iOS:我可以重写UIScrollView的捏入/拖出行为吗?

我在UIScrollView包含的UIView上绘制graphics,以便用户可以水平滚动查看整个graphics。

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

我想我必须抓住捏合手势并重绘graphics,覆盖默认的缩放行为。

但有没有办法做到这一点?

我一直有一个非常困难的时间赶上在UIScrollView捏手势,因为它取消触摸时,它开始滚动。 即使在UIScrollView取消触摸之后,我也想让缩放工作。 🙁

谢谢库拉

虽然您不能删除现有的捏手势识别器,您可以禁用它,然后添加自己的:

 // 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]; 

然后进来

 - (void) pinch:(UIPinchGestureRecognizer*)recognizer { .. } 

使用

 [recognizer locationOfTouch:0 inView:..] [recognizer locationOfTouch:1 inView:..] 

弄清楚用户是水平还是垂直捏。

您应该改为访问gestureRecognizers (在UIView中定义),其中有几个被滚动视图使用,

找出哪一个是捏认识器,并调用removeGestureRecognizer:在滚动视图,然后创build你自己的,并做它的工作,添加回addGestureRecognizer:

这些都是公共API,识别器和它们的顺序不是(当前),因此在访问它们时防御性地进行编程

(这是操纵UIKit视图的完全有效的方法,苹果公司不会/不应该有这个问题 – 虽然他们不能保证它在任何未来的版本中都能正常工作)

你应该能够inheritanceUIScrollView并覆盖touchesBegan:方法。 不要打电话给[super touchesBegan:],而是根据需要调整缩放比例:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //Anything you want. Probably you would want to store all the touches //or their values, so that you can compare them to the touches //in the touchesEnded: method, //thus letting you know what the pinch amount was } 

如果你喜欢,你可以判断是否是捏,如果不是,请调用超级方法,只有自己处理自定义捏。

Edsko&bshirley的答案是好的,但他们不知道在哪里放置代码。

首先,我把它放在viewDidLoad方法中,但在scrollview中找不到捏手势识别器(可能是因为我的scrollview是一个IBOutlet)。

然后,我尝试在viewWillAppearviewDidAppearUIPinchGestureRecognizer在这里。