【发布时间】:2014-02-26 12:43:57
【问题描述】:
我正在开发一个应用程序,其中有几个 UIView 对象,它们是 UIScrollView 对象的子视图。我以编程方式创建子视图,并根据关联对象的属性将它们放置在滚动视图上。允许用户在滚动视图上移动这些子视图。通常这是可行的,但有时滚动视图会抓取平移手势。
如果触摸位置在其中一个子视图内,我想做的是抑制滚动视图手势识别器。
我可以通过查看滚动视图的手势识别器数组并查找UIScrollViewPanGestureRecognizer 对象来找到滚动视图手势识别器。我假设只有一个。
我的一个想法是让我的视图控制器成为这个手势识别器的代表,然后如果触摸在其中一个子视图的范围内,让代表抑制它。
这是处理这种情况的最佳方法,还是有更好的方法?
我已经做了类似的事情,在我对我自己的问题的回答中有所描述。 How to get stepper and longpress to coexist?
嗯。看起来识别滚动视图的UIScrollViewPanGestureRecognizer 比我预期的要困难。任何有关这样做的提示将不胜感激。
我的想法行不通。为了编写我的想法,我必须让我的 VC 成为滚动视图的平移手势识别器的代表。但是,当我这样做时,我得到了这个错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'UIScrollView's built-in pan gesture recognizer must have its scroll view as its delegate.'
这是我使用的代码。在viewDidLoad 中,我调用了一个获取滚动视图的平移手势识别器并将self 设置为委托的方法(self.scrollViewPanGestureRecognizer 只是一个存储它的属性):
self.scrollViewPanGestureRecognizer = [self.scrollView panGestureRecognizer];
self.scrollViewPanGestureRecognizer.delegate = self;
然后我实现了这个委托方法:
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
//Disable touch if touch location is in a subview.
BOOL enableGestureRecognizer = YES;
if (gestureRecognizer == self.scrollViewPanGestureRecognizer) {
CGPoint touchLocation = [touch locationInView:self.scrollView];
for (UIView *s in self.scrollView.subviews) {
if (CGRectContainsPoint(s.frame, touchLocation)) {
enableGestureRecognizer = NO;
}
}
}
return enableGestureRecognizer;
}
似乎是个好主意,但看起来我不能让我的 VC 成为代表。
刚刚尝试在滚动视图上将scrollEnabled 设置为NO。这成功地禁用了滚动,但它并没有解决问题。视图仍然偶尔不响应手势。考虑到可能是某些错误导致手势识别器从对象上脱落,我要求调试器显示有问题的视图的手势识别器。他们还在那里。我被难住了。
更新:新信息。我终于意识到没有响应的子视图是屏幕右侧的子视图。经过仔细测试,这似乎只发生在横向,并且仅当手指位置在纵向右边缘的右侧时,即320点。显然,当旋转到横向时,某些东西没有被处理。一切看似正常,但手势无法识别。
只是为了笑,我决定在方法viewDidLayoutSubviews 中显示框架和边界以及内容区域。我得到的是:
self.view.frame is {{0, 0}, {480, 320}}
self.view.bounds is {{0, 0}, {480, 320}}
self.scrollView.frame is {{0, 0}, {480, 320}}
self.scrollView.bounds is {{0, 0}, {480, 320}}
self.scrollView.contentSize is {480, 320}
我似乎错过了什么。旋转时还需要设置什么?
【问题讨论】:
标签: ios uiscrollview uigesturerecognizer