IOS6 新特性之UIActivityViewController详解
首先 从实际效果入手,上两张图。
在iphone和ipod touch上采用模态呈现

而在ipad上 则采用Popoverview方式弹出

虽然在iphone 和 ipad上的展现方式不同 但是 它们展现的都是一个东西。
这也就是此次要谈及的新特性的关键 UIActivityViewController
The UIActivityViewController class is a standard view controller that you can use to offer various services from your application.(引用文档原话)
即该viewcontroller是一个用来提供各种各样的服务的一个标准的viewcontroller。
如图 可以提供E-mail Twitter Facerbook 等分享。(由于是模拟器打印等操作没有呈现出来 而最后的RenRen是我自己添加的 稍后会提到之一)
说一说我自己的理解。
其实UIActivityViewCOntroller 管理着的那个View 以固定的形式展现出来(模态 或者 PopoverView)。
View中的内容 是使用各类服务的按钮。IOS6自带的标准服务有E - mail,各类大型社交网络的分享,打印,拷贝,保存等等。(成为ActivityType 稍后也会提到之二)
当然 自己也可以添加一些服务,比如上图所示的人人一键分享。那个爱心 以及 文字都是自定义的 当然 点击后 也会有个自定义方法。
说了这么多文字性质的,那么接下来 就从代码角度看一看这个UIActivityViewController到底是如何工作的了。
Test *dz = [[Testalloc]init];
//这UIActivityRenren 对应的便是RenRen的那个按钮 稍后提到之一
NSArray *activity = [[NSArrayalloc] initWithObjects:dz,nil];
NSArray *activityItems = [[NSArrayalloc]initWithObjects:
//保存 分享等服务的方法 需要传入文字和图片 这个NSArray中保存的就是这个。
@"Padgram",
@"Dz",
[UIImageimageNamed:@"background1.png"],nil];
// 初始化一个UIActivityViewController 2个参数 第一个是服务所需参数 第二个是自定义添加的服务列表
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:activity];
// 写一个bolck,用于completionHandler的初始化
UIActivityViewControllerCompletionHandler myBlock = ^(NSString *activityType,BOOL completed)
{
NSLog(@"%@", activityType);
if (completed) {
NSLog(@"completed");
} else
{
NSLog(@"cancled");
}
[activityVC dismissViewControllerAnimated:YEScompletion:Nil];
};
// 初始化completionHandler,当post结束之后(无论是done还是cancell)该block都会被调用
activityVC.completionHandler = myBlock;
// 以PopoverView方式展现出UIActivityViewController
self.sharePopover = [[UIPopoverControlleralloc] initWithContentViewController:activityVC];
[self.sharePopover presentPopoverFromRect:self.shareBtn.frame
inView:self.view
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
由上述代码可以总结出UIActivityView的三要素 初始化 completionHandler 以及呈现方式
一、初始化方法
initWithActivityItems:activityItems applicationActivityies:activity
有两个参数。第一个 activityItems 是调用服务时传递给服务的一个数据数组 里面可能有你要email 分享 或者 打印等的 文字 或图片。
第二个 activity 是一个数组 里面存放着UIActivityRenren 这个参数便是我们自定义添加的服务数组
二、completionHandler
这是UIActivityViewController的两个参数之一
ps: 另外一个参数是excludedActivityTypes 类型为NSarray 可以理解为禁用服务列表
例如 该属性中存在元素UIActivityTypeMail 则UIActivityView中则没有Mail这个服务选项。
当用户完成了服务的选择操作,或者当用户释放了view controller,
那么viewcontroller会执行completion handler,以便让你的应用程序知道用户操作的最终结果。
此处笔者由于水平十分有限。。也没有弄得特别明白 十分抱歉。
三、呈现方式
之前已经提过
iphone或者ipod touch 使用模态方式呈现 例:[self presentViewController:activityVC animated:YEScompletion:Nil];
ipad则用PopoverVIew呈现 如代码中所写
那么 接下来就该把前文中一些没有提及的给补充起来 其中 最为重要的是UIActivity
UIActivity 是一个抽象类,用于提供一些特定程序的服务。
它和UIActivityViewController对象联合起来使用,为用户呈现一些相关服务。
众所周知,抽象类无法直接生成对象。只能以它为父类,生成一些子类。
在IOS6中,已经有一些写好的UIActivity子类。比如 e-mail,Facebook,sinaweibo等服务。
但是仅仅是这些自带的,是远远不能满足用户的需求的。比如 对中国用户 而已 他们需要一键分享到人人的服务,这个类似sinaweibo。可是 IOS6原生并不自带这个服务。所以需要自己去写,也就是 subclass UIAcitivity 然后 复写父类的一些方法。
以下摘自IOS6说明文档
Methods to Override
When subclassing, you must always override the following methods and use them to provide information about your service:
- - (NSString *)activityType
- - (NSString *)activityTitle
- - (UIImage *)activityImage
- - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems;
- - (void)prepareWithActivityItems:(NSArray *)activityItems;
UIActivityViewController object,
which is responsible for presenting services to the user.
翻译过来就是 要继承UIActivity 至少要复写以上5个方法 然后 和 UIActivityViewController对象一起实现自定义服务。
这五个方法中的前三个 顾名思义 第一个是activityType 说到这个 便把上文的稍后提到之二一并写出
IOS6是自带了一些标准服务的 如e-mail 打印 分享至各类社交网络 那么 这些便是不同的activityType
下面贴上一个标准服务的ActivityType表
Constants
Built-in Activity Types
Activity types for which the system has built-in support.
NSString *const UIActivityTypePostToFacebook;
NSString *constUIActivityTypePostToTwitter;
NSString *constUIActivityTypePostToWeibo;
NSString *constUIActivityTypeMessage;
NSString *constUIActivityTypeMail;
NSString *constUIActivityTypePrint;
NSString *constUIActivityTypeCopyToPasteboard;
NSString *constUIActivityTypeAssignToContact;
NSString *constUIActivityTypeSaveToCameraRoll;
回到原题 activityType这个方法就是要你 返回一个NSString 作为该UIActivity的Type
第二个和第三个 则是在UIActivityView中显示的标题和图标 返回值分别是NSString 和 UIImage
第四个返回YES or NO表示该服务是否在UIActivityView中显示
而第五个最为重要 这个方法里面写的是 点击服务后(该方法会受到ActivityItems参数) 要做的事 你们可以先NSLog体会一下(这里面写的就是各种服务了 比如一键人人)
实战遇到的问题
Question1 :如果在设置中没有事先登陆各类分享账号 那么弹出的UIActivityView中便没有对应的服务。。。坑爹啊= =不是应该点了之后提示设置的么
时间关系。。这个我稍后再解决。。。。
另外 我看到一些人反应说有些标准服务 比如 微博 facebook 显示不了 这个问题可能的原因之一 是你设定activityItem时 添加了不该添加的东西= = 让我们先来看一看帮助文档
UIActivityTypePostToFacebook
The object posts the provided content to the user’s wall on Facebook. When using this service, you can provideNSString, NSAttributedString, UIImage, AVAsset,
and NSURL objects
as data for the activity items. You may also specifyNSURL objects
whose contents use the assets-library scheme.
以Facebook服务为例 它只能以NSString,NSAttributedString, UIImage, AVAsset,
and NSURL这些类作为其activityItem的数据
如果有其他的对象包含在里面 那么 在UIActivityView上 是不会显示Facebook的服务的。
通过后来的实验发现另外一个导致这种情况的原因,而且应该是出现该问题最主要的原因,就是用户并没有在设置里面添加对应的账户。比如没有添加facebook的账户 uiactivityview里面 便没有facebook的选项。
其次 要注意到的是,模拟器中 虽然我们没有设置对应的社交网络的账号。但是,它的uiactivityview 中所有的服务 facebook twitter 以及新浪微博 都是存在的。这是因为 某个检测设备是否关联了对应服务的方法,在模拟器上 无论实际情况如何 它返回的值都是true 也就意味着 关联的对应服务。所以才能得以在uiactivityview上显示所有的服务。这个方法如下(检测新浪微博是否关联)
[SLComposeviewcontroller isAvailableForServiceType:SLServiceTypeSinaWeibo];
有兴趣的可以自行在IOS6的特性文档中查询一下SLComposeviewcontroller
在之后的介绍文章中 我也会针对SLComposeviewcontroller做一些介绍。
IOS6 新特性之UIActivityViewController详解的更多相关文章
- Swift 3 新特性和迁移详解
写在前面 Swift 3.0 正式版发布了差不多快一个月了,断断续续的把手上和 Swift 相关的迁移到了Swift 3.0.所以写点小总结. 背景 代码量(4万行) 首先,我是今年年初才开始入手 S ...
- h5新特性 File API详解
之前一直觉得h5的新特性就是一些新标签呢,直到想研究一下图片上传预览的原理,才发现还是有好多新的api的,只是不兼容ie低版本,挺可惜的, File API在表单中文件输入字段基础上,又添加了一些直接 ...
- [C++11新特性] 智能指针详解
动态内存的使用很容易出问题,因为确保在正确的时间释放内存是极为困难的.有时我们会忘记释放内存产生内存泄漏,有时提前释放了内存,再使用指针去引用内存就会报错. 为了更容易(同时也更安全)地使用动态内存, ...
- Android新特性Instant Run详解
关于 Instant Run Android Studio 2.0 中引入的 Instant Run 是 Run 和 Debug 命令的行为,可以大幅缩短应用更新的时间.尽管首次构建可能需要花费较长的 ...
- java8 array、list操作 汇【3】)(-Java8新特性之Collectors 详解
//编写一个定制的收集器 public static class MultisetCollector<T> implements Collector<T, Multiset<T ...
- Spring Boot 2.3 新特性优雅停机详解
什么是优雅停机 先来一段简单的代码,如下: @RestController public class DemoController { @GetMapping("/demo") p ...
- Flex布局新旧混合写法详解(兼容微信)
原文链接:https://www.usblog.cc/blog/post/justzhl/Flex布局新旧混合写法详解(兼容微信) flex是个非常好用的属性,如果说有什么可以完全代替 float 和 ...
- Hadoop 新 MapReduce 框架 Yarn 详解
Hadoop 新 MapReduce 框架 Yarn 详解: http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/ Ap ...
- iOS 6分享列表——UIActivityViewController详解
iOS 6分享列表——UIActivityViewController详解 2013-06-03 01:42:33 发表评论 在iOS 6之后提供了一个分享列表视图,它通过UIActivity ...
随机推荐
- mysql sql的分类、运算符、常用的数据类型
SQL (结构化查询语言)的分类 DML(数据操作语言),关键字 insert,update,delete, DCL(数据控制语言),控制权限,grand,revoke 授权,回收 DDL(数据定义语 ...
- VBS脚本完美实现开机延时启动
目录 概述 vbs内容示例: vbs示例语句分析 自定义vbs脚本 一些问题和解决方法 概述 系统开机时,顺带自动启动了不少驱动程序,使得电脑开机后鼠标要呆滞许久.为了加快windows的开机速度 ...
- leetcode-第10周双周赛-5081-歩进数
题目描述: 自己的提交:参考全排列 class Solution: def countSteppingNumbers(self, low: int, high: int) -> List[int ...
- JQuery Ajax 向后台传参方式
在jquery的ajax函数中,可以传入3种类型的数据 文本:"uname=alice&mobileIpt=110&birthday=1983-05-12" jso ...
- 【转载】OpenCL实现矩阵相乘
矩阵相乘其实就是前一个矩阵的每一行乘以后一个矩阵的每一列,然后将乘后的每一个数字相加,得到结果矩阵的指定位置的数值.具体算法回顾一下线性代数即可.但是这种行列相乘其实都是独立的,如果是CPU计算必须串 ...
- 剑指Offer-14:输入一个链表,输出该链表中倒数第k个结点。
题目描述: 输入一个链表,输出该链表中倒数第k个结点.例如有一个链表有六个节点1,2,3,4,5,6.则它的倒数第二个节点为5 节点定义如下: public class ListNode { int ...
- System.Clollections.IEnumerable.cs
ylbtech-System.Clollections.IEnumerable.cs 1.程序集 mscorlib, Version=4.0.0.0, Culture=neutral, PublicK ...
- 分类算法之朴素贝叶斯分类(Naive Bayesian classification)
分类算法之朴素贝叶斯分类(Naive Bayesian classification) 0.写在前面的话 我个人一直很喜欢算法一类的东西,在我看来算法是人类智慧的精华,其中蕴含着无与伦比的美感.而每次 ...
- 转:Linux环境下段错误的产生原因及调试方法小结
源地址:http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 补充:http://baike.baidu.com/link ...
- day21-time与random等常用模块与包
2018-08-05 # ********************day21-time与random等常用模块与包 ******************* # 参考资料# python模块(转自Yua ...