2013-03-21 92 views
8

我在一些視圖上使用了幾個手勢識別器,但有時視圖太小,很難打到它。使用識別器是必要的,那麼如何擴大命中區域?如何擴大UIGestureRecognizer的命中區域?

+0

所以,你問如何放大視圖? – Jordan 2013-03-21 17:11:50

+1

不,當然我知道如何放大視野:)我需要放大點擊幀,而不會影響其真實幀。 – Tesseract 2013-03-21 17:14:42

回答

19

如果您自定義UIView這樣做,你應該能夠覆蓋hitTest:withEvent:方法:

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

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

上面的代碼將添加視圖四周有20點的邊界。在該區域(或視圖本身)的任何地方點擊都會顯示一個命中。

+0

謝謝,正是我所需要的 – Tesseract 2013-03-21 17:20:51

+0

我認爲最好重寫pointInside,因爲hitTest調用pointInside:遞歸地處理子視圖。 – Andy 2015-11-25 12:35:40

0

如果您使用的是UIImageView作爲一個按鈕,你可以使用以下擴展名(雨燕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 
} 
} 

類似於UIButton擴展here

0

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