zoukankan      html  css  js  c++  java
  • 使用自定义《UIActivity》进行内容分享-b

    简介

    这段时间有很多朋友都问我关于怎么去集成ShareSDK或者友盟社会化分享SDK的问题, 其实我想说, Apple一开始就提供了一个类, 供我们去使用分享了, 在iOS 6之后更加增强了这个类, 使我们不再需要集成第三方的, 而且还支持自定义分享的item.


    作者感言

    在我写这篇文章的时候, 虽然国内有一堆文章介绍UIActivityViewControllerUIActivity, 但都是零零散散的, 哪怕我翻墙出去看YouTube, 或者是著名的黑胡子博客, 都没有详细的讲解怎么去自定义所需的UIActivity, 最后基本上翻遍了谷歌, 才找到了所需的.

    最后:如果你有更好的建议或者对这篇文章有不满的地方, 请联系我, 我会参考你们的意见再进行修改, 联系我时, 请备注UIActivityViewController 如果觉得好的话, 希望大家也可以打赏一下~嘻嘻~祝大家学习愉快~谢谢~

    Cain(罗家辉)

    zhebushimengfei@qq.com: 联系方式

    350116542: 腾讯QQ


    创建新工程


    创建一个继承与UIActivityViewController的类


    创建一个继承与UIActivity的类

    这时候我们就要来给这个自定义的UIActivity类写上我们需要的内容, 首先我们可以去到系统提供的UIActivity头文件看API, 获取我们所需的API.


    配置UIActivity和UIActivityViewController

    下面是我写好的自定义WeiboActivity API

    代码:

    #import "WeiboActivity.h"  
    @implementation WeiboActivity  
    - (NSString *)activityType {      
        return @"CustomWeiboActivity"; 
    }  
    - (NSString *)activityTitle {      
        return @"新浪微博"; 
    }  
    - (UIImage *)activityImage {      
        return [UIImage imageNamed:@"ShareBundle.bundle/share_icon_1"]; 
    }  
    - (void)performActivity {     
        [self activityDidFinish:YES]; 
    }  
    @end
     

    下面是我写好的自定义UIActivityController

    代码:

    #import "UIActivityController.h" 
    #import "WeiboActivity.h"  
    #define CAL_GET_OBJECT(objc) if (objc) return objc  
    @interface UIActivityController ()  
    @property (nonatomic, strong) WeiboActivity *weiboActivity;  
    @end  
    @implementation UIActivityController  
    - (instancetype)initAspActivityControllerWithContent:(NSArray *)activityContent {      
        NSArray *activitys = @[self.weiboActivity];      
        if (self = [super initWithActivityItems:activityContent applicationActivities:activitys]) {          
            self.excludedActivityTypes = @[UIActivityTypePostToFacebook,                                        
                                           UIActivityTypePostToTwitter,                                        
                                           UIActivityTypePostToWeibo,                                        
                                           UIActivityTypeMail,                                        
                                           UIActivityTypePrint,                                        
                                           UIActivityTypeCopyToPasteboard,                                        
                                           UIActivityTypeAssignToContact,                                        
                                           UIActivityTypeSaveToCameraRoll,                                        
                                           UIActivityTypeAddToReadingList,                                        
                                           UIActivityTypePostToFlickr,                                        
                                           UIActivityTypePostToVimeo,                                        
                                           UIActivityTypePostToTencentWeibo,                                        
                                           UIActivityTypeAirDrop,                                        
                                           UIActivityTypeOpenInIBooks];     
        }      
        return self; 
    }  
    - (WeiboActivity *)weiboActivity {      
        CAL_GET_OBJECT(_weiboActivity);      
        _weiboActivity = [[WeiboActivity alloc] init];      
        return _weiboActivity; 
    }  
    @end
     

    这里和大家说说excludedActivityTypes这个属性, 这个属性其实是一个数组属性, 代表的是, 如果我们不需要系统的服务就可以给它赋值, 这样子UIActivityViewController就不会显示对应的服务, 我这里默认全部干掉, 一个服务都不需要, 当然如果需要干掉我们自定义的UIActivity, 也可以在这里写上.

    还有一点, 就是我们给UIActivityViewController赋值自定义的UIActivity

    PS: 注意一点, 这个赋值只能在initWithActivityItems: applicationActivities:这个方法的applicationActivities:赋值, 而且只能在初始化的时候赋值, 一旦赋值之后就不能再修改了.


    调起UIActivityViewController

    最重要的地方来了, 就是调起我们自定义的UIActivityController.

    首先我们要在Main.storyboard中拖一个UIButton, 然后添加对应的代码.

    代码:

    #import "ViewController.h"
    #import "UIActivityController.h"
    @interface ViewController ()
    @property (nonatomic, strong) UIActivityController *activityController;
    @end
    @implementation ViewController
    - (IBAction)popActivityController:(UIButton *)sender {      
        [self presentViewController:self.activityController animated:YES completion:nil];
    }
    - (UIActivityController *)activityController {      
        NSString *shareTitle = @"分享的标题";     
        UIImage *shareImage = [UIImage imageNamed:@"ShareBundle.bundle/share_icon_1"];      
        if (!_activityController) {          
            _activityController = [[UIActivityController alloc] initAspActivityControllerWithContent:@[shareTitle, shareImage]];     
        }      
        return _activityController;
    
    }
    @end
     

    最后我们运行一下看看效果

    发现什么都没有, 肯定在喷我, 觉得我是在耍你们, 哈哈, 其实在这里我们少了一个方法没有添加, 回到我们自定义的WeiboActivity中, 添加上就OK了

    代码:

    - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems {          if (activityItems.count > 0) {                  return YES;        }          return NO; }

    再来运行看看效果

    好了, item出来了, 但好像有什么不对, 图标呢???!!! 为啥是灰色的? 楼主你耍我, 我要去爆你菊花!!!!!

    别紧张, 在系统默认的UIActivityViewController中, 下面这部分是属于系统服务, 默认只会显示一个轮廓, 并不会显示整张图片, 下面我们把自定义的WeiboActivity显示图片的方法改改就好了.

    代码:

    - (UIImage *)_activityImage {          return [UIImage imageNamed:@"ShareBundle.bundle/share_icon_1"]; }

    好了, 我的菊花保住了, 图标出来了, 把我吓了一身冷汗

    图标出来了, 我们就要给这个item添加点击事件了, 做什么好呢, 总不可能让我去导个微信微博等SDK进来演示, 毕竟还要去申请AppIDAppKey呢, 我们来个弹框吧~~~

    我一般喜欢写个Block把点击事件抛出去做处理, 这次我也不例外~~

    代码:

    - (void)performActivity {        [self activityDidFinish:YES];          if (self.weiboBlock) {                self.weiboBlock();        } }

    代码:

    - (WeiboActivity *)weiboActivity {          CAL_GET_OBJECT(_weiboActivity);          _weiboActivity = [[WeiboActivity alloc] init];          [_weiboActivity setWeiboBlock:^{                  UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"新浪微博"                                                             message:@"分享至新浪微博"                                                            delegate:nil                                                   cancelButtonTitle:@"好的"                                                   otherButtonTitles:nil, nil];          
           [alertView show];    
       }];      
       return _weiboActivity;
    }

    PS: 由于我这里是做示范, 所以使用UIAlertView, 如果大家要在项目中使用的话, 尽量使用UIAlertController.


    最终效果


    GitHub工程地址

    工程地址: https://github.com/CainRun/ActivityControllerDemo/tree/master/UIActivityViewControllerDemo


    作者;CainLuo

    掘金地址:http://gold.xitu.io/post/57b55dae0a2b580057f98491

    感谢大神分享

  • 相关阅读:
    docker 介绍,安装,镜像操作, docker换源
    go语言5 接口, 并发与并行, go协程, 信道, 缓冲信道, 异常处理, python进程线程
    [编织消息框架]目录
    2017总结
    赚钱方法[信息红利]
    面单 全单 单板 批发吉他民谣 知乎 百度知道 百度贴吧 吉他批发
    看第三部杀破狼感想
    海豚极货店 淘宝店开张啦
    我上头条了
    尤克里里 ukulele 单板 非kaka tom uma
  • 原文地址:https://www.cnblogs.com/isItOk/p/5685066.html
Copyright © 2011-2022 走看看