Swift - 自定义UIActivity分享
作者:hangge | 2015-03-04 09:51
(本文代码已升级至Swift3)
下面通过继承 UIActivity 实现定制按钮和功能,通过调用 UIActivityViewController 来展示分享框。
注意:UIActivityView 面板有上下两行,上面一行是分享按钮(为彩色)。下面一行是动作按钮(图片自动变为黑白)。
下面我们分别在上下各添加一个自定义的功能按钮(“微信”“航歌”)作为演示。
效果图如下:

--- ViewController.swift ---
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
//点击按钮弹出分享框
@IBAction func btnClicked(_ sender: AnyObject) {
//准备分享内容,文本图片链接
let items:[Any] = ["航歌", UIImage(named:"toSendImage.png")!,
URL(fileURLWithPath:"http://hangge.com")]
//新建自定义的分享对象数组
let acts = [WeiXinActivity(),HanggeActivity()]
//根据分享内容和自定义的分享按钮调用分享视图
let actView:UIActivityViewController =
UIActivityViewController(activityItems: items, applicationActivities: acts)
//要排除的分享按钮,不显示在分享框里
actView.excludedActivityTypes = [.mail,.copyToPasteboard,.print,
.assignToContact,.saveToCameraRoll]
//显示分享视图
self.present(actView, animated:true, completion:nil)
}
}
--- HanggeActivity.swift ---
import UIKit
class HanggeActivity : UIActivity {
//用于保存传递过来的要分享的数据
var text:String!
var url:URL!
var image:UIImage!
//显示在分享框里的名称
override var activityTitle: String? {
return "航歌"
}
//分享框的图片
override var activityImage: UIImage? {
return UIImage(named:"hangge.png")
}
//分享类型,在UIActivityViewController.completionHandler回调里可以用于判断,一般取当前类名
override var activityType: UIActivityType? {
return UIActivityType(rawValue: HanggeActivity.self.description())
}
//按钮类型(分享按钮:在第一行,彩色,动作按钮:在第二行,黑白)
override class var activityCategory: UIActivityCategory {
return .action
}
//是否显示分享按钮,这里一般根据用户是否授权,或分享内容是否正确等来决定是否要隐藏分享按钮
override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
for item in activityItems {
if item is UIImage {
return true
}
if item is String {
return true
}
if item is URL {
return true
}
}
return false
}
//解析分享数据时调用,可以进行一定的处理
override func prepare(withActivityItems activityItems: [Any]) {
print("prepareWithActivityItems:hangge")
for item in activityItems {
if item is UIImage {
image = item as! UIImage
}
if item is String {
text = item as! String
}
if item is URL {
url = item as! URL
}
}
}
//执行分享行为
//这里根据自己的应用做相应的处理
//例如你可以分享到另外的app例如微信分享,也可以保存数据到照片或其他地方,甚至分享到网络
override func perform() {
print("performActivity:hangge")
//具体的执行代码这边先省略
//......
activityDidFinish(true)
}
//分享时调用
override var activityViewController: UIViewController? {
print("activityViewController:hangge")
return nil
}
//完成分享后调用
override func activityDidFinish(_ completed: Bool) {
print("activitydidfinish:hangge")
}
}
--- WeiXinActivity.swift ---
import UIKit
class WeiXinActivity : UIActivity {
//用于保存传递过来的要分享的数据
var text:String!
var url:URL!
var image:UIImage!
//显示在分享框里的名称
override var activityTitle: String? {
return "微信"
}
//分享框的图片
override var activityImage: UIImage? {
return UIImage(named:"wechat_session")
}
//分享类型,在UIActivityViewController.completionHandler回调里可以用于判断,一般取当前类名
override var activityType: UIActivityType? {
return UIActivityType(rawValue: WeiXinActivity.self.description())
}
//按钮类型(分享按钮:在第一行,彩色,动作按钮:在第二行,黑白)
override class var activityCategory: UIActivityCategory {
return .share
}
//是否显示分享按钮,这里一般根据用户是否授权,或分享内容是否正确等来决定是否要隐藏分享按钮
override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
for item in activityItems {
if item is UIImage {
return true
}
if item is String {
return true
}
if item is URL {
return true
}
}
return false
}
//解析分享数据时调用,可以进行一定的处理
override func prepare(withActivityItems activityItems: [Any]) {
print("prepareWithActivityItems:weixin")
for item in activityItems {
if item is UIImage {
image = item as! UIImage
}
if item is String {
text = item as! String
}
if item is URL {
url = item as! URL
}
}
}
//执行分享行为
//这里根据自己的应用做相应的处理
//例如你可以分享到另外的app例如微信分享,也可以保存数据到照片或其他地方,甚至分享到网络
override func perform() {
print("performActivity:weixin")
//具体的执行代码这边先省略
//......
activityDidFinish(true)
}
//分享时调用
override var activityViewController: UIViewController? {
print("activityViewController:weixin")
return nil
}
//完成分享后调用
override func activityDidFinish(_ completed: Bool) {
print("activitydidfinish:weixin")
}
}
全部评论(2)
希望更新一下
站长回复:代码已更新,你可以再看下。
大神,动作图标默认变灰貌似很坑啊,cancel按钮怎么设置文字,一行里即使没有Activity,也出现一个more…… 很多问题。。。。。 总觉的这个类定制过度,并且也没有相关属性可以设置,不知道别人的例子是怎么弄出来的?
站长回复:确实像你说的一样,UIActivityViewController在个性化定制方面很弱,more、变灰这些是无法设置改变的。你看到别人的例子我想他们应该是通过自定义组件实现的,而不是用UIActivityViewController。