在不锁定 UI 的情况下禁用滚动视图

Posted

技术标签:

【中文标题】在不锁定 UI 的情况下禁用滚动视图【英文标题】:disable scrollview without locking the UI 【发布时间】:2013-02-28 15:50:25 【问题描述】:

我有一个包含(以及其他控件)UIScrollview 的应用程序。 在某些时候我需要禁用滚动视图上的滚动,但我不想使用

   scrollView.scrollEnabled = YES;

属性。我该如何处理?

我试图拦截

    -(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
     
    if(mycondition) 
      return;
    

当我的条件有效时,代码会返回,但滚动仍然会发生。

【问题讨论】:

" 因为它锁定了 UI" - 你是什么意思?它只锁定滚动视图,使其不滚动 - 这不是你想要的吗? 不,它会锁定我想要的滚动视图上的触摸,但有条件地禁用滚动。 对子视图的触摸仍然有效,您要尝试哪些触摸? 【参考方案1】:

你已经很接近了,试试这个:

-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView  
   if(mycondition)
      [scrollView setContentOffset:scrollView.contentOffset animated:YES];    

如果 mycondition 为真,这应该会停止滚动。

【讨论】:

很酷的修复老兄,我所做的只是 [scrollView setContentOffset:CGPointMake(0, 0) animated:YES];【参考方案2】:

我有一种笨拙的方法可以帮助你,也可能没有。

您尝试使用 scrollViewWillBeginDecelerating: 做某事没有奏效,因为该方法只是为您提供消息,而不是请求许可(返回 void)。

相反,您可以实现 scrollViewDidScroll:,它也不需要请求权限,但在该方法中,您可以通过设置 contentOffset 值来防止滚动发生滚动视图实际上并没有移动。要完成这项工作,您必须检测到您不想滚动的其他地方并在此时保存 contentOffset

    // Condition starts.  Save the content offset
    if (whatever) 
       lockedContentOffset = tableView.contentOffset;
    

...

- (void) scrollViewDidScroll:(UIScrollView *)scrollView 
    if (condition_for_which_i_dont_want_to_scroll) 
        scrollView.contentOffset = lockedContentOffset;
        NSLog(@"Reset content offset");
    

scrollViewDidScroll: 方法将在每次尝试滚动时被调用多次,因为 scrollView 仍在尝试滚动并且具有动量。然而,在我对这段代码的测试中,我没有看到任何明显的滚动。

希望这会有所帮助。

【讨论】:

以上是关于在不锁定 UI 的情况下禁用滚动视图的主要内容,如果未能解决你的问题,请参考以下文章

在我做其他事情时禁用放大滚动视图

如何在不向用户显示视图的情况下捕获整个滚动视图的图片

嵌套滚动视图的滚动无法正常工作

如何在不滚动选择器视图的情况下选择当前时间

UIPanGestureRecognizer 重新启用滚动视图

在不使用图像的情况下滚动滚动视图时,应用程序崩溃并在 ARC 中收到内存异常