閱讀533 返回首頁    go 技術社區[雲棲]


iOS 6分享列表——UIActivityViewController詳解

在iOS 6之後提供了一個分享列表視圖,它通過UIActivityViewController管理。蘋果設計它主要的目的是替換分享動作選單(ActionSheet),分享動作選單是出於分享目的的動作選單。

1

通過動作選單上的選擇按鈕,可以把圖片分享給別人。但是隨著iOS功能的不斷增加,需要分享的內容越來越多,它會以模態視圖方式呈現。iPad設備的分享列表,它會以Popover視圖方式呈現。

2

從圖中可以看出分享列表中可以有很多頁,每頁有9個應用,可以左右滑動翻頁,這樣就可以共享更多的內容了。

內置活動列表項

分享列表使用UIActivityViewController來控製它的呈現和關閉,凡是繼承UIActivity抽象類的子類對象都可以放在列表中呈現出來。

下麵我們通過一個實例介紹一下使用UIActivityViewController管理內置活動列表項,這個實例點擊左畫麵工具欄中的Action按鈕,會彈出分享列表模態視圖(中圖所示),如果我們選擇了微博,會彈出微博撰寫對話框(右圖所示),可以在這裏撰寫微博,完成之後可以點擊“發送”按鈕發送微博,如果沒有在係統設置中沒有設置微博賬戶信息,則會有提示對話框。

3

我們下麵介紹一下代碼實現部分,代碼參考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網站。

4

我們下麵介紹一下代碼實現部分,代碼參考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

  上一篇:go 刷榜源頭魚死網破 中國區AppStore排行榜遭血洗
  下一篇:go 飛思卡爾龍丘下載顯示set target speed 和 TBDML Setup問題