我在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视为精选。但是我需要能够同时在RedOrGreenUIView上执行hitTest,它位于TransparentUIView下面。我无法理解这一点。请帮忙。
答案 0 :(得分:11)
为容器创建自定义视图并覆盖pointInside:message,当该点不在符合条件的子视图中时返回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 version
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
}
}
答案 1 :(得分:2)
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
}
答案 2 :(得分:1)
如果一个UIView接触到了,下面的其他人都没有得到任何东西。
因此,您可以拥有一个中心类,它将触摸传递给您的UIView对象,或者第一个UIView(位于顶部的UIView)将其UITouch对象传递给下面的UIView并执行hitTest。
答案 3 :(得分:1)
我目前正在为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")
}
}