Nie ma nic złego w przedstawionych odpowiedziach; chciałem jednak rozszerzyć odpowiedź jlarjlar, ponieważ ma niesamowity potencjał, który może wnieść wartość do tego samego problemu z innymi kontrolkami (np. SearchBar). Wynika to z faktu, że ponieważ pointInside jest dołączony do UIView, można podklasować dowolną kontrolę, aby poprawić obszar dotyku. Ta odpowiedź pokazuje również pełną próbę wdrożenia pełnego rozwiązania.
Utwórz nową podklasę dla swojego przycisku (lub dowolnej kontrolki)
#import <UIKit/UIKit.h>
@interface MNGButton : UIButton
@end
Następnie zastąp metodę pointInside w implementacji podklasy
@implementation MNGButton
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
//increase touch area for control in all directions by 20
CGFloat margin = 20.0;
CGRect area = CGRectInset(self.bounds, -margin, -margin);
return CGRectContainsPoint(area, point);
}
@end
W pliku storyboard / xib wybierz kontrolkę, o której mowa, otwórz inspektora tożsamości i wpisz nazwę swojej klasy niestandardowej.
W klasie UIViewController dla sceny zawierającej przycisk zmień typ klasy przycisku na nazwę swojej podklasy.
@property (weak, nonatomic) IBOutlet MNGButton *helpButton;
Połącz przycisk scenorysu / xib z właściwością IBOutlet, a obszar dotykowy zostanie rozszerzony, aby pasował do obszaru zdefiniowanego w podklasie.
Oprócz zastąpienia metody pointInside razem z metodami CGRectInset i CGRectContainsPoint , należy poświęcić trochę czasu na zbadanie CGGeometry w celu rozszerzenia prostokątnego obszaru dotykowego dowolnej podklasy UIView. W NSHipster możesz także znaleźć kilka dobrych wskazówek na temat przypadków użycia CGGeometry .
Na przykład można sprawić, że obszar dotyku jest nieregularny, stosując metody wymienione powyżej, lub po prostu wybrać, aby szerokość obszaru dotyku była dwa razy większa niż pozioma powierzchnia dotyku:
CGRect area = CGRectInset(self.bounds, -(2*margin), -margin);
NB: Zastąpienie dowolnego elementu sterującego klasy interfejsu użytkownika powinno dać podobne wyniki przy rozszerzaniu obszaru dotykowego dla różnych elementów sterujących (lub dowolnej podklasy UIView, takiej jak UIImageView itp.).