일부보기에서는 제스처 인식기를 거의 사용하지 않지만보기가 너무 작아서보기가 어렵습니다. 인식기 사용이 필요하므로 어떻게 히트 영역을 확대 할 수 있습니까?UIGestureRecognizer의 히트 영역을 확대하는 방법은 무엇입니까?
사용자 정의UIView
에 대해이 작업을 수행하는 경우
일부보기에서는 제스처 인식기를 거의 사용하지 않지만보기가 너무 작아서보기가 어렵습니다. 인식기 사용이 필요하므로 어떻게 히트 영역을 확대 할 수 있습니까?UIGestureRecognizer의 히트 영역을 확대하는 방법은 무엇입니까?
사용자 정의UIView
에 대해이 작업을 수행하는 경우
, 당신은 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
를 사용하는 경우
, 당신은 다음과 같은 확장 (스위프트 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 대답스위프트 버전 :
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
let frame = self.bounds.insetBy(dx: -20, dy: -20);
return frame.contains(point) ? self : nil;
}
그래서보기를 확대하는 방법을 묻는 중입니까? – Jordan
아니요 물론 프레임의 확대 방법을 알고 있습니다 :) 실제 프레임에는 영향을주지 않고 히트 프레임을 확대해야합니다. – Tesseract