UIView animateWithDuration UITableView导致UITableViewCell子视图也动画

时间:2015-06-18 11:31:24

标签: ios objective-c iphone uitableview

我正在尝试使用 + transitionWithView:duration:options:animations:completion:设置更改UITableView高度约束的动画。设置选项后,UITableViewCell contentView的子视图UIView也会动画显示。效果如下。正如您所看到的那样,窗口下方的单元格向上,红点视图的边界将动画化为预定义的约束。如果我没有设置动画选项,它就不会是这样的。但是当我改变UITableView高度时我需要动画。那么如何保持表视图高度动画并禁用表视图单元格contentView的子视图动画?代码如下。红点视图是具有红色背景颜色的UIView。有没有办法禁用UITableViewCell contentView的子视图动画?

- (void)changeTableViewHeight {
    self.tableViewTopVerticalSpaceConstraint.constant = 0;
    [self.tableView setNeedsUpdateConstraints];
    [self.view setNeedsUpdateConstraints];
    [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
        [self.view layoutIfNeeded];
    } completion:^(BOOL finished) {
        self.topViewHeightConstraint.constant = 50;
        [self.topView setNeedsUpdateConstraints];
    }];
}

animation

3 个答案:

答案 0 :(得分:0)

//1. All constraints change must be done
self.hightConstraint.constant = 200;
self.anotherConstraint.constant = 34;
...
...

// 2. Indimate to iOS that this view need update constraints. 
// Hey iOS I have modified few constraints. beware of it to layout that changes.
[self.view setNeedsUpdateConstraints];


// 3. I'm done, relayout the view with animation, 
      If I really changed any constraints  to view.
[UIView animateWithDuration:1.5 animations:^{
    [self.view layoutIfNeeded];
}];

希望有人能节省时间

答案 1 :(得分:0)

有一个类似的问题,我解决了禁用动画的视图层我不想动画。在您的情况下...为您的awakeFromNib子类实现UITableViewCell方法并在那里禁用动画。在你的情况下像... ...

override func awakeFromNib() {
    super.awakeFromNib()
    redCircleView.layer.removeAllAnimations()
}

事情是UIView.animateWithDuration为视图的图层设置动画,对于在此动画期间或因此动画创建的新表视图单元格和其他视图,所有更改也将被设置为动画。

...编辑......

与此同时,我设法找到了更好的解决方案。在UIView.animateWithDuration的options参数中,使用UIViewAnimationOptionLayoutSubviews(或Swift中的.LayoutSubviews)选项。这将在动画提交时布置子视图。

答案 2 :(得分:-1)

更新代码

- (void)changeTableViewHeight {
    self.tableViewTopVerticalSpaceConstraint.constant = 0;
    self.topViewHeightConstraint.constant = 50;
    [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
       [self.view layoutIfNeeded];
    } completion:^(BOOL finished) {
       [self.topView setNeedsUpdateConstraints];
    }];
}