В представленных ответах нет ничего плохого; однако я хотел расширить jlarjlar's answer, поскольку он обладает удивительным потенциалом, который может повысить ценность той же проблемы с другими элементами управления (например, 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);
NB: замена любого элемента управления UI Class должна привести к аналогичным результатам при расширении сенсорной области для различных элементов управления (или любого подкласса UIView, такого как UIImageView и т. Д.).
person
Tommie C.
schedule
08.09.2014
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { return bounds.insetBy(dx: -20, dy: -20).contains(point) }- person Fattie   schedule 22.09.2019