gpt4 book ai didi

ios - 是否可以决定 UITouch 绑定(bind)到哪个 View ?

转载 作者:行者123 更新时间:2023-11-28 22:57:11 25 4
gpt4 key购买 nike

我有几个 UIView,它们的形状有些复杂,我通过每个 UIView 的 drawRect: 方法绘制了这些形状。我已经保存了对路径的引用(通过 CGPath 属性),我在我的触摸方法中使用它来检测触摸是否实际上在路径或形状内 (CGPathContainsPoint)。由于形状的原因, View 的某些区域是透明的(显然任何非正方形/矩形的区域都将具有透明区域,假设 View 的 backgroundColor 属性设置为 clearColor 或类似的属性)。

对于 View 最终位于顶部或彼此重叠的情况(经常发生),我正在测试触摸方法(touchesBegan 等)以查看触摸是否实际上在 CGPath 或形状内。如果触摸不在形状内,我会将触摸转发到下面的下一个 View ,看看它是否依次满足该要求。

遗憾的是(令我非常沮丧),这与实际绑定(bind)到 View 的触摸行为不同。我已经以各种方式解决了这个问题,特别是除了一个。每个 View 都使用 UIRotationGestureRecognizer。但是,如果触摸起源于另一个 View 的透明区域,并且该 View 将该触摸转发到其下方的 View ,则永远不会触发 UIGestureRecognizer。

我已经从我知道的各个角度审视了这个问题。我试图想出一些方法来实际将触摸重新分配或绑定(bind)到适当的 View ,但我不知道这是否可行。只要 View 只是将触摸转发到另一个 View ,触摸就会保持绑定(bind)到最先接收到触摸的原始 View 。

我想知道您是否可以通过子类化 UIApplication 或 UIWindow 并覆盖 sendEvent:"方法来以这种方式做某事。我不确定 Apple 在这方面可能会给您什么样的控制权。我负担不起做任何可能的事情正在访问私有(private) API。我真的只需要一些方法来重新分配触摸,以便 View 认为触摸属于它。

有什么想法吗?'

最佳答案

您可以通过子类化 UIView 或子类化 UIGestureRecognizer 来做到这一点。

子类化 UIView

通过子类化 UIView(或其任何子类)并覆盖

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

您可以决定哪些点被认为在您的 View 内。对于路径之外的点,您只需返回 NO

子类化 UIGestureRecognizer

通过子类化 UIGestureRecognizer(或其任何子类)并覆盖

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

您可以决定手势识别器应该识别哪些触摸。对于路径之外的所有触摸,您应该调用(但不是子类)

- (void)ignoreTouch:(UITouch *)touch forEvent:(UIEvent *)event

你自己。


指向路径内部?

无论哪种情况,您都需要知道这些点是否在您所说的已存储路径内。

如果路径已经存储为UIBezierPath,您可以简单地调用

- (BOOL)containsPoint:(CGPoint)point

在贝塞尔路径上。可能需要通过调用将点或触摸转换为与路径相同的 View 坐标

- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view

- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view

在你看来。

如果路径存储为 CGPath,您可以使用它创建 UIBezierPath

[UIBezierPath bezierPathWithCGPath:CGPath]; 

关于ios - 是否可以决定 UITouch 绑定(bind)到哪个 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10556609/

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