您的位置:首页 > 产品设计 > UI/UE

UIActivityViewController及其自定义

2016-11-11 22:13 405 查看
UIActivityViewController 是iOS很早就推出的一个分享控制器, 内部集成了一些和系统服务进行交互的接口,也可以新增一些我们自定义的动作。

先通过它的构造方法来慢慢了解它的内部结构:

- (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];


具体类型可查看官方文档。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  UIActivity 分享