Нет ничего плохого в представленных ответах; однако я хотел бы расширить ответ jlarjlar , поскольку он обладает удивительным потенциалом, который может добавить ценность к той же проблеме с другими элементами управления (например, SearchBar). Это связано с тем, что поскольку pointInside подключен к UIView, можно подкласс любого элемента управления улучшить область касания. Этот ответ также показывает полный пример того, как реализовать полное решение.
Создать новый подкласс для вашей кнопки (или любого элемента управления)
#import <UIKit/UIKit.h>
@interface MNGButton : UIButton
@end
Затем переопределите метод pointInside в вашей реализации подкласса
@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
В файле раскадровки / xib выберите нужный элемент управления, откройте инспектор идентификации и введите имя своего пользовательского класса.
В вашем классе UIViewController для сцены, содержащей кнопку, измените тип класса для кнопки на имя вашего подкласса.
@property (weak, nonatomic) IBOutlet MNGButton *helpButton;
Свяжите свою раскадровку / кнопку xib со свойством IBOutlet, и ваша область касания будет расширена, чтобы соответствовать области, определенной в подклассе.
В дополнение к переопределению метода pointInside вместе с CGRectInset и CGRectContainsPoint , необходимо время, чтобы изучить CGGeometry для расширения прямоугольной области касания любого подкласса UIView. Вы также можете найти несколько полезных советов по сценариям использования CGGeometry на NSHipster .
Например, можно сделать область касания нерегулярной, используя методы, упомянутые выше, или просто выбрать, чтобы область касания шириной была в два раза больше горизонтальной области касания:
CGRect area = CGRectInset(self.bounds, -(2*margin), -margin);
Примечание: замена любого элемента управления класса UI должна давать аналогичные результаты при расширении сенсорной области для различных элементов управления (или любого подкласса UIView, такого как UIImageView и т. Д.).