UIScrollView并取消缩放捏合手势

时间:2011-06-04 05:29:44

标签: objective-c ios uiscrollview

如何强制取消UIScrollView上的缩放开放捏动手势,例如当用户“足够”缩放以触发新动作时?

3 个答案:

答案 0 :(得分:4)

要防止用户控制器缩放和平移但仍允许滚动视图的编程缩放和平移,最好的方法是覆盖子类中的UIScrollView's - addGestureRecognizer:方法。

-(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
    //Prevent any of the default panning and zooming controls from working
    gestureRecognizer.enabled = NO;
    [super addGestureRecognizer:gestureRecognizer];
    return;
}

每个手势识别器都被禁用,以便更好地控制(例如,允许平移控制,但仅允许通过双击进行缩放),您只需通过-isKindOfClass:检查传入手势识别器并禁用合适的。

-(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
{
    //Prevent zooming but not panning
    if ([gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]]) 
    {
        gestureRecognizer.enabled = NO;
    }
    [super addGestureRecognizer:gestureRecognizer];
    return;
}

希望这有帮助。

答案 1 :(得分:2)

这是怎么回事:

-(void)handlePinchGesture:(UIPinchGestureRecognizer *)sender
{
    if (![sender isEnabled])
    {
        [sender setEnabled:YES];
    }

    if (sender.state == UIGestureRecognizerStateChanged)
    {
        if (sender.scale > 2.0)
        {
            NSLog(@"Upper bound reached");
            [sender setEnabled:NO];

        }
        else if (sender.scale < 0.75)
        {
            NSLog(@"Lower bound reached");
            [sender setEnabled:NO];
        }
    }
}

只需使用手势识别器注册此selector(handlePinchGesture:)即可。这将产生一种“一次性”捏合处理程序,当它达到上限或下限时停止。

答案 2 :(得分:1)

我发现的强力解决方案是删除并重新添加接收触摸的视图,因为只要用户不结束手势,我的(子)scrollview只是没有结束对缩放的反应。

在ScrollViews中,如果您在用户滚动较大的内容大小时删除/添加子视图,则通常会执行此操作,因此甚至无需编写其他代码。

- (void)scrollViewDidZoom:(UIScrollView *)scrollView   
{
   if (scrollView.zoomScale < 0.65) 
   {
     // some actions
     [self myactionstodo];  
     // force cancel zoom gesture by usual reload (remove and re-add subviews)
     [self reloadSV:currentpage];  
   }
}