号外每日一记之二 - UIActivityViewController简单使用

来源:互联网 发布:腾讯php招聘 编辑:程序博客网 时间:2024/06/06 07:34

本文参考了关东升的博客http://2009315319.blog.51cto.com/701759/1195374


此项目在使用分享弹框的样式自定义时使用了该控件:UIActivityViewController

UIActivityViewController是iOS 6后,苹果用来替换actionsheet的新的控制器。功能有点类似以前的URL scheme。

在iOS上它以模态出现,而在iPad上则是popover。

苹果已经内置很多UIActivity。社交:天朝有微信微博,外国有推特Facebook。邮件,相机等。

使用也很简单。

一是为现有的UIActivity提供数据。让它们接收你传的数据,并显示相应的UI。这些数据可以是真实的字符串,图片以及URL,也可以是某些对象。作为数据提供者的对象,是有格式要求的,这个要求写在了UIActivityItemSource协议中。你只要实现这些协议方法,就能作为UIActivity的数据提供者了。苹果已经内置了一个实现这些方法的类UIActivityProvider。你可以使用它来简化一些操作。这边引用了一段代码:

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. - (IBAction)shareAction:(id)sender {   
  2.    
  3. NSString *textToShare = @”请大家登录《iOS云端与网络通讯》服务网站。”; ①   
  4.    
  5. UIImage *imageToShare = [UIImage imageNamed:@"iosshare.jpg"]; ②   
  6.    
  7. NSURL *urlToShare = [NSURL URLWithString:@"http://www.iosbook3.com"]; ③   
  8.    
  9. NSArray *activityItems = @[textToShare, imageToShare, urlToShare];       ④   
  10.    
  11. UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems   
  12.    
  13. applicationActivities:nil];  ⑤   
  14.    
  15. //不出现在活动项目   
  16.    
  17. activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard,   
  18.    
  19. UIActivityTypeAssignToContact,UIActivityTypeSaveToCameraRoll]; ⑥   
  20.    
  21. [self presentViewController:activityVC animated:TRUE completion:nil];  ⑦   
  22.    
  23. }   
分别给出了提供的真实数据以及所需的UIActivity。当然这边是采用不包含的方式进行的。


第二种是自定义自己的UIActivity。这边和前边的很类似,不过这边有个自定义的UIActivity。

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. - (IBAction)shareAction:(id)sender {   
  2.    
  3. NSURL *urlToShare = [NSURL URLWithString:@"http://iosshare.cn/"]; ①   
  4.    
  5. NSArray *activityItems = @[urlToShare];   
  6.    
  7. BookActivity *bookActivity = [BookActivity new];  ②   
  8.    
  9. NSArray *applicationActivities = @[bookActivity];   
  10.    
  11. UIActivityViewController *activityVC = [[UIActivityViewController alloc]   
  12.    
  13. initWithActivityItems:activityItems   
  14.    
  15. applicationActivities:applicationActivities];  ③   
  16.    
  17. [self presentViewController:activityVC animated:YES completion:nil];   
  18.    
  19. }   

既然是自定义的,那么也需要能够处理你传入的数据。UIActivity是一个抽象类,你要使用它的子类,因此你需要继承它,而继承它的同时你又覆盖它的一些方法,来提供对处理这些数据的支持。

打开UIActivity文档,你会发现一些有意思的东西。一个UIActivity的分类包括UIActivityCategoryAction和UIActivityCategoryShare两种。而它的类型一般就是我们的UIActivity名。还需要提供标题和图片。另外的一些方法,看起来有点代理时候的意思。

- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems
指明了我们的应用能否对数据源数组作出回应。似乎有点麻烦,整个数组既可以是一组不同类型数据组成的一项,也可以是满足数据提供者的一个数据。如果是真实数据,我们只需要看看数组中有没有我们要处理的数据类型。如果是提供者,我们也得检查下它是否提供了我们关心的数据。


- (void)prepareWithActivityItems:(NSArray *)activityItems
这是在回应点击消息前的一些准备,譬如你要处理下数据,再做反应。这时候可以把关键的数据存起来。


- (void)performActivity
这时候就真的进行回应了。


关于如何响应点击事件的话呢,可以重写父类的方法:

- (void)activityDidFinish:(BOOL)completed;使用completed来判断是否完成回应。

想在UIActivityViewController消失的时候做点啥?

那就用下这个属性 completionHandler。




0 0
原创粉丝点击