模仿斗鱼直播

最近直播比较火,比如喵播,映客等等,我也利用闲暇时间模仿了斗鱼,供大家互相学习,有哪些不足的地方,还请大家多多讨论交流

斗鱼直播是比较火热的,里面包括了秀场直播,和游戏直播,直播中的所用的到技术是非常多的,比如,送礼物,聊天,弹幕,....

这里我刚刚开始模仿,所以写的东西不多,后续会更新在 gitHub 上 https://github.com/SummerHH/douYuLive.git 

先说说已经实现的效果了吧,

 

 

 

1.斗鱼引导页是实现,2.斗鱼 导航设置了导航栏的pop和push手势,也就是去掉了系统自带的边缘手势,换成了全屏的pop手势(Swift版)

RootNavigationController中屏蔽了系统的手势添加全局手势重写 push pop 方法

ScreenShotView中是添加 pop动画返回是的黑色视图

APPdelegate中添加视图

    var screenshotView: ScreenShotView?
 
 screenshotView = ScreenShotView(frame: CGRect(x: 0, y: 0, width: (self.window?.frame.width)!, height: (self.window?.frame.height)!))
        window?.insertSubview(screenshotView!, at: 0)
        screenshotView?.isHidden = true

  

定义基类BaseViewController,在 controller中

是否支持自定义拖动pop手势,默认yes,支持手势 设置 true 支持手势

    var enablePanGesture: Bool = true //是否支持自定义拖动pop手势,默认yes,支持手势

BaseViewController中设置contentView正在加载中动画,定义两个方法,在子类中,开启,关闭动画,随时调用

extension BaseViewController {
    func setupUI() {
        // 1.隐藏内容的View
        contentView?.isHidden = true
        
        // 2.添加执行动画的UIImageView
        view.addSubview(animImageView)
        
        // 3.给animImageView执行动画
        animImageView.startAnimating()
        
        // 4.设置view的背景颜色
        view.backgroundColor = UIColor(r: 250, g: 250, b: 250)
    }
    
    func loadDataFinished() {
        // 1.停止动画
        animImageView.stopAnimating()
        
        // 2.隐藏animImageView
        animImageView.isHidden = true
        
        // 3.显示内容的View
        contentView?.isHidden = false
    }
}

2.设置了广告加载页,loadingAdvertisingPages

加载广告页原理:第一次项目加载引导页时不显示此页,以后每次加载广告页,当然广告也是可以打开链接的,

正常情况下,加载写的图片是可以换的,这个是由服务器来判定的,加载启动页的图片是由服务器返回,客户端下载展示,当然,并不是每次打开 APP 都要下载一遍,

是只有更换图片的时候才会从新下载,保存本地,这需要服务器返回一个图片的 Id ,客户端每次需要判断 Id 是否一致,如果 id有变动,从本地中删除原来图片,下载最新的,如果一样,直接从本地中取出原来图片即可,这里下载图片使用了Kingfisher框架,

    //加载广告页面
    fileprivate func loadingAdvertisingPages() {
    
        let picUrl = "http://staticlive.douyucdn.cn//upload//signs//201611261752175278.jpg"
        let userDefaultKey = "launchImageKey"
        
        if UserDefaults.standard.string(forKey: userDefaultKey) == "1" {
            let startView: LaunchImageView = LaunchImageView.startAdsWith(imageUrl: picUrl, clickImageAction: {
                
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: loadAdsNote), object: nil)
                
            }) as! LaunchImageView
            
            startView.startAnimationTime(time: 5, completionBlock: { (adsView: LaunchImageView) in
                print("广告执行结束")
            })
            
        }else{
            
            LaunchImageView.downLoadAdsImage(imageUrl: picUrl)
            UserDefaults.standard.set("1", forKey: userDefaultKey)
            _ = UserDefaults.standard.synchronize()
        }
    }

 

3.首页数据的加载

 

首页中的布局使用 UICollectionView来实现,代码中用到了 MVVM(并没有结合 RAC,RAC 正在学习中)网络请求类,数据的处理全部都在 ViewModel 中完成的

 

目前完成的就这样,后面会继续写直播页面,更新字在 gitHub上

 

 

 

 

posted @ 2016-12-15 14:18  _水畔竹汐  阅读(751)  评论(0编辑  收藏  举报