iOS7 CookBook精彩瞬间(三)UIActivityViewController的基本使用及自定义Activity
1.基本使用
UIActivityViewController主要用于分享内容,创建activityView的方法很简单,调用下面的方法创建:
[[UIActivityViewController alloc] initWithActivityItems: applicationActivities:]
第一个参数为要分享的内容数组,可以为任何类,常见的为NSString和UIImage,第二个为自定义Activity数组,每个Activity对应一个按钮,如果只使用系统默认的传入nil。
要显示这个View,使用modal的方式弹出即可。
2.自定义Activity
在微信中打开一个链接,可以通过右上角的按钮打开一个activityView来选择不同的功能,常用的有分享和复制链接,下面我们模拟这个情景,设计一个Activity,实现通过传入的地址用safari打开网站。
①要自定义Activity,要定义一个继承自UIActivity的类,然后重写获取标题、图片和有关活动允许的方法:
头文件:
#import <UIKit/UIKit.h> @interface BrowserActivity : UIActivity @end
m文件:
#import "BrowserActivity.h"
@interface BrowserActivity ()
@property (nonatomic, strong) NSArray *activityItems;
@end
@implementation BrowserActivity
- (NSString *)activityTitle{
return @"Browser";
}
- (UIImage *)activityImage{
return [UIImage imageNamed:@"browser"];
}
- (NSString *)activityType{ // type用于唯一标识活动,一个比较好的方法是用bundleIdentifier加上类名
return [[NSBundle mainBundle].bundleIdentifier stringByAppendingString:NSStringFromClass([self class])];
}
- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems{
return YES;
}
- (void)prepareWithActivityItems:(NSArray *)activityItems{
self.activityItems = [activityItems copy];
}
- (void)performActivity{
if (self.activityItems.count < 1) {
return;
}
NSString *url = [self.activityItems firstObject];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
}
其中title决定了按钮的标题,image决定了按钮的图片,type用于唯一标识activity。
为了安全性,系统会先调用- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems方法来询问是否可以执行,你可以根据items的类型判断是否合法,返回YES才会进一步操作,调用- (void)prepareWithActivityItems:(NSArray *)activityItems来加载数据,注意一般数据最好copy防止外部突然改变,最后系统会调用- (void)performActivity方法,在这个方法里执行Activity内容,我们是通过Safari打开这个URL。
注意:这里假设传入的元素只有一个,并且是NSString,没有判断,存在隐患,实际应用应该在canPerformWithActivityItems:方法中判断是否可执行。
②使用一个textField来编辑url,一个按钮来触发activityView:
#import "ViewController.h"
#import "BrowserActivity.h" @interface ViewController () <UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *textField;
@property (strong, nonatomic) UIActivityViewController *avc; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
} - (IBAction)shareClick:(id)sender { [self presentViewController:self.avc animated:YES completion:nil]; } - (UIActivityViewController *)avc{ if (_avc == nil) {
_avc = [[UIActivityViewController alloc] initWithActivityItems:@[self.textField.text] applicationActivities:@[[BrowserActivity new]]];
} return _avc; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [self.view endEditing:YES]; }
当按下share按钮时,会显示下图的界面:
可以看到第二行已经有了Browser这个Activity,注意系统把图片渲染成了黑色。
当点击了Browser时,即可执行活动,通过Safari打开特定URL。
iOS7 CookBook精彩瞬间(三)UIActivityViewController的基本使用及自定义Activity的更多相关文章
- iOS7 CookBook精彩瞬间(二)NSSet、通过Subscript访问类成员等
1.NSSet的用法 ①NSSet是一种无序集合,基于hash实现,可以在线性时间复杂度内查找某个元素,如果要让元素有序,应当使用NSOrderedSet,要让集合可变,与NSArray类似,使用NS ...
- iOS7 CookBook精彩瞬间(一)property、selector细节、__unused
1.我们常常使用nonatomic,很多人只知道它的效率较高,却不知道其含义,其含义是非线程安全的,也就是说多线程修改时不加锁,可能出现多个线程先后修改而成为脏数据的情况. 2.unsafe_unre ...
- 实操一下<python cookbook>第三版1
这几天没写代码, 练一下代码. 找的书是<python cookbook>第三版的电子书. *这个操作符,运用得好,确实少很多代码,且清晰易懂. p = (4, 5) x, y = p p ...
- python cookbook第三版学习笔记 一
数据结构 假设有M个元素的列表,需要从中分解出N个对象,N<M,这会导致分解的值过多的异常.如下: record=['zhf','zhf@163.com','775-555-1212','847 ...
- python cookbook第三版学习笔记十:类和对象(一)
类和对象: 我们经常会对打印一个对象来得到对象的某些信息. class pair: def __init__(self,x,y): self.x=x self. ...
- python cookbook第三版学习笔记十三:类和对象(三)描述器
__get__以及__set__:假设T是一个类,t是他的实例,d是它的一个描述器属性.读取属性的时候T.d返回的是d.__get__(None,T),t.d返回的是d.__get__(t,T).说法 ...
- python书籍推荐:Python Cookbook第三版中文
所属网站分类: 资源下载 > python电子书 作者:熊猫烧香 链接:http://www.pythonheidong.com/blog/article/44/ 来源:python黑洞网 内容 ...
- python cookbook第三版学习笔记二十一:利用装饰器强制函数上的类型检查
在演示实际代码前,先说明我们的目标:能对函数参数类型进行断言,类似下面这样: @typeassert(int, int) ... def add(x, y): ... return x + y ...
- python cookbook第三版学习笔记二十:可自定义属性的装饰器
在开始本节之前,首先介绍下偏函数partial.首先借助help来看下partial的定义 首先来说下第一行解释的意思: partial 一共有三个部分: (1)第一部分也就是第一个参数,是一个函数, ...
随机推荐
- empty()和size()的优劣
通常下面代码: if(c.size() == 0) if(c.empty()) 我们会觉得它们是是等价的. 为何empty()比较好? 主要是他们之间的效率有一定差距: empty对任意的容器都是常数 ...
- NOIP 2015
Prob.1 2015 神奇的幻方 模拟就好了.(这不是noip2017的初赛题么.)代码: #include<cstdio> #include<cstring> #inclu ...
- hdu 5636 搜索 BestCoder Round #74 (div.2)
Shortest Path Accepts: 40 Submissions: 610 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: ...
- 4455[Zjoi2016]小星星 容斥+dp
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 527 Solved: 317[Submit][Status] ...
- 数据挖掘实战<1>:数据质量检查
数据行业有一句很经典的话--"垃圾进,垃圾出"(Garbage in, Garbage out, GIGO),意思就是,如果使用的基础数据有问题,那基于这些数据得到的任何产出都是没 ...
- MySQL插件实现浅析——插件的调用
一. MySQL中的动态插件 最初想到这个问题是在学习mysql半同步复制相关问题的时候,为何在mysql运行时install半同步插件并开启后就能起到作用,他是如何让事务停下来等待的.安装插件的时候 ...
- HL7工具安装步骤
下载目录:http://gforge.hl7.org/gf/ 说明:在安装HL7V3学习工具之前,确保本机已安装IIS服务和Access数据库. 各种软件见附件. 1.下载安装步骤 RIM模型下载 ...
- face-alignment:用 pytorch 实现的 2D 和 3D 人脸对齐库
使用世界上最准确的面对齐网络从 Python 检测面部地标,能够在2D和3D坐标中检测点. 项目地址:https://github.com/1adrianb/face-alignment 作者: 阿德 ...
- Eclipse插件安装4种方法
第一种:直接复制法 假设Eclipse的安装目录在C:\eclipse,解压下载的eclipse 插件或者安装eclipse 插件到指定目录AA(如:c:\AA)文件夹,打开AA 文件夹,在AA文件夹 ...
- 关于一些基础的Java问题的解答(一)
学习一门语言基础是非常重要的,因此本文总结了一些常见的Java基础问题的解答,希望可以帮到大家. 1. 九种基本数据类型的大小,以及他们的封装类. 9种基本数据类型 基本类型 包装类型 大小 bool ...