Swift, Custom UIButton не работает при нажатии
У меня есть пользовательский UIButton, созданный с помощью файла XIB. Когда я использую свою пользовательскую кнопку в моем представлении, она не работает, когда я нажимаю на нее.
Мой файл RoundBtn.swift:
import UIKit
@IBDesignable class RoundBtn: UIButton {
var nibName = "RoundBtn"
@IBOutlet weak var btnImageView: UIImageView!
@IBOutlet weak var btnLabel: UILabel!
@IBInspectable var image: UIImage? {
get {
return btnImageView.image
} set(image) {
btnImageView.image = image
}
}
@IBInspectable var label: String? {
get {
return btnLabel.text
} set(label) {
btnLabel.text = label
}
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
func setup() {
let view = loadViewFromNib()
view.frame = self.bounds
view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
btnImageView.layer.cornerRadius = 60/2
btnImageView.layer.borderColor = UIColor(red: 5/255,
green: 66/255, blue: 38/255, alpha: 1).CGColor
btnImageView.layer.borderWidth = 2
btnLabel.font = UIFont.boldSystemFontOfSize(14.0)
btnImageView.userInteractionEnabled = true
btnLabel.userInteractionEnabled = true
view.userInteractionEnabled = true
addSubview(view)
}
func loadViewFromNib() -> UIButton {
let bundle = NSBundle(forClass: self.dynamicType)
let nib = UINib(nibName: nibName, bundle: bundle)
let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIButton
return view
}
}
Мой файл RoundBtn.xib:
Посмотрите, где я использовал свою пользовательскую кнопку:
Я включил userInteractionEnabled
на всех компонентах представления. Когда я нажимаю на свою пользовательскую кнопку, она не работает. Я попытался, определив щелчок программно и определив действие segue (показать).
@IBAction func myCartBtnPressed(sender: AnyObject) {
print("my cart btn pressed")
}
2 ответа
Я думаю, что это вызвано тем, что вы добавляете пару подпредставлений UIViews к вашей текущей UIButton с помощью userInteractionEnabled, что означает, что они обрабатывают пользовательский ввод.
Если вы делаете:
view.isUserInteractionEnabled = false
Сам RoundBtn получит все сенсорные события вместо этих UIViews, которые у вас есть сверху.
Ссылаясь на ответ @fdiaz. Свифт 4 нотации.
И наоборот, если вы присоединяете некоторое UIButton (или интерактивное представление пользователя) к UIImageView, вы должны повернуть его isUserInteractionEnabled = true, чтобы позволить касаниям проходить иерархию вверх вплоть до UIButton.