UIScrollView zoomToRect没有缩放到给定的rect(从UITouch CGPoint创建)

pmh*_*art 6 iphone calayer uiscrollview

我的应用程序有一个带有一个子视图的UIScrollView.子视图是一个扩展的UIView,它使用drawLayer事件中的图层将PDF页面打印到自身.

使用内置捏的缩放效果很好.setZoomScale也可以按预期工作.

我一直在努力使用zoomToRect功能.我发现了一个在线示例,它从给定的CGPoint生成CGRect zoomRect变量.

在touchesEnded函数中,如果有双击并且它们一直缩小,我想放大到我创建的PDFUIView,好像它们正在用它们双击的捏的中心捏出来.

因此,假设我将UITouch变量传递给我的函数,如果它们双击,则使用zoomToRect.

我开始使用我在苹果网站上找到的以下功能:

http://developer.apple.com/iphone/library/documentation/WindowsViews/Conceptual/UIScrollView_pg/ZoomZoom/ZoomZoom.html

以下是我的UIScrollView扩展类的修改版本:

- (void)zoomToCenter:(float)scale withCenter:(CGPoint)center {     

    CGRect zoomRect;
    zoomRect.size.height = self.frame.size.height / scale;
    zoomRect.size.width  = self.frame.size.width  / scale;

    zoomRect.origin.x = center.x - (zoomRect.size.width  / 2.0);
    zoomRect.origin.y = center.y - (zoomRect.size.height / 2.0); 

    //return zoomRect;

    [self zoomToRect:zoomRect animated:YES];

} 
Run Code Online (Sandbox Code Playgroud)

当我这样做时,UIScrollView似乎使用上面的zoomRect的右下边缘而不是中心进行缩放.

如果我像这样制作UIView

UIView *v = [[UIView alloc] initWithFrame:zoomRect]; 
[v setBackgroundColor:[UIView redColor]];
[self addSubview:v];
Run Code Online (Sandbox Code Playgroud)

红色框出现,触摸点位于中心位置.

请注意:我正在从我的电脑上写这篇文章,我记得在我的Mac上用两个部分搞乱,所以假设这画了一个矩形,触摸点在中心.如果UIView离开中心但是缩小到正确的位置那将是好事.

然而,发生的事情是当它预先形成zoomToRect时,似乎使用放大结果左上角的zoomRect右下角.

此外,我注意到,根据我点击UIScrollView的位置,它会锚定到不同的位置.几乎看起来中间有一个十字架,它以某种方式反映了点,好像中间的任何一个地方都是负反射,中间的任何地方都是正反射?

这似乎很复杂,不应该只是缩放到UIView能够绘制的绘制的矩形吗?

我用了很多研究来弄清楚如何创建一个高质量的PDF,所以我假设使用CALayer可能会抛弃坐标系?但是对于UIScrollView,它应该将其视为具有768x985尺寸的视图.

这有点高级,请假设创建zoomRect的代码都很好.UIVc中的CALayer有更深层次的内容,它位于UIScrollView中....

Tom*_*sen 5

好的,另一个答案:

苹果提供的例程对我有用,但是您需要让手势识别器将点击点转换为imageView坐标,而不是滚动条。

Apple的示例执行了此操作,但是由于我们的应用程序工作方式不同(我们更改了UIImageView),因此在uiscrollview上设置了actionRecongnizer-效果很好,但是您需要在handleDoubleTap中执行此操作:

这大致基于苹果示例代码“ TaptoZoom”,但正如我所说,我们需要将手势识别器连接到滚动视图。

- (void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer {
    // double tap zooms in
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(handleSingleTap:) object:nil];
    float newScale = [imageScrollView zoomScale] * 1.5;
    // Note we need to get location of the tap in the imageView coords, not the imageScrollView
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:imageView]];
    [imageScrollView zoomToRect:zoomRect animated:YES];
}
Run Code Online (Sandbox Code Playgroud)


小智 0

我有类似的东西,这是因为我没有通过将 center.x 和 center.y 值除以比例来调整它们(使用 center.x/scale 和 center.y/scale )。也许我没有正确阅读你的代码。