Non c'è nulla di sbagliato nelle risposte presentate; tuttavia volevo estendere la risposta di jlarjlar in quanto ha un potenziale straordinario che può aggiungere valore allo stesso problema con altri controlli (ad esempio SearchBar). Questo perché poiché pointInside è collegato a una UIView, è possibile sottoclassare qualsiasi controllo per migliorare l'area touch. Questa risposta mostra anche un esempio completo di come implementare la soluzione completa.
Crea una nuova sottoclasse per il tuo pulsante (o qualsiasi controllo)
#import <UIKit/UIKit.h>
@interface MNGButton : UIButton
@end
Successivamente sovrascrivere il metodo pointInside nell'implementazione della sottoclasse
@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
Sul tuo file storyboard / xib seleziona il controllo in questione e apri la finestra di ispezione identità e digita il nome della tua classe personalizzata.
Nella classe UIViewController per la scena contenente il pulsante, cambia il tipo di classe per il pulsante con il nome della sottoclasse.
@property (weak, nonatomic) IBOutlet MNGButton *helpButton;
Collega il tuo pulsante storyboard / xib alla proprietà IBOutlet e l'area touch verrà espansa per adattarsi all'area definita nella sottoclasse.
Oltre a sovrascrivere il metodo pointInside insieme ai metodi CGRectInset e CGRectContainsPoint , si dovrebbe impiegare del tempo per esaminare la CGGeometry per estendere l'area di tocco rettangolare di qualsiasi sottoclasse UIView. Su NSHipster puoi trovare anche alcuni suggerimenti utili sui casi d'uso di CGGeometry .
Ad esempio, si potrebbe rendere irregolare l'area di tocco usando i metodi sopra menzionati o semplicemente scegliere di rendere l'area di tocco di larghezza due volte più grande dell'area di tocco orizzontale:
CGRect area = CGRectInset(self.bounds, -(2*margin), -margin);
NB: la sostituzione di qualsiasi controllo della classe UI dovrebbe produrre risultati simili sull'estensione dell'area touch per controlli diversi (o qualsiasi sottoclasse UIView, come UIImageView, ecc.).