【问题标题】:iphone - determine if touch occurred in subview of a uiviewiphone - 确定触摸是否发生在 uiview 的子视图中
【发布时间】:2010-09-09 19:39:09
【问题描述】:
在 UIView 的子类中我有这个:
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
if(touch occurred in a subview){
return YES;
}
return NO;
}
我可以在 if 语句中添加什么?我想检测子视图中是否发生了触摸,无论它是否位于 UIView 的框架内。
【问题讨论】:
标签:
iphone
events
uiview
touch
subview
【解决方案1】:
试试看:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
return CGRectContainsPoint(subview.frame, point);
}
如果您想在触摸位于您实现此方法的视图内时返回 YES,请使用以下代码:(如果您想将手势识别器添加到位于容器边界之外的子视图中)
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
if ([super pointInside:point withEvent:event])
{
return YES;
}
else
{
return CGRectContainsPoint(subview.frame, point);
}
}
【解决方案2】:
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
return ([self hitTest:point withEvent:nil] == yourSubclass)
}
方法 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 返回包含指定点的视图层次结构(包括其自身)中接收器的最远后代。我在那里所做的是返回最远视图与您的子视图进行比较的结果。如果您的子视图也有子视图,这可能对您不起作用。所以在这种情况下你想做的是:
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
return ([[self hitTest:point withEvent:nil] isDescendantOfView:yourSubclass])
}
【解决方案3】:
试试这个:
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
NSSet *touches = [event allTouches];
UITouch *touch = [touches anyObject];
if([touch.view isKindOfClass:[self class]]) {
return YES;
}
return NO;
}
【解决方案4】:
Swift 版本:
var yourSubview: UIView!
override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
return subviewAtPoint(point) == yourSubview
}
private func subviewAtPoint(point: CGPoint) -> UIView? {
for subview in subviews {
let view = subview.hitTest(point, withEvent: nil)
if view != nil {
return view
}
}
return nil
}