Tom*_*Tom 7 objective-c uiscrollview ios
我在转发手势和触摸方面遇到了一些麻烦.我玩了很多,但我不能按照我想要的方式工作.
基本上我想用2个手指控制双屏幕上的滚动视图,并将其他所有内容转发到覆盖滚动视图后面的ipad视图.
为了能够控制双屏幕上的滚动视图,我UIScrollView将其子类化,并将其添加为具有清晰背景的覆盖视图到ipad屏幕.
然后我与一位代表联系起来,将其拖动和内容转发到双屏幕上的滚动视图.这很完美.
正如我写的那样,我希望scrollview只响应2个手指滚动,所以我把它设置为
ScrollView.panGestureRecognizer.minimumNumberOfTouches = 2;
Run Code Online (Sandbox Code Playgroud)
但是滚动视图会消除所有触摸,我不能正确地将其他所有内容转发给后面的视图.我认为压倒一切
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
Run Code Online (Sandbox Code Playgroud)
必须要做的伎俩,但我不能正确地检测屏幕上的手指数量.
我想分享/解释该问题的解决方案。话虽如此,我也想指出,海雀科的输入使我朝着正确的方向前进。非常感谢你的队友!
尝试将视图/滚动视图作为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];
}}
Run Code Online (Sandbox Code Playgroud)
我做了这样的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];
Run Code Online (Sandbox Code Playgroud)
底层滚动视图的委托方法:
- (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);
}}
Run Code Online (Sandbox Code Playgroud)
该解决方案效果很好。另一个解决方案是像我最初打算的那样,将滚动视图作为覆盖视图。就像说的那样,问题在于让toplayer视图知道它附近的视图(nextResponder)。为了实现这一点,您必须对UIScrollview进行细分,并创建UIResponder属性,您必须将其连接到interface-builder文件中或在运行时。这样,覆盖的滚动视图将知道谁是下一个响应者。 请参阅Morningstar的答案
| 归档时间: |
|
| 查看次数: |
7684 次 |
| 最近记录: |