iOS開發 - UIActivityViewController詳解
昨天在做分享的時候, 用到了這個東西。趁熱寫點東西記錄下。
UIActivityViewController類是一個標準的view controller,通個使用這個controller,你的應用程式就可以提供各種服務。
系統提供了一些通用的標準服務,例如拷貝內容至粘貼板、發布一個公告至社交網、通過email或者SMS發送內容。
應用程式同樣可以自訂服務。(我的分享就屬於自訂服務, 之後將會寫一篇教程介紹)
你的應用程式負責配置、展現和解僱這個view controller。
viewcontroller的配置涉及到viewcontroller需要用到的具體的資料對象。(也可以指定自訂服務列表,讓應用程式支援這些服務)。
在展現view controller時,必鬚根據當前的裝置類型,使用適當的方法。在iPad上,必須通過popover來展現view controller。在iPhone和iPodtouch上,必須以模態的方式展現。
一。UIActivityViewController 類參考
繼承自 |
UIViewController : UIResponder : NSObject |
符合 |
NSCoding (UIViewController) UIAppearanceContainer (UIViewController) NSObject (NSObject) |
架構 |
/System/Library/Frameworks/UIKit.framework |
可用性 |
iOS6以及之後 |
聲明在 |
UIActivityViewController.h
|
二。初始化Activity View Controller
- (id)initWithActivityItems:(NSArray *)activityItems applicationActivities:(NSArray *)applicationActivities;
根據指定的資料初始化並返回一個新的activity view controller。
參數1.activityItems在執行activity中用到的資料對象數組。數組中的物件類型是可變的,並依賴於應用程式管理的資料。例如,資料可能是由一個或者多個字串/映像對象,代表了當前選中的內容。
數組中的對象,也可以通過UIActivityItemSource協議來代替,例如UIActivityItemProvider對象。源和提供者扮演代理的角色,根據實際情況,需要相應資料時再進行提供。這裡, 分享的資料包括文本, 映像, 訪問網址。 當然, 這些是可選項。 比如你不想添加url,只包含文本和映像也是可以的。這個數組不能為nil,至少要有一個對象。
2.applicationActivities是一個UIActivity對象的數組,代表了應用程式支援的自訂服務。這個參數可以是nil。
傳回值返回一個將要展現的activity view controller。
使用樣本
NSString *textToShare = @"要分享的常值內容"; UIImage *imageToShare = [UIImage imageNamed:@"iosshare.jpg"]; NSURL *urlToShare = [NSURL URLWithString:@"http://blog.csdn.net/hitwhylz"]; NSArray *activityItems = @[textToShare, imageToShare, urlToShare]; UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil];
三。訪問Completion Handler
@property(nonatomic,copy) UIActivityViewControllerCompletionHandler completionHandler; // set to nil after call
typedef void (^UIActivityViewControllerCompletionHandler)(NSString *activityType, BOOL completed);
當activityview controller被解僱時,completion handler會被執行。這可以用來處理當使用完activityview controller之後, 執行的一些相關操作。
不管是點擊了“cancel”, 還是選中了某項服務,當它結束後,都會調用這個塊,並且能捕抓到你選中的服務,來執行相關操作。
block的參數如下:1.activityType被使用者選擇的服務類型。如果是自訂的服務,這個值是由UIActivity對象的方法activityType返回的。如果是系統定義的activities,這個值是一個在UIActivity類參考中”Built-inActivity Types”列出來的字串。
2.completed
如果服務被執行了,則返回YES,如果沒有則返回NO。當使用者沒有選擇一個服務,而是解僱了view controller,這個參數同樣被設定為NO。
使用樣本
//給activityVC的屬性completionHandler寫一個block。 //用以UIActivityViewController執行結束後,被調用,做一些後續處理。 UIActivityViewControllerCompletionHandler myBlock = ^(NSString *activityType,BOOL completed) { NSLog(@"activityType :%@", activityType); if (completed) { NSLog(@"completed"); } else { NSLog(@"cancel"); } //放回上一級介面 [self.navigationController dismissModalViewControllerAnimated:YES]; }; // 初始化completionHandler,當post結束之後(無論是done還是cancell)該blog都會被調用 activityVC.completionHandler = myBlock;
四。excludedActivityTypes屬性
@property(nonatomic,copy)NSArray *excludedActivityTypes
預設情況下,UIActivityViewController 將顯示所有可用於所提供內容的服務,但我們也可以排除特定的 Activity 類型。
這就要利用excludedActivityTypes屬性了,它可以聲明我們不要顯示出來的服務列表。
Activity 類型又分為“操作”和“分享”兩大類, 具體看名稱就能區分了。
UIKIT_EXTERN NSString *const UIActivityTypePostToFacebook NS_AVAILABLE_IOS(6_0);UIKIT_EXTERN NSString *const UIActivityTypePostToTwitter NS_AVAILABLE_IOS(6_0);UIKIT_EXTERN NSString *const UIActivityTypePostToWeibo NS_AVAILABLE_IOS(6_0); // SinaWeiboUIKIT_EXTERN NSString *const UIActivityTypeMessage NS_AVAILABLE_IOS(6_0);UIKIT_EXTERN NSString *const UIActivityTypeMail NS_AVAILABLE_IOS(6_0);UIKIT_EXTERN NSString *const UIActivityTypePrint NS_AVAILABLE_IOS(6_0);UIKIT_EXTERN NSString *const UIActivityTypeCopyToPasteboard NS_AVAILABLE_IOS(6_0);UIKIT_EXTERN NSString *const UIActivityTypeAssignToContact NS_AVAILABLE_IOS(6_0);UIKIT_EXTERN NSString *const UIActivityTypeSaveToCameraRoll NS_AVAILABLE_IOS(6_0);UIKIT_EXTERN NSString *const UIActivityTypeAddToReadingList NS_AVAILABLE_IOS(7_0);UIKIT_EXTERN NSString *const UIActivityTypePostToFlickr NS_AVAILABLE_IOS(7_0);UIKIT_EXTERN NSString *const UIActivityTypePostToVimeo NS_AVAILABLE_IOS(7_0);UIKIT_EXTERN NSString *const UIActivityTypePostToTencentWeibo NS_AVAILABLE_IOS(7_0);UIKIT_EXTERN NSString *const UIActivityTypeAirDrop NS_AVAILABLE_IOS(7_0);
每個 Activity 類型都支援好多種不同的資料類型。例如,一條 Tweet 可能由 NSString 以及一個附加的映像 和/或 URL 所組成。
不同的 Activity 類型所支援的資料類型如下:
使用樣本
//排除類型, 不顯示 //// default is nil. activity types listed will not be displayed activityVC.excludedActivityTypes = @[UIActivityTypeAssignToContact, UIActivityTypePrint];
五。展示
在展現view controller時,必鬚根據當前的裝置類型,使用適當的方法。在iPad上,必須通過popover來展現view controller。在iPhone和iPodtouch上,必須以模態的方式展現。
使用樣本
//以模態的方式展現activityVC。 [self presentViewController:activityVC animated:YES completion:nil];
展示之後, 你看到的大概是這樣:
分享和自訂 UIActivity。
學習的路上, 與君共勉