An den Antworten ist nichts auszusetzen. Ich wollte jedoch die Antwort von jlarjlar erweitern, da sie ein erstaunliches Potenzial birgt, das das gleiche Problem mit anderen Steuerelementen (z. B. SearchBar) aufwerten kann. Dies liegt daran, dass pointInside an eine UIView angehängt ist und jedes Steuerelement in Unterklassen unterteilt werden kann , um den Berührungsbereich zu verbessern. Diese Antwort zeigt auch ein vollständiges Beispiel für die Implementierung der vollständigen Lösung.
Erstellen Sie eine neue Unterklasse für Ihre Schaltfläche (oder ein beliebiges Steuerelement).
#import <UIKit/UIKit.h>
@interface MNGButton : UIButton
@end
Überschreiben Sie als Nächstes die pointInside-Methode in Ihrer Unterklassenimplementierung
@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ählen Sie in Ihrer Storyboard- / XIB-Datei das betreffende Steuerelement aus, öffnen Sie den Identitätsinspektor und geben Sie den Namen Ihrer benutzerdefinierten Klasse ein.
Ändern Sie in Ihrer UIViewController-Klasse für Szenen, die die Schaltfläche enthalten, den Klassentyp für die Schaltfläche in den Namen Ihrer Unterklasse.
@property (weak, nonatomic) IBOutlet MNGButton *helpButton;
Verknüpfen Sie Ihre Storyboard- / XIB-Schaltfläche mit der Eigenschaft IBOutlet, und Ihr Touch-Bereich wird erweitert, um dem in der Unterklasse definierten Bereich zu entsprechen.
Zusätzlich zum Überschreiben der pointInside-Methode zusammen mit den Methoden CGRectInset und CGRectContainsPoint sollte man sich Zeit nehmen, um die CGGeometry auf die Erweiterung des rechteckigen Berührungsbereichs einer UIView-Unterklasse zu untersuchen. Möglicherweise finden Sie auch einige nützliche Tipps zu CGGeometry-Anwendungsfällen bei NSHipster .
Zum Beispiel könnte man den Berührungsbereich mit den oben genannten Methoden unregelmäßig machen oder einfach wählen, den Breiten-Berührungsbereich doppelt so groß wie den horizontalen Berührungsbereich zu machen:
CGRect area = CGRectInset(self.bounds, -(2*margin), -margin);
Hinweis: Das Ersetzen eines UI-Klassensteuerelements sollte zu ähnlichen Ergebnissen führen, wenn der Berührungsbereich für verschiedene Steuerelemente (oder eine UIView-Unterklasse wie UIImageView usw.) erweitert wird.