Tidak ada yang salah dengan jawaban yang disajikan; namun saya ingin memperluas jawaban jlarjlar karena memiliki potensi luar biasa yang dapat menambah nilai untuk masalah yang sama dengan kontrol lain (misalnya SearchBar). Ini karena sejak pointInside terpasang ke UIView, seseorang dapat mensubklasifikasikan kontrol apa pun untuk meningkatkan area sentuh. Jawaban ini juga menunjukkan sampel lengkap tentang bagaimana menerapkan solusi lengkap.
Buat subkelas baru untuk tombol Anda (atau kontrol apa pun)
#import <UIKit/UIKit.h>
@interface MNGButton : UIButton
@end
Selanjutnya timpa metode pointInside dalam implementasi subclass Anda
@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
Pada file storyboard / xib Anda pilih kontrol yang dimaksud dan buka inspektur identitas dan ketikkan nama kelas khusus Anda.
Di kelas UIViewController Anda untuk adegan yang berisi tombol, ubah tipe kelas untuk tombol tersebut ke nama subkelas Anda.
@property (weak, nonatomic) IBOutlet MNGButton *helpButton;
Hubungkan tombol storyboard / xib Anda ke IBOutlet properti dan area sentuh Anda akan diperluas agar sesuai dengan area yang ditentukan dalam subkelas.
Selain mengganti metode pointInside bersama-sama dengan metode CGRectInset dan CGRectContainsPoint , kita harus meluangkan waktu untuk memeriksa CGGeometry untuk memperluas area sentuh persegi panjang dari setiap subkelas UIView. Anda juga dapat menemukan beberapa tips bagus tentang kasus penggunaan CGGeometry di NSHipster .
Misalnya seseorang dapat membuat area sentuh tidak teratur menggunakan metode yang disebutkan di atas atau hanya memilih untuk membuat area sentuh lebar dua kali lebih besar dari area sentuh horizontal:
CGRect area = CGRectInset(self.bounds, -(2*margin), -margin);
NB: Mengganti kontrol Kelas UI harus menghasilkan hasil yang serupa pada perluasan area sentuh untuk kontrol yang berbeda (atau subkelas UIView lainnya, seperti UIImageView, dll.).