我一男同事曾經(jīng)對一曬自己健身照片的女同事留言: "健身三分鐘, 拍照兩小時", 夸張地道出了當下 '秀出自己' 的時代趨勢. 基于以上需求, 手機就有了現(xiàn)在分享功能. 那么App中的分享功能, 是如何實現(xiàn)的呢? 首先看一下效果.

點擊分享按鈕, 彈出要分享的路徑. 其中微博路徑需要首先在設(shè)置中登錄微博賬戶. 其余的騰訊微博, Twitter等與此同理. 路徑也可以自定義實現(xiàn), 第二個微信圖標便是.

點擊新浪微博路徑后, 彈出系統(tǒng)自定義界面. 中部的文字和右邊的按鈕圖片可以在創(chuàng)建分享控制器UIActivityViewController時傳遞. 點擊自定義微信路徑后的分享控制器, 也需要自定義實現(xiàn).
打開UIActivityViewController類的.h頭文件, 可以看到其初始化的方法.
- (instancetype)initWithActivityItems:(NSArray *)activityItems applicationActivities:(nullable NSArray<__kindof UIActivity *> *)applicationActivities
其接受兩個數(shù)組activityItems和applicationActivities. 其中activityItems表示要分享的具體內(nèi)容, 比如微博分享界面中間的文字內(nèi)容, 微信分享界面上的文字和圖像; applicationActivities的對象, 指定成了UIActivity的泛型. 打開UIActivity的頭文件, 可以看到需要重寫的方法.
有了上面的知識, 首先定義泛型UIActivity的實體類CustomActivity. .m實現(xiàn)文件如下.
#import "CustomActivity.h"
#import "WeiXinController.h"
NSString *const CustomActivityMine = @"CustomActivityMine";
@interface CustomActivity ()
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *imageName;
@property (nonatomic, strong) NSArray *items_toShare;
@property (nonatomic, strong) UINavigationController *nav;
@end
@implementation CustomActivity
- (instancetype)initWithTitie:(NSString *)title withImageName:(NSString *)imageName{
self = [super init];
if (self) {
self.title = title;
self.imageName = imageName;
}
return self;
}
//彈出的控制器
- (UIViewController *)activityViewController{
UIStoryboard *storyB = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
WeiXinController *weixinC = [storyB instantiateViewControllerWithIdentifier:@"WeiXinController"];
weixinC.items_toShare = self.items_toShare;
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:weixinC];
weixinC.title = @"微信";
weixinC.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"完成" style:UIBarButtonItemStyleDone target:self action:@selector(complete)];
self.nav = nav;
return nav;
}
- (void)complete {
[self.nav dismissViewControllerAnimated:true completion:^{
NSLog(@"完成發(fā)布");
}];
}
//標識路徑
- (UIActivityType)activityType{
return CustomActivityMine;
}
//路徑名
- (NSString *)activityTitle{
return self.title;
}
//路徑圖標
- (UIImage *)activityImage{
return [UIImage imageNamed:self.imageName];
}
- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems{
NSLog(@"%@", activityItems);
return true;
}
- (void)prepareWithActivityItems:(NSArray *)activityItems{
self.items_toShare = activityItems;
NSLog(@"%@", activityItems);
}
- (void)activityDidFinish:(BOOL)completed{
NSLog(@"activityDidFinish");
}
//路徑位置
+ (UIActivityCategory)activityCategory{
return UIActivityCategoryShare;
}
@end
WeiXinController為點擊自定義微信分享路徑后要跳轉(zhuǎn)的控制器. 點擊分享按鈕后會首先執(zhí)行canPerformWithActivityItems方法, 當返回false時, 該分享路徑就會被隱藏. 點擊路徑跳轉(zhuǎn)控制器之前, 會依次執(zhí)行prepareWithActivityItems, activityViewController方法, 可以在這兩個方法中設(shè)計要展示的頁面.
activityCategory方法控制分享路徑的位置, UIActivityCategoryAction位于分享欄的底部, UIActivityCategoryShare位于分享欄. 兩種位置顯示的圖像背景都會被系統(tǒng)自動渲染, 所以實際中需要把背景色設(shè)置為透明.
然后使用自定義CustomActivity.
- (void)share {
//@"我是冬風(fēng)破10_IOS,歡迎關(guān)注我"
NSString *title = @"微信";
NSString *imageName = @"weixin";
CustomActivity * custom = [[CustomActivity alloc] initWithTitie:title withImageName:imageName];
NSArray *activities = @[custom];
NSString *text = @"這一刻的想法...";
UIImage *image = [UIImage imageNamed:@"weixin"];
NSString *subTitle = @"搖一搖, 打開未知世界. ";
NSArray *items = @[text, image, subTitle];
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:activities];
if ([[UIDevice currentDevice].systemVersion floatValue] < 8.0) {
activityVC.completionHandler = ^(UIActivityType _Nullable activityType, BOOL completed) {
NSLog(@"completionHandler");
};
}else{
activityVC.completionWithItemsHandler = ^(UIActivityType _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) {
NSLog(@"completionWithItemsHandler");
};
}
activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard,
UIActivityTypeAssignToContact,UIActivityTypeSaveToCameraRoll];
[self presentViewController:activityVC animated:true completion:nil];
}
completionHandler和completionWithItemsHandler是分享完成后的回調(diào)函數(shù), 一般是彈出分享成功的提示框. excludedActivityTypes控制不顯示的分享路徑, 可以在相關(guān)頭文件中看到系統(tǒng)可以控制的分享路徑.
UIKIT_EXTERN UIActivityType const UIActivityTypePostToFacebook
UIKIT_EXTERN UIActivityType const UIActivityTypePostToTwitter
UIKIT_EXTERN UIActivityType const UIActivityTypePostToWeibo
UIKIT_EXTERN UIActivityType const UIActivityTypeMessage
UIKIT_EXTERN UIActivityType const UIActivityTypeMail
UIKIT_EXTERN UIActivityType const UIActivityTypePrint
UIKIT_EXTERN UIActivityType const UIActivityTypeCopyToPasteboard
UIKIT_EXTERN UIActivityType const UIActivityTypeAssignToContact
UIKIT_EXTERN UIActivityType const UIActivityTypeSaveToCameraRoll
UIKIT_EXTERN UIActivityType const UIActivityTypeAddToReadingList
UIKIT_EXTERN UIActivityType const UIActivityTypePostToFlickr
UIKIT_EXTERN UIActivityType const UIActivityTypePostToVimeo
UIKIT_EXTERN UIActivityType const UIActivityTypePostToTencentWeibo
UIKIT_EXTERN UIActivityType const UIActivityTypeAirDrop
UIKIT_EXTERN UIActivityType const UIActivityTypeOpenInIBooks
喜歡和關(guān)注都是對我的鼓勵和支持~