No hay nada malo con las respuestas presentadas; sin embargo, quería extender la respuesta de jlarjlar ya que tiene un potencial sorprendente que puede agregar valor al mismo problema con otros controles (por ejemplo, SearchBar). Esto se debe a que ya que pointInside está conectado a una UIView, se puede subclasificar cualquier control para mejorar el área táctil. Esta respuesta también muestra una muestra completa de cómo implementar la solución completa.
Cree una nueva subclase para su botón (o cualquier control)
#import <UIKit/UIKit.h>
@interface MNGButton : UIButton
@end
A continuación, anule el método pointInside en su implementación de subclase
@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
En su archivo de guión gráfico / xib, seleccione el control en cuestión y abra el inspector de identidad y escriba el nombre de su clase personalizada.
En su clase UIViewController para la escena que contiene el botón, cambie el tipo de clase para el botón al nombre de su subclase.
@property (weak, nonatomic) IBOutlet MNGButton *helpButton;
Enlace su storyboard / botón xib a la propiedad IBOutlet y su área táctil se expandirá para adaptarse al área definida en la subclase.
Además de anular el método pointInside junto con los métodos CGRectInset y CGRectContainsPoint , uno debería tomarse un tiempo para examinar CGGeometry para extender el área táctil rectangular de cualquier subclase UIView. También puede encontrar algunos buenos consejos sobre casos de uso de CGGeometry en NSHipster .
Por ejemplo, uno podría hacer que el área táctil sea irregular utilizando los métodos mencionados anteriormente o simplemente elegir hacer que el área táctil de ancho sea dos veces más grande que el área táctil horizontal:
CGRect area = CGRectInset(self.bounds, -(2*margin), -margin);
NB: la sustitución de cualquier control de clase UI debería producir resultados similares al extender el área táctil para diferentes controles (o cualquier subclase UIView, como UIImageView, etc.).