我正在UIView
上绘制图表,该图表由UIScrollView
包含,以便用户可以水平滚动查看整个图表。
现在我想在用户用两根手指插入时缩放图形,但不是在X和Y方向上以相同的速率放大视图,我想通过改变X比例仅在X方向上缩放,而不改变Y尺度。
我想我必须抓住捏合进/出手势并重绘图表,覆盖默认的缩放行为。
但是有办法做到这一点吗?
我一直很难抓住UIScrollView
上的捏手势,因为它在开始滚动时取消了触摸。我希望即使在UIScrollView
取消触摸后缩放也能正常工作。 :(
谢谢, 库拉
答案 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)
首先,我将它放在viewDidLoad
方法中,但在scrollview中找不到Pinch Gesture Recognizer(可能是因为我的scrollview是一个IBOutlet)。
然后我尝试了viewWillAppear
或viewDidAppear
,而UIPinchGestureRecognizer
就在这里。