2013-03-21 1 views
8

일부보기에서는 제스처 인식기를 거의 사용하지 않지만보기가 너무 작아서보기가 어렵습니다. 인식기 사용이 필요하므로 어떻게 히트 영역을 확대 할 수 있습니까?UIGestureRecognizer의 히트 영역을 확대하는 방법은 무엇입니까?

사용자 정의 UIView에 대해이 작업을 수행하는 경우
+0

그래서보기를 확대하는 방법을 묻는 중입니까? – Jordan

+1

아니요 물론 프레임의 확대 방법을 알고 있습니다 :) 실제 프레임에는 영향을주지 않고 히트 프레임을 확대해야합니다. – Tesseract

답변

19

, 당신은 hitTest:withEvent: 메소드를 오버라이드 (override) 할 수 있어야한다 : 위의 코드는보기 주위에 20 점 테두리를 추가합니다

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    CGRect frame = CGRectInset(self.bounds, -20, -20); 

    return CGRectContainsPoint(frame, point) ? self : nil; 
} 

. 해당 영역 (또는보기 자체)의 아무 곳이나 누르면 태세가 나타납니다. 당신이 버튼으로 UIImageView를 사용하는 경우

+0

고마워, 그냥 내가 원하는 건 – Tesseract

+0

hitTest가 pointInside를 호출하기 때문에 pointInside를 재정의하는 것이 더 좋다 : 재귀 적으로 하위 뷰에서. – Andy

0

, 당신은 다음과 같은 확장 (스위프트 3.0)를 사용할 수 있습니다 다음 UIButton 확장에

extension UIImageView { 
open override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { 
    if self.isHidden || !self.isUserInteractionEnabled || self.alpha < 0.01 { return nil } 

    let minimumHitArea = CGSize(width: 50, height: 50) 
    let buttonSize = self.bounds.size 
    let widthToAdd = max(minimumHitArea.width - buttonSize.width, 0) 
    let heightToAdd = max(minimumHitArea.height - buttonSize.height, 0) 
    let largerFrame = self.bounds.insetBy(dx: -widthToAdd/2, dy: -heightToAdd/2) 

    // perform hit test on larger frame 
    return (largerFrame.contains(point)) ? self : nil 
} 
} 

유사를 here

@rmaddy 대답
0

스위프트 버전 :

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { 
    let frame = self.bounds.insetBy(dx: -20, dy: -20); 
    return frame.contains(point) ? self : nil; 
} 
관련 문제