버튼이 이미 UIButton의 하위 클래스가 아닌 경우이 작업을 수행해야합니다. pointInside:withEvent:
을 무시하면 "터치 가능한"영역을 원하는 임의의 모양으로 변경할 수 있습니다. 단순히 히트 박스의 인 세트의 값을 변경하는 서브 클래스는 다음과 같이 보일 수 있습니다 : 당신이 눈치
// --HEADER--
@interface TouchInsetButton : UIButton
@property (nonatomic, assign) UIEdgeInsets touchInsets;
@end
// --IMPLEMENTATION--
@implementation TouchInsetButton
@synthesize touchInsets = _touchInsets;
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
CGRect modifiedHitBox = UIEdgeInsetsInsetRect([self bounds], _touchInsets);
return CGRectContainsPoint(modifiedHitBox, point);
}
@end
그냥, 그주의, UIButtons은 일반적으로 자신의 경계보다 약간 큰의 경계 상자를 사용합니다. 인서트를 설정하지 않고이 서브 클래스를 사용하면 단추의 경계 내에있는 히트 만 허용하는 단추가 생깁니다.
'pointInside'가 무시됩니다. OP의 버튼은 원형이므로'CGRectContainsPoint'뿐만 아니라 피타고라스가 필요합니다. 정말 복잡한 도형의 경우 버튼 윤곽선 형태로 'UIBezerPath'를 만들고 그 위에'containsPoint'를 호출하십시오. – Dondragmer
이것은 나를 위해 작동하지 않습니다. 네거티브 인세 트 값을 사용하여 버튼 주위의 터치 가능한 영역을 확대하면 버튼이 인세 트 영역의 바깥 쪽 가장자리 근처에있는 도청을 인식하지 못합니다. pointInside : withEvent 메서드가 YES를 반환하고 탭하면 탭 이미지가 깜박이지만 버튼의 대상 선택자는 절대 호출되지 않습니다. 그러나 컨트롤 이벤트를 UIControlEventTouchDown으로 변경하면 모든 것이 예상대로 작동합니다. – dmarnel