Iphone UIScrollView';s zoomToRect需要调用两次

Iphone UIScrollView';s zoomToRect需要调用两次,iphone,ios,uiscrollview,Iphone,Ios,Uiscrollview,我希望平移到我的UIScrollView中的某个点,同时放大到最大缩放级别。这里不考虑zoom rect计算,似乎需要调用两次zoomToRect来缩放和平移我想要的位置 [self performSelector:@selector(zoom) withObject:nil afterDelay:1.0]; [self performSelector:@selector(zoom) withObject:nil afterDelay:2.0]; [self performSelector:@s

我希望平移到我的
UIScrollView
中的某个点,同时放大到最大缩放级别。这里不考虑zoom rect计算,似乎需要调用两次
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];
}
第一个
zoom
调用会放大,但需要第二个调用才能真正平移到正确的位置。一旦到了正确的位置,第三次呼叫就什么也不做了——这是我对第二次呼叫的预期

这里有什么问题?据我所知,我希望它能在第一次通话时起作用

上提供了一个示例项目。

问题是覆盖的布局子视图使图像视图居中。这会影响第一次调用后生成的帧的位置

[self.scrollView zoomToRect:(CGRect){ 913.556, 0, 320, 465 } animated:YES];
我做了一些测试,发现了一个快速破解,也许这会引导您找到一个适合您需要的解决方案:

1.)Override zoomToRect:表示您正在执行自动缩放:

- (void)zoomToRect:(CGRect)rect animated:(BOOL)animated {
    self.automaticZooming = YES;
    [super zoomToRect:rect animated:animated];
}
2.)根据自动对焦状态调整布局子视图中的图像视图:

- (void)layoutSubviews 
...
    if (!self.automaticZooming) {
        imageView.frame = frameToCenter;
    }
...
}
3.重置完成缩放后的自动缩放状态:

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    self.automaticZooming = NO;
}
“问题”是覆盖的布局子视图,它使图像视图居中。这会影响第一次调用后生成的帧的位置

[self.scrollView zoomToRect:(CGRect){ 913.556, 0, 320, 465 } animated:YES];
我做了一些测试,发现了一个快速破解,也许这会引导您找到一个适合您需要的解决方案:

1.)Override zoomToRect:表示您正在执行自动缩放:

- (void)zoomToRect:(CGRect)rect animated:(BOOL)animated {
    self.automaticZooming = YES;
    [super zoomToRect:rect animated:animated];
}
2.)根据自动对焦状态调整布局子视图中的图像视图:

- (void)layoutSubviews 
...
    if (!self.automaticZooming) {
        imageView.frame = frameToCenter;
    }
...
}
3.重置完成缩放后的自动缩放状态:

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

真奇怪。你能在github上发布一个独立的示例代码项目吗?如果不使用performSelector:withObject:afterDelay:直接调用zoom,是否会发生同样的情况?是的,我刚才使用performSelector使其易于复制。它通常直接从CoreLocation委托方法调用。将尝试为它创建一个项目。好的-能够创建一个简单的项目来重现这个。现在可以在github上使用,这很奇怪。你能在github上发布一个独立的示例代码项目吗?如果不使用performSelector:withObject:afterDelay:直接调用zoom,是否会发生同样的情况?是的,我刚才使用performSelector使其易于复制。它通常直接从CoreLocation委托方法调用。将尝试为它创建一个项目。好的-能够创建一个简单的项目来重现这个。现在可在Hah的github上获得!你给我指出了正确的方向。似乎只是删除
frameToCenter.origin.(x | y)=0
就可以做到这一点。还不知道为什么会在里面。哈!你给我指出了正确的方向。似乎只是删除
frameToCenter.origin.(x | y)=0
就可以做到这一点。甚至不知道为什么会在那里。