更改 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 子视图的位置错误(自动布局)

单元格聚焦时无法更改子视图的 alpha

将子视图添加到 UICollectionViewCell 子类?

使用 xib 将手势添加到 UICollectionViewCell 子视图

如何将子视图添加到自定义 UICollectionViewCell

将子视图添加到 UICollectionViewCell 时出现意外行为