Как я могу создать пользовательскую 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