将NSLayoutConstraints与CALayer支持的视图结合使用无法正确显示动画

我有一个自动布局设置与动画,改变NSLayoutContraint常量值

// set the slide in view's initial height to zero self.adViewHeightConstraint = [NSLayoutConstraint constraintWithItem:self.adContainerView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:0.0]; [self.view addConstraint:self.adViewHeightConstraint]; // later, set the slid in view's height to non-zero double delayInSeconds = 3.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ self.adViewHeightConstraint.constant = 100; [UIView animateWithDuration:2.5 animations:^{ [self.view layoutIfNeeded]; }]; }); 

这正确地动画了我所拥有的视图的大小,因此,正常工作。 然而,我看到的问题是,我在2.5秒动画的持续时间内没有重绘一些自定义图层支持的视图。

我看到的行为是,要求自定义图层支持的视图在动画开始时绘制最终位置,然后应用一个转换,在动画持续时间内拉伸视图,直到它最终看起来正确。

在此处输入图像描述

这4张照片显示的是红色条形动画,然后两个蓝色视图的高度缩小,以适应尺寸缩小。 图层知道如何为每个边界更改正确绘制自己,但动画并不要求它在动画的每一步重绘…仅在开头。 这就是为什么黑色圆圈看起来像一个椭圆形 – 它与图像#4相同但是拉伸了两半。

自定义CAlayer子类有一个重写方法: drawInContext: ,并且该层将needsDisplayOnBoundsChange设置为YES

因此,问题仍然存在……我怎么能告诉NSLayoutConstraints这个动画让整个动画期间的视图重绘?

这是一个已知的问题(如果你谷歌它你会看到几个好点击,虽然我认为这个答案,虽然承认不同的症状,是迄今为止我已经看到的最明确的答案描述UIView缩放期间的问题动画 ……这是一个古老的答案,但仍然适用,我相信)。

最简单的解决方案,恕我直言,将图层放在一个不调整动画大小的视图中(例如,固定大小的新视图,其约束使其以内容视图为中心,但不会改变大小作为您的内容视图确实)。 这样,您可以享受基于约束的动画,但不会丢失自定义图层的宽高比/大小。