UIScrollView:仅在允许时滚动
Posted
技术标签:
【中文标题】UIScrollView:仅在允许时滚动【英文标题】:UIScrollView: Only scroll when allowed 【发布时间】:2013-04-29 19:06:40 【问题描述】:我一直在尝试只让我的UIScrollView
向一个方向滚动并且仍然获得所有UITouch
事件。我根本不完全确定这是可能的。
我试图覆盖UIResponder
的“触摸”事件,但是一旦UIScrollView
开始滚动,触摸方法就会停止调用。
然后我尝试将UIScrollView
的scrollEnabled
属性设置为false,直到我希望UIScrollView
开始接收拖动事件,但我似乎找不到让UIScrollView
开始的方法在拖动中接收触摸事件。 这可能吗?
我的下一个尝试是在滚动视图中添加“填充”,并通过使用contentOffset
属性创建我自己的“触摸事件”,但这开始调用scrollViewDidScroll:
的次数过多并且处理得像疯了似的——回复的有效性也存在一些问题。
我玩过hitTest:withEvent:
、pointInside:withEvent:
、touchesShouldBegin:withEvent:inContentView:
和touchesShouldCancelInContentView:
,但没有成功。
从那以后,我尝试了其他一些方法,但都没有奏效。另外,根据我的发现,将 delaysContentTouches
设置为 false 会破坏滚动响应。
我会喜欢一些 real 被覆盖的触摸方法。如果我不调用 super,UIScrollView
不会收到触摸的方法。
我需要一种方法来获取UITouch
es(拖动、开始、释放和取消,而不仅仅是点击),而不会影响UIScrollView
的滚动,因为UIResponder
“触及“一旦滚动开始,事件就会消失。这可能吗?
【问题讨论】:
【参考方案1】:如果您只想检测常见的touches
,请尝试将gesture recognizers
(如UITapGestureRecognizer
)附加到您的view
,即使使用UIScrollView
,它们也应该可以工作。
您也可以尝试在scrollview
上放置一个透明的UIView
,以检测一些touches
,并将其余部分传递给scrollview
。
【讨论】:
在拖动中传递触摸不允许滚动视图滚动。另外,我不是在寻找点击,而是所有事件的触摸(尤其是拖动)。 然后尝试制作一个自定义手势识别器来捕获您想要的事件。看到这个:developer.apple.com/library/ios/#documentation/uikit/reference/… 这可能有用:iphonedevsdk.com/forum/iphone-sdk-tutorials/… 谢谢,但是,第二个帖子无关紧要。如果您查看here,它在 SDK 3.0 中停止工作。不幸的是,我已经看到了其中的大部分内容。 我已经使用自定义 UIGestureRecognizer 和实现解决了这个问题。谢谢!【参考方案2】:当您开始滚动时,保存偏移量的副本。然后在完成滚动时检查它。此代码允许向左滚动,但阻止向右滚动
CGPoint oldOffset;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
oldOffset = scrollView.contentOffset;
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
if (scrollView.contentOffset.x < oldOffset.x)
[scrollView setContentOffset:oldOffset];
【讨论】:
我很欣赏这个想法,但我需要拖拽的感觉。那只会给我起点和终点之间的距离。以上是关于UIScrollView:仅在允许时滚动的主要内容,如果未能解决你的问题,请参考以下文章