支付集成ios专题iOS 开发相关

iOS UIActivityViewController原生多图

2017-06-05  本文已影响728人  知忧丶

前言

UIActivityViewController是iOS平台提供的一种工具类,其中包含了一些社会化插件。iOS平台提供的社会化工具和我们日常使用的友盟、shareSDK、百度分享各有优缺点。

实现

最基本的使用:

func activity() -> () {
        
        let image = UIImage(named: "1.jpg")
        ///  applicationActivities 可以没有元素,系统会自动选择合适的平台
        let activityController = UIActivityViewController(activityItems: ["分享的文字", image!], applicationActivities: [])
        
        /// 可以排除一些不希望的平台 UIActivityType
        activityController.excludedActivityTypes = [.postToTencentWeibo, .airDrop, .openInIBooks, .postToVimeo, .postToFlickr, .addToReadingList, .saveToCameraRoll, .assignToContact, .copyToPasteboard, .print, .mail]
        
        /// 分享完成后可以看到分享平台的相关字符串
        <!--  部分打印内容
 /// UIActivityType(_rawValue: com.apple.UIKit.activity.PostToWeibo)
/// UIActivityType(_rawValue: com.tencent.mqq.ShareExtension) // qq
/// UIActivityType(_rawValue: com.apple.mobilenotes.SharingExtension) 笔记
/// UIActivityType(_rawValue: com.tencent.xin.sharetimeline) weixin
/// com.apple.UIKit.activity.PostToFlickr
/// com.apple.UIKit.activity.PostToVimeo
        -->
        
        activityController.completionWithItemsHandler = {
            (type, flag, array, error) -> Swift.Void in
            print(type ?? "")
        }
        
        present(activityController, animated: true) { }
    }

注意事项

#import <UIKit/UIKit.h>
@interface ActivityItem : NSObject<UIActivityItemSource>

- (instancetype)initWithImage:(UIImage *)image path:(NSURL *)path;

@end

#import "ActivityItem.h"

@interface ActivityItem ()
@property (nonatomic, strong) UIImage *image;
@property (nonatomic, strong) NSURL *path;
@end

@implementation ActivityItem

- (instancetype)initWithImage:(UIImage *)image path:(NSURL *)path
{
    self = [super init];
    if (self) {
        _image = image;
        _path = path;
    }
    return self;
}

/// 数据
- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController{
    return _image;
}

/// 路径
- (nullable id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType{
    return _path;
}

@end

/// 调用 URL -> image
func demo3() -> () {
        let image1 = UIImage(named:"a")
        let url1 = URL(fileURLWithPath: Bundle.main.path(forResource: "a.png", ofType: nil)!)
        let item1 = ActivityItem.init(image: image1!, path: url1)
        
        let image2 = UIImage(named:"b")
        let url2 = URL(fileURLWithPath: Bundle.main.path(forResource: "b.png", ofType: nil)!)
        let item2 = ActivityItem.init(image: image2!, path: url2)
        
        let image3 = UIImage(named:"c")
        let url3 = URL(fileURLWithPath: Bundle.main.path(forResource: "c.png", ofType: nil)!)
        let item3 = ActivityItem.init(image: image3!, path: url3)
        
        
        let activityVC = UIActivityViewController.init(activityItems: [item1 ?? "3", item2 ?? "2", item3 ?? "1"], applicationActivities: nil)
        
        activityVC.excludedActivityTypes = [.postToTencentWeibo, .airDrop, .openInIBooks, VimeoActivity().activityType!, FlickrActivity().activityType!, .addToReadingList, .saveToCameraRoll, .assignToContact, .copyToPasteboard, .print, .mail]
        
        activityVC.completionWithItemsHandler = {
            (type, flag, array, error) -> Swift.Void in
            print("------------")
            print(type ?? "")
        }

关于UIActivity类

UIActivity是一个抽象类,你可以通过打印某个分享平台的字符串创建该平台的UIActivity,该子类仅当需要屏蔽某个平台时使用。这种情况下也可以用下面的方法代替:

public struct UIActivityType : RawRepresentable, Equatable, Hashable, Comparable {
    public init(rawValue: String)
}

子类化

class WeiBoActivity: UIActivity {
    
    @available(iOS 7.0, *)
    open override class var activityCategory: UIActivityCategory { return UIActivityCategory.share }
   
    open override var activityType: UIActivityType? {
        let postToWeibo = UIActivityType.init(rawValue: "com.apple.UIKit.activity.PostToWeibo")
        
        return postToWeibo
    }
}

class QQActivity: UIActivity {
   
    @available(iOS 7.0, *)
    open override class var activityCategory: UIActivityCategory { return UIActivityCategory.share }

    open override var activityType: UIActivityType? {
        let postToQQ = UIActivityType.init(rawValue: "com.tencent.mqq.ShareExtension")
        
        return postToQQ
    }
}

class WXActivity: UIActivity {
    
    @available(iOS 7.0, *)
    open override class var activityCategory: UIActivityCategory { return UIActivityCategory.action }
    
    open override var activityType: UIActivityType? {
        let postToWX = UIActivityType.init(rawValue: "com.tencent.xin.sharetimeline")
        
        return postToWX
    }
}

支持类型参考

支持类型

参考链接

上一篇下一篇

猜你喜欢

热点阅读