小码哥-斗鱼直播APP之弹出房间界面

弹出房间界面

功能说明

  • 区分弹出秀场&普通房间
    • 如果用户是秀场直播,那么弹出秀场房间界面
    • 如果用户是电脑直播,那么弹出普通房间界面
  • 秀场界面弹出
    • 直接以Model方式,从底部弹出即可
  • 普通界面弹出
    • 将界面PUSH出来
    • 注意:
    • 1> 界面push之后,不能再显示UITabbar(默认依然在下面)
    • 2> 弹出的界面需要因此导航栏,但是首页导航栏依然正常展示
    • 3> 弹出完成后,实现全屏Pop,手势左滑退出控制器

效果展示

  • 效果展示

弹出功能实现

  • 监听UICollectionView的Cell点击
    • 在BaseAnchorViewController中实现对应的代码方法监听即可
  • 创建两个房间的控制器(房间不同,需要创建两个控制器)
    • RoomNormalViewController(普通房间控制器)
    • RoomShowViewController(秀场房间控制器)
  • 在监听Cell点击方法中执行弹出逻辑
    • 取出对应的AnchorModel对象
    • 根据anchor中的isVertical属性,判断弹出方式
      • 0 : 电脑直播
      • 1 : 手机直播
    • 根据方式,弹出控制器即可
 
 
  1. func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
  2. // 1.取出主播信息
  3. let anchor = baseVM.anchorGroups[indexPath.section].anchors[indexPath.item]
  4. // 2.判断是手机直播&电脑直播
  5. anchor.isVertical == 1 ? presentShowLiveVM(anchor: anchor) : pushNormalLiveVM(anchor: anchor)
  6. }
  7. private func presentShowLiveVM(anchor : AnchorModel) {
  8. // 创建控制器
  9. let showVC = RoomShowViewController()
  10. // 弹出
  11. present(showVC, animated: true, completion: nil)
  12. }
  13. private func pushNormalLiveVM(anchor : AnchorModel) {
  14. // 1.创建控制器
  15. let normalVC = RoomNormalViewController()
  16. // 2.push
  17. navigationController?.pushViewController(normalVC, animated: true)
  18. }

显示&隐藏UINavigationBar

  • 显示&隐藏UINavigationBar使用下面方法即可
    • navigationController.setNavigationBarHidden(true, animated: true)
    • true : 隐藏
    • false : 显示
  • 在RoomNormalViewController的系统回调方法中分别执行对应的方法
    • viewWillAppear:执行隐藏方法
    • viewWillDisappear:执行显示方法
  • 注意:
    • 这样做会产生一个问题,就是原来系统的左边缘的滑动退出控制器手势无效了
    • 一旦我们隐藏了导航栏,那么该手势就会自动失效
    • 如果希望继续显示,则需要按照下面的步骤
      • 1> navigationController?.interactivePopGestureRecognizer?.delegate = self
      • 2> navigationController?.interactivePopGestureRecognizer?.isEnabled = true
  • 代码如下:
 
 
  1. class RoomNormalViewController: UIViewController, UIGestureRecognizerDelegate {
  2. override func viewDidLoad() {
  3. super.viewDidLoad()
  4. view.backgroundColor = UIColor.purple
  5. // 保留Pop手势
  6. navigationController?.interactivePopGestureRecognizer?.delegate = self
  7. navigationController?.interactivePopGestureRecognizer?.isEnabled = true
  8. }
  9. override func viewWillAppear(_ animated: Bool) {
  10. super.viewWillAppear(animated)
  11. navigationController?.setNavigationBarHidden(true, animated: true)
  12. }
  13. override func viewWillDisappear(_ animated: Bool) {
  14. super.viewWillDisappear(animated)
  15. navigationController?.setNavigationBarHidden(false, animated: true)
  16. }
  17. }

隐藏UITabbar

  • 在push时隐藏UITabbar非常简答
    • 因为系统已经提供了一个控制器的属性
    • 设置控制器的hidesBottomBarWhenPushed为true即可
  • 注意:所有的push控制器其实都需要因此,那么怎么办呢?
    • 方案一:抽取统一的父类
    • 方案二:截取push过程,在push的那一刻,设置控制器的属性
  • 该位置采取方案二:更为简单
    • 如何截取?
    • 自定义UINavigationController
    • 重写pushViewController(_ viewController: UIViewController, animated: Bool)方法
    • 将之前的UINavigationController改成自定义的
  • 代码如下:
 
 
  1. class CustomNavigationController: UINavigationController {
  2. override func viewDidLoad() {
  3. super.viewDidLoad()
  4. }
  5. override func pushViewController(_ viewController: UIViewController, animated: Bool) {
  6. viewController.hidesBottomBarWhenPushed = true
  7. super.pushViewController(viewController, animated: animated)
  8. }
  9. }

添加全屏Pop手势

思路分析:添加全屏Pop手势一直以来都有两种实现思路
  • 方式一:自己在Push出来的View中添加UIPanGestureRecognizer手势
    • 添加手势,监听手势滑动
    • 随着手势滑动,逐渐退出控制器的View
    • 优点:最容易想到,使用自定义专场即可实现
    • 缺点:较为麻烦
  • 方式二:利用运行时机制,获取系统的Pop手势target&action
    • 获取系统的手势监听View
    • 获取系统的手势target&action
    • 创建自己的手势,添加事件监听时,使用上步中的target&action
    • 将手势,添加到系统手势监听的View中
    • 优点:实现非常简单
    • 缺点:需要用到运行时机制,且不容易想到

实现方案:方案二(简单)

  • 该位置我们采用第二种实现方案,也是我个人常用的实现方案
  • 首先,我们已经知道系统是有一个左滑手势
    • 该左滑手势只能在左边缘滑动才会生效
    • 但是该手势的View&target&action系统已经创建好了
    • 我们可以自己创建一个手势,但是利用系统的View&target&action
  • 问题?
    • 1> 如果获取系统手势的View?
      • 比如简单,因为可以直接获取interactivePopGestureRecognizer手势
      • interactivePopGestureRecognizer.view即可获得
    • 2> 如果获取target&action
      • 该方式较为麻烦,需要使用KVC
      • 通过某一些Key来获取可接
    • 3> 通过哪些key呢?
      • 需要用运行时,遍历所有的属性找到
  • 代码分析:
 
 
  1. class CustomNavigationController: UINavigationController {
  2. override func viewDidLoad() {
  3. super.viewDidLoad()
  4. // 1.取出手势&view
  5. guard let gesture = interactivePopGestureRecognizer else { return }
  6. gesture.isEnabled = false
  7. let gestureView = gesture.view
  8. // 2.获取所有的target
  9. let target = (gesture.value(forKey: "_targets") as? [NSObject])?.first
  10. guard let transition = target?.value(forKey: "_target") else { return }
  11. let action = Selector(("handleNavigationTransition:"))
  12. // 3.创建新的手势
  13. let popGes = UIPanGestureRecognizer()
  14. popGes.maximumNumberOfTouches = 1
  15. gestureView?.addGestureRecognizer(popGes)
  16. popGes.addTarget(transition, action: action)
  17. }
  18. override func pushViewController(_ viewController: UIViewController, animated: Bool) {
  19. viewController.hidesBottomBarWhenPushed = true
  20. super.pushViewController(viewController, animated: animated)
  21. }
  22. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值