iOS原生分享UIActivityViewController的使用(詳細步驟)

我一男同事曾經(jīng)對一曬自己健身照片的女同事留言: "健身三分鐘, 拍照兩小時", 夸張地道出了當下 '秀出自己' 的時代趨勢. 基于以上需求, 手機就有了現(xiàn)在分享功能. 那么App中的分享功能, 是如何實現(xiàn)的呢? 首先看一下效果.

Share.gif

點擊分享按鈕, 彈出要分享的路徑. 其中微博路徑需要首先在設(shè)置中登錄微博賬戶. 其余的騰訊微博, Twitter等與此同理. 路徑也可以自定義實現(xiàn), 第二個微信圖標便是.

微博

點擊新浪微博路徑后, 彈出系統(tǒng)自定義界面. 中部的文字和右邊的按鈕圖片可以在創(chuàng)建分享控制器UIActivityViewController時傳遞. 點擊自定義微信路徑后的分享控制器, 也需要自定義實現(xiàn).

打開UIActivityViewController類的.h頭文件, 可以看到其初始化的方法.
- (instancetype)initWithActivityItems:(NSArray *)activityItems applicationActivities:(nullable NSArray<__kindof UIActivity *> *)applicationActivities
其接受兩個數(shù)組activityItems和applicationActivities. 其中activityItems表示要分享的具體內(nèi)容, 比如微博分享界面中間的文字內(nèi)容, 微信分享界面上的文字和圖像; applicationActivities的對象, 指定成了UIActivity的泛型. 打開UIActivity的頭文件, 可以看到需要重寫的方法.

有了上面的知識, 首先定義泛型UIActivity的實體類CustomActivity. .m實現(xiàn)文件如下.

#import "CustomActivity.h"
#import "WeiXinController.h"

NSString *const CustomActivityMine = @"CustomActivityMine";

@interface CustomActivity ()
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *imageName;
@property (nonatomic, strong) NSArray *items_toShare;
@property (nonatomic, strong) UINavigationController *nav;
@end

@implementation CustomActivity

- (instancetype)initWithTitie:(NSString *)title withImageName:(NSString *)imageName{
    self = [super init];
    if (self) {
        self.title = title;
        self.imageName = imageName;
    }
    return self;
}

//彈出的控制器
- (UIViewController *)activityViewController{
    
    UIStoryboard *storyB = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    WeiXinController *weixinC = [storyB instantiateViewControllerWithIdentifier:@"WeiXinController"];
    weixinC.items_toShare = self.items_toShare;
    
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:weixinC];
    weixinC.title = @"微信";
    weixinC.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"完成" style:UIBarButtonItemStyleDone target:self action:@selector(complete)];
    self.nav = nav;
    return nav;
}

- (void)complete {
    
    [self.nav dismissViewControllerAnimated:true completion:^{
        NSLog(@"完成發(fā)布");
    }];
}

//標識路徑
- (UIActivityType)activityType{
    
    return CustomActivityMine;
}

//路徑名
- (NSString *)activityTitle{
    return self.title;
}
//路徑圖標
- (UIImage *)activityImage{
    return [UIImage imageNamed:self.imageName];
}

- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems{
    
    NSLog(@"%@", activityItems);
    
    return true;
}
- (void)prepareWithActivityItems:(NSArray *)activityItems{
    self.items_toShare = activityItems;
    NSLog(@"%@", activityItems);
}

- (void)activityDidFinish:(BOOL)completed{
    NSLog(@"activityDidFinish");
}

//路徑位置
+ (UIActivityCategory)activityCategory{
    return UIActivityCategoryShare;
}

@end

WeiXinController為點擊自定義微信分享路徑后要跳轉(zhuǎn)的控制器. 點擊分享按鈕后會首先執(zhí)行canPerformWithActivityItems方法, 當返回false時, 該分享路徑就會被隱藏. 點擊路徑跳轉(zhuǎn)控制器之前, 會依次執(zhí)行prepareWithActivityItems, activityViewController方法, 可以在這兩個方法中設(shè)計要展示的頁面.

