我该如何在iOS中创建自定义UIActivity?

64
我怎样才能在iOS上创建一个自定义的 UIActivity
我之所以想这么做,是因为我想在我的某个应用中加入一个“查看App Store中的评论”按钮。那么我该怎样创建这个自定义的 UIActivity 呢?
4个回答

172
First, 创建文件。我选择将其命名为 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文件:-- 恶意链接已删除 -- 这是原始的250px .png http://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];
   }

1
根据 iPhone 和 iPod touch 的 Apple 手册,图片大小不应超过 43 x 43 points(对于具备 Retina 显示屏的设备相当于 86 x 86 像素)。对于 iPad,图片大小不应超过 55 x 55 points(对于具备 Retina 显示屏的 iPad 相当于 110 x 110 像素)。 - voromax
请问您能否重新上传您的文件?看起来它们已经不可用了。 - DrMickeyLauer
1
@DrMickeyLauer 我在这里重新上传了.PSD文件:http://www.datafilehost.com/download-a67ca6f3.html - klcjr89
你好,我使用了你的代码创建了一个自定义的UIActivityItem。当我点击这个项目时,我想要呈现一个邮件视图控制器,但是我无法从该类中呈现任何内容。你能否请看一下这个问题:http://stackoverflow.com/questions/18810822/how-can-i-send-emails-from-my-custom-uiactivity-class - David Gölzhäuser
6
iOS 7中推荐的图片尺寸已更改 - 请参阅UIActivity的文档。对于iPhone和iPod touch,iOS 7上的图片应为60x60点。对于早期版本:不超过43x43点。对于iPad,图片应为76x76点;在早期版本中:不超过60x60点。在具有Retina显示屏的设备上,每个方向上的像素数量加倍。 - Jordan H
显示剩余4条评论

23

这是我的 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 在你的视图控制器中使用

我将它附加到了一个UIBarButtonItem上,该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)
}

很遗憾,苹果默认没有这个功能。 - 3lvis

12

基于DogCoffee的代码,这是我Swift 3的实现:

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

1
这是使用UIActivity的-activityViewController方法展示邮件编辑器界面的示例。它展示了如何放置一个UIKit视图控制器或您自己的自定义视图控制器以用于任何目的。它取代了-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 = @"developer@apple.com";
    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的子类设置为委托。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接