Il n'y a rien de mal avec les réponses présentées; Cependant, je voulais étendre la réponse de jlarjlar car elle possède un potentiel incroyable qui peut ajouter de la valeur au même problème avec d'autres contrôles (par exemple, SearchBar). En effet, puisque pointInside est attaché à un UIView, il est possible de sous-classer n'importe quel contrôle pour améliorer la zone tactile. Cette réponse montre également un exemple complet de mise en œuvre de la solution complète.
Créez une nouvelle sous-classe pour votre bouton (ou tout contrôle)
#import <UIKit/UIKit.h>
@interface MNGButton : UIButton
@end
Remplacez ensuite la méthode pointInside dans votre implémentation de sous-classe
@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
Sur votre fichier storyboard / xib, sélectionnez le contrôle en question et ouvrez l'inspecteur d'identité et tapez le nom de votre classe personnalisée.
Dans votre classe UIViewController pour la scène contenant le bouton, remplacez le type de classe du bouton par le nom de votre sous-classe.
@property (weak, nonatomic) IBOutlet MNGButton *helpButton;
Liez votre bouton storyboard / xib à la propriété IBOutlet et votre zone tactile sera étendue pour s'adapter à la zone définie dans la sous-classe.
En plus de remplacer la méthode pointInside avec les méthodes CGRectInset et CGRectContainsPoint , il faut prendre le temps d'examiner la CGGeometry pour étendre la zone tactile rectangulaire de toute sous-classe UIView. Vous pouvez également trouver de bons conseils sur les cas d'utilisation de CGGeometry sur NSHipster .
Par exemple, on pourrait rendre la zone tactile irrégulière en utilisant les méthodes mentionnées ci-dessus ou simplement choisir de rendre la zone tactile de largeur deux fois plus grande que la zone tactile horizontale:
CGRect area = CGRectInset(self.bounds, -(2*margin), -margin);
NB: la substitution de n'importe quel contrôle de classe d'interface utilisateur devrait produire des résultats similaires en étendant la zone tactile pour différents contrôles (ou toute sous-classe UIView, comme UIImageView, etc.).