Swift封装的友盟分享,可以直接拿来用的

分享这个功能基本每个APP都会有,我今天给大家分享一款我自己封装好的,代码的话,我会加到文章最后可以去下载,比较简单,先上个效果图吧:


友盟分享3.gif

这个代码主要都在ShareView.swift文件里,比较简单,我觉得效果挺实用的,不想动手的朋友,可以直接拿着撸。

下面我就一步一步说说怎么实现的:

第一步确定你要分享给别人什么玩意,无非就是图片,文字内容,标题,URL吧,我们来定义几个属性

    private var shareContent:String!
    private var shareImage:UIImage!
    private var shareUrl:String!
    private var shareTitle:String!

这里我直接用private来修饰了,作为一个准全栈工程师,这点严谨性还是得有的,接着我大致来说说我的思路吧,我准备先添加个灰色视图(bgView)当遮罩背景,然后在添加一个充当容器的视图(contentView)在它上面做些文章,当然ShareView是要集成自UIView的,毕竟封装的东西越简单越好,别人一看就能懂,自己也得劲。(适当装逼,有益健康)

我准备在这个contentView上面添加一个可以左右滑动的UIScollView,中间是个UIPageControl,下面直接搞个UIButton,基本控件就这么多

    private var bgView:UIView!
    private var contentView:UIView!
    private var rootVC:UIViewController!
    private var scrollView:UIScrollView!
    private var pageControl:UIPageControl!

有人会有疑惑rootVC是个什么鬼,关于这个咱们得往大东家友盟看了,人家有个参数专门让你传的,你不传不行啊是吧,接着往下看。这里为了表达出我优雅的封装,代码的可扩展性,我依然决断的把contentView的高度当成个属性拿出来了,你可以随意写高度,绝对不定死。

private var contentHeight:CGFloat = 220

不闲扯了,下面上代码:

