0

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

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

在 iOS 3.2 及更低版本上,这对于使用 zoomToRect:animated: 方法的手指缩放和实用缩放都非常有效。

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

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

4

1 回答 1

2

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

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

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

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

于 2011-09-26T10:29:31.410 回答