Không có gì sai với các câu trả lời được trình bày; tuy nhiên tôi muốn mở rộng câu trả lời của jlarjlar vì nó có tiềm năng đáng kinh ngạc có thể tăng giá trị cho cùng một vấn đề với các điều khiển khác (ví dụ SearchBar). Điều này là do pointInside được gắn vào UIView, nên người ta có thể phân lớp bất kỳ điều khiển nào để cải thiện vùng cảm ứng. Câu trả lời này cũng cho thấy một mẫu đầy đủ về cách thực hiện giải pháp hoàn chỉnh.
Tạo một lớp con mới cho nút của bạn (hoặc bất kỳ điều khiển nào)
#import <UIKit/UIKit.h>
@interface MNGButton : UIButton
@end
Tiếp theo ghi đè phương thức pointInside trong triển khai lớp con của bạn
@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
Trên tập tin bảng phân cảnh / xib của bạn, chọn điều khiển trong câu hỏi và mở trình kiểm tra danh tính và nhập tên của lớp tùy chỉnh của bạn.
Trong lớp UIViewControll của bạn cho cảnh chứa nút, hãy thay đổi loại lớp cho nút thành tên của lớp con của bạn.
@property (weak, nonatomic) IBOutlet MNGButton *helpButton;
Liên kết nút bảng phân cảnh / xib của bạn với IBOutlet thuộc tính và vùng cảm ứng của bạn sẽ được mở rộng để phù hợp với khu vực được xác định trong lớp con.
Ngoài trọng các phương pháp pointInside cùng với CGRectInset và CGRectContainsPoint phương pháp, ta nên dành thời gian để kiểm tra CGGeometry cho việc mở rộng khu vực cảm ứng hình chữ nhật của bất kỳ phân lớp UIView. Bạn cũng có thể tìm thấy một số mẹo hay về các trường hợp sử dụng CGGeometry tại NSHipster .
Ví dụ: người ta có thể làm cho vùng cảm ứng không đều bằng cách sử dụng các phương pháp được đề cập ở trên hoặc chỉ cần chọn để làm cho vùng cảm ứng chiều rộng lớn gấp đôi diện tích chạm ngang:
CGRect area = CGRectInset(self.bounds, -(2*margin), -margin);
Lưu ý: Việc thay thế bất kỳ điều khiển Lớp UI nào sẽ tạo ra kết quả tương tự khi mở rộng vùng cảm ứng cho các điều khiển khác nhau (hoặc bất kỳ lớp con UIView nào, như UIImageView, v.v.).