Saya memiliki metode yang menggambar tombol lingkaran ke UIImageView
. Tombolnya tampak bagus dan dijalankan dengan sempurna. Namun area yang dapat diklik bukan hanya lingkaran yang telah digambar, namun seluruh persegi panjang aslinya.
Berikut adalah metode tombol di kelas DrawMenu
:
func drawButton(superImageView: UIImageView, delegate: ButtonDelegate, x_of_origin: CGFloat, y_of_origin: CGFloat, width_of_oval: CGFloat, height_of_oval: CGFloat, want_to_test_bounds:Bool) -> UIButton {
var button = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton
button.addTarget(delegate, action: "buttonTap:", forControlEvents: UIControlEvents.TouchUpInside)
// THIS IS WHERE THE ORIGINAL RECT IS DEFINED, and it currently the clickable area
button.frame = CGRect(x: x_of_origin, y: y_of_origin, width: width_of_oval, height: height_of_oval)
button.clipsToBounds = true
// This is where the look of circle is defined, and IS WHERE THE CLICKABLE AREA SHOULD BE
button.layer.cornerRadius = height_of_oval/2.0
if (want_to_test_bounds == true) {
button.layer.borderColor = UIColor.blackColor().CGColor
button.layer.borderWidth = 1.0
}
return button
}
Dan inilah panggilan di ViewController:
override func viewDidLoad() {
super.viewDidLoad()
var drawMenu = DrawMenu()
var newButton = drawMenu.drawButton(imageView, delegate: self, x_of_origin: 100, y_of_origin: 150, width_of_oval: 100, height_of_oval: 100, want_to_test_bounds: true)
imageView.userInteractionEnabled = true
imageView.addSubview(newButton)
}
Seperti biasa, bantuan apa pun dihargai. Terima kasih
Edit, setelah diberi label [duplikat]
Saya menghargai bahwa pertanyaan iOS: Area pukulan non-persegi untuk tombol menanyakan pertanyaan yang pada dasarnya sama, dan saya bersyukur telah diarahkan ke pertanyaan tersebut.
Namun, setelah beberapa jam bergumul dengan masalah tersebut, saya yakin satu-satunya solusi dari pertanyaan tersebut yaitu:
"Anda dapat mencapai ini dengan membuat subkelas UIButton dan menyediakan sendiri:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
// return YES if point is inside the receiver’s bounds; otherwise, NO.
}
Dokumentasi UIView Apple memberikan detailnya, seperti mengonfirmasi bahwa titik tersebut sudah ada dalam sistem koordinat penerima."
tidak cukup karena berkaitan dengan kesulitan tambahan dari pertanyaan saya.
Khususnya:
1. Apa yang dimaksud dengan "batas penerima" dalam kasus ini? Itu tidak mungkin apa pun yang berhubungan dengan rect asli, karena itu akan memberi saya hasil yang sama. Oleh karena itu mungkin return button
.
2. Kalaupun ya, bagaimana saya bisa menerapkannya? pointInside:
tidak dapat menerima argumen tambahan.
3. Saya juga menerapkan ini di seluruh kelas, yang selanjutnya membedakan solusi saya dengan solusi yang diberikan di atas.
Saya memahami pentingnya menghindari pertanyaan duplikat. Namun dalam kasus ini saya yakin tidak masuk akal untuk meminta solusi yang lebih baik daripada yang disediakan oleh iOS: Area pukulan non-persegi untuk tombol.
Terima kasih lagi.
pointInside:withEvent:
untuk tombol bulat: stackoverflow.com/a/9336838/77567 - person rob mayoff   schedule 12.09.2015layoutSubviews
dan menambahkanvar _path = UIBezierPath(ovalInRect: self.bounds)
ke dalamnya. Kemudian dibuat funcPathButton
yang berisi ` var button = UIButton(frame: rect) button.layer.cornerRadius = height_of_oval/2.0 button.clipsToBounds = true var _path = UIBezierPath(ovalInRect: rect) ` - person user2176152   schedule 13.09.2015override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { return _path.containsPoint(point) }
- person user2176152   schedule 13.09.2015UIButton
, bukan membuat turunan dari subkelas tombol Anda. - person rob mayoff   schedule 13.09.2015