为捏合手势设置 UIScrollView 的原点

Posted

技术标签:

【中文标题】为捏合手势设置 UIScrollView 的原点【英文标题】:Setting UIScrollView's origin for pinch gestures 【发布时间】:2012-11-23 14:33:25 【问题描述】:

我正在创建一个滚动视图来显示一个非常大的视图,并且我需要滚动和缩放功能(就像图像查看器一样)。以下是我采取的步骤:

    在界面构建器中,我已将滚动查看器置于视图控制器中。 我在滚动查看器中添加了捏合手势识别器。 我已将手势识别器的操作连接到处理手势事件的代码。 加载视图控制器时,我将视图的原点更改为中心(viewer 是我的滚动查看器):self.viewer.contentOffset = CGPointMake(384, 512); 在我的处理程序代码中,我这样处理事件:

startScale开头是1.0)

- (IBAction)handlePinch:(UIPinchGestureRecognizer *)sender 
    if(sender.state == UIGestureRecognizerStateEnded)
        startScale *= sender.scale;
    else
        float result = sender.scale * startScale;

        self.viewer.transform = CGAffineTransformMakeScale(result, result);
    

当我运行应用程序时,手势被识别并且缩放工作正常,但是,整个视图相对于屏幕的0,0 点(左上角)进行缩放。我希望它相对于我应用手势的中间点进行缩放,就像放大照片的自然捏合手势一样。

我也尝试设置self.viewer.frame 的来源,但没有任何改变。我搜索了这个问题,发现了这些:

How to set a UIView's origin reference?(已经试过了)

https://***.com/questions/13163279/pinch-punch-gestures-center(关于我的问题,但未得到答复)

UIPinchGestureRecognizer for zooming and panning an image in xcode(看起来有点矫枉过正,对我来说太复杂了,我不确定这是否真的有助于我的情况)

如何使用滚动视图实现自然捏合,我做错了什么?

谢谢, 可以。

【问题讨论】:

【参考方案1】:

好吧,问题的答案很简单:完全取消捏合手势。使用 UIScrollView 的好处是它在内部处理平移/缩放,您无需执行任何操作

编辑:为确保内容正确缩放,您将需要一个 UIView(称为 contentView 或任何您想要的)放置所有内容的位置,然后在您的 @987654323 的委托方法上@这样做:

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
    return contentView;

这应该可以解决您的问题

编辑 2:还记得为 UIScrollView 设置最小/最大缩放比例

【讨论】:

哦,我不知道它在内部处理了捏。但不幸的是它没有用。我删除了手势识别器,将我所有的内容视图放入其中,并尝试了这个:-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView return self.innerView; 但现在我捏的时候什么都没有发生? 一个观察:viewForZoomingInScrollView 永远不会被调用。 (是的,我已将我的视图控制器连接为滚动视图的委托) 好的,解决了问题:我需要设置滚动视图的最小/最大缩放比例。您能否将这些要求也添加到未来访问者的答案中?

以上是关于为捏合手势设置 UIScrollView 的原点的主要内容,如果未能解决你的问题,请参考以下文章

将捏合手势从自定义 UIView 传递到父 UIScrollView

UIScrollView 在不正确的点上缩放

UIScrollView 直到缩放用户操作后才平移

UIScrollView 放大固定点,并禁用捏合/拉出

当已经完全放大时,如何强制 UIScrollView 完全忽略放大手势?

更改 UIScrollView 中的比例因子