我的应用程序有一个带有一个子视图的 UIScrollView。子视图是一个扩展的 UIView,它使用 drawLayer 事件中的图层将 PDF 页面打印到自身。
使用内置捏合进行缩放效果很好。setZoomScale 也可以按预期工作。
我一直在努力使用 zoomToRect 函数。我在网上找到了一个示例,它从给定的 CGPoint 生成 CGRect zoomRect 变量。
在 touchesEnded 函数中,如果有双击并且它们一直被缩小,我想放大到我创建的 PDFUIView,就好像它们在他们双击的捏合中心进行捏合一样。
因此,假设我将 UITouch 变量传递给我的函数,如果他们双击则使用 zoomToRect。
我从在苹果网站上找到的以下功能开始:
以下是我的 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];
}
当我这样做时, UIScrollView 似乎使用上方 zoomRect 的右下边缘而不是中心进行缩放。
如果我像这样制作 UIView
UIView *v = [[UIView alloc] initWithFrame:zoomRect];
[v setBackgroundColor:[UIView redColor]];
[self addSubview:v];
红色框显示在中心,触摸点已死。
请注意:我是从我的 PC 上写这篇文章的,我记得在我的 Mac 上搞乱了除以二的部分,所以假设这会在中心绘制一个触摸点的矩形。如果 UIView 偏离中心但放大到正确的位置,那就太好了。
但是,当它执行 zoomToRect 时,它似乎使用了放大结果左上角的 zoomRect 的右下角。
另外,我注意到根据我在 UIScrollView 上单击的位置,它会锚定到不同的位置。似乎中间有一个十字架,它以某种方式反映了这些点,就好像中间左边的任何地方都是负面的反映,而中间的任何地方都是正面的反映?
这似乎很复杂,不应该只是缩放到 UIView 能够绘制的矩形吗?
我进行了大量研究来弄清楚如何创建高质量缩放的 PDF,所以我假设使用 CALayer 可能会脱离坐标系?但是对于 UIScrollView 来说,它应该将其视为具有 768x985 尺寸的视图。
这有点高级,请假设创建 zoomRect 的代码都很好。UIScrollView 中的 UIView 中的 CALayer 有一些更深层次的东西......