最近直播比较火,比如喵播,映客等等,我也利用闲暇时间模仿了斗鱼,供大家互相学习,有哪些不足的地方,还请大家多多讨论交流
斗鱼直播是比较火热的,里面包括了秀场直播,和游戏直播,直播中的所用的到技术是非常多的,比如,送礼物,聊天,弹幕,....
这里我刚刚开始模仿,所以写的东西不多,后续会更新在 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, (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上