iOS開發中活動視圖控制器UIActivityViewController的應用

iOS開發中活動視圖控制器UIActivityViewController的應用

    在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;
相關文章
相關標籤/搜索