UIActivityViewController及其自定义
2016-11-11 22:13
405 查看
UIActivityViewController 是iOS很早就推出的一个分享控制器, 内部集成了一些和系统服务进行交互的接口,也可以新增一些我们自定义的动作。
先通过它的构造方法来慢慢了解它的内部结构:
构造方法可以传入两个参数:
activityItems:数组类型。
applicationActivities:数组类型。(但对数组的元素有了要求,必须是 UIActivity 对象)
先了解第一个参数,看这样的几个初始化:
这里初始化的时候,第一次 activityItems 传了个nil;第二次放了两个NSString;第三次放了一个NSString,一个NSURL。
看下效果:
【由于模拟器硬件的限制,内容在真机上会有所增加】
可以看到,activityItems数组里元素类型的不同,直接影响了界面的显示。因此我们可以推断,UIActivityViewController 会根据数组里元素的类型,去匹配可以对应的系统服务。(比如字符型的话,只有复制。网址的话,可以保存书签,或者添加到日程中去)。
再来看另外一个参数 applicationActivities, 上面说到,他的元素是UIActivity。其实系统服务展示出来的也是一个UIActivity,这也是我们自定义的关键所在。
UIActivity
这是一个抽象类,也就意味着我们需要继承该类,去定义我们自己的Activity。下面剖析一下内部的属性
activityCategory :枚举类型,UIActivity有UIActivityCategoryAction和UIActivityCategoryShare两大类。默认是UIActivityCategoryAction。
activityType :每个UIActivity对应一个Type
activityImage:显示的图标
activityTitle:每个图标下面对应的名字
熟悉了上面的这些基本方法,我们就可以继承 UIActivity ,开始自定义了。
重写UIActivity类的一些方法
初始化:
这里就完成了对UIActivityViewController的自定义。
另外,对于有关系统服务的UIActivity,如打印,拷贝等,我们可以选择性的让其出现。
可以在 UIActivityViewController 初始化的时候,设置 excludedActivityTypes 属性。这是一个数组,包含了需要隐藏的 UIActivity 类型。如隐藏打印的这个类型
具体类型可查看官方文档。
先通过它的构造方法来慢慢了解它的内部结构:
- (instancetype)initWithActivityItems:(NSArray *)activityItems applicationActivities:(nullable NSArray<__kindof UIActivity *> *)applicationActivities NS_DESIGNATED_INITIALIZER;
构造方法可以传入两个参数:
activityItems:数组类型。
applicationActivities:数组类型。(但对数组的元素有了要求,必须是 UIActivity 对象)
先了解第一个参数,看这样的几个初始化:
UIActivityViewController *vc = [[UIActivityViewController alloc]initWithActivityItems:nil applicationActivities:nil]; [self presentViewController:vc animated:YES completion:nil];
UIActivityViewController *vc = [[UIActivityViewController alloc] initWithActivityItems:@[@"123",@"456"] applicationActivities:nil]; [self presentViewController:vc animated:YES completion:nil];
UIActivityViewController *vc = [[UIActivityViewController alloc] initWithActivityItems:@[@"123",[NSURL URLWithString:@"https://www.baidu.com"]] applicationActivities:nil]; [self presentViewController:vc animated:YES completion:nil];
这里初始化的时候,第一次 activityItems 传了个nil;第二次放了两个NSString;第三次放了一个NSString,一个NSURL。
看下效果:
【由于模拟器硬件的限制,内容在真机上会有所增加】
可以看到,activityItems数组里元素类型的不同,直接影响了界面的显示。因此我们可以推断,UIActivityViewController 会根据数组里元素的类型,去匹配可以对应的系统服务。(比如字符型的话,只有复制。网址的话,可以保存书签,或者添加到日程中去)。
再来看另外一个参数 applicationActivities, 上面说到,他的元素是UIActivity。其实系统服务展示出来的也是一个UIActivity,这也是我们自定义的关键所在。
UIActivity
这是一个抽象类,也就意味着我们需要继承该类,去定义我们自己的Activity。下面剖析一下内部的属性
activityCategory :枚举类型,UIActivity有UIActivityCategoryAction和UIActivityCategoryShare两大类。默认是UIActivityCategoryAction。
activityType :每个UIActivity对应一个Type
activityImage:显示的图标
activityTitle:每个图标下面对应的名字
- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems; /* 判断当前这个UIActivity是否需要显示。 上文也提到,如果是系统的服务,会自动根据硬件支持以及activityItems的类型去判断该显示哪些内容,如果是自定义,这些事情就要我们自己做了。 比如微信分享,要判断是否安装了微信。还有就是判断activityItems里的参数是否支持 */ - (void)prepareWithActivityItems:(NSArray *)activityItems; //点击动作即将执行的准备阶段,可以用来处理一下值或者逻辑。 - (void)performActivity; //点击UIActivity的动作消息,处理点击后的相应逻辑 - (void)activityDidFinish:(BOOL)completed; //完成处理
熟悉了上面的这些基本方法,我们就可以继承 UIActivity ,开始自定义了。
重写UIActivity类的一些方法
#import "WeixinSessionActivity.h" @implementation WeixinSessionActivity + (UIActivityCategory)activityCategory { return UIActivityCategoryShare; } - (UIImage *)activityImage { return [UIImage imageNamed:@"ic_wechat"]; } - (NSString *)activityTitle { return @"微信"; } @end
初始化:
UIActivity *wechatActivity = [[WeixinSessionActivity alloc] init]; UIActivityViewController *shareActivityVC = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:@[wechatActivity]];
这里就完成了对UIActivityViewController的自定义。
另外,对于有关系统服务的UIActivity,如打印,拷贝等,我们可以选择性的让其出现。
可以在 UIActivityViewController 初始化的时候,设置 excludedActivityTypes 属性。这是一个数组,包含了需要隐藏的 UIActivity 类型。如隐藏打印的这个类型
shareActivityVC.excludedActivityTypes = @[UIActivityTypePrint];
具体类型可查看官方文档。
相关文章推荐
- UIActivityViewController的相关用法(三)--自定义分享方式(比第三方分享库轻便)
- iOS7 CookBook精彩瞬间(三)UIActivityViewController的基本使用及自定义Activity
- iOS UIActivityViewController自定义分享配置
- iOS7 CookBook精彩瞬间(三)UIActivityViewController的基本使用及自定义Activity
- 使用UIActivityViewController展现自定义分享选项
- UIActivityViewController 自定义选项
- Presenting Sharing Options with UIActivityViewController
- ipad 自定义UISplitViewController
- IOS-MFMailComposeViewController自定义NavBar
- 在ViewController中使用自定义Notification处理applicationWillTerminate
- IOS--弹出viewController窗口 自定义底层框架--
- 用UIImagePickerViewController自定义相机界面
- ipad 自定义UISplitViewController
- iOS创建不带nib文件的工程之三--将window和自定义的view及viewController关联起来
- iOS 6分享列表——UIActivityViewController详解
- IOS 6 UIActivityViewController详解 社交分享
- 使用XIB自定义一个UIView,然后将这个view添加到controller的view
- 使用XIB自定义一个UIView,然后将这个view添加到controller的view
- 自定义 pushViewController 的动画
- iOS6新特征:UIActivityViewController使用示例