初始化布局,都在这里了

    override init(frame: CGRect) {
        super.init(frame: frame)
        //添加一个遮罩视图
        self.bgView = UIView.init(frame: self.bounds)
        self.bgView.backgroundColor = UIColor.blackColor()
        self.bgView.alpha = 0.0
        self.addSubview(self.bgView)
       
        //给遮罩添加一个手势,用来隐藏视图并移除
        let tapGesture = UITapGestureRecognizer.init(target: self, action: #selector(self.bgViewTapped))
        self.bgView.addGestureRecognizer(tapGesture)
        //这个是容器视图,上面的有scrollView、pageControl、cancelBtn三个子视图
        self.contentView = UIView.init(frame: CGRectMake(0, CGRectGetHeight(frame), CGRectGetWidth(frame), contentHeight))
        self.contentView.backgroundColor = UIColor.groupTableViewBackgroundColor()
        self.addSubview(self.contentView)
        //数组里面是两个数组,第一个数组管图片文件名,第二个管标题名
        let sharePaltformArray = [
            [ "share_weixin", "share_friend", "share_sina" , "share_qq", "share_zone"],
            [ "微信","朋友圈", "微博", "QQ", "QQ空间"]
        ]
        //添加一个可以左右滑动的视图
        self.scrollView = UIScrollView.init(frame: CGRectMake(0, 0, CGRectGetWidth(frame), 130))
        self.scrollView.showsHorizontalScrollIndicator = false
        self.scrollView.showsVerticalScrollIndicator = false
        self.scrollView.pagingEnabled = true
        self.scrollView.delegate = self
        self.scrollView.backgroundColor = UIColor.whiteColor()
        self.scrollView.contentOffset = CGPointMake(0, 0)
        self.scrollView.contentSize = CGSizeMake(CGRectGetWidth(frame) * CGFloat(self.pageNum(sharePaltformArray[0].count)), 0)
        self.contentView.addSubview(self.scrollView)
        
        //这个是显示UIScrollView到哪一页的小按钮
        self.pageControl = UIPageControl.init(frame: CGRectMake(0, CGRectGetHeight(self.scrollView.frame), CGRectGetWidth(frame), 35))
        self.pageControl.backgroundColor = UIColor.whiteColor()
        self.pageControl.currentPageIndicatorTintColor = UIColor.grayColor()
        self.pageControl.pageIndicatorTintColor = UIColor.lightGrayColor()
        self.pageControl.numberOfPages = pageNum(sharePaltformArray[0].count)
        self.contentView.addSubview(self.pageControl)
        //下面这一大坨全是将的怎么在scrollView上布局小图标
        let buttonWidth:CGFloat = 55.0
        let buttonGap = ( CGRectGetWidth(frame) - buttonWidth * 4 ) / 5
        
        for i in 0 ..< 5 {
            
            let shareButton = UIButton(type:.Custom)
        
            let btnRect = CGRectMake(buttonGap * ( CGFloat(i) + 1) + buttonWidth * CGFloat(i) + (i % 4 == 0 && i != 0 ? 20 : 0), 40, buttonWidth, buttonWidth)
            
            shareButton.frame = btnRect
            shareButton.tag = 100 + i
            shareButton.addTarget(self, action: #selector(self.shareButtonClicked(_:)), forControlEvents: .TouchUpInside)
            shareButton.setBackgroundImage(UIImage(named: sharePaltformArray[0][i]), forState: .Normal)
            shareButton.setBackgroundImage(UIImage(named: sharePaltformArray[0][i] + "_hover"), forState: .Highlighted)
            shareButton.layer.cornerRadius = buttonWidth / 2
            shareButton.layer.masksToBounds = true
            self.scrollView.addSubview(shareButton)
            
            let shareLabel = UILabel.init(frame: CGRectMake(CGRectGetMinX(shareButton.frame), CGRectGetMaxY(shareButton.frame) + 10 , CGRectGetWidth(shareButton.frame), 15))
            shareLabel.font = UIFont.systemFontOfSize(13)
            shareLabel.textColor = UIColor.init(red: 0.24, green: 0.24, blue: 0.25, alpha: 1.0)
            shareLabel.textAlignment = .Center
            shareLabel.text = sharePaltformArray[1][i]
            self.scrollView.addSubview(shareLabel)
        }
        //最后就是添加个取消按钮了
        let cancelBtn = UIButton(type:.Custom)
        cancelBtn.frame = CGRectMake(0, CGRectGetHeight(self.contentView.frame) - 44, CGRectGetWidth(self.contentView.frame), 44)
        cancelBtn.backgroundColor = UIColor.whiteColor()
        cancelBtn.setTitle("取消", forState: .Normal)
        cancelBtn.setTitleColor(UIColor.blackColor(), forState: .Normal)
        cancelBtn.titleLabel?.font = UIFont.systemFontOfSize(16)
        cancelBtn.addTarget(self, action: #selector(self.cancelBtnClicked), forControlEvents: .TouchUpInside)
        self.contentView.addSubview(cancelBtn)
    }

然后对外写个方法,用来把图片,内容,标题,url这些乱七八糟的东西全传进来

func setShareModel(content:String , image:UIImage , url:String , title:String) {
        
        self.shareContent = content
        self.shareImage = image
        self.shareUrl = url
        self.shareTitle = title
        
    }

下面是取消按钮和遮罩视图的轻拍手势响应的事件

/**
     遮罩背景响应事件
     */
    func bgViewTapped() {
        
        self.dismiss()
        
    }
    
    /**
     取消按钮响应事件
     */
    func cancelBtnClicked() {
        
        self.dismiss()
        
    }

现在来撸一下,这个移除视图的操作是这么玩的

private func dismiss(){
        UIView.animateWithDuration(0.3, animations: { 
                self.bgView.alpha = 0.0
                self.contentView.frame = CGRectMake(0, CGRectGetHeight(self.frame), CGRectGetWidth(self.frame), self.contentHeight)
            
            }) { (finished) in
                self.removeFromSuperview()
        }
        
        
    }

还有就是点击分享按钮要实现跳转APP分享的功能了,差点忘了自己在干啥,要不还是直接看代码吧

    /**
     分享按钮响应事件
     */
    func shareButtonClicked(sender:UIButton) {
        
        let snsTypes:Array<AnyObject>!
        var currentShareType:String!
        if sender.tag == 100 {
            snsTypes = [UMShareToWechatSession]
            currentShareType = "1"
            
            UMSocialData.defaultData().extConfig.wechatSessionData.title = self.shareTitle
            UMSocialData.defaultData().extConfig.wechatSessionData.url = self.shareUrl
            
        }else if sender.tag == 100 + 1 {
            snsTypes = [UMShareToWechatTimeline]
            currentShareType = "0"
            if self.shareTitle != nil && self.shareTitle.characters.count > 0 {
                UMSocialData.defaultData().extConfig.wechatTimelineData.title = self.shareTitle
                
            }else{
                UMSocialData.defaultData().extConfig.wechatTimelineData.title = self.shareContent
            }
        }else if sender.tag == 100 + 2 {
            snsTypes = [UMShareToSina]
            currentShareType = "2"
            
            self.shareContent = self.shareUrl + self.shareContent
            
            guard self.shareTitle.characters.count > 0 else{
                UMSocialData.defaultData().extConfig.qzoneData.title = "  "
                return
            }
            UMSocialData.defaultData().extConfig.qzoneData.title = self.shareTitle
            UMSocialData.defaultData().extConfig.qzoneData.url = self.shareUrl
        }else if sender.tag == 100 + 3 {
            snsTypes = [UMShareToQQ]
            currentShareType = "4"
            guard self.shareTitle.characters.count > 0 else{
                UMSocialData.defaultData().extConfig.qqData.title = "  "
                return
            }
            UMSocialData.defaultData().extConfig.qqData.title = self.shareTitle
            UMSocialData.defaultData().extConfig.qqData.url = self.shareUrl
        }else if sender.tag == 100 + 4 {
            snsTypes = [UMShareToQzone]
            currentShareType = "3"
            guard self.shareTitle.characters.count > 0 else{
                UMSocialData.defaultData().extConfig.qzoneData.title = "  "
                return
            }
            UMSocialData.defaultData().extConfig.qzoneData.title = self.shareTitle
            UMSocialData.defaultData().extConfig.qzoneData.url = self.shareUrl
        }else{
            snsTypes = []
            currentShareType = " "
        }
        UMSocialDataService.defaultDataService().postSNSWithTypes(snsTypes, content: self.shareContent, image: self.shareImage, location: nil, urlResource: UMSocialUrlResource.init(snsResourceType: UMSocialUrlResourceTypeDefault, url: self.shareUrl), presentedController: self.rootVC) { (shareResponse) in
            if shareResponse.responseCode == UMSResponseCodeSuccess {
                print("分享成功")
                dispatch_async(dispatch_get_main_queue(), { 
                    
                })
            }
        }
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.3)), dispatch_get_main_queue(), {
            self.dismiss()
        })
    }

