Swift斗鱼直播--首页处理TitleView和ContentView的逻辑关系

优化

  • 问题1:contentView中定义了一个parentVC对其是个强引用;与HomeVC对contentView是强引用,会造成循环引用,会造成无法销毁,
    • 方法,将其中一个改成weak,但是必须是可选类型
  • 问题2:闭包中使用self,最后使用weak,否则也会有循环引用
    • [weak self]in

1.PageTitleView中点击

  • 1️⃣titleView中逻辑处理:按钮选中状态,滑块移动
  • 2️⃣告诉contentView滚动到对应控制器界面

步骤

  • 1️⃣给label添加点击手势
    • extension监听点击的方法
      • 1.获取当前label --- 手势.view转换label
      • 2.获取之前的label --- 定义属性保存,默认是0
      • 3.切换文字的颜色
      • 4.保存最新label下标值
      • 5.滚动条滚动到最新label下
      • 6.对应contentView也要滚动 --- 注意:titleView和contentView是两个独立的UIView,他们产生关系的位置是HomeVC中,只能讲titleView的滚动消息告诉HomeVC,让HomeVC告诉contentView需要滚动 ------ 闭包 通知 代理

关于代理

  • 协议后面要加上class,只能被类遵守,防止其他类型也可以使用就无法将协议中的属性定义成可选类型

2.处理contentView的滚动

  • 1️⃣如何监听滚动?collectionView的代理
    • 在滚动的时候(代理方法中)需要获取的数据
      • a.progress滚动进度
      • b.sourceIndex(原来标题下标)
      • c.targetIndex(目标滚动标题下标)
    • 思路
      • a.判断左滑or右滑
        • 代理方法:开始滚动时
      • b.将数据通过代理传到titleView
        • 1.取出sourceLabel和targetLabel
        • 2.处理滑动条逻辑
        • 3.颜色渐变
          • 定义宏
          • 将之前创建时用UIColor的部分改成宏
      • c.点击title而不是挪动下面的contentView的时候,会调用titleView中的代理方法,进而通知contentView的代理方法去计算offset等数据再传递给titleView进行label的设置,其实是多余的,点击title时应该直接改变label颜色 而不需要计算offset!
        • 定义一个布尔值isForbidScrollDelegate,判断当前是否是titleView的点击
          - 初始化值为false
          - 如果是true在pageContentView的scrollView代理方法中直接return
          - pageContentView中对外(除本类)提供了一个设置对应currentIndex的方法(根据传入的index设置当前pageContentView);若对外使用该方法,则isForbidScrollDelegate = true (应该直接设置,而并非需要contentView计算)
      • d.bug:滑动后在点击其他label两个都会是橘色
        • 在TitleView中,根据contentView设置label之后,要记录已经最新的label下标值

你可能感兴趣的:(Swift斗鱼直播--首页处理TitleView和ContentView的逻辑关系)