UIScrollView的zoomToRect需要调用两次

tcu*_*rdt 0 iphone uiscrollview ios

我希望平移到我的某个点UIScrollView,同时这样做也可以放大到最大缩放级别.在这里省略缩放矩形计算,似乎zoomToRect需要调用两次来缩放和平移我想要的位置.

[self performSelector:@selector(zoom) withObject:nil afterDelay:1.0];
[self performSelector:@selector(zoom) withObject:nil afterDelay:2.0];
[self performSelector:@selector(zoom) withObject:nil afterDelay:3.0];

- (void) zoom
{
    [self.imageScrollView zoomToRect:(CGRect){ 913.556, 0, 320, 465 }
                            animated:YES];
}
Run Code Online (Sandbox Code Playgroud)

第一个zoom调用放大,但第二个调用实际平移到正确的位置.一旦处于正确的位置,第三个呼叫什么都不做 - 这是我已经预期的第二个呼叫.

这有什么问题?根据Apple文档,我希望它能够在第一次调用时工作.

github上提供了一个示例项目.

小智 5

"问题"是被覆盖的layoutSubviews,它以图像视图为中心.这会在第一次调用后影响结果帧的位置

[self.scrollView zoomToRect:(CGRect){ 913.556, 0, 320, 465 } animated:YES];
Run Code Online (Sandbox Code Playgroud)

我做了一些测试,发现了一个快速的黑客,也许这会引导您找到符合您需求的解决方案:

1.)覆盖zoomToRect:表示您正在进行自动缩放:

- (void)zoomToRect:(CGRect)rect animated:(BOOL)animated {
    self.automaticZooming = YES;
    [super zoomToRect:rect animated:animated];
}
Run Code Online (Sandbox Code Playgroud)

2.)在layoutSubviews中调整图像视图取决于 automaticZooming状态:

- (void)layoutSubviews 
...
    if (!self.automaticZooming) {
        imageView.frame = frameToCenter;
    }
...
}
Run Code Online (Sandbox Code Playgroud)

3.)完成缩放后重置自动缩放状态:

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    self.automaticZooming = NO;
}
Run Code Online (Sandbox Code Playgroud)

  • 哇——这么老的问题/答案。很高兴它仍然有用。 (2认同)