2013-03-21 2 views
8

Я использую несколько распознавателей жестов на некоторых видах, но иногда виды слишком малы, и это трудно ударить. Использование распознавателей необходимо, так как я могу увеличить область попадания?Как увеличить область попадания UIGestureRecognizer?

+0

Итак, вы спрашиваете, как увеличить вид? – Jordan

+1

Нет, конечно, я знаю, как увеличить раму зрения :) Мне нужно увеличить рамку кадра, не затрагивая ее реальную рамку. – Tesseract

ответ

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

+0

Я думаю, что лучше переопределить pointInside, потому что hitTest вызывает pointInside: рекурсивно на subviews. – Andy

0

Если вы используете UIImageView в качестве кнопки, вы можете использовать следующее расширение (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 
} 
} 

Похожие на расширение UIButtonhere

0

Swift версия @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; 
} 
Смежные вопросы