当前位置: 首页 > 编程日记 > 正文

UIActivityViewController使用

苹果从iOS6开始,提供了一个活动列表视图,为分享和操作数据提供了一个统一的服务接口,通过UIActivityViewController来控制它的呈现和关闭,凡是继承UIActivity抽象类的子类对象都可以放在列表中呈现出来。如下图所示:


活动列表

通过下面代码,就可以调出视图:

- (IBAction)activity:(id)sender {// 设置分享内容NSString *text = @"分享内容";UIImage *image = [UIImage imageNamed:@"1.jpg"];NSURL *url = [NSURL URLWithString:@"https://www.baidu.com"];NSArray *activityItems = @[text, image, url];UIActivityViewController *activityViewController =    [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];[self presentViewController:activityViewController animated:YES completion:nil];// 选中活动列表类型[activityViewController setCompletionWithItemsHandler:^(NSString * __nullable activityType, BOOL completed, NSArray * __nullable returnedItems, NSError * __nullable activityError){NSLog(@"act type %@",activityType);}];
}

默认情况下,如没有指定 UIActivityViewController 的 applicationActivities ,那么系统将会自动检测所有可用于所提供内容的服务,显示在列表中,我们也可以排除特定的 Activity 类型。
activityViewController.excludedActivityTypes = @[UIActivityTypePostToFacebook];

当我们点击活动列表中的选项时,系统会作出相应的操作,例如常见的,微博、微信、QQ的分享:



![微博分享]

微信分享

QQ分享

自定义 UIActivity

如果系统提供的操作不能满足我们的需求,也可以自定义UIActivity,可获取按钮选择事件,手动的进行处理。下面就来手动的实现微博分享操作。

1.创建WeiboActivity:
//WeiboActivity.m
#import "WeiboActivity.h"
@implementation WeiboActivity+ (UIActivityCategory)activityCategory{return UIActivityCategoryShare;
}- (NSString *)activityType{return @"com.myz.share.weibo.post";
}
//显示在列表中的图标
- (UIImage *)activityImage{return [UIImage imageNamed:@"share_weibo"];
}
//显示在列表中标题
- (NSString *)activityTitle{return @"微博分享";
}- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems{return YES;
}- (void)prepareWithActivityItems:(NSArray *)activityItems{
}- (void)performActivity {if (self.performWeiboActivityBlock) {self.performWeiboActivityBlock();}[self activityDidFinish:YES];
}
@end
  • UIActivity 类型:
+ (UIActivityCategory)activityCategory;
- (NSString *)activityType;

UIActivity 类型又分为“分享”和“操作”两大类,如下图所示:


UIActivityType
  • 列表未显示前判断是否显示该activity,YES显示。这里可以根据将要分享的内容activityItems来判断是否在列表中显示该activity。例如微博分享最多九张图,在这里可以判断是否超过,从而来确定是否显示。
- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems;
  • 点击该activity后调用的方法
- (void)performActivity;
2.自定义好了activity后就可以显示了:
    WeiboActivity * weiboActivity = [[WeiboActivity alloc] init];weiboActivity.performWeiboActivityBlock = ^{[self socialSinaWeibo];};NSArray * activitys = @[weiboActivity];UIActivityViewController *activityViewController =    [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:activitys];[self presentViewController:activityViewController animated:YES completion:nil];

自定义分享按钮
3.分享到微博

想要分享到微博,获取到点击事件后还需要进一步的处理,这里使用系统的微博分享接口,使用前需要在系统设置中登陆微博账号

