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 类型所支持的数据类型如下:
使用示例
//排除类型, 不显示 //// 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];
展示之后, 你看到的效果图大概是这样:
好了, UIActivityViewController基本功能就介绍到这里, 接下去如果有时间再谢谢微信分享和自定义 UIActivity。
学习的路上, 与君共勉
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。