项目中遇到感觉一切都设置对了,但是看到的效果和预想的不一样。
后来查询了一番,才知道问题所在,现在记录一下,担心过后又忘了。
最初的问题是这样的,这个热度只有在评论里有,点击赞的时候,热度应该消失,再切回评论的时候,热度又应该出现。左右滑动这个子UIScrollView的时候,效果没问题,但是手动点击评论和赞的时候,UI 展现就出现问题了。最开始的时候以为是没处理,查看代码,其实处理的看起来没问题。下面是最初的代码截图:
在点击评论或者赞的时候,先调用的是selectedIndex,这里会先设置UIScrollView的偏移量,然后滚动UIScrollView(该scrollview有子视图的时候)会触发layoutSubviews,也就是会去调用layoutMySonsFrames,当调用了这个layoutMySonsFrames方法之后,会去判断偏移量,根据情况去隐藏或者显示这个热度。按照这个逻辑,看起来没有毛病。但是忽略了一点:
如果直接调用 setContentOffset:方法,或者setContentOffset: animated: 为NO, 在方法结束就可以立刻改变contentoffset值;如果设为YES,只能在调用这个方法的函数执行结束后才能得到新的contentoffset值。
最开始animated 设置的是 YES,也就是只有在selectedIndex方法执行完,才会将 UIScrollView 的偏移量设置成我想要的。所以这里的问题是需要将 animated 设置成 NO。
顺便记录一下layoutSubviews会被调用的几种情况:(init初始化不会触发layoutSubviews)
1、addSubview会触发viewWillLayoutSubviews
2、设置self.view及子视图的frame.size会触发layoutSubviews,当然前提是frame.size的值设置前后发生了变化,注意,此处不是origin,呼应官方文档上的边界发生变化
3、滚动一个UIScrollView(该scrollview有子视图的时候)会触发layoutSubviews
4、横竖屏幕切换会触发