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)。
然后,我尝试在viewWillAppear
或viewDidAppear
和UIPinchGestureRecognizer
在这里。