在动画块中调用layoutIfNeeded会冻结iPhone 7上的UI

时间:2017-08-31 08:09:37

标签: ios objective-c uiview nslayoutconstraint

在动画块中调用layoutIfNeeded会冻结UI时,有没有人遇到过同样的问题?

我有一个方法:

- (void)hide {
dispatch_block_t onMain = ^{
    CGFloat height = -viewContent.frame.size.height;

    [UIView animateKeyframesWithDuration:0.15f delay:0 options:0 animations:^{
        [UIView addKeyframeWithRelativeStartTime:0.f relativeDuration:0.7f animations:^{
            self.constraintViewContentBottom.constant = height/3;
            [self layoutIfNeeded];
        }];
        [UIView addKeyframeWithRelativeStartTime:0.7f relativeDuration:0.3f animations:^{
            self.constraintViewContentBottom.constant = height;
            [self layoutIfNeeded];
        }];
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:0.2f animations:^{
            self.viewBackground.alpha = 0.0f;
        }
                         completion:^(BOOL finished) {
                             self.hidden = YES;
                         }];
    }];
};
if([NSThread isMainThread]) {
    onMain();
}
else {
    dispatch_sync(dispatch_get_main_queue(), onMain);
}
}

在许多设备上都能很好地运行,但在iPhone 7上,行[self layoutIfNeeded];冻结了用户界面。

我无法调试该设备,但可以从中获取一些日志。

有谁知道我们如何解决问题?

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

在动画块之前设置约束'常量layoutIfNeeded是唯一必须加入块中的东西......