56- Swift 之 UIActivity 的使用和自定义

一 、 UIActivity 的介绍

                一个抽象类的子类来实现App-Specific服务。这个类可以使用之前必须从它派生出子类。活动的工作对象是数据提供,并提供一些iOS的元信息可以显示给用户。对于更复杂的服务,一个活动对象还可以显示一个自定义用户界面和使用它来从用户收集更多的信息。

二、UIActivity 的使用要重写的方法

  • activityType : Activity 的类型

  • activityTitle : Activity 按钮下方显示的文字

  • activityImage : Activity 的按钮显示图像

  • canPerform(withActivityItems:) : Activity 是否允许显示按钮

  • prepare(withActivityItems:) :Activity 的事件执行前调用函数

  • activityCategory : Activity 按钮的类型( share / action)

  • activityViewController : 事件执行完毕后的跳转的控制器

  • perform() : 事件执行中调用的函数

  • activityDidFinish : 事件在 activityViewController 无返回值的时候,调用改完成函数。

三 、 UIActivity 的参数和方法的介绍

func IntroduceActivity() -> Void {
    /**
     创建一个 UIActivity
     */
    let KActivity = UIActivity.init()
    // MARK: Activity 的Params
    
    // TODO: Activity 的按钮类型
    /**
     UIActivityCategory 
     
     @params 
     
     action : 是按钮类型
     share:  分享类型
     
     */
    let ActionType = UIActivity.activityCategory
    print(ActionType)
    
    // TODO : 分享类型
    let ActivityType = KActivity.activityType
    print(ActivityType!)
    
    
    // TODO : 分享的文字
    let ActivityTitle = KActivity.activityTitle
    print(ActivityTitle!)
    
    
    // TODO : 分享的图像
    let ActivityImage = KActivity.activityImage
    print(ActivityImage!)
    

     // TODO: 是否显示分享按钮
    open func canPerform(withActivityItems activityItems: [Any]) -> Bool
     
     // TODO:解析分享数据时调用
     open func prepare(withActivityItems activityItems: [Any])
    
     // TODO: 分享成功调用
     open var activityViewController: UIViewController? { get }
     
     // TODO: 分享执行时调用
     open func perform()
     
     // TODO: 分享执行完毕时调用
     open func activityDidFinish(_ completed: Bool)

}

四 、 UIActivity 的子类创建实例

1> activityCategory 的类型是 Action 时

import UIKit

class NetworkMethodActivity: UIActivity {

    /**
     方法按钮图标
     */
    override var activityImage: UIImage? {
        return UIImage.init(named: "search")
    }
    
    /**
     按钮下方的文字
     */
    override var activityTitle: String? {
        return "NetWork搜索"
    }
    
    /**
     类型
     */
    override var activityType: UIActivityType? {
        return UIActivityType.init("NetWork小贱")
    }
    
    /**
     按钮的类型
     */
    override class var activityCategory: UIActivityCategory {
        return .action
    }
    
    
    /**
     判断是否显示事件按钮
     */
    override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
        return true
    }
    
    /**
     事件执行前调用的方法
     */
    override func prepare(withActivityItems activityItems: [Any]) {
        print("事件执行前")
    }
    
    
    /**
     事件执行中时调用
     */
    override func perform() {
        /**
         分享代码
         
         分享到 WeChat / QQ / Sina / 人人 等
         */
        activityDidFinish(true)
    }
    

    /**
     事件完成后跳转页面
     */
    override var activityViewController: UIViewController? {
        return nil
    }
    
    /**
     事件完成
     */
    override func activityDidFinish(_ completed: Bool) {
        print("事件调用完成")
    }
}

2> activityCategory 的类型是 share 时

import UIKit

class NetworkActivity: UIActivity {
    /**
     UIActivity 我们不能直接使用,我都是用继承UIActivity的子类。
     */
    
    /**
     模型参数
     */
    var wkText:String!
    var wkUrl:URL!
    var wkImage:UIImage!
    
    /**
     显示分享框内的名字
     */
    override var activityTitle: String?{
        return "NetWork分享"
    }
    
    /**
     显示在分享框里面的图片
     */
    override var activityImage: UIImage? {
        return (UIImage.init(named: "Image")?.withRenderingMode(.alwaysOriginal))
    }
    
    /**
     分享类型
     */
    override var activityType: UIActivityType? {
        return UIActivityType.init("NetWork小贱")
    }
    
    /**
     分享按钮的类型
     */
    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("发起分享")
    }
    
    /**
     分享执行中时调用
     */
    override func perform() {
        /**
         分享代码
         
         分享到 WeChat / QQ / Sina / 人人 等
         */
        activityDidFinish(true)
    }
    
    /**
     分享时调用
     */
    override var activityViewController: UIViewController? {
        
        return nil
    }
    
    /**
     分享结束调用
     
     注意:如果activityViewController 有返回值时,则 perform() 将不再调用
     */
    override func activityDidFinish(_ completed: Bool) {
         print("NetWork--分享成功")
    }

}

3> UIActivity 的调用实例

func activityStart() {
    /**
     按钮
     */
    let shareBtn = UIButton.init(type: .custom)
    shareBtn.frame = CGRect.init(x: 20, y: 80, width: self.view.frame.width-40, height: 40)
    shareBtn.setTitle("Activity 的自定义", for: .normal)
    shareBtn.backgroundColor = UIColor.cyan
    shareBtn.addTarget(self, action: #selector(btnClick), for: .touchUpInside)
    self.view.addSubview(shareBtn)
}

func btnClick() -> Void {
    /**
     传入分想的数据
     */
    let items:[Any] = ["NetWork小贱",UIImage.init(named: "Image")!,URL.init(string: "https://www.baidu.com")!]
    
    /**
     分享的按钮组件
     */
    let activities = [NetworkActivity(),NetworkMethodActivity()]
    
    /**
     分享的控件
     */
    let ActivityVc = UIActivityViewController.init(activityItems: items, applicationActivities: activities)
    
    /**
     排除其他按钮显示在分享框里面
     */
    ActivityVc.excludedActivityTypes = [.mail,.copyToPasteboard,.print,.assignToContact,.saveToCameraRoll,.addToReadingList]
    

    /**
     显示分享视图
     */
    self.present(ActivityVc, animated: true, completion: nil)
    
}

效果展示如下:

56- Swift 之 UIActivity 的使用和自定义_第1张图片
Untitled.gif

你可能感兴趣的:(56- Swift 之 UIActivity 的使用和自定义)