ไม่มีอะไรผิดปกติกับคำตอบที่นำเสนอ; แต่ฉันต้องการขยายคำตอบของ jlarjlarเนื่องจากมีศักยภาพที่น่าทึ่งที่สามารถเพิ่มคุณค่าให้กับปัญหาเดียวกันกับตัวควบคุมอื่น ๆ (เช่น SearchBar) นี่คือเนื่องจากเนื่องจาก pointInside แนบกับ UIView หนึ่งสามารถ subclass ตัวควบคุมใด ๆเพื่อปรับปรุงพื้นที่สัมผัส คำตอบนี้ยังแสดงตัวอย่างทั้งหมดของวิธีการใช้โซลูชันที่สมบูรณ์
สร้างคลาสย่อยใหม่สำหรับปุ่มของคุณ (หรือตัวควบคุมใด ๆ )
#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 use-cases ที่NSHipster NSHipster
ตัวอย่างเช่นสามารถทำให้พื้นที่สัมผัสผิดปกติโดยใช้วิธีการที่กล่าวถึงข้างต้นหรือเพียงแค่เลือกที่จะทำให้พื้นที่สัมผัสกว้างเป็นสองเท่าของพื้นที่สัมผัสแนวนอน:
CGRect area = CGRectInset(self.bounds, -(2*margin), -margin);
หมายเหตุ: การแทนที่การควบคุมคลาส UI ใด ๆ ควรให้ผลลัพธ์ที่คล้ายกันในการขยายพื้นที่การสัมผัสสำหรับการควบคุมที่แตกต่างกัน (หรือคลาสย่อย UIView ใด ๆ เช่น UIImageView เป็นต้น)