У представлених відповідях немає нічого поганого; однак я хотів поширити відповідь 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 тощо).