在不锁定 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 的情况下禁用滚动视图的主要内容,如果未能解决你的问题,请参考以下文章