2011-06-04 120 views

回答

4

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

-(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; 
} 

希望这会有所帮助。

+0

实际上,这会永久禁用该手势。这些问题表明了以编程方式切换手势的能力。没有? – dugla 2013-01-23 23:42:00

+1

我们可以通过[pageScrollView removeGestureRecognizer:pageScrollView.pinchGestureRecognizer]来做到这一点; ,那么为什么要继承? – Xeieshan 2014-06-22 18:56:49

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:)与手势识别。这会形成一种“一次性”的夹点处理程序,当它达到上限或下限时停止。

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