[英]How to pass touches from UIView to UIScrollView
与这个线程和许多其他线程类似,我有一个视图 controller,其中的 NIB 文件具有这种布局......
上面的所有三个项目都是 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中执行操作。 我希望这有帮助
更多选项:
考虑将isUserinteractionEnabled
设置为 false 以隐藏/=滚动视图上方的视图。 我认为这是针对“c.UIView (480x320)”的,请在此处查看答案https://stackoverflow.com/a/52054954/4970749 。 如果为假,触摸将被跳过并传递给下面的子视图。
顶部“c. UIView (480x320)”上的 animation isExclusiveTouch
可能设置为 true。 将其设置为默认的 false 值。 苹果文档: https://developer.apple.com/documentation/uikit/uiview/1622453-isexclusivetouch
手势识别器还允许发生多次触摸。 UIGestureRecognizerDelegate 有func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool
手势识别器第 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.