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

时间:2011-06-30 18:07:21

标签: iphone ios uiscrollview

我正在UIView上绘制图表,该图表由UIScrollView包含,以便用户可以水平滚动查看整个图表。

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

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

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

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

谢谢, 库拉

4 个答案:

答案 0 :(得分: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];

然后在

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

使用

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

判断用户是水平还是垂直挤压。

答案 1 :(得分:5)

您应该访问gestureRecognizers(在UIView中定义),滚动视图中使用了其中的几个,

找出哪一个是捏合识别器并在滚动视图上调用removeGestureRecognizer:,然后创建自己的工作并让它完成工作,然后将其添加回addGestureRecognizer:

这些都是公共API, 识别者和他们所处的顺序不是(目前), 所以在访问时可以防御性地编程

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

答案 2 :(得分:1)

您应该能够继承UIScrollView并覆盖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
}

如果你愿意,你可以判断它是否是一个捏,如果不是,请调用super方法,并自己处理自定义捏。

答案 3 :(得分:0)

埃德斯科& bshirley答案很好,但他们不知道在哪里放置代码。

首先,我将它放在viewDidLoad方法中,但在scrollview中找不到Pinch Gesture Recognizer(可能是因为我的scrollview是一个IBOutlet)。

然后我尝试了viewWillAppearviewDidAppear,而UIPinchGestureRecognizer就在这里。