В представленных ответах нет ничего плохого; однако я хотел бы расширить ответ 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 и т. Д.).