gpt4 book ai didi

ios - 将触摸和手势从 UIScrollview 转发到 View

转载 作者:可可西里 更新时间:2023-11-01 03:30:04 24 4
gpt4 key购买 nike

我在转发手势和触摸方面遇到了一些麻烦。我玩了很多,但我无法让它按照我想要的方式工作。

基本上我想用 2 根手指控制双屏上的 ScrollView ,并将其他所有内容转发到覆盖 ScrollView 后面的 ipad View 。

为了能够在双屏上控制 ScrollView ,我对 UIScrollView 进行了子类化,并将其作为具有清晰背景的叠加 View 添加到 ipad 屏幕。

然后我将它与委托(delegate)连接起来,将其拖动和内容转发到双屏上的 ScrollView 。这很有效。

正如我所写的,我希望 ScrollView 仅响应 2 个手指滚动,所以我将其设置为

ScrollView.panGestureRecognizer.minimumNumberOfTouches = 2;

但是 scrollview 占用了所有触摸,除了 2 根手指触摸到后面的 View 之外,我不正确地转发其他所有内容。我认为重写

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

必须做到这一点,但我无法正确检测屏幕上的手指数量。

最佳答案

我想分享/解释问题的解决方案。也就是说,我还想指出 hatfinch 的输入让我朝着正确的方向前进。非常非常感谢,伙计!

尝试将 View / ScrollView 作为覆盖的顶层播放器时出现的问题是顶层播放器不知道它的“下一个响应者”。将 View / ScrollView 作为底层 View 将解决此问题。您可能需要微调该底层 ScrollView 中任何 ScrollView 的触摸行为以使行为正确(例如设置最大触摸次数)

解决方案是子类化一个 UIScrollview,覆盖这个方法 override the touchesBegan: and other touch methods as follows (参见 user1085093 的回答),并将其作为底层 View 添加到 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];

底层scrollview的委托(delegate)方法:

- (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);
}}

这个解决方案效果很好。另一种解决方案是将 ScrollView 作为我最初打算的覆盖 View 。如前所述,问题是让 toplayer View 了解它下面的 View (nextResponder)。要实现这一点,您必须子类化 UIScrollview 并创建一个 UIResponder 属性,您必须在界面构建器文件中或在运行时进行连接。这样,覆盖的 ScrollView 就会知道谁是下一个响应者。 please see morningstar's answer

关于ios - 将触摸和手势从 UIScrollview 转发到 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19723610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com