我在转发手势和触摸时遇到了一些麻烦。我玩了很多,但是我无法按照我想要的方式工作。
基本上,我想用两根手指控制双屏上的滚动视图,并将其他所有内容转发到重叠式滚动视图后面的ipad视图。
为了能够在双屏上控制滚动视图,我UIScrollView
将其子类化,并将其作为具有清晰背景的叠加视图添加到ipad屏幕上。
然后,我将它与一个委托挂钩,以将其拖动和内容转发到双屏上的scrollview中。这很完美。
正如我写的那样,我希望滚动视图仅响应2个手指滚动,所以我将其设置为
ScrollView.panGestureRecognizer.minimumNumberOfTouches = 2;
但是scrollview吞噬了所有触摸,而我只好用两指触摸将其他所有内容转发给后面的视图。我认为优先于
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
必须做到这一点,但我无法正确检测屏幕上的手指数量。
我想分享/解释该问题的解决方案。话虽如此,我也想指出,海雀科的输入使我朝着正确的方向前进。非常感谢你的队友!
尝试将视图/滚动视图作为toplayer的覆盖层时的问题是toplayer不知道其“下一个响应者”。将视图/滚动视图作为基础视图将解决此问题。您可能需要微调该底层滚动视图中任何滚动视图的触摸行为,以使行为正确(例如,设置最大触摸次数)
解决方案是将UIScrollview子类化,重写此方法将覆盖touchesBegan:和其他touch方法,如下所示(请参阅user1085093答案),并将其作为底层视图添加到ipad屏幕。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
// If not dragging, send event to next responder
if (!self.dragging){
[self.nextResponder touchesBegan: touches withEvent:event];
}
else{
[super touchesBegan: touches withEvent: event];
}}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
// If not dragging, send event to next responder
if (!self.dragging){
[self.nextResponder touchesMoved: touches withEvent:event];
}
else{
[super touchesMoved: touches withEvent: event];
}}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
// If not dragging, send event to next responder
if (!self.dragging){
[self.nextResponder touchesEnded: touches withEvent:event];
}
else{
[super touchesEnded: touches withEvent: event];
}}
我做了这样的scrollview的设置:
TopLayerScrollView *newScrollView = [[TopLayerScrollView alloc] init];
[newScrollView setBackgroundColor:[UIColor clearColor]];
[newScrollView setFrame:self.tabBarController.view.frame];
[newScrollView setContentSize:dualScreenViewController.scrollContent.contentSize];
newScrollView.showsHorizontalScrollIndicator = NO;
newScrollView.showsVerticalScrollIndicator = NO;
newScrollView.delegate = self;
newScrollView.bounces = NO;
[newScrollView scrollsToTop];
newScrollView.panGestureRecognizer.minimumNumberOfTouches = 2;
self.topLayerScrollView = newScrollView;
[newScrollView release];
[self.tabBarController.view removeFromSuperview];
[topLayerScrollView addSubview:self.tabBarController.view];
[window addSubview:topLayerScrollView];
[topLayerScrollView bringSubviewToFront:self.tabBarController.view];
底层滚动视图的委托方法:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (scrollView.dragging || scrollView.tracking)
{
[dualScreenViewControlleremphasized text.scrollContent setContentOffset:CGPointMake(scrollView.contentOffset.x, scrollView.contentOffset.y) animated:NO];
self.tabBarController.view.frame = CGRectMake(scrollView.contentOffset.x, scrollView.contentOffset.y, self.tabBarController.view.frame.size.width, self.tabBarController.view.frame.size.height);
}}
该解决方案效果很好。另一个解决方案是让滚动视图作为我最初打算的覆盖视图。就像说的那样,问题在于让toplayer视图知道它附近的视图(nextResponder)。要实现这一点,您必须对UIScrollview进行细分,并创建UIResponder属性,您必须在接口生成器文件中或运行时进行连接。这样,覆盖的滚动视图将知道谁是下一个响应者。请参阅Morningstar的答案
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句