Swift - 自定义UIActivity分享

本文介绍如何在Swift中利用UIActivity和UIActivityViewController自定义分享功能,包括创建自定义分享按钮并控制其显示位置(分享按钮或动作按钮),同时展示了如何排除不需要的内置分享选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UIActivity可以十分方便地将文字、图片等内容进行分享,比如分享到微信、微博、发送邮件、短信等等。我们不仅可以分享内容出来,也可以在自己的App里添加自己的分享按钮或隐藏已有的分享按钮来实现定制的功能。

下面通过继承UIActivity实现定制按钮和功能,通过调用UIActivityViewController来展示分享框。
 
注意:UIActivityView面板有上下两行,上面一行是分享按钮(为彩色)。下面一行是动作按钮(图片自动变为黑白)。
下面我们分别在上下各添加一个自定义的功能按钮(“微信”“航歌”)作为演示。

效果图如下:
     

--- ViewController.swift ---
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import UIKit
 
class ViewController : UIViewController {
     
     override func viewDidLoad() {
         super .viewDidLoad()
     }
 
     override func didReceiveMemoryWarning() {
         super .didReceiveMemoryWarning()
     }
     
     //点击按钮弹出分享框
     @IBAction func btnClicked(sender: AnyObject ) {
         //准备分享内容,文本图片链接
         let items = [ "航歌" , UIImage (named: "toSendImage.png" )!,
             NSURL (fileURLWithPath: "http://hangge.com" )!]
         //新建自定义的分享对象数组
         let acts = [ WeiXinActivity (), HanggeActivity ()]
         //根据分享内容和自定义的分享按钮调用分享视图
         var actView: UIActivityViewController =
         UIActivityViewController (activityItems: items, applicationActivities: acts)       
         //要排除的分享按钮,不显示在分享框里
         actView.excludedActivityTypes = [ UIActivityTypeMail , UIActivityTypeCopyToPasteboard ,
             UIActivityTypePrint , UIActivityTypeAssignToContact , UIActivityTypeSaveToCameraRoll ]
         //显示分享视图
         self .presentViewController(actView, animated: true , completion: nil )
     }
}

 

--- HanggeActivity.swift ---
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import UIKit
 
class HanggeActivity : UIActivity {
     //用于保存传递过来的要分享的数据
     var text: String !
     var url: NSURL !
     var image: UIImage !
     
     //显示在分享框里的名称
     override func activityTitle() -> String ? {
         return "航歌"
     }
     
     //分享框的图片
     override func activityImage() -> UIImage ? {
         return UIImage (named: "swift.png" )
     }
     
     //分享类型,在UIActivityViewController.completionHandler回调里可以用于判断,一般取当前类名
     override func activityType() -> String ? {
         return HanggeActivity . self .description()
     }
     
     //按钮类型(分享按钮:在第一行,彩色,动作按钮:在第二行,黑白)
     override class func activityCategory() -> UIActivityCategory {
         return UIActivityCategory . Action
     }
     
     //是否显示分享按钮,这里一般根据用户是否授权,或分享内容是否正确等来决定是否要隐藏分享按钮
     override func canPerformWithActivityItems(activityItems: [ AnyObject ]) -> Bool {
         for item in activityItems {
             if item is UIImage {
                 return true
             }
             if item is String {
                 return true
             }
             if item is NSURL {
                 return true
             }
         }
         return false
     }
     
     //解析分享数据时调用,可以进行一定的处理
     override func prepareWithActivityItems(activityItems: [ AnyObject ]) {
         println ( "prepareWithActivityItems" )
         for item in activityItems {
             if item is UIImage {
                 image = item as ! UIImage
             }
             if item is String {
                 text = item as ! String
             }
             if item is NSURL {
                 url = item as ! NSURL
             }
         }
     }
     
     //执行分享行为
     //这里根据自己的应用做相应的处理
     //例如你可以分享到另外的app例如微信分享,也可以保存数据到照片或其他地方,甚至分享到网络
     override func performActivity() {
         println ( "performActivity" )
         //具体的执行代码这边先省略
     }
     
     //分享时调用
     override func activityViewController() -> UIViewController ? {
         println ( "activityViewController" )
         return nil
     }
     
     //完成分享后调用
     override func activityDidFinish(completed: Bool ) {
         println ( "activitydidfinish" )
     }
}

 

--- WeiXinActivity.swift ---

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import UIKit
 
class WeiXinActivity : UIActivity {
     //用于保存传递过来的要分享的数据
     var text: String !
     var url: NSURL !
     var image: UIImage !
     
     //显示在分享框里的名称
     override func activityTitle() -> String ? {
         return "微信"
     }
     
     //分享框的图片
     override func activityImage() -> UIImage ? {
         return UIImage (named: "wechat_session" )
     }
     
     //分享类型,在UIActivityViewController.completionHandler回调里可以用于判断,一般取当前类名
     override func activityType() -> String ? {
         return WeiXinActivity . self .description()
     }
     
     //按钮类型(分享按钮:在第一行,彩色,动作按钮:在第二行,黑白)
     override class func activityCategory() -> UIActivityCategory {
         return UIActivityCategory . Share
     }
     
     //是否显示分享按钮,这里一般根据用户是否授权,或分享内容是否正确等来决定是否要隐藏分享按钮
     override func canPerformWithActivityItems(activityItems: [ AnyObject ]) -> Bool {
         for item in activityItems {
             if item is UIImage {
                 return true
             }
             if item is String {
                 return true
             }
             if item is NSURL {
                 return true
             }
         }
         return false
     }
     
     //解析分享数据时调用,可以进行一定的处理
     override func prepareWithActivityItems(activityItems: [ AnyObject ]) {
         println ( "prepareWithActivityItems" )
         for item in activityItems {
             if item is UIImage {
                 image = item as ! UIImage
             }
             if item is String {
                 text = item as ! String
             }
             if item is NSURL {
                 url = item as ! NSURL
             }
         }
     }
     
     //执行分享行为
     //这里根据自己的应用做相应的处理
     //例如你可以分享到另外的app例如微信分享,也可以保存数据到照片或其他地方,甚至分享到网络
     override func performActivity() {
         println ( "performActivity" )
         //具体的执行代码这边先省略
     }
     
     //分享时调用
     override func activityViewController() -> UIViewController ? {
         println ( "activityViewController" )
         return nil
     }
     
     //完成分享后调用
     override func activityDidFinish(completed: Bool ) {
         println ( "activitydidfinish" )
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值