activityCategory方法控制分享路徑的位置, UIActivityCategoryAction位于分享欄的底部, UIActivityCategoryShare位于分享欄. 兩種位置顯示的圖像背景都會被系統(tǒng)自動渲染, 所以實際中需要把背景色設(shè)置為透明.

然后使用自定義CustomActivity.

 - (void)share {
    //@"我是冬風(fēng)破10_IOS,歡迎關(guān)注我"
    NSString *title = @"微信";
    NSString *imageName = @"weixin";
    
    CustomActivity * custom = [[CustomActivity alloc] initWithTitie:title withImageName:imageName];

    NSArray *activities = @[custom];
    
    NSString *text = @"這一刻的想法...";
    UIImage *image = [UIImage imageNamed:@"weixin"];
    NSString *subTitle = @"搖一搖, 打開未知世界. ";
    
    NSArray *items = @[text, image, subTitle];
    UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:activities];
    
    
    if ([[UIDevice currentDevice].systemVersion floatValue] < 8.0) {
        activityVC.completionHandler = ^(UIActivityType  _Nullable activityType, BOOL completed) {
            NSLog(@"completionHandler");
        };
    }else{
        activityVC.completionWithItemsHandler = ^(UIActivityType  _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) {
            NSLog(@"completionWithItemsHandler");
        };
    }
    activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard,
                                         
                                         UIActivityTypeAssignToContact,UIActivityTypeSaveToCameraRoll];
    [self presentViewController:activityVC animated:true completion:nil];
}

completionHandler和completionWithItemsHandler是分享完成后的回調(diào)函數(shù), 一般是彈出分享成功的提示框. excludedActivityTypes控制不顯示的分享路徑, 可以在相關(guān)頭文件中看到系統(tǒng)可以控制的分享路徑.

UIKIT_EXTERN UIActivityType const UIActivityTypePostToFacebook    
UIKIT_EXTERN UIActivityType const UIActivityTypePostToTwitter     
UIKIT_EXTERN UIActivityType const UIActivityTypePostToWeibo       
UIKIT_EXTERN UIActivityType const UIActivityTypeMessage           
UIKIT_EXTERN UIActivityType const UIActivityTypeMail              
UIKIT_EXTERN UIActivityType const UIActivityTypePrint             
UIKIT_EXTERN UIActivityType const UIActivityTypeCopyToPasteboard  
UIKIT_EXTERN UIActivityType const UIActivityTypeAssignToContact   
UIKIT_EXTERN UIActivityType const UIActivityTypeSaveToCameraRoll  
UIKIT_EXTERN UIActivityType const UIActivityTypeAddToReadingList  
UIKIT_EXTERN UIActivityType const UIActivityTypePostToFlickr      
UIKIT_EXTERN UIActivityType const UIActivityTypePostToVimeo       
UIKIT_EXTERN UIActivityType const UIActivityTypePostToTencentWeibo
UIKIT_EXTERN UIActivityType const UIActivityTypeAirDrop           
UIKIT_EXTERN UIActivityType const UIActivityTypeOpenInIBooks      

詳細可參考UIActivityViewController

喜歡和關(guān)注都是對我的鼓勵和支持~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,191評論 25 708
  • 前幾天在好報上報了個30天寫作班,其實自己真的不知道能不能堅持下來。一來對自己懶惰成性的習(xí)慣深惡痛絕,最主要的是對...
    韻秋閱讀 553評論 7 8
  • 打開支付寶 點擊掃一掃 點擊相冊 找到紅包二維碼點擊她 領(lǐng)取紅后, 它將會保存在卡包里面 點擊卡包 點擊立即使用 ...
    最純在閱讀 1,282評論 2 1
  • 愛一個不愛自己的人,就像倆人落座,擺好棋盤。他紅子先手,當頭炮。你跳馬飛象車巡河。大刀闊斧的吃了他的卒砍了他的馬,...
    杜小臉閱讀 263評論 0 0

友情鏈接更多精彩內(nèi)容