iOS:我可以覆盖UIScrollView的捏合/缩小行为吗?

Tak*_*aka 5 iphone uiscrollview ios

我在a上绘制了一个图形UIView,它由a包含,UIScrollView以便用户可以水平滚动以查看整个图形.

现在我想在用户用两个手指插入时缩放图形,但是我不想在X和Y方向上以相同的速率放大视图,我想通过改变X比例来仅在X方向上放大,而不改变Y量表.

我想我必须抓住捏合进/出手势并重绘图形,覆盖默认的缩放行为.

但是有办法做到这一点吗?

我一直很难抓住捏手势UIScrollView,因为它在开始滚动时取消了触摸.我希望即使UIScrollView取消触摸后缩放也能正常工作.:(

谢谢,库拉

eds*_*sko 12

虽然您无法删除现有的捏手势识别器,但您可以将其禁用,然后添加自己的:

// Disable existing recognizer
for (UIGestureRecognizer* recognizer in [_scrollView gestureRecognizers]) {
    if ([recognizer isKindOfClass:[UIPinchGestureRecognizer class]]) {
        [recognizer setEnabled:NO];
    }
}

// Add our own
UIPinchGestureRecognizer* pinchRecognizer = 
  [[UIPinchGestureRecognizer alloc] initWithTarget:self 
                                            action:@selector(pinch:)];
[_scrollView addGestureRecognizer:pinchRecognizer];
[pinchRecognizer release];
Run Code Online (Sandbox Code Playgroud)

然后进去

- (void) pinch:(UIPinchGestureRecognizer*)recognizer { .. }
Run Code Online (Sandbox Code Playgroud)

使用

[recognizer locationOfTouch:0 inView:..]
[recognizer locationOfTouch:1 inView:..]
Run Code Online (Sandbox Code Playgroud)

弄清楚用户是水平还是垂直挤压.

  • 来自遥远未来的快速评论:在写完这个答案三个月后推出的iOS 5添加了` - [UIScrollView pinchGestureRecognizer]`所以你不必进行线性搜索并希望Apple也不做任何事情非正统的. (2认同)

bsh*_*ley 5

你应该改为访问gestureRecognizers(在UIView中定义),滚动视图使用了几个,

弄清楚哪一个是夹点识别器并调用removeGestureRecognizer:滚动视图,然后创建自己的并让它完成工作,将其添加回来addGestureRecognizer:.

这些都是公共API,识别器以及它们所处的顺序不是(当前),因此在访问它们时会采取防御措施

(这是操纵UIKit视图的完全有效的方式,Apple不会/不应该有它的问题 - 尽管他们不保证它可以在以后的任何版本中使用)