533
技術社區[雲棲]
iOS 6分享列表——UIActivityViewController詳解
在iOS 6之後提供了一個分享列表視圖,它通過UIActivityViewController管理。蘋果設計它主要的目的是替換分享動作選單(ActionSheet),分享動作選單是出於分享目的的動作選單。
通過動作選單上的選擇按鈕,可以把圖片分享給別人。但是隨著iOS功能的不斷增加,需要分享的內容越來越多,它會以模態視圖方式呈現。iPad設備的分享列表,它會以Popover視圖方式呈現。
從圖中可以看出分享列表中可以有很多頁,每頁有9個應用,可以左右滑動翻頁,這樣就可以共享更多的內容了。
內置活動列表項
分享列表使用UIActivityViewController來控製它的呈現和關閉,凡是繼承UIActivity抽象類的子類對象都可以放在列表中呈現出來。
下麵我們通過一個實例介紹一下使用UIActivityViewController管理內置活動列表項,這個實例點擊左畫麵工具欄中的Action按鈕,會彈出分享列表模態視圖(中圖所示),如果我們選擇了微博,會彈出微博撰寫對話框(右圖所示),可以在這裏撰寫微博,完成之後可以點擊“發送”按鈕發送微博,如果沒有在係統設置中沒有設置微博賬戶信息,則會有提示對話框。
我們下麵介紹一下代碼實現部分,代碼參考ViewController.m的shareAction:方法:
- (IBAction)shareAction:(id)sender { NSString *textToShare = @”請大家登錄《iOS雲端與網絡通訊》服務網站。”; ① UIImage *imageToShare = [UIImage imageNamed:@"iosshare.jpg"]; ② NSURL *urlToShare = [NSURL URLWithString:@"https://www.iosbook3.com"]; ③ NSArray *activityItems = @[textToShare, imageToShare, urlToShare]; ④ UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil]; ⑤ //不出現在活動項目 activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact,UIActivityTypeSaveToCameraRoll]; ⑥ [self presentViewController:activityVC animated:TRUE completion:nil]; ⑦ }
後麵選擇微博,以及發送微博這些全部是UIActivityViewController給我們封裝好的,我們不需要編寫一行代碼
自定義活動列表項
有的時候根據我們共享內容不同,需要自動定義活動列表項。例如:你的應用是一個觀看視頻的應用,那麼你可能需要共享視頻到“優酷”視頻網站。下麵這一節我們介紹自定義活動列表項。
凡是繼承UIActivity抽象類的子類對象都可以放在列表中呈現出來。這包括了iOS係統通過內置的9個活動列表,也可以是我們自定義的列表項。
下麵我們通過一個實例介紹一下使用UIActivityViewController管理自定義活動列表項,點擊左畫麵工具欄中的Action按鈕,會彈出分享列表模態視圖,其中列表中“打開Book”是我們自定義列表項,點擊“打開Book”列表項執行一些操作,這裏的操作是打開Book網站。
我們下麵介紹一下代碼實現部分,代碼參考ViewController.m的shareAction:方法:
- (IBAction)shareAction:(id)sender { NSURL *urlToShare = [NSURL URLWithString:@"https://iosshare.cn/"]; ① NSArray *activityItems = @[urlToShare]; BookActivity *bookActivity = [BookActivity new]; ② NSArray *applicationActivities = @[bookActivity]; UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities]; ③ [self presentViewController:activityVC animated:YES completion:nil]; }
shareAction:方法與上一節內置活動列表項類似,在本例中我們隻需要一個數據項(即提供URL),第①行代碼就是提供了URL。第②行代碼實例化活動列表項BookActivity,然後需要把它放到一個NSArray集合中。第③行代碼實例化UIActivityViewController對象,構造方法中applicationActivities部分參數在內置活動列表項為nil,在自定義活動列表項中是指定自定義活動列表項對象集合,就是NSArray集合。
自定義活動列表項代碼實現BookActivity.h的代碼如下:
#import <UIKit/UIKit.h> @interface BookActivity : UIActivity @property (nonatomic,strong) NSURL *url; @end
自定義活動列表項必須繼承UIActivity,屬性url提供列表項服務的數據項。BookActivity.m的代碼如下:
@implementation BookActivity - (NSString *)activityType { return NSStringFromClass([self class]); ① } - (NSString *)activityTitle { return NSLocalizedStringFromTable(@”Open Book”, @”BookActivity”, nil); ② } - (UIImage *)activityImage { return [UIImage imageNamed:@"Book"]; ③ } - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems { for (id activityItem in activityItems) { ④ if ([activityItem isKindOfClass:[NSURL class]]) { ⑤ if ([[UIApplication sharedApplication] canOpenURL:activityItem]) { ⑥ return YES; } } } return NO; } - (void)prepareWithActivityItems:(NSArray *)activityItems { for (id activityItem in activityItems) { if ([activityItem isKindOfClass:[NSURL class]]) { ⑦ _url = activityItem; ⑧ } } } - (void)performActivity { BOOL completed = [[UIApplication sharedApplication] openURL:_url]; ⑨ [self activityDidFinish:completed]; ⑩ } @end
出自《iOS網絡編程與雲端應用最佳實踐》作者:關東升 @tony_關東升
最後更新:2017-04-03 18:51:45