【问题标题】:Swift, Custom UIButton does not work when clickSwift,单击时自定义 UIButton 不起作用
【发布时间】:2016-05-20 22:59:27
【问题描述】:

我有一个使用 xib 文件创建的自定义 UIButton。当我在视图上使用我的自定义按钮时,当我按下它时它不起作用。

我的 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")
}

【问题讨论】:

    标签: ios xcode uibutton swift2 buttonclick


    【解决方案1】:

    我认为这是因为您使用 userInteractionEnabled 向当前 UIButton 添加了几个 UIViews 子视图,这意味着它们正在处理用户输入。

    如果你这样做:

    view.isUserInteractionEnabled = false
    

    RoundBtn 本身将获取所有触摸事件,而不是您在顶部拥有的 UIView。

    【讨论】:

    • 嗨,一开始我没有以编程方式启用交互,点击后无论如何都不起作用,然后我用谷歌搜索它,找到了启用交互的解决方案,我启用了所有这些,无论如何点击不工作
    • 现在我尝试删除那 3 行,但也不起作用,然后我尝试了您的解决方案,它有效:D,但请解释为什么我必须在需要交互时禁用视图?跨度>
    • 当您将 UIView 添加到 RoundBtn 时,该 UIView 默认将 userInteractionEnabled 设为 true(与 UIImageView 和 UILabel 默认将 userInteractionEnabled 设为 false 不同)。所以所有的触摸事件都去那个视图而不是去你的 RoundBtn。我建议您查看Hit-Testing Returns the View Where a Touch Occurred 以获得更好的理解。
    • 拯救了我的一天,这就是解决方案!谢谢!
    • 在带有 XCode 11.2.1 的 Swift 5 中遇到了同样的问题。要解决此问题,请在“属性检查器”选项卡(第 5 个选项卡)中禁用情节提要中的所有用户交互,并在“身份检查器”选项卡(第 4 个选项卡)中禁用启用用户交互的特征。
    【解决方案2】:

    参考@fdiaz 的回答。 Swift 4 表示法。

    相反,如果您将一些 UIButton(或用户交互视图)附加到 UIImageView,则必须将其 isUserInteractionEnabled = true 以让触摸通过层次结构向下传递到 UIButton。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多