2012-10-07 12 views
62

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

La razón por la que deseo esto es agregar un botón Revisar aplicación en una de mis aplicaciones que lleva al usuario a la sección de revisión en la tienda de aplicaciones. ¿Cómo puedo crear una costumbre como esa UIActivity?

Respuesta

168

Primero, cree los archivos. Elegí ActivityViewCustomActivity nombre de la mina

Hacer ActivityViewCustomActivity.h tener este aspecto:

#import <UIKit/UIKit.h> 

@interface ActivityViewCustomActivity : UIActivity 

@end 

Hacer ActivityViewCustomActivity.m 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í es el .PSD que hice: - Enlace malicioso eliminado - Y aquí está el original de 250 px .png http://i.imgur.com/pGWVj.png

En su controlador de vista hacer esto:

#import "ActivityViewCustomActivity.h" 

Y ahora donde 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]; 
    } 
+1

funciona muy bien! Gracias. – OscarTheGrouch

+1

De acuerdo con el manual de Apple para iPhone y iPod touch, las imágenes no deben ser mayores de 43 por 43 puntos (lo que equivale a 86 por 86 píxeles para dispositivos con pantallas Retina).) Para iPad, las imágenes no deben tener más de 55 x 55 puntos (lo que equivale a 110 por 110 píxeles para iPads con pantallas Retina). – voromax

+0

El manual de Apple no funciona para todo. Los tamaños de imagen que seleccioné fueron por ensayo y error, y funcionan perfectamente para lo que necesitaba. – klcjr89

22

Aquí es mi versión Swift - que necesitaba múltiples acciones personalizadas entonces creé esta clase. No es necesario para delegados o protocolos.

1. Añadir 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 Uso en su Vista Controlador

He adjuntado a un UIBarButtonItem, que llama al 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) 
} 
+0

Sucks que Apple no tiene esto por defecto. – 3lvis

1

Aquí hay un ejemplo de cómo configurar una interfaz de compositor de correo electrónico utilizando -activityViewCon método troller de UIActivity. Esto muestra cómo colocar un UIKit viewController o su propio viewController personalizado para el propósito que elija. Suplanta el método -performActivity.

#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 

en cuenta que -activityDidFinish se llama desde el delegado electrónico compositor después de que el usuario ha desestimado la interfaz de correo electrónico. Esto es necesario para que desaparezca la interfaz UIActivityViewController. Si escribe su propio viewController, necesitará un método delegado al que llame cuando haya terminado y tendrá que hacer que su subclase de UIActivity sea el delegado.

8

Mi Swift 3 Implementación con sede fuera de DogCoffee de:

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() 
    } 
} 
Cuestiones relacionadas