2012-07-18 5 views
3

사용자 정의 단추 (사용자 정의보기로 원 모양의 이미지를 사용함)가 있습니다. 문제는 맞춤 검색 버튼의 활성 영역이 너무 큽니다. 버튼 외부에 적어도 100 픽셀을 탭하면 여전히 버튼에 탭으로 등록됩니다. 이로 인해 우발적 인 도청이 발생합니다.원형 모양의 사용자 정의 버튼에 대한 작은 활성 영역

참고 : - 이미 최소 요구 사항보다 크기 때문에 버튼 크기를 줄이고 싶지 않습니다. 나는 가능한 공간을 줄이고 싶다.

어떻게하면이 버튼의 활성 영역을 줄일 수 있습니까?

답변

2

버튼이 이미 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은 일반적으로 자신의 경계보다 약간 큰의 경계 상자를 사용합니다. 인서트를 설정하지 않고이 서브 클래스를 사용하면 단추의 경계 내에있는 히트 만 허용하는 단추가 생깁니다.

+0

'pointInside'가 무시됩니다. OP의 버튼은 원형이므로'CGRectContainsPoint'뿐만 아니라 피타고라스가 필요합니다. 정말 복잡한 도형의 경우 버튼 윤곽선 형태로 'UIBezerPath'를 만들고 그 위에'containsPoint'를 호출하십시오. – Dondragmer

+0

이것은 나를 위해 작동하지 않습니다. 네거티브 인세 트 값을 사용하여 버튼 주위의 터치 가능한 영역을 확대하면 버튼이 인세 트 영역의 바깥 쪽 가장자리 근처에있는 도청을 인식하지 못합니다. pointInside : withEvent 메서드가 YES를 반환하고 탭하면 탭 이미지가 깜박이지만 버튼의 대상 선택자는 절대 호출되지 않습니다. 그러나 컨트롤 이벤트를 UIControlEventTouchDown으로 변경하면 모든 것이 예상대로 작동합니다. – dmarnel

관련 문제