2013-03-21 34 views
8

Tôi đang sử dụng một vài công cụ nhận dạng cử chỉ trên một số chế độ xem, nhưng đôi khi lượt xem quá nhỏ và rất khó để đạt được. Sử dụng các trình nhận dạng là cần thiết, vậy làm thế nào tôi có thể phóng to khu vực hit?Làm thế nào để phóng to khu vực hit của UIGestureRecognizer?

+0

Vì vậy, bạn đang hỏi cách phóng to chế độ xem? – Jordan

+1

Không, tất nhiên tôi biết cách mở rộng khung hình :) Tôi cần phóng to khung hình, mà không ảnh hưởng đến khung hình thực của nó. – Tesseract

Trả lời

19

Nếu bạn đang làm điều này cho một phong tục UIView, bạn sẽ có thể ghi đè lên các phương pháp hitTest:withEvent::

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

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

Đoạn mã trên sẽ thêm một biên giới 20 điểm xung quanh xem. Nhấn vào vị trí bất kỳ trong khu vực đó (hoặc trên chính chế độ xem) sẽ cho biết một lần truy cập.

+0

Cảm ơn, chỉ cần những gì tôi cần – Tesseract

+0

Tôi nghĩ rằng nó là tốt hơn để ghi đè pointInside vì hitTest cuộc gọi pointInside: đệ quy trên subviews. – Andy

0

Nếu bạn đang sử dụng một UIImageView như một nút, bạn có thể sử dụng tiện ích sau (Swift 3.0):

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 
} 
} 

Tương tự như phần mở rộng UIButtonhere

0

phiên bản Swift của câu trả lời @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; 
}