繁体   English   中英

如何将触摸从 UIView 传递到 UIScrollView

[英]How to pass touches from UIView to UIScrollView

这个线程和许多其他线程类似,我有一个视图 controller,其中的 NIB 文件具有这种布局......

  • 一种。 UIView (480 x 320) - 存储背景图像
  • b. UIScrollView (480 x 220) - 是一个级别选择器滚动视图
  • c. UIView (480 x 320) - 包含前景动画图形

上面的所有三个项目都是 NIB 中主视图的子视图。 UIView (c) 是 iPhone 屏幕的完整尺寸,位于层次结构的顶部。 在它上面,我放置了一个角色,该角色根据该视图中的当前触摸 position 进行动画处理。 但是问题是,通过此视图接收触摸,我无法触摸到它下面的 ScrollView (b)。 我仍然需要使用 (c) 处的触摸,但之后还需要将相关的触摸/滑动传递给下面的 UIScrollView。

谁能建议如何做到这一点? 我已经阅读了关于使用 hittest 的各种帖子,但不想完全抵消触摸,我只需要在之后转发它们,这样滚动视图仍然可以正常工作。

谢谢,

这是一个更适合我的简单解决方案:

在视图C(UIScrollView上方的前景视图)中,使宽度和高度均为0(以便视图在技术上不再位于scrollview之上)并设置clipsToBounds = NO(以便视图C的内容仍然是显示在scrollview之上)。 它对我来说就像一个魅力。

 self.viewC.clipsToBounds = NO;
 CGRect frame = self.viewC.frame;
 self.viewC.frame = CGRectMake(frame.origin.x, frame.origin.y, 0, 0);

请注意,如果视图C包含交互式控件,则它们将不再起作用。

如果是我,我会将scrollView设置为顶视图的委托。 当然,这需要顶视图是UIView的自定义子级,因此您可以进行设置

id delegate; 

@property (nonatomic, assign) id delegate;

在头文件中。 然后,您可以将scrollView设置为具有某些内容的委托

[topView setDelegate:scrollView];

有了这个,您可以在必要时将消息(在您的情况下,触摸事件)发送到scrollView。 例如,如果您要发送所有touchBegan事件,您将拥有:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.delegate touchesBegan:touches withEvent:event];
}

当然,如果你只想要传递某些事件,你可以在方法中设置你的参数来说明何时调用[self.delegate ....][super ....] 后者将对视图执行操作,而不是在scrollView中执行操作。 我希望这有帮助

更多选项:

  1. 考虑将isUserinteractionEnabled设置为 false 以隐藏/=滚动视图上方的视图。 我认为这是针对“c.UIView (480x320)”的,请在此处查看答案https://stackoverflow.com/a/52054954/4970749 如果为假,触摸将被跳过并传递给下面的子视图。

  2. 顶部“c. UIView (480x320)”上的 animation isExclusiveTouch可能设置为 true。 将其设置为默认的 false 值。 苹果文档: https://developer.apple.com/documentation/uikit/uiview/1622453-isexclusivetouch

  3. 手势识别器还允许发生多次触摸。 UIGestureRecognizerDelegate 有func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool

  4. 手势识别器第 2 部分func gestureRecognizerShouldBegin(_) https://stackoverflow.com/a/11968812/4970749

子类UIScrollVeiw并覆盖touchesShouldCancelInContentView:方法,如下所示:

-(BOOL)touchesShouldCancelInContentView:(UIView *)view
{

    if ([view isKindOfClass:[UIButton class]]) {//or whatever class you want to override
        return YES;
    }

    if ([view isKindOfClass:[UIControl class]]) {
        return NO;
    }

    return YES;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM