UIScrollView 并取消缩放捏合手势

Posted

技术标签:

【中文标题】UIScrollView 并取消缩放捏合手势【英文标题】:UIScrollView and cancel a zooming pinch gesture 【发布时间】:2011-06-04 05:29:43 【问题描述】:

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

【问题讨论】:

【参考方案1】:

要防止用户控制器缩放和平移但仍允许以编程方式缩放和平移滚动视图,最好的方法是覆盖子类中的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;

希望这会有所帮助。

【讨论】:

实际上,这将永久禁用手势。这些问题表明了以编程方式切换手势的能力。没有? 我们可以通过 [pageScrollView removeGestureRecognizer:pageScrollView.pinchGestureRecognizer]; , 那么为什么要子类化呢?【参考方案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:)。这将产生一种“一次性”捏合处理程序,当它达到上限或下限时停止。

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于UIScrollView 并取消缩放捏合手势的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView的缩放原理

UIScrollView 放大固定点,并禁用捏合/拉出

为捏合手势设置 UIScrollView 的原点

使用 Unity 5 UI 进行捏合缩放

实现UIScrollView的缩放 Objective-C语言

不使用 UIScrollview 缩放 UIView