Cara membuat hanya area lingkaran dari sebuah tombol yang dapat diklik, bukan seluruh persegi asli [duplikat]

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.


person user2176152    schedule 11.09.2015    source sumber
comment
Bisakah Anda menambahkan tangkapan layar seperti apa tampilannya? Saya ingin tahu tentang jumlah ruang di luar tombol di UIImageView Anda.   -  person Acludia    schedule 12.09.2015
comment
@rmaddy Terima kasih telah merujuk saya ke pertanyaan terkait. Jika Anda mau, silakan baca hasil edit saya, dan pertimbangkan kembali status pertanyaan saya. Terima kasih   -  person user2176152    schedule 12.09.2015
comment
Berikut jawaban yang menunjukkan cara mengimplementasikan pointInside:withEvent: untuk tombol bulat: stackoverflow.com/a/9336838/77567   -  person rob mayoff    schedule 12.09.2015
comment
@robmayoff Terima kasih, saya mencoba menerapkan beberapa kode Anda di Swift, tetapi area yang dapat diklik masih asli. Saya mendefinisikan _path di kelas yang merupakan subkelas dari UIButton, dan saya mengganti layoutSubviews dan menambahkan var _path = UIBezierPath(ovalInRect: self.bounds) ke dalamnya. Kemudian dibuat func PathButton 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.2015
comment
Di dalam fungsi saya kemudian menambahkan tombol ke subtampilan, yang diteruskan ke subtampilan, lalu seluruh fungsi mengembalikan jalurnya. Kemudian terapkan override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { return _path.containsPoint(point) }   -  person user2176152    schedule 13.09.2015
comment
Anda harus memposting pertanyaan tingkat atas baru yang berisi kode Anda dan menjelaskan apa yang salah. Tapi bagaimanapun, kode di komentar Anda menunjukkan Anda membuat stok UIButton, bukan membuat turunan dari subkelas tombol Anda.   -  person rob mayoff    schedule 13.09.2015