在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:@"http://www.iosbook3.com"]; ③NSArray *activityItems = @[textToShare, imageToShare, urlToShare]; ④UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItemsapplicationActivities: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:@"http://iosshare.cn/"]; ①NSArray *activityItems = @[urlToShare];BookActivity *bookActivity = [BookActivity new]; ②NSArray *applicationActivities = @[bookActivity];UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItemsapplicationActivities: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_關東升