2013-03-21 24 views
8

Bazı görünümlerde birkaç tane jest tanıyıcı kullanıyorum, ancak bazen görünümler çok küçük ve buna vurmak zor. Tanıtıcıları kullanmak gereklidir, bu yüzden isabet alanını nasıl genişletebilirim?UIGestureRecognizer'ın hit alanı nasıl büyütülür?

Eğer özel bir UIView için yapıyorsanız
+0

Peki, görünümü nasıl büyüteceğinizi mi soruyorsunuz? – Jordan

+1

Hayır, tabiki çerçevenin nasıl büyütüleceğini biliyorum :) Gerçek çerçeveyi etkilemeden hit kareyi büyütmem gerekiyor. – Tesseract

cevap

19

, sen hitTest:withEvent: yöntemi geçersiz gerekir: Yukarıdaki kod görünümünde çevresindeki 20 noktalı sınır katacak

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

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

. O bölgede (veya görünümün kendisinde) herhangi bir yere dokunmak bir isabet gösterecektir. Eğer bir düğme olarak bir UIImageView kullanıyorsanız

+0

Teşekkürler, sadece neye ihtiyacım var – Tesseract

+0

Ben pointTnside pointInside çağırıyor çünkü overIride daha iyi olduğunu düşünüyorum. – Andy

0

, aşağıdaki uzantıyı (Swift 3.0) kullanabilirsiniz: UIButton uzantısı

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

Benzer here

@rmaddy cevabın
0

Swift sürümü:

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