玩轉iOS開發:《使用系統自帶的UIActivityViewController和UIActivity進行內容分享》

目錄


簡介

這段時間有不少朋友都問我關於怎麼去集成ShareSDK或者友盟社會化分享SDK的問題, 其實我想說, Apple一開始就提供了一個類, 供咱們去使用分享了, 在iOS 6以後更加加強了這個類, 使咱們再也不須要集成第三方的, 並且還支持自定義分享的item.git


做者感言

在我寫這篇文章的時候, 雖然國內有一堆文章介紹UIActivityViewControllerUIActivity, 但都是零零散散的, 哪怕我FQ出去看YouTube, 或者是著名的黑鬍子博客, 都沒有詳細的講解怎麼去自定義所需的UIActivity, 最後基本上翻遍了谷歌, 才找到了所需的.github

最後:
若是你有更好的建議或者對這篇文章有不滿的地方, 請聯繫我, 我會參考大家的意見再進行修改, 聯繫我時, 請備註UIActivityViewController 若是以爲好的話, 但願你們也能夠打賞一下~嘻嘻~祝你們學習愉快~謝謝~objective-c

Cain(羅家輝)
聯繫方式: zhebushimengfei@qq.com
騰訊QQ: 350116542數組


建立新工程

1

2


建立一個繼承與UIActivityViewController的類

3

4


建立一個繼承與UIActivity的類

5

這時候咱們就要來給這個自定義的UIActivity類寫上咱們須要的內容, 首先咱們能夠去到系統提供的UIActivity頭文件看API, 獲取咱們所需的API.微信

6


配置UIActivity和UIActivityViewController

下面是我寫好的自定義WeiboActivity APIapp

7

#import "WeiboActivity.h"

@implementation WeiboActivity

- (NSString *)activityType {
    
    return @"CustomWeiboActivity";
}

- (NSString *)activityTitle {
    
    return @"新浪微博";
}

- (UIImage *)activityImage {
    
    return [UIImage imageNamed:@"ShareBundle.bundle/share_icon_1"];
}

- (void)performActivity {
    [self activityDidFinish:YES];
}

@end

下面是我寫好的自定義UIActivityController學習

8

#import "UIActivityController.h"
#import "WeiboActivity.h"

#define CAL_GET_OBJECT(objc) if (objc) return objc

@interface UIActivityController ()

@property (nonatomic, strong) WeiboActivity *weiboActivity;

@end

@implementation UIActivityController

- (instancetype)initAspActivityControllerWithContent:(NSArray *)activityContent {
    
    NSArray *activitys = @[self.weiboActivity];
    
    if (self = [super initWithActivityItems:activityContent applicationActivities:activitys]) {
        
        self.excludedActivityTypes = @[UIActivityTypePostToFacebook,
                                       UIActivityTypePostToTwitter,
                                       UIActivityTypePostToWeibo,
                                       UIActivityTypeMail,
                                       UIActivityTypePrint,
                                       UIActivityTypeCopyToPasteboard,
                                       UIActivityTypeAssignToContact,
                                       UIActivityTypeSaveToCameraRoll,
                                       UIActivityTypeAddToReadingList,
                                       UIActivityTypePostToFlickr,
                                       UIActivityTypePostToVimeo,
                                       UIActivityTypePostToTencentWeibo,
                                       UIActivityTypeAirDrop,
                                       UIActivityTypeOpenInIBooks];
    }
    
    return self;
}

- (WeiboActivity *)weiboActivity {
    
    CAL_GET_OBJECT(_weiboActivity);
    
    _weiboActivity = [[WeiboActivity alloc] init];
    
    return _weiboActivity;
}

@end

這裏和你們說說excludedActivityTypes這個屬性, 這個屬性實際上是一個數組屬性, 表明的是, 若是咱們不須要系統的服務就能夠給它賦值, 這樣子UIActivityViewController就不會顯示對應的服務, 我這裏默認所有幹掉, 一個服務都不須要, 固然若是須要幹掉咱們自定義的UIActivity, 也能夠在這裏寫上.ui

還有一點, 就是咱們給UIActivityViewController賦值自定義的UIActivityatom

PS: 注意一點, 這個賦值只能在initWithActivityItems: applicationActivities:這個方法的applicationActivities:賦值, 並且只能在初始化的時候賦值, 一旦賦值以後就不能再修改了.code

9


調起UIActivityViewController

最重要的地方來了, 就是調起咱們自定義的UIActivityController.

首先咱們要在Main.storyboard中拖一個UIButton, 而後添加對應的代碼.

10

#import "ViewController.h"
#import "UIActivityController.h"

@interface ViewController ()

@property (nonatomic, strong) UIActivityController *activityController;

@end

@implementation ViewController

- (IBAction)popActivityController:(UIButton *)sender {
    
    [self presentViewController:self.activityController animated:YES completion:nil];
}

- (UIActivityController *)activityController {
    
    NSString *shareTitle = @"分享的標題";
    UIImage *shareImage = [UIImage imageNamed:@"ShareBundle.bundle/share_icon_1"];
    
    if (!_activityController) {
        
        _activityController = [[UIActivityController alloc] initAspActivityControllerWithContent:@[shareTitle, shareImage]];
    }
    
    return _activityController;
}

@end

最後咱們運行一下看看效果

11

發現什麼都沒有, 確定在噴我, 以爲我是在耍大家, 哈哈, 其實在這裏咱們少了一個方法沒有添加, 回到咱們自定義的WeiboActivity中, 添加上就OK了

12

- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems {
    
    if (activityItems.count > 0) {
        
        return YES;
    }
    
    return NO;
}

再來運行看看效果

13

好了, item出來了, 但好像有什麼不對, 圖標呢???!!! 爲啥是灰色的? 樓主你耍我, 我要去爆你菊花!!!!!

別緊張, 在系統默認的UIActivityViewController中, 下面這部分是屬於系統服務, 默認只會顯示一個輪廓, 並不會顯示整張圖片, 下面咱們把自定義的WeiboActivity顯示圖片的方法改改就行了.

14

- (UIImage *)_activityImage {
    
    return [UIImage imageNamed:@"ShareBundle.bundle/share_icon_1"];
}

15

好了, 個人菊花保住了, 圖標出來了, 把我嚇了一身冷汗

圖標出來了, 咱們就要給這個item添加點擊事件了, 作什麼好呢, 總不可能讓我去導個微信微博等SDK進來演示, 畢竟還要去申請AppIDAppKey呢, 咱們來個彈框吧~~~

我通常喜歡寫個Block把點擊事件拋出去作處理, 此次我也不例外~~

16

- (void)performActivity {
    [self activityDidFinish:YES];
    
    if (self.weiboBlock) {
        self.weiboBlock();
    }
}

17

- (WeiboActivity *)weiboActivity {
    
    CAL_GET_OBJECT(_weiboActivity);
    
    _weiboActivity = [[WeiboActivity alloc] init];
    
    [_weiboActivity setWeiboBlock:^{
        
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"新浪微博"
                                                            message:@"分享至新浪微博"
                                                           delegate:nil
                                                  cancelButtonTitle:@"好的"
                                                  otherButtonTitles:nil, nil];
        
        [alertView show];
    }];

    return _weiboActivity;
}

PS: 因爲我這裏是作示範, 因此使用UIAlertView, 若是你們要在項目中使用的話, 儘可能使用UIAlertController.


最終效果

18


GitHub工程地址

工程地址: https://github.com/CainRun/ActivityControllerDemo


結束語

好啦, 教程到這裏就結束了, 謝謝你們的耐心觀看

相關文章
相關標籤/搜索