更改 UICollectionViewCell 子视图框架
Posted
技术标签:
【中文标题】更改 UICollectionViewCell 子视图框架【英文标题】:Change UICollectionViewCell subview frame 【发布时间】:2019-10-25 07:32:53 【问题描述】:我有一个带有多个子视图的 UICollectionView 子类。单元格类包括一个方法,该方法应该导致单元格中的一个子视图(timerView)的动画。问题是,尽管 NSLog() 语句表明帧正在更改,但没有任何反应。子视图的框架没有变化。如何使 subView 的框架发生变化?
UIView *superView = self.timerView.superview;
//Force the border view to layout so we can get the size
[superView layoutIfNeeded];
NSLog(@"%@", NSStringFromCGRect(superView.frame));
self.timerView.frame = CGRectMake(0, 0, 0, superView.frame.size.height);
NSLog(@"%@", NSStringFromCGRect(self.timerView.frame));
[UIView animateWithDuration:duration animations:^
self.timerView.frame = self.timerView.superview.frame;
completion:^(BOOL finished)
if (completion)
completion();
];
【问题讨论】:
你试过reloadData
吗?为什么不autolayout
?
我正在使用自动布局,但我需要对一个子视图的框架进行动画更改以响应用户交互
我没有使用 reloadData,因为它会用新的单元格替换单元格,而不是为更改设置动画
为什么不直接改变宽度约束?
正在动画的视图此时没有使用自动布局,因为操作框架是让它动画的一种简单方法。你认为这在没有改变框架的情况下会起作用吗?
【参考方案1】:
呃,答案很简单,但我花了好几个小时才弄清楚。我正在使用collectionView: cellForItemAtIndexPath:
在collectionView: didSelectItemAtIndexPath:
中检索对目标UICollectionViewCell
的引用。这意味着被引用的单元格并不总是我认为的单元格,因为出队。最后,我从单元格创建了一个自定义委托回调,因此我可以拥有自己的 didSelectItem...
方法,该方法也传递了单元格本身。这样我就知道我要处理的单元格永远是我认为的那个单元格,然后动画开始工作。
当我开始遇到属性问题时,我才意识到这一点,当我从其他方法访问时,我知道我设置为 nil
。所以我意识到一个新的细胞正在出队。
感谢您的所有帮助,抱歉,这有点像白痴。
【讨论】:
以上是关于更改 UICollectionViewCell 子视图框架的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionViewCell 子视图的位置错误(自动布局)
将子视图添加到 UICollectionViewCell 子类?
使用 xib 将手势添加到 UICollectionViewCell 子视图