基本实现的代码就是这些,下面我们要把它这个ShareView加在ViewController上来显示出来
首先定义一个方法

    private func showInView(parentView:UIView) {
        
        parentView.addSubview(self)
        UIView.animateWithDuration(0.3) {
            self.bgView.alpha = 0.4
            self.contentView.frame = CGRectMake(0, CGRectGetHeight(self.frame) - self.contentHeight, CGRectGetWidth(self.frame), self.contentHeight)
        }
        
    }

然后在外面调用下面这个方法来把视图添加上去

func showInViewController(viewController:UIViewController){
        self.rootVC = viewController
        self.showInView(viewController.view)
    }

主要方法就是这些,下面我贴出来别的辅助方法:

//根据意思,我们知道这个方法是根据传入的个人,来判断需要几页显示的
//打比方,我要分享的平台只有三个(QQ,微信,微博),那我一页就能显示完,返回的值就是1,表示一页
private func pageNum(num:Int) -> Int {
        return (num % 4 == 0 ? 0 : 1) + num / 4
    }

 //MARK: - UIScrollViewDelegate
    func scrollViewDidScroll(scrollView: UIScrollView) {
        let pageWidth = CGRectGetWidth(self.bounds)
        let pageFraction = self.scrollView.contentOffset.x / pageWidth
        self.pageControl.currentPage = Int(pageFraction)
        
    }

然后,下面就是最最重要的方法调用了,本来以为写完了,要关电脑睡觉了-_-!!

let shareView = ShareView.init(frame: CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT))
shareView.setShareModel("我是分享的主要内容,我先强调一下,这里我最帅", image: UIImage(named: "share_logo")!, url: "http://www.wufeiyue.com", title: "我是标题,URL是对的")

//你可以这样用:
shareView.showInViewController(self.navigationController)          

//你也可以这样用:
let tabBarVC = appDelegate.window?.rootViewController
shareView.showInViewController(tabBarVC!)

//你同样可以这样用:
shareView.showInViewController(SharedApp.tabbarController)

//这么多种选择,总有一样适合你,选其一

下面是demo地址
https://github.com/eppeo/ShareViewTest

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,046评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,943评论 4 60
  • 按照不才浅显的划分,动漫的风格大约有两种,一种死拖硬拖连载亿年后幸福大团圆结局,一种是话未说完故事到一个节点后嘎然...
    化浊阅读 169评论 0 0
  • 清明回家,奶奶跟我说:“阿英回来了。”内心一惊,我以为她再也不会回到这个闭塞的故乡,我以为她对这里是厌恶的。 “她...
    萌芽论坛阅读 240评论 0 1
  • 成长是什么? 我也不知道啊,我觉得成长是一个奇怪的过程,虽然会难过...
    罗嫚阅读 372评论 1 6