玩轉iOS開發:《使用系統自帶的UIActivityViewController和UIActivity進行內容分享》
目錄
簡介
這段時間有很多朋友都問我關於怎麼去整合
ShareSDK
或者友盟社會化分享SDK
的問題, 其實我想說,Apple
一開始就提供了一個類, 供我們去使用分享了, 在iOS 6
之後更加增強了這個類, 使我們不再需要整合第三方的, 而且還支援自定義分享的item
.
作者感言
在我寫這篇文章的時候, 雖然國內有一堆文章介紹
UIActivityViewController
和UIActivity
, 但都是零零散散的, 哪怕我FQ出去看YouTube
, 或者是著名的黑鬍子部落格, 都沒有詳細的講解怎麼去自定義所需的UIActivity
, 最後基本上翻遍了谷歌, 才找到了所需的.最後:
如果你有更好的建議或者對這篇文章有不滿的地方, 請聯絡我, 我會參考你們的意見再進行修改, 聯絡我時, 請備註UIActivityViewController
如果覺得好的話, 希望大家也可以打賞一下~嘻嘻~祝大家學習愉快~謝謝~
Cain(羅家輝)
聯絡方式: [email protected]
騰訊QQ: 350116542
建立新工程
建立一個繼承與UIActivityViewController的類
建立一個繼承與UIActivity的類
這時候我們就要來給這個自定義的
UIActivity
類寫上我們需要的內容, 首先我們可以去到系統提供的UIActivity
標頭檔案看API
, 獲取我們所需的API
.
配置UIActivity和UIActivityViewController
下面是我寫好的自定義
WeiboActivity
API
#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
#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
, 也可以在這裡寫上.
還有一點, 就是我們給
UIActivityViewController
賦值自定義的UIActivity
PS: 注意一點, 這個賦值只能在
initWithActivityItems: applicationActivities:
這個方法的applicationActivities:
賦值, 而且只能在初始化的時候賦值, 一旦賦值之後就不能再修改了.
調起UIActivityViewController
最重要的地方來了, 就是調起我們自定義的
UIActivityController
.首先我們要在
Main.storyboard
中拖一個UIButton
, 然後新增對應的程式碼.
#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
最後我們執行一下看看效果
發現什麼都沒有, 肯定在噴我, 覺得我是在耍你們, 哈哈, 其實在這裡我們少了一個方法沒有新增, 回到我們自定義的
WeiboActivity
中, 新增上就OK了
- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems {
if (activityItems.count > 0) {
return YES;
}
return NO;
}
再來執行看看效果
好了,
item
出來了, 但好像有什麼不對, 圖示呢???!!! 為啥是灰色的? 樓主你耍我, 我要去爆你菊花!!!!!別緊張, 在系統預設的
UIActivityViewController
中, 下面這部分是屬於系統服務, 預設只會顯示一個輪廓, 並不會顯示整張圖片, 下面我們把自定義的WeiboActivity
顯示圖片的方法改改就好了.
- (UIImage *)_activityImage {
return [UIImage imageNamed:@"ShareBundle.bundle/share_icon_1"];
}
好了, 我的菊花保住了, 圖標出來了, 把我嚇了一身冷汗
圖標出來了, 我們就要給這個
item
新增點選事件了, 做什麼好呢, 總不可能讓我去導個微信微博等SDK進來演示, 畢竟還要去申請AppID
和AppKey
呢, 我們來個彈框吧~~~我一般喜歡寫個
Block
把點選事件丟擲去做處理, 這次我也不例外~~
- (void)performActivity {
[self activityDidFinish:YES];
if (self.weiboBlock) {
self.weiboBlock();
}
}
- (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
.
最終效果
GitHub工程地址
工程地址: https://github.com/CainRun/ActivityControllerDemo
結束語
好啦, 教程到這裡就結束了, 謝謝大家的耐心觀看