UIScrollView在iOS 4.0上放大时不调用layoutSubviews

时间:2011-04-27 03:56:06

标签: iphone ios uiscrollview uiscrollviewdelegate layoutsubviews

我已经阅读了许多在这里提出的UIScrollView问题,但没有人回答这个问题。

我有一个UIScrollView可以缩放包含其他子视图的视图。当发生缩放时,我需要将视图的子视图移动到某些位置。我可以通过在UIScrollView的layoutSubviews方法中相应地更改它们的帧来实现这一点。

在iOS 3.2及更低版本中,这适用于使用zoomToRect:animated:method进行手指缩放和实用缩放。

在iOS 4.0或更高版本中,这仅适用于手指缩放。通过使用zoomToRect:animated:进行实用缩放,对layoutSubviews的调用仅发生一次(在缩放结束时)。我需要在缩放期间多次调用此方法,以便我的子视图可以随着缩放一起平滑更改位置。

总而言之,在iOS 3.2上,对layoutSubviews的调用多次发生,而在iOS 4.0上,当调用zoomToRect:animated:时,只调用一次layoutSubviews。有谁知道我的问题的解决方案?

1 个答案:

答案 0 :(得分:2)

在IOS 4.0中,动画由操作系统完成 - 我假设尽可能多地使用基于GPU的硬件加速。作为缺点,对从另一个(动画)值导出的值进行动画处理变得更加困难。与您的情况一样,子视图的位置取决于UIScrollView的缩放级别。 为了实现这一点,您应该将子视图的动画设置为与缩放动画并行。尝试类似:

[UIView animateWithDuration:0.5 delay:0
                    options:UIViewAnimationOptionLayoutSubviews
                 animations:^{
    theScrollView.zoomScale = zoomScale;
    [theScrollView layoutSubViews];
} completion:^(BOOL finished) {}];

这应该在同一动画上下文中设置子视图的帧属性,因此,它们应该由OS一起动画。 我不确定是否需要显式的layoutSubViews,或者UIViewAnimationOptionLayoutSubviews选项是否已经实现了。

另请参阅此问题的答案:How to make UIScrollView send scrollViewDidScroll messages during animations