2012-10-07 11 views
62

Come posso creare una personalizzata UIActivity in iOS?Come posso creare un UIActivity personalizzato in iOS?

Il motivo per cui voglio aggiungere un pulsante App Review in una delle mie app che porta l'utente alla sezione di revisione nell'App Store. Come posso creare tale personalizzato UIActivity?

risposta

168

Innanzitutto, creare i file. Ho scelto di nome mio ActivityViewCustomActivity

Marchio ActivityViewCustomActivity.h simile a questa:

#import <UIKit/UIKit.h> 

@interface ActivityViewCustomActivity : UIActivity 

@end 

Fai ActivityViewCustomActivity.m simile a questa:

#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 

Questo è ciò che la mia immagine sembrava: Qui è il .PSD che ho creato: - link malevolo rimosso - Ed ecco l'originale 250 px .png http://i.imgur.com/pGWVj.png

Ora nel tuo controller della vista fare questo:

#import "ActivityViewCustomActivity.h" 

E ora dove vuoi visualizzare il vostro 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

funziona alla grande! Grazie. – OscarTheGrouch

+1

Secondo il manuale Apple per iPhone e iPod touch, le immagini non dovrebbero essere più grandi di 43 per 43 punti (che equivale a 86 per 86 pixel per i dispositivi con display Retina.) Per iPad, le immagini non devono superare i 55 x 55 punti (che equivale a 110 per 110 pixel per iPad con display Retina). – voromax

+0

Il manuale Apple non funziona per tutto. Le dimensioni dell'immagine che ho selezionato erano per tentativi ed errori e funzionano perfettamente per ciò di cui avevo bisogno. – klcjr89

22

Qui è la mia versione Swift - avevo bisogno di più azioni personalizzate così ho creato questa classe. Non c'è bisogno di delegati o protocolli.

1. Aggiungere la classe personalizzata

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 utilizzare per le View Controller

Ho allegato ad un UIBarButtonItem, che chiama il seguente

@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

Suck che Apple non ha questo di default. – 3lvis

1

Ecco un esempio di creazione di un'interfaccia del compositore di posta elettronica utilizzando l'-activityViewCon metodo troller di UIActivity. Questo mostra come montare un ViewController UIKit o il tuo ViewController personalizzato per qualsiasi scopo tu scelga. Sostituisce il metodo -performAttività.

#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 

noti che -activityDidFinish viene chiamato dal delegato di posta compositore dopo che l'utente ha respinto l'interfaccia e-mail. Questo è necessario per far scomparire l'interfaccia UIActivityViewController. Se scrivi il tuo ViewController avrai bisogno di un metodo delegato che invochi al termine e dovrai delegare la sottoclasse di UIActivity.

8

mio Swift 3 Attuazione in base al largo di DogCoffee di:

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() 
    } 
} 
Problemi correlati