iOS开发 - UIActivityViewController详解

昨天在做微信分享的时候, 用到了这个东西。趁热写点东西记录下。


UIActivityViewController类是一个标准的view controller,通个使用这个controller,你的应用程序就可以提供各种服务。

系统提供了一些通用的标准服务,例如拷贝内容至粘贴板、发布一个公告至社交网、通过email或者SMS发送内容。

应用程序同样可以自定义服务。(我的微信分享就属于自定义服务, 之后将会写一篇教程介绍)

你的应用程序负责配置、展现和解雇这个view controller。

viewcontroller的配置涉及到viewcontroller需要用到的具体的数据对象。(也可以指定自定义服务列表,让应用程序支持这些服务)。

在展现view controller时,必须根据当前的设备类型,使用适当的方法。在iPad上,必须通过popover来展现view controller。在iPhone和iPodtouch上,必须以模态的方式展现。


一。UIActivityViewController 类参考

继承自

UIViewController : UIResponder : NSObject

符合

NSCoding (UIViewController)

UIAppearanceContainer (UIViewController)

NSObject (NSObject)

框架

/System/Library/Frameworks/UIKit.framework

可用性

iOS6以及之后

声明在

UIActivityViewController.h




二。初始化Activity View Controller

- (id)initWithActivityItems:(NSArray *)activityItems applicationActivities:(NSArray *)applicationActivities;

根据指定的数据初始化并返回一个新的activity view controller。

参数

1.activityItems

在执行activity中用到的数据对象数组。数组中的对象类型是可变的,并依赖于应用程序管理的数据。例如,数据可能是由一个或者多个字符串/图像对象,代表了当前选中的内容。
数组中的对象,也可以通过UIActivityItemSource协议来代替,例如UIActivityItemProvider对象。源和提供者扮演代理的角色,根据实际情况,需要相应数据时再进行提供。这里, 分享的数据包括文本, 图像, 访问网址。 当然, 这些是可选项。 比如你不想添加url,只包含文本和图像也是可以的。这个数组不能为nil,至少要有一个对象。



2.applicationActivities

是一个UIActivity对象的数组,代表了应用程序支持的自定义服务。这个参数可以是nil。

返回值

返回一个将要展现的activity view controller。

使用示例

    NSString *textToShare = @"要分享的文本内容";
    UIImage *imageToShare = [UIImage imageNamed:@"iosshare.jpg"];
    NSURL *urlToShare = [NSURL URLWithString:@"http://blog.csdn.net/hitwhylz"];
    NSArray *activityItems = @[textToShare, imageToShare, urlToShare];

    UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil];




三。访问Completion Handler

@property(nonatomic,copy) UIActivityViewControllerCompletionHandler completionHandler;  // set to nil after call
typedef void (^UIActivityViewControllerCompletionHandler)(NSString *activityType, BOOL completed);
当activityview controller被解雇时,completion handler会被执行。这可以用来处理当使用完activityview controller之后, 执行的一些相关操作。

不管是点击了“cancel”, 还是选中了某项服务,当它结束后,都会调用这个块,并且能捕抓到你选中的服务,来执行相关操作。


block的参数如下:

1.activityType

被用户选择的服务类型。如果是自定义的服务,这个值是由UIActivity对象的方法activityType返回的。如果是系统定义的activities,这个值是一个在UIActivity类参考中”Built-inActivity Types”列出来的字符串。

2.completed


如果服务被执行了,则返回YES,如果没有则返回NO。当用户没有选择一个服务,而是解雇了view controller,这个参数同样被设置为NO。

使用示例

    //给activityVC的属性completionHandler写一个block。
    //用以UIActivityViewController执行结束后,被调用,做一些后续处理。
    UIActivityViewControllerCompletionHandler myBlock = ^(NSString *activityType,BOOL completed)
    {
        NSLog(@"activityType :%@", activityType);
        if (completed)
        {
            NSLog(@"completed");
        }
        else
        {
            NSLog(@"cancel");
        }
        
        //放回上一级界面
        [self.navigationController dismissModalViewControllerAnimated:YES];
        
    };
    
    // 初始化completionHandler,当post结束之后(无论是done还是cancell)该blog都会被调用
    activityVC.completionHandler = myBlock;




四。excludedActivityTypes属性

@property(nonatomic,copy)NSArray *excludedActivityTypes
默认情况下,UIActivityViewController 将显示所有可用于所提供内容的服务,但我们也可以排除特定的 Activity 类型。
这就要利用excludedActivityTypes属性了,它可以声明我们不要显示出来的服务列表。
Activity 类型又分为“操作”和“分享”两大类, 具体看名称就能区分了。

UIKIT_EXTERN NSString *const UIActivityTypePostToFacebook     NS_AVAILABLE_IOS(6_0);
UIKIT_EXTERN NSString *const UIActivityTypePostToTwitter      NS_AVAILABLE_IOS(6_0);
UIKIT_EXTERN NSString *const UIActivityTypePostToWeibo        NS_AVAILABLE_IOS(6_0);    // SinaWeibo
UIKIT_EXTERN NSString *const UIActivityTypeMessage            NS_AVAILABLE_IOS(6_0);
UIKIT_EXTERN NSString *const UIActivityTypeMail               NS_AVAILABLE_IOS(6_0);
UIKIT_EXTERN NSString *const UIActivityTypePrint              NS_AVAILABLE_IOS(6_0);
UIKIT_EXTERN NSString *const UIActivityTypeCopyToPasteboard   NS_AVAILABLE_IOS(6_0);
UIKIT_EXTERN NSString *const UIActivityTypeAssignToContact    NS_AVAILABLE_IOS(6_0);
UIKIT_EXTERN NSString *const UIActivityTypeSaveToCameraRoll   NS_AVAILABLE_IOS(6_0);
UIKIT_EXTERN NSString *const UIActivityTypeAddToReadingList   NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIActivityTypePostToFlickr       NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIActivityTypePostToVimeo        NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIActivityTypePostToTencentWeibo NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIActivityTypeAirDrop            NS_AVAILABLE_IOS(7_0);

每个 Activity 类型都支持好多种不同的数据类型。例如,一条 Tweet 可能由 NSString 以及一个附加的图像 和/或 URL 所组成。
不同的 Activity 类型所支持的数据类型如下:

iOS开发 - UIActivityViewController详解

iOS开发 - UIActivityViewController详解

使用示例

    //排除类型,  不显示
    //// default is nil. activity types listed will not be displayed
    activityVC.excludedActivityTypes = @[UIActivityTypeAssignToContact,
                                           UIActivityTypePrint];


五。展示

在展现view controller时,必须根据当前的设备类型,使用适当的方法。在iPad上,必须通过popover来展现view controller。在iPhone和iPodtouch上,必须以模态的方式展现。

使用示例

    //以模态的方式展现activityVC。
    [self presentViewController:activityVC animated:YES completion:nil];


展示之后, 你看到的效果图大概是这样:

iOS开发 - UIActivityViewController详解

这里的那些分享功能(Facebook, Twitter, 新浪微博, 腾讯微博...)需要你在手机上绑定了登录账户, 才能正常显示。


好了, UIActivityViewController基本功能就介绍到这里, 接下去如果有时间再谢谢微信分享和自定义 UIActivity。


学习的路上, 与君共勉


iOS开发 - UIActivityViewController详解,布布扣,bubuko.com

iOS开发 - UIActivityViewController详解

上一篇:Android 应用程序启动过程源代码分析


下一篇:iOS 技术官方 Q&A