是的。您可以覆盖 hitTest:withEvent: 方法以返回一个视图,该视图包含比该视图包含的更大的点集。请参阅UIView Class Reference。
编辑:示例:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
CGFloat radius = 100.0;
CGRect frame = CGRectMake(-radius, -radius,
self.frame.size.width + radius,
self.frame.size.height + radius);
if (CGRectContainsPoint(frame, point)) {
return self;
}
return nil;
}
编辑 2:(澄清后:)为了确保按钮被视为在父级的范围内,您需要在父级中覆盖 pointInside:withEvent: 以包含按钮的框架。
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
if (CGRectContainsPoint(self.view.bounds, point) ||
CGRectContainsPoint(button.view.frame, point))
{
return YES;
}
return NO;
}
注意 用于覆盖 pointInside 的代码并不完全正确。正如 Summon 在下面解释的那样,请执行以下操作:
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
if ( CGRectContainsPoint(self.oversizeButton.frame, point) )
return YES;
return [super pointInside:point withEvent:event];
}
请注意,您很可能将self.oversizeButton 用作此 UIView 子类中的 IBOutlet;然后您可以将有问题的“超大按钮”拖动到有问题的特殊视图。 (或者,如果由于某种原因您在项目中经常这样做,您将拥有一个特殊的 UIButton 子类,您可以查看这些类的子视图列表。)希望它有所帮助。