//@import Social
- (void)socialSinaWeibo {// 1. 判断设备是否支持指定的分享平台// SLComposeViewController:社交分享的视图控制器BOOL isAvailable = [SLComposeViewController isAvailableForServiceType:SLServiceTypeSinaWeibo];if (isAvailable == NO) {NSLog(@"应用不支持新浪微博分享");return;}// 2. 创建分享视图控制器,并指定分享平台SLComposeViewController *composeVC = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeSinaWeibo];/* 系统支持的分享功能可以分享的平台SOCIAL_EXTERN NSString *const SLServiceTypeTwitterSOCIAL_EXTERN NSString *const SLServiceTypeFacebookSOCIAL_EXTERN NSString *const SLServiceTypeSinaWeiboSOCIAL_EXTERN NSString *const SLServiceTypeTencentWeiboSOCIAL_EXTERN NSString *const SLServiceTypeLinkedIn*/    // 3. 设置分享内容[composeVC setInitialText:@"微博分享"];[composeVC addImage:[UIImage imageNamed:@"1.png"]];[composeVC addURL:[NSURL URLWithString:@"https://www.baidu.com"]];// 4. 进入分享界面[self presentViewController:composeVC animated:YES completion:^{NSLog(@"进入分享界面");}];// 5. 监听用户操作[composeVC setCompletionHandler:^(SLComposeViewControllerResult result) {if (result == SLComposeViewControllerResultCancelled) {NSLog(@"取消分享");}else if (result == SLComposeViewControllerResultDone) {NSLog(@"分享成功");}}];}

微博分享

分享结果

这样就可以实现自定义的微博分享的功能,可在微博中查看分享的内容,显示来自iOS。

Demo: https://github.com/MA806P/ActivityDemo

References

https://github.com/nixzhu/dev-blog/blob/master/2014-04-22-ui-activity-viewcontroller.md
http://www.jianshu.com/p/9de528d96466


相关文章:

SQL Server系统表sysobjects介绍与使用

关于SQL Server数据库的一切信息都保存在它的系统表格里。我怀疑你是否花过比较多的时间来检查系统表格,因为你总是忙于用户表格。但是,你可能需要偶尔做一点不同寻常的事,例如数据库所有的触发器。你可以一个一个地检查表格,但是…

手动部署OpenStack环境(三:OpenStack环境预配置)

任务三、OpenStack环境预配置 3.1、本地OpenStack yum源制作 任务三:OpenStack环境预配置 3.1、本地OpenStack yum 源制作 3.1.1、拷贝镜像文件源到本地 3.1.2、查看createrepo是否安装,并使用yum方法安装。 (此操作只在controller0主机进…

Java 集合框架(二)—— ArrayList

二、数组列表 —— ArrayList 1、构造方法 ArrayList 是 Java 中的动态数组,底层实现就是对象数组,只不过数组的容量会根据情况来改变。 它有个带 int 类型参数的构造方法,根据传入的参数,扩展初始化的数组容量,这个方…

Linux X Window System运行原理和启动过程

本文主要说明X Window System的基本运行原理,其启动过程,及常见的跨网络运行X Window System。 一) 基本运行原理 X Window System采用C/S结构,但和我们常见的C/S不同。常见的C/S结构中,称提供服务的一方为server,即服…

悬浮球 / 悬浮按钮 / 辅助按钮

原文链接:https://github.com/jinht/FloatingBall类似于 iOS 系统自带的 AssistiveTouch / 京东 / 聚划算 / 建行等的辅助按钮 —— 由anticipate_91分享FloatingBall Function Description 这是一个类似于iOS系统自带的AssistiveTouch/京东《我的》部分的悬浮按钮等…

手动部署OpenStack环境(四:安装控制器必备软件)

任务四、安装控制器必备组件 4.1、安装MySQL服务(controller0) 4.2、安装Rabbitmq消息队列(controller0) 4.3、Keystone认证(controller0) 4.4、glance的安装与配置(controller0) 4.…

cocoaPods安装、更新第三方库

pod install 换成 pod install --verbose --no-repo-update pod update 换成 pod update --verbose --no-repo-update这是因为:目前,cocoaPods正在被墙中......转载于:https://www.cnblogs.com/hello-Huashan/p/5542456.html

iOS 性能优化总结

原文链接:https://github.com/skyming/iOS-Performance-Optimization关于 iOS 性能优化梳理: 基本工具、业务优化、内存优化、卡顿优化、布局优化、电量优化、 安装包瘦身、启动优化、网络优化等 —— 由_skyming_分享关于iOS 性能优化梳理: …

TCP/IP协议分析

一;前言 学习过TCP/IP协议的人多有一种感觉,这东西太抽象了,没有什么数据实例,看完不久就忘了。本文将介绍一种直观的学习方法,利用协议分析工具学习TCP/IP,在学习的过程中能直观的看到数据的具体传输过程。 为了初学者…

手动部署OpenStack环境(五:新建网络及部署虚拟机)

任务五、新建网络及部署虚拟机 5.1、配置安全组规则 5.2、新建网络 5.3、创建云主机 任务五、新建网络及部署虚拟机 5.1、配置安全组规则 5.1.1、配置安全组; 5.2、新建网络。 5.2.1、创建外部网络; 5.2.2、网络地址为外部网络连接的子网地址&#xff1b…

C++基础day01 程序设计方法的发展历程

类把属性和方法作了封装! 总结: 面向过程程序设计:数据结构 算法 主要解决科学计算问题,用户需求简单而固定 特点: 分析解决问题所需要的步骤 利用函数实现各个步骤 依次调用函数解决问题 问题: 软件可重用…

【android】android中activity的生命周期

activity生命周期: 实例代码: 1 public class DemoActivity extends Activity {2 3 //1、activity第一次被创建的时候,执行4 Override5 public void onCreate(Bundle savedInstanceState) {6 super.onCreate(savedIn…

Xcode消除编译器警告

Whenever,Xcode警告对于我们来说都相当重要,提醒我们可能存在的错误。但是有时候,我们知道一切都好,everything is in the palm of my hand,我们想要消除那些警告。自己项目的警告 比如我们定义一个designated initial…

手动部署OpenStack环境(六:出现的问题与解决方案总结)

排错一:keystone服务安装中demo用户表单没信息。 排错思路: 组件安装是否有问题;用户创建畲缶有问题;用户认证信息是否合适;原因:用户的认证信息配置错误。 解决方案: a)删除有关demo用户的所有…

一劳永逸,iOS 自定义 ActionSheet 封装流程

原文链接:http://www.jianshu.com/p/cfb87a7db7b1本文为 iOS 自定义视图封装《一劳永逸》系列的第四期,旨在提供封装思路,结果固然重要,但理解过程才最好。授人以鱼不如授人以渔。 —— 由卖报的小画家Sure分享前言 本文为iOS自定…

cocoapods更新

使用sudo gem install cocoapods更新提示: ERROR: While executing gem ... (Errno::EPERM) Operation not permitted 改为:sudo gem install -n /usr/local/bin cocoapods --pre刷刷刷完成更新。但是马上发下更新后使用pod install又发现一个问题 The …

创建对象_工厂方法(Factory Method)模式 与 静态工厂方法

工厂方法模式: 定义:为创建对象定义一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟至子类。应用场景:客户类不关心使用哪个具体类,只关心该接口所提供的功能;创建过程比较复杂&#xff0c…

数据通信技术(一:IP划分)

一、某公司生产部有50人,销售部有100人,财务部有25人,客服部有12人,没个员工配置一台主机,该公司有192.168.100.1/24的网段可用,应该如何划分子网。 销售部(100)台:/25 …

团队作业—第二阶段06

站立会议: 继续数据库的连接编程。 任务进度: 实现数据的输出。 站立会议照片: 任务看板: 燃尽图: 转载于:https://www.cnblogs.com/cpljlgs/p/5546157.html

Fade 数字切换动效

原文链接:http://www.jianshu.com/p/983674e6f4ef根据原型高度还原的一个动效作品。希望可以通过审核。谢谢。 —— 由Bear1494735376123分享欢迎同样喜爱动效的你加入 iOS动效特攻队–>QQ群:547897182 iOS动效特攻队–>熊熊:64807025…

fieldset 使用小案例

有初学者问到如何做出如下页面: 对应的代码如下: <fieldset><legend>★审核状态</legend><input name"state" type"radio" class"input1" value"1" />已审核<input name"state" type"radio…

数据通信技术(二:交换机配置管理)

交换机配置与管理&#xff08;思科模拟器&#xff09; 1.从用户模式进入特权模式,并进入配置模式设置进入特权模式的密码; 2.进入交换机的端口模式并进行端口状态的设置; 用新密码登录并查看接口状态信息,重启交换机;4.硬件和软件版本查询: 5.设备CPU的利用率: 6.检查设备的MA…

iOS之各种区别

作者 APP叫我取个帅气的昵称 关注 2017.05.15 10:47* 字数 140 阅读 1273评论 7喜欢 51写在前面&#xff1a;本文持续更新&#xff0c;也欢迎简友提供更多的关于iOS&#xff08;包括swift&#xff09;中的区别 1. _ _block和 _ _weak修饰符的区别的&#xff1a; (1). _ _block不…

lightoj 1014

lightoj 1014 Ifter Party 链接&#xff1a;http://www.lightoj.com/volume_showproblem.php?problem1014 题意&#xff1a;给你两个数 p, l&#xff0c;求 cha&#xff08;cha p-l&#xff09;的约数&#xff0c;当约数大于 l 时&#xff0c;按从小到大输出 思路&#xff1a…

poj 2681 字符串

http://poj.org/problem?id2681 给你任意长度的字符串&#xff0c;找出两串字符中不相同的字符个数&#xff08;总数&#xff09; #include<string> #include<cstring> #include<iostream> #include<cstdio> using namespace std; int main() {int n;…

数据通信技术(三:VLAN划分)

VLAN划分 1.配置环境 &#xff1a;创建4台PC机&#xff0c;并为PC机配置IP PC0&#xff1a;192.168.1.1/24 PC1&#xff1a;192.168.1.2/24 PC2&#xff1a;192.168.1.3/24 PC3&#xff1a;192.168.1.4/24 2.修改交换机名称&#xff1a; 创建VLAN1和VLAN2&#xff1a;…

CSS(2 )-- CSS样式大全

常用css样式大全Author&#xff1a;xu_shuyi201504039.CSS颜色代码大全http://www.cnblogs.com/axing/archive/2011/04/09/CSS.html1.CSS文字属性color : #999999; /*文字颜色*/font-family : 宋体,sans-serif; /*文字字体*/font-size : 9pt; /*文字大小*/font-style:itelic; /…

java io读书笔记(6) Writing Arrays of Bytes

显而易见&#xff0c;一次性写出一堆数据&#xff0c;要比一个byte一个byte的写&#xff0c;快多了&#xff0c;因此&#xff0c;outputstream&#xff0c;给出了2个增强型的write&#xff1a; public void write(byte[] data) throws IOException public void write(byte[] da…

iOS 自定义双向滑块Slider

ZPSlider 一个双向滑块的Slider 前提 这个是在一次和朋友吃饭的时候&#xff0c;我们唠嗑的时候他说的一个需求。因为系统的Slider是只有一个滑块的&#xff0c;而且没有分段滑动的效果。 这不最近都在研究这么个需求。 How to use it -(instancetype)initWithFrame:(CGRec…

数据通信技术(四:链路聚合)

1、修改交换机名称 2、配置A交换机数据 3、配置B交换机数据 4、创建VLAN 5、互拼验证 6、去掉一条链路再进行验证 数据通信技术&#xff08;一&#xff1a;IP划分&#xff09; https://blog.csdn.net/qq_37823605/article/details/90345408 数据通信技术&#xff08;二&#xf…