¿Cómo puedo crear una personalizada UIActivity en iOS?

La razón por la que desea es añadir una Revisión de la Aplicación botón en una de mis aplicaciones que lleva al usuario a la sección de revisión en la App Store. ¿Cómo puedo crear una costumbre UIActivity?

InformationsquelleAutor klcjr89 | 2012-10-07

4 Comentarios

  1. 172

    Primero, la creación de los archivos. Yo elegí el nombre de la mina ActivityViewCustomActivity

    Hacer ActivityViewCustomActivity.h este aspecto:

    #import <UIKit/UIKit.h>
    
    @interface ActivityViewCustomActivity : UIActivity
    
    @end

    Hacer ActivityViewCustomActivity.m este aspecto:

    #import "ActivityViewCustomActivity.h"
    
    @implementation ActivityViewCustomActivity
    
    - (NSString *)activityType
    {
        return @"yourappname.Review.App";
    }
    
    - (NSString *)activityTitle
    {
        return @"Review App";
    }
    
    - (UIImage *)activityImage
    {  
        //Note: These images need to have a transparent background and I recommend these sizes:
        //[email protected] should be 126 px, iPadShare should be 53 px, [email protected] should be 100 
        //px, and iPhoneShare should be 50 px. I found these sizes to work for what I was making.
    
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        {
            return [UIImage imageNamed:@"iPadShare.png"];
        }
        else
        {
            return [UIImage imageNamed:@"iPhoneShare.png"];
        }
    }
    
    - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems
    {
        NSLog(@"%s", __FUNCTION__);
        return YES;
    }
    
    - (void)prepareWithActivityItems:(NSArray *)activityItems
    {
        NSLog(@"%s",__FUNCTION__);
    }
    
    - (UIViewController *)activityViewController
    {
        NSLog(@"%s",__FUNCTION__);
        return nil;
    }
    
    - (void)performActivity
    {   
        //This is where you can do anything you want, and is the whole reason for creating a custom 
        //UIActivity
    
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=yourappid"]];
        [self activityDidFinish:YES];
    }
    
    @end

    Esto es lo que mi imagen se parecía a:
    Aquí está la .PSD que hice: — malicioso enlace eliminado —
    Y aquí está el original 250 px .png http://i.imgur.com/pGWVj.png

    ¿Cómo puedo crear una personalizada UIActivity en iOS?

    Ahora en su controlador de vista de hacer esto:

    #import "ActivityViewCustomActivity.h"

    Y ahora dondequiera que usted desea mostrar su UIActivityViewController:

       NSString *textItem = @"Check out the yourAppNameHere app: itunes http link to your app here";
       UIImage *imageToShare = [UIImage imageNamed:@"anyImage.png"];
    
       NSArray *items = [NSArray arrayWithObjects:textItem,imageToShare,nil];
    
       ActivityViewCustomActivity *aVCA = [[ActivityViewCustomActivity alloc]init];
    
       UIActivityViewController *activityVC =
       [[UIActivityViewController alloc] initWithActivityItems:items
                                                      applicationActivities:[NSArray arrayWithObject:aVCA]];
    
       activityVC.excludedActivityTypes = @[UIActivityTypePostToWeibo, UIActivityTypeAssignToContact, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeSaveToCameraRoll];
    
       activityVC.completionHandler = ^(NSString *activityType, BOOL completed)
       {
            NSLog(@"ActivityType: %@", activityType);
            NSLog(@"Completed: %i", completed);
       };
    
       if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
       {
          self.popoverController = [[UIPopoverController alloc] initWithContentViewController:activityVC];
    
          CGRect rect = [[UIScreen mainScreen] bounds];
    
          [self.popoverController
                         presentPopoverFromRect:rect inView:self.view
                         permittedArrowDirections:0
                         animated:YES];
       }
       else
       {
           [self presentViewController:activityVC animated:YES completion:nil];
       }
    • De acuerdo a la Manzana manual para el iPhone y el iPod touch, las imágenes deben ser de no más de 43 por 43 puntos (que equivale a 86 86 píxeles para dispositivos con pantallas de Retina.) Para el iPad, las imágenes no debe ser mayor de 55 x 55 puntos (lo que equivale a 110 de 110 píxeles para iPads con pantallas de Retina.)
    • El Apple manual no funciona para todo. El tamaño de las imágenes que he seleccionado fueron por ensayo y error, y funcionan perfectamente para lo que yo necesitaba.
    • Podrías subir los archivos de nuevo? Parece que ya no están disponibles.
    • Yo reuploaded el .Archivo PSD aquí: datafilehost.com/download-a67ca6f3.html
    • Hay un pequeño fallo. Se hace referencia a la clase «ActivityViewCustomProvider» como «CustomProivder» en la última sección de origen.
    • buena captura, creo que me fijo ahora.
    • No creo que realmente necesita la ActivityViewCustomProvider. Al menos funciona bien para mí sin él.
    • usted está en lo correcto! Editado mi respuesta a excluir.
    • Hola, he utilizado tu código para crear un traje UIActivityItem, me gustaría presentar un Mail ViewController cuando se presiona sobre el tema, pero yo no puedo presentar nada de la clase. Puede usted por favor, eche un vistazo a esto: stackoverflow.com/questions/18810822/…
    • El recomendado tamaño de la imagen cambia en iOS 7 – consulte la documentación de UIActivity. Para el iPhone y el iPod touch, imágenes en iOS 7 debería ser de 60 por 60 puntos. Para versiones anteriores: no más de 43 por 43 puntos. Para el iPad, las imágenes deben ser de 76 76 puntos; en versiones anteriores: no más de 60 por 60 puntos. En un dispositivo con pantalla Retina, el número de píxeles que se duplica en cada dirección.
    • He sido capaz de implementar una Actividad personalizada, pero no puede averiguar cómo agregar la impresión a la lista. Estoy pensando que tengo que agregar una UISimpleTextPrintFormatter objeto UIActivityViewController, pero produce un fallo al intentar hacerlo.

  2. 22

    Aquí está mi Swift Versión: necesitaba múltiples acciones personalizadas así que he creado esta clase. No hay necesidad para que los delegados o protocolos.

    1. Agregar la Clase personalizada

    class ActivityViewCustomActivity: UIActivity {
    
        var customActivityType = ""
        var activityName = ""
        var activityImageName = ""
        var customActionWhenTapped:( (Void)-> Void)!
    
        init(title: String, imageName:String, performAction: (() -> ()) ) {
            self.activityName = title
            self.activityImageName = imageName
            self.customActivityType = "Action \(title)"
            self.customActionWhenTapped = performAction
            super.init()
        }
    
        override func activityType() -> String? {
            return customActivityType
        }
    
        override func activityTitle() -> String? {
            return activityName
        }
    
        override func activityImage() -> UIImage? {
            return UIImage(named: activityImageName)
        }
    
        override func canPerformWithActivityItems(activityItems: [AnyObject]) -> Bool {
            return true
        }
    
        override func prepareWithActivityItems(activityItems: [AnyObject]) {
            //nothing to prepare
        }
    
        override func activityViewController() -> UIViewController? {
            return nil
        }
    
        override func performActivity() {
            customActionWhenTapped()
        }
    }

    2 Utilizar en la Vista Controlador

    Me he unido a una UIBarButtonItem, que llama a la siguiente

    @IBAction func actionButtonPressed(sender: UIBarButtonItem) {
    
        var sharingItems = [AnyObject]() //nothing to share...
    
        let myCustomActivity = ActivityViewCustomActivity(title: "Mark Selected", imageName: "removePin") {
            println("Do something")
        }
    
        let anotherCustomActivity = ActivityViewCustomActivity(title: "Reset All", imageName: "reload") {
            println("Do something else")
        }
    
        let activityViewController = UIActivityViewController(activityItems:sharingItems, applicationActivities:[myCustomActivity, anotherCustomActivity])
    
        activityViewController.excludedActivityTypes = [UIActivityTypeMail, UIActivityTypeAirDrop, UIActivityTypeMessage, UIActivityTypeAssignToContact, UIActivityTypePostToFacebook, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeSaveToCameraRoll]
    
        activityViewController.popoverPresentationController?.barButtonItem = sender
    
        self.presentViewController(activityViewController, animated: true, completion: nil)
    }
    • Chupa que Apple no tiene esta opción por defecto.
  3. 10

    Mi Swift 3 Implementación a partir de DogCoffee del:

    class ActivityViewCustomActivity: UIActivity {
    
        //MARK: Properties
    
        var customActivityType: UIActivityType
        var activityName: String
        var activityImageName: String
        var customActionWhenTapped: () -> Void
    
    
        //MARK: Initializer
    
        init(title: String, imageName: String, performAction: @escaping () -> Void) {
            self.activityName = title
            self.activityImageName = imageName
            self.customActivityType = UIActivityType(rawValue: "Action \(title)")
            self.customActionWhenTapped = performAction
            super.init()
        }
    
    
    
        //MARK: Overrides
    
        override var activityType: UIActivityType? {
            return customActivityType
        }
    
    
    
        override var activityTitle: String? {
            return activityName
        }
    
    
    
        override class var activityCategory: UIActivityCategory {
            return .share
        }
    
    
    
        override var activityImage: UIImage? {
            return UIImage(named: activityImageName)
        }
    
    
    
        override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
            return true
        }
    
    
    
        override func prepare(withActivityItems activityItems: [Any]) {
            //Nothing to prepare
        }
    
    
    
        override func perform() {
            customActionWhenTapped()
        }
    }
  4. 1

    He aquí un ejemplo de la colocación de un correo electrónico compositor de la interfaz de uso de la activityViewController método de UIActivity. Esto muestra cómo poner un UIKit viewController o su propio personalizado viewController para cualquier propósito que usted elija. Se suplanta la performActivity método.

    #import <MessageUI/MessageUI.h>
    #import <UIKit/UIKit.h>
    
    @interface EPSuggestionsActivity : UIActivity <MFMailComposeViewControllerDelegate>
    
    @end
    
    @implementation EPSuggestionsActivity
    
    ....
    
    - (UIViewController *)activityViewController{
    
        MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
        picker.mailComposeDelegate = self;
    
        NSString *emailAddress = @"[email protected]";
        NSArray *toRecipients = @[emailAddress];
        [picker setToRecipients:toRecipients];
        [picker setSubject:@"Suggestions"];
    
        return picker;
    }
    
    #pragma mark - MFMailComposeViewControllerDelegate Method
    
    - (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error  {
    
        [self activityDidFinish:YES];   // Forces the activityViewController to be dismissed
    }
    
    @end

    Aviso que -activityDidFinish es llamado desde el correo compositor delegado después de que el usuario ha desestimado la interfaz de correo electrónico. Esto es necesario para obtener la UIActivityViewController interfaz de desaparecer. Si usted escribe su propio viewController tendrá un delegado método que se llama cuando haya terminado y usted tendrá que hacer su subclase de UIActivity el delegado.

Dejar respuesta

Please enter your comment!
Please enter your name here