Как мога да създам персонализирана UIActivity в iOS?

Как мога да създам персонализиран UIActivity в iOS?

Причината, поради която искам това, е да добавя бутон за преглед на приложението в едно от моите приложения, който отвежда потребителя до секцията за преглед в App Store. Как мога да създам такъв персонализиран UIActivity?


person klcjr89    schedule 07.10.2012    source източник


Отговори (4)


Първо създайте файловете. Избрах да кръстя моя ActivityViewCustomActivity

Направете ActivityViewCustomActivity.h да изглежда така:

#import <UIKit/UIKit.h>

@interface ActivityViewCustomActivity : UIActivity

@end

Направете ActivityViewCustomActivity.m да изглежда така:

#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:
    // iPadShare@2x should be 126 px, iPadShare should be 53 px, iPhoneShare@2x 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

Ето как изглеждаше изображението ми: Ето .PSD, който направих: -- премахната злонамерена връзка -- И ето оригиналния 250 px .png https://i.imgur.com/pGWVj.png

Сега във вашия изглед контролер направете това:

#import "ActivityViewCustomActivity.h"

И сега, където искате да покажете своя 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];
   }
person Community    schedule 07.10.2012
comment
Според ръководството на Apple за iPhone и iPod touch изображенията не трябва да са по-големи от 43 на 43 точки (което се равнява на 86 на 86 пиксела за устройства с Retina дисплеи.) За iPad изображенията не трябва да са по-големи от 55 x 55 точки ( което се равнява на 110 на 110 пиксела за iPad с Retina дисплеи.) - person voromax; 21.10.2012
comment
Ръководството на Apple не работи за всичко. Размерите на изображенията, които избрах, бяха чрез проба и грешка и работят перфектно за това, от което се нуждаех. - person klcjr89; 23.10.2012
comment
Бихте ли качили вашите файлове отново? Изглежда вече не са налични. - person DrMickeyLauer; 06.12.2012
comment
@DrMickeyLauer Качих отново .PSD файла тук: datafilehost.com/download-a67ca6f3.html - person klcjr89; 07.12.2012
comment
Има малък бъг. Вие препращате към класа ActivityViewCustomProvider като CustomProivder в последния раздел на източника. - person Klaas; 11.01.2013
comment
Не мисля, че всъщност се нуждаете от ActivityViewCustomProvider. Поне при мен работи добре и без него. - person Gottfried; 22.02.2013
comment
Здравейте, използвах вашия код, за да създам костюм UIActivityItem, обичам да представям Mail ViewController, когато натисна елемента, но не мога да представя нищо от класа. Можете ли да го разгледате: stackoverflow.com/questions/18810822/ - person David Gölzhäuser; 15.09.2013
comment
Препоръчителните размери на изображенията са променени в iOS 7 - вижте документацията за UIActivity. За iPhone и iPod touch изображенията на iOS 7 трябва да са 60 на 60 точки. За по-ранни версии: не по-големи от 43 на 43 точки. За iPad изображенията трябва да са 76 на 76 точки; на по-ранни версии: не по-големи от 60 на 60 точки. На устройство с Retina дисплей броят на пикселите се удвоява във всяка посока. - person Jordan H; 13.05.2014
comment
Успях да внедря персонализирана дейност, но не мога да разбера как да добавя печат към списъка. Мисля, че трябва да добавя UISimpleTextPrintFormatter обект към UIActivityViewController, но той причинява срив при опит за представяне. - person Joe Fratianni; 03.02.2015

Ето моята Swift версия - имах нужда от множество персонализирани действия, така че създадох този клас. Няма нужда от делегати или протоколи.

1. Добавете персонализирания клас

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 Използвайте във вашия View Controller

Прикачих го към UIBarButtonItem, който извиква следното

@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)
}
person DogCoffee    schedule 27.05.2015
comment
Гадно е, че Apple няма това по подразбиране. - person 3lvis; 21.03.2016

Моята Swift 3 реализация, базирана на DogCoffee:

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()
    }
}
person johnslay    schedule 12.12.2016

Ето пример за поставяне на интерфейс за съставяне на имейл с помощта на метода -activityViewController на UIActivity. Това показва как да поставите UIKit viewController или ваш собствен персонализиран viewController за каквато и да е цел, която изберете. Той замества метода -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

Забележете, че -activityDidFinish се извиква от делегата за композиране на поща, след като потребителят е отхвърлил имейл интерфейса. Това е необходимо, за да изчезне интерфейсът на UIActivityViewController. Ако напишете свой собствен viewController, той ще се нуждае от метод на делегат, който извиква, когато приключи, и ще трябва да направите вашия подклас на UIActivity делегат.

person Paul Linsay    schedule 29.12.2015