gpt4 book ai didi

iphone - UIScrollView ZoomToRect 未缩放到给定的矩形(从 UITouch CGPoint 创建)

转载 作者:行者123 更新时间:2023-12-03 18:43:00 25 4
gpt4 key购买 nike

我的应用程序有一个带有一个 subview 的 UIScrollView。 subview 是一个扩展的 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];

}

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

如果我像这样制作 UIView

UIView *v = [[UIView alloc] initWithFrame:zoomRect]; 
[v setBackgroundColor:[UIView redColor]];
[self addSubview:v];

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

请注意:我是在 PC 上写这篇文章的,我记得在 Mac 上把除以两部分搞乱了,所以假设这会绘制一个触摸点位于中心的矩形。如果 UIView 偏离中心但缩放到正确的位置,那就太好了。

但是,当它执行zoomToRect时,它似乎使用了放大结果左上角的zoomRect的右下角。

此外,我注意到根据我单击 UIScrollView 的位置,它会锚定到不同的位置。看起来几乎中间有一个十字,它以某种方式反射(reflect)了点,就好像中间左边的任何地方都是负面反射,而中间右边的任何地方都是正面反射?

这看起来很复杂,难道不应该缩放到 UIView 能够绘制的矩形吗?

我进行了大量的研究来弄清楚如何创建高质量的 PDF,所以我假设使用 CALayer 可能会抛弃坐标系?但对于 UIScrollView 来说,它应该将其视为尺寸为 768x985 的 View 。

这有点高级,请假设创建 ZoomRect 的代码都很好。 UIView 中的 CALayer 在 UIScrollView 中还有更深层次的东西......

最佳答案

好的另一个答案:

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

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

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

- (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];
}

关于iphone - UIScrollView ZoomToRect 未缩放到给定的矩形(从 UITouch CGPoint 创建),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2384162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com