Swift - 自定义UIActivity分享
(本文代码已升级至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") } }
希望更新一下
大神,动作图标默认变灰貌似很坑啊,cancel按钮怎么设置文字,一行里即使没有Activity,也出现一个more…… 很多问题。。。。。 总觉的这个类定制过度,并且也没有相关属性可以设置,不知道别人的例子是怎么弄出来的?