简体   繁体   English

带有自定义 UIView(包括按钮)的 UIViewController 无法识别点击

[英]UIViewController with custom UIView (that includes a button) doesn't recognize taps

When trying to load a custom UIView (BaseHeader.swift) that contains a UIButton into a UIViewController (ViewController.swift) programmatically, the taps on the button are not recognized.当尝试以编程方式将包含 UIButton 的自定义 UIView (BaseHeader.swift) 加载到 UIViewController (ViewController.swift) 中时,无法识别按钮上的点击。

If I extract the code within the custom UIView and paste it directly into the UIViewController, all taps are recognized and working as expected.如果我提取自定义 UIView 中的代码并将其直接粘贴到 UIViewController 中,则所有点击都会被识别并按预期工作。 What am I missing?我错过了什么?

At first, I thought it was a problem with not defining a frame size for the UIView after it gets instantiated.起初,我认为在 UIView 实例化后没有为它定义框架大小是一个问题。 I thought that there might be no "hit box" for the button despite it being displayed as intended.我认为尽管按钮按预期显示,但它可能没有“命中框”。 After giving the view a frame I still had no luck and tried various other things after googling about for awhile.在给视图一个框架后,我仍然没有运气,并在谷歌搜索了一段时间后尝试了各种其他的东西。

The view loads but button taps are not recognized -- see image视图加载但无法识别按钮点击 - 请参见图片

ViewController.swift视图控制器.swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        self.title = "Authentication"
    }

    override func loadView() {
        super.loadView()

        let header = BaseHeader()
        header.translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview(header)

        NSLayoutConstraint.activate([
            header.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
            header.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),
            header.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor, constant: -10),
        ])
    }
}

BaseHeader.swift BaseHeader.swift

import UIKit

class BaseHeader: UIView {

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }

    func setupView() {

        self.isUserInteractionEnabled = true

        let avenirFont = UIFont(name: "Avenir", size: 40)
        let lightAvenirTitle = avenirFont?.light

        let title = UILabel()
        title.text = "Title"
        title.font = lightAvenirTitle
        title.textColor = .black
        title.translatesAutoresizingMaskIntoConstraints = false
        self.addSubview(title)

        NSLayoutConstraint.activate([
            title.topAnchor.constraint(equalTo: self.topAnchor, constant: 20),
            title.centerXAnchor.constraint(equalTo: self.centerXAnchor)
        ])


        let profile = UIButton()
        let profileImage = UIImage(named: "person-icon")
        profile.setImage(profileImage, for: .normal)
        profile.setImage(UIImage(named: "think-icon"), for: .highlighted)
        profile.addTarget(self, action: #selector(profileTapped), for: .touchUpInside)
        profile.backgroundColor = .systemBlue
        profile.frame.size = CGSize(width: 30, height: 30)
        profile.isUserInteractionEnabled = true
        profile.translatesAutoresizingMaskIntoConstraints = false
        self.addSubview(profile)

        NSLayoutConstraint.activate([
            profile.centerYAnchor.constraint(equalTo: title.centerYAnchor),
            profile.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -20),
        ])
    }

    @objc func profileTapped(sender: UIButton) {
        print("Tapped")
    }
}

It might be that you are calling the wrong initializer for your custom view and that your setupView() function is not being called.可能是您为自定义视图调用了错误的初始化程序,并且没有调用 setupView() 函数。 It looks like in the view controller you are calling它看起来像在您正在调用的视图控制器中

let header = BaseHeader()

To initialize the view, but it's this init:初始化视图,但它是这个初始化:

override init(frame: CGRect) {
    super.init(frame: frame)
    setupView()
}

That calls your setupView() function and sets up the tap.这会调用您的 setupView() 函数并设置水龙头。

You forgot set height for BaseHeader您忘记为 BaseHeader 设置高度

 NSLayoutConstraint.activate([
            header.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
            header.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),
            header.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor, constant: -10),
header.heightAnchor.constraint(equalToConstant: 40) //add more
        ])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM