Swift: UIView 在另一个 UIView 下的 hitTest
Swift: hitTest for UIView underneath another UIView
我在 RedOrGreenUIView 之上有 TransparentUIView。 TransparentUIView 有一个 UILongPressGestureRecognizer 附加到它。一旦用户开始长按它,我检查这个 LongPressGesture 的 .Changed 状态,并在下面执行 hitTest:
var p:CGPoint = rec.locationInView(self.view)
var selectedView = view.hitTest(p, withEvent: nil)
if selectedView != nil {
if selectedView == TransparentUIView {
println("TransparentUIView is being touched")
}
}
我将 TransparentView 作为 selectedView 正常。但是我需要能够同时对 RedOrGreenUIView 进行 hitTest,它位于 TransparentUIView 之下。我无法全神贯注地完成这项工作。请帮忙
如果一个 UIView 被触摸,下面的其他 UIView 就不会被触摸。
因此,您可以有一个中央 class 将触摸传递给两个 UIView 对象,或者第一个 UIView(位于顶部的那个)将其 UITouch 对象传递给下面的 UIView 并进行 hitTest .
为您的容器创建自定义视图并覆盖 pointInside: 消息到 return NO 当点不在符合条件的子视图中时,如下所示:
@interface PassthroughView : UIView
@end
@implementation PassthroughView
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
for (UIView *view in self.subviews) {
if (!view.hidden && view.alpha > 0 && view.userInteractionEnabled && [view pointInside:[self convertPoint:point toView:view] withEvent:event])
return YES;
}
return NO;
}
@end
swift版本
class PassThroughView: UIView {
override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
for subview in subviews as [UIView] {
if !subview.hidden && subview.alpha > 0 && subview.userInteractionEnabled && subview.pointInside(convertPoint(point, toView: subview), withEvent: event) {
return true
}
}
return false
}
}
Swift 4 版本:
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
for subview in YourView.subviews as [UIView] {
if !subview.isHidden && subview.alpha > 0 && subview.isUserInteractionEnabled && subview.point(inside:point, with: event) {
return true
}
}
return false
}
我目前正在为 iOS 应用开发一个透明的帮助覆盖图,我自己也在寻找一个好的答案。
我真的找不到任何东西,所以决定再看看。关于 hitTest 的苹果文档说它不包括透明度 < 0.1、隐藏或 userInteractionEnabled 为 false 的视图。
最后一个给了我一个想法,它似乎工作得很好。
尝试以下(我还需要进一步测试,但似乎没问题):
var p:CGPoint = rec.locationInView(self.view)
TransparentUIView.isUserInteractionEnabled = false
var selectedView = view.hitTest(p, withEvent: nil)
TransparentUIView.isUserInteractionEnabled = true
if selectedView != nil {
if selectedView == TransparentUIView {
println("TransparentUIView is being touched")
}
}
我在 RedOrGreenUIView 之上有 TransparentUIView。 TransparentUIView 有一个 UILongPressGestureRecognizer 附加到它。一旦用户开始长按它,我检查这个 LongPressGesture 的 .Changed 状态,并在下面执行 hitTest:
var p:CGPoint = rec.locationInView(self.view)
var selectedView = view.hitTest(p, withEvent: nil)
if selectedView != nil {
if selectedView == TransparentUIView {
println("TransparentUIView is being touched")
}
}
我将 TransparentView 作为 selectedView 正常。但是我需要能够同时对 RedOrGreenUIView 进行 hitTest,它位于 TransparentUIView 之下。我无法全神贯注地完成这项工作。请帮忙
如果一个 UIView 被触摸,下面的其他 UIView 就不会被触摸。
因此,您可以有一个中央 class 将触摸传递给两个 UIView 对象,或者第一个 UIView(位于顶部的那个)将其 UITouch 对象传递给下面的 UIView 并进行 hitTest .
为您的容器创建自定义视图并覆盖 pointInside: 消息到 return NO 当点不在符合条件的子视图中时,如下所示:
@interface PassthroughView : UIView
@end
@implementation PassthroughView
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
for (UIView *view in self.subviews) {
if (!view.hidden && view.alpha > 0 && view.userInteractionEnabled && [view pointInside:[self convertPoint:point toView:view] withEvent:event])
return YES;
}
return NO;
}
@end
swift版本
class PassThroughView: UIView {
override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
for subview in subviews as [UIView] {
if !subview.hidden && subview.alpha > 0 && subview.userInteractionEnabled && subview.pointInside(convertPoint(point, toView: subview), withEvent: event) {
return true
}
}
return false
}
}
Swift 4 版本:
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
for subview in YourView.subviews as [UIView] {
if !subview.isHidden && subview.alpha > 0 && subview.isUserInteractionEnabled && subview.point(inside:point, with: event) {
return true
}
}
return false
}
我目前正在为 iOS 应用开发一个透明的帮助覆盖图,我自己也在寻找一个好的答案。
我真的找不到任何东西,所以决定再看看。关于 hitTest 的苹果文档说它不包括透明度 < 0.1、隐藏或 userInteractionEnabled 为 false 的视图。
最后一个给了我一个想法,它似乎工作得很好。
尝试以下(我还需要进一步测试,但似乎没问题):
var p:CGPoint = rec.locationInView(self.view)
TransparentUIView.isUserInteractionEnabled = false
var selectedView = view.hitTest(p, withEvent: nil)
TransparentUIView.isUserInteractionEnabled = true
if selectedView != nil {
if selectedView == TransparentUIView {
println("TransparentUIView is being touched")
}
}