【问题标题】:swift can't click uibutton located inside multiple subviewsswift无法单击位于多个子视图内的uibutton
【发布时间】:2019-03-28 20:59:22
【问题描述】:

当我按下arrowButton 时我没有得到,甚至print("toggleWhiteMenu pressed") 也没有在控制台中打印?我已经搜索过类似这个的其他问题,但似乎没有帮助。

 let card: UIView = {
        let tsl = UIView()
        tsl.backgroundColor = UIColor.black
        tsl.alpha = 0.9
        return tsl
    }()


let yellowCard: UIView = {
    let tsl = UIView()
    tsl.backgroundColor = UIColor.yellow
    //tsl.alpha = 1
     tsl.isUserInteractionEnabled = false
    return tsl
}()



  lazy var arrowButton: UIButton = {
    let button = UIButton(type: .system)

    button.setImage(#imageLiteral(resourceName: "down arrow"), for: .normal)
    button.tintColor = UIColor.black
    button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 14)
    button.addTarget(self, action: #selector(self.toggleWhiteMenu), for: .touchUpInside)
    return button
}()


func toggleWhiteMenu() {
    print("toggleWhiteMenu pressed")
    UIView.animate(withDuration: 1, animations: {

        self.whiteMenu.transform = CGAffineTransform(scaleX: 11, y: 11)
    }) { (true) in
        print("really sick")
    }
}


let whiteMenu: UIView = {
    let tsl = UIView()
    tsl.backgroundColor = UIColor.white
    tsl.alpha = 1
    tsl.isUserInteractionEnabled = false
    return tsl
}()



    let containerView: UIView = {
        let v = UIView()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = .yellow
        v.isUserInteractionEnabled = false
        return v
    }()

    let scrollView: UIScrollView = {
        let v = UIScrollView()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = .white
        return v
    }()


let backgroundImageView: UIImageView = {
    let imageView = UIImageView()
    imageView.image = UIImage(named: "eiffel tower")
    imageView.translatesAutoresizingMaskIntoConstraints = false
     imageView.isUserInteractionEnabled = false
    imageView.layer.masksToBounds = true
    imageView.contentMode = .scaleAspectFill

    return imageView
}()


func setUpViews() { 
        self.view.addSubview(scrollView)
        scrollView.addSubview(containerView)

        containerView.addSubview(backgroundImageView)
        backgroundImageView.addSubview(card)
        backgroundImageView.addSubview(yellowCard)

        yellowCard.addSubview(whiteMenu)
        yellowCard.addSubview(arrowButton)

        ///i have left out constraints except for the arrowbutton's constraints as i don't deem them necessary for this question

        arrowButton.anchor(top: nil, left: nil, bottom: nil, right: nil, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: view.frame.width/6, height: view.frame.width/6)

        arrowButton.clipsToBounds = true

        arrowButton.centerXAnchor.constraint(equalTo: whiteMenu.centerXAnchor).isActive = true
        arrowButton.centerYAnchor.constraint(equalTo: whiteMenu.centerYAnchor).isActive = true
}

【问题讨论】:

  • 我们的一个子视图可能重叠 UIButton 为所有子视图设置不同的背景颜色并检查您的按钮是否可见,如果是,则检查 UIButton 框架,否则正确设置子视图框架。
  • 感谢 Abu Ul Hassan 我这样做了,按钮显然位于所有子视图的顶部,没有子视图与按钮重叠
  • 你试过在toggleWhiteMenu函数前面添加@objc吗?因此,编译器可能不会在运行时关联 func。

标签: ios swift uiview uibutton


【解决方案1】:

请使用如下选择器方法添加@objc。

 @objc func toggleWhiteMenu() {
    print("toggleWhiteMenu pressed")
    UIView.animate(withDuration: 1, animations: {

        self.whiteMenu.transform = CGAffineTransform(scaleX: 11, y: 11)
    }) { (true) in
        print("really sick")
    }
    }

【讨论】:

  • 将此行添加到 setUpViews 的末尾 arrowButton.addTarget(self, action: #selector(self.toggleWhiteMenu), for: .touchUpInside)
  • 并将其从延迟加载块中删除。
【解决方案2】:

您正在设置:

.isUserInteractionEnabled = false

在多个视图上,然后添加一个按钮作为子视图。 isUserInteractionEnabled 在父视图上设置为 false 将级联到所有子视图,包括按钮和其他控件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多