在iOS開發中,UIActivityViewController經常使用來彈出分享面板,其實除了用來社會化分享,UIActivityViewController還有一大應用是用來進行自定義行爲。先看以下示例代碼:ios
//活動內容 NSString * content = @"活動的內容"; //活動的url NSURL * url = [NSURL URLWithString:@"https://www.baidu.com"]; //活動的圖片 UIImage * image = [UIImage imageNamed:@"ios"]; UIActivityViewController * con = [[UIActivityViewController alloc]initWithActivityItems:@[content,url,image] applicationActivities:nil]; //活動行爲結束後回調的block con.completionWithItemsHandler = ^(UIActivityType activityType, BOOL completed, NSArray * returnedItems, NSError * __nullable activityError){ NSLog(@"%@\n%@",activityType,returnedItems); }; [self presentViewController:con animated:YES completion:nil];
活動面板以下圖:數組
須要注意,活動面板能夠分爲3個部分,最上面爲AirDrop傳輸功能,中間爲分享相關功能,最下面爲數據處理功能。UIActivityViewController繼承自UIViewController,類解析以下:app
//初始化方法 - (instancetype)init; - (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil; - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder; /* activityItems參數用來設置活動數據數組,其中能夠是任意類型的對象,可是隻有能夠處理這些數據的行爲會被展現出來 applicationActivitie參數能夠設置自定義的操做行爲,後面會介紹 */ - (instancetype)initWithActivityItems:(NSArray *)activityItems applicationActivities:(nullable NSArray<__kindof UIActivity *> *)applicationActivitie; /* 活動行爲結束後執行的回調block,其中參數以下: typedef void (^UIActivityViewControllerCompletionWithItemsHandler)(UIActivityType __nullable activityType, BOOL completed, NSArray * __nullable returnedItems, NSError * __nullable activityError); activityType:活動的類型 completed:活動是否完成 returnItems:擴展程序返回的數據 */ @property(nullable, nonatomic, copy) UIActivityViewControllerCompletionWithItemsHandler completionWithItemsHandler; //這個參數能夠設置不被顯示的活動類型 @property(nullable, nonatomic, copy) NSArray<UIActivityType> *excludedActivityTypes; //下面這些方法在iOS8後被棄用 在iOS6-iOS8以前可用 //設置活動行爲結束後回調的block /* typedef void (^UIActivityViewControllerCompletionHandler)(UIActivityType __nullable activityType, BOOL completed); */ @property(nullable, nonatomic, copy) UIActivityViewControllerCompletionHandler completionHandler;
上面初始化方法中有提到activityItems這個參數,系統提供的一些分享與活動行爲可支持的數據類型列表以下:函數
系統提供了一些活動類型,例如分享到微博、臉書、進行添加提示、發送信息等,系統提供的活動類型列舉以下(UIActivityType實際上就是NSString*):atom
UIActivityType const UIActivityTypePostToFacebook;//臉書 UIActivityType const UIActivityTypePostToTwitter;//推特 UIActivityType const UIActivityTypePostToWeibo; // 微博 UIActivityType const UIActivityTypeMessage;//發送信息 UIActivityType const UIActivityTypeMail;//發送郵件 UIActivityType const UIActivityTypePrint;//打印 UIActivityType const UIActivityTypeCopyToPasteboard;//複製 UIActivityType const UIActivityTypeAssignToContact;//關聯到聯繫人 UIActivityType const UIActivityTypeSaveToCameraRoll;//存照片 UIActivityType const UIActivityTypeAddToReadingList;//添加到提醒列表 UIActivityType const UIActivityTypePostToFlickr;//Flickr UIActivityType const UIActivityTypePostToVimeo;//Vimeo UIActivityType const UIActivityTypePostToTencentWeibo;//騰訊微博 UIActivityType const UIActivityTypeAirDrop;//AirDrop UIActivityType const UIActivityTypeOpenInIBooks;//在IBooks中打開
自定義活動行爲須要建立繼承於UIActivity類的子類,示例以下:url
#import "CustomActivity.h" @implementation CustomActivity //設置活動類別 +(UIActivityCategory)activityCategory{ return UIActivityCategoryShare; } //設置活動類型 -(UIActivityType)activityType{ return @"Custom"; } //設置活動標題 -(NSString *)activityTitle{ return @"title"; } //設置活動圖標 -(UIImage *)activityImage{ return [UIImage imageNamed:@"ios"]; } //設置是否能夠對指定的數據進行響應 -(BOOL)canPerformWithActivityItems:(NSArray *)activityItems{ NSLog(@"%@",activityItems); return YES; } //爲要響應的活動進行準備工做 - (void)prepareWithActivityItems:(NSArray *)activityItems{ } //響應互動 -(void)performActivity{ NSLog(@"========="); //活動處理完成後 必須調用activityDidFinish函數 [self activityDidFinish:YES]; } @end
用自定義的活動對UIActivityViewController進行初始化:spa
NSString * content = @"活動的內容"; NSURL * url = [NSURL URLWithString:@"https://www.baidu.com"]; UIImage * image = [UIImage imageNamed:@"ios"]; CustomActivity * activity = [[CustomActivity alloc]init]; UIActivityViewController * con = [[UIActivityViewController alloc]initWithActivityItems:@[content,url,image] applicationActivities:@[activity]]; con.completionWithItemsHandler = ^(UIActivityType activityType, BOOL completed, NSArray * returnedItems, NSError * __nullable activityError){ NSLog(@"%@\n%@",activityType,returnedItems); }; [self presentViewController:con animated:YES completion:nil];
效果以下圖所示:code
UIActivity類解析以下:orm
//子類實現,設置自定義活動的類別 /* typedef NS_ENUM(NSInteger, UIActivityCategory) { UIActivityCategoryAction,//行爲類別 顯示在活動面板下面 UIActivityCategoryShare,//分享類別,顯示在活動面板中間 }; */ + (UIActivityCategory)activityCategory; //子類實現 設置自定義活動的類型 返回字符串 - (nullable UIActivityType)activityType; //子類實現 設置自定義活動的標題 返回字符串 - (nullable NSString *)activityTitle; //子類實現 設置自定義活動的圖標 UIImage - (nullable UIImage *)activityImage; //子類實現 activityItems爲活動數據數組 返回布爾值決定此活動是否能夠響應這些數據 - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems; //子類實現 若是上面的方法返回YES,會接着執行這個方法,開發者能夠作些活動處理的準備 - (void)prepareWithActivityItems:(NSArray *)activityItems; //子類實現 返回一個視圖控制器做爲處理活動的模態視圖 活動處理完成後須要調用activityDidFinish方法 - (nullable UIViewController *)activityViewController; //子類實現 若是子類沒有實現上一個方法 或者返回nil,則會執行這個方法來處理活動 活動處理完成後須要調用activityDidFinish方法 - (void)performActivity; //活動處理完成後須要調用這個方法 以後會通知UIActivityViewController執行活動完成後的回調block - (void)activityDidFinish:(BOOL)completed;