【问题标题】:Change UICollectionViewCell subview frame更改 UICollectionViewCell 子视图框架
【发布时间】: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,因为它会用新的单元格替换单元格,而不是为更改设置动画
  • 为什么不直接改变宽度约束?
  • 正在动画的视图此时没有使用自动布局,因为操作框架是让它动画的一种简单方法。你认为这在没有改变框架的情况下会起作用吗?

标签: ios objective-c uicollectionviewcell


【解决方案1】:

呃,答案很简单,但我花了好几个小时才弄清楚。我正在使用collectionView: cellForItemAtIndexPath:collectionView: didSelectItemAtIndexPath: 中检索对目标UICollectionViewCell 的引用。这意味着被引用的单元格并不总是我认为的单元格,因为出队。最后,我从单元格创建了一个自定义委托回调,因此我可以拥有自己的 didSelectItem... 方法,该方法也传递了单元格本身。这样我就知道我要处理的单元格永远是我认为的那个单元格,然后动画开始工作。

当我开始遇到属性问题时,我才意识到这一点,当我从其他方法访问时,我知道我设置为 nil。所以我意识到一个新的细胞正在出队。

感谢您的所有帮助,抱歉,这有点像白痴。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多