Swift 在UIScrollView中看不到按钮

Swift 在UIScrollView中看不到按钮,swift,uiscrollview,uibutton,uilabel,addsubview,Swift,Uiscrollview,Uibutton,Uilabel,Addsubview,我在swift中以scrollview的形式制作了一个列表,其中视图包括各种类型,如标签、按钮等 但是,当我将按钮添加到子视图时,虽然显示了所有其他标签等,但它们并未显示。我还试着在约束和锚定中乱搞。 另一方面,当我将相同的按钮添加到self.view.addsubview而不是scrollview.addsubview时,它们显示为不滚动,因为不再是scrollview的一部分。 我甚至去掉了标签,以确保按钮没有重叠(也不起作用) 我还试图在“代码调试层次结构”(3D模式)中查看代码,尽管我已

我在swift中以scrollview的形式制作了一个列表,其中视图包括各种类型,如标签、按钮等

但是,当我将按钮添加到子视图时,虽然显示了所有其他标签等,但它们并未显示。我还试着在约束和锚定中乱搞。 另一方面,当我将相同的按钮添加到self.view.addsubview而不是scrollview.addsubview时,它们显示为不滚动,因为不再是scrollview的一部分。 我甚至去掉了标签,以确保按钮没有重叠(也不起作用)

我还试图在“代码调试层次结构”(3D模式)中查看代码,尽管我已经添加了按钮,但也无法在那里看到它

下面是我的代码以及标签、滚动视图和按钮的示例。如果有人能提供任何见解,那就太好了……无论如何,谢谢

..scrollview..

var editInfoView : UIScrollView = {

    let view = UIScrollView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.contentSize.height = 700
    view.backgroundColor = tableBackGroundColor
    view.frame = CGRect(x: 0, y: 220, width: 375, height: 400)

    return view
}()
vehicleNumberLabel.translatesAutoresizingMaskIntoConstraints = false
    vehicleNumberLabel.textColor = .white
    vehicleNumberLabel.text = "Vehicle Number"
    vehicleNumberLabel.textAlignment = .left

    editInfoView.addSubview(vehicleNumberLabel)

    vehicleNumberLabel.leftAnchor.constraint(equalTo: editInfoView.leftAnchor).isActive = true
    vehicleNumberLabel.topAnchor.constraint(equalTo: editInfoView.topAnchor, constant: 100).isActive = true
    vehicleNumberLabel.widthAnchor.constraint(equalToConstant: 160).isActive = true
    vehicleNumberLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true
vehicleNumberButton.translatesAutoresizingMaskIntoConstraints = false
    vehicleNumberButton.setTitleColor(tableTextColor, for: .normal)
    vehicleNumberButton.setTitle("Vehicle Number", for: .normal)
    vehicleNumberButton.tintColor = tableTextColor
    vehicleNumberButton.backgroundColor = tableTextColor

    editInfoView.addSubview(vehicleNumberButton)

    vehicleNumberButton.rightAnchor.constraint(equalTo: editInfoView.rightAnchor).isActive = true
    vehicleNumberButton.topAnchor.constraint(equalTo: editInfoView.topAnchor, constant: 400).isActive = true
    vehicleNumberButton.widthAnchor.constraint(equalToConstant: 600).isActive = true
    vehicleNumberButton.heightAnchor.constraint(equalToConstant: 255).isActive = true
标签………..

var editInfoView : UIScrollView = {

    let view = UIScrollView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.contentSize.height = 700
    view.backgroundColor = tableBackGroundColor
    view.frame = CGRect(x: 0, y: 220, width: 375, height: 400)

    return view
}()
vehicleNumberLabel.translatesAutoresizingMaskIntoConstraints = false
    vehicleNumberLabel.textColor = .white
    vehicleNumberLabel.text = "Vehicle Number"
    vehicleNumberLabel.textAlignment = .left

    editInfoView.addSubview(vehicleNumberLabel)

    vehicleNumberLabel.leftAnchor.constraint(equalTo: editInfoView.leftAnchor).isActive = true
    vehicleNumberLabel.topAnchor.constraint(equalTo: editInfoView.topAnchor, constant: 100).isActive = true
    vehicleNumberLabel.widthAnchor.constraint(equalToConstant: 160).isActive = true
    vehicleNumberLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true
vehicleNumberButton.translatesAutoresizingMaskIntoConstraints = false
    vehicleNumberButton.setTitleColor(tableTextColor, for: .normal)
    vehicleNumberButton.setTitle("Vehicle Number", for: .normal)
    vehicleNumberButton.tintColor = tableTextColor
    vehicleNumberButton.backgroundColor = tableTextColor

    editInfoView.addSubview(vehicleNumberButton)

    vehicleNumberButton.rightAnchor.constraint(equalTo: editInfoView.rightAnchor).isActive = true
    vehicleNumberButton.topAnchor.constraint(equalTo: editInfoView.topAnchor, constant: 400).isActive = true
    vehicleNumberButton.widthAnchor.constraint(equalToConstant: 600).isActive = true
    vehicleNumberButton.heightAnchor.constraint(equalToConstant: 255).isActive = true
………..按钮………..

var editInfoView : UIScrollView = {

    let view = UIScrollView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.contentSize.height = 700
    view.backgroundColor = tableBackGroundColor
    view.frame = CGRect(x: 0, y: 220, width: 375, height: 400)

    return view
}()
vehicleNumberLabel.translatesAutoresizingMaskIntoConstraints = false
    vehicleNumberLabel.textColor = .white
    vehicleNumberLabel.text = "Vehicle Number"
    vehicleNumberLabel.textAlignment = .left

    editInfoView.addSubview(vehicleNumberLabel)

    vehicleNumberLabel.leftAnchor.constraint(equalTo: editInfoView.leftAnchor).isActive = true
    vehicleNumberLabel.topAnchor.constraint(equalTo: editInfoView.topAnchor, constant: 100).isActive = true
    vehicleNumberLabel.widthAnchor.constraint(equalToConstant: 160).isActive = true
    vehicleNumberLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true
vehicleNumberButton.translatesAutoresizingMaskIntoConstraints = false
    vehicleNumberButton.setTitleColor(tableTextColor, for: .normal)
    vehicleNumberButton.setTitle("Vehicle Number", for: .normal)
    vehicleNumberButton.tintColor = tableTextColor
    vehicleNumberButton.backgroundColor = tableTextColor

    editInfoView.addSubview(vehicleNumberButton)

    vehicleNumberButton.rightAnchor.constraint(equalTo: editInfoView.rightAnchor).isActive = true
    vehicleNumberButton.topAnchor.constraint(equalTo: editInfoView.topAnchor, constant: 400).isActive = true
    vehicleNumberButton.widthAnchor.constraint(equalToConstant: 600).isActive = true
    vehicleNumberButton.heightAnchor.constraint(equalToConstant: 255).isActive = true

虽然我无法通过提供的代码和解释确定问题的根本原因,但我怀疑在
ViewDidDisplay(:)
cRect添加子视图后,
UIScrollView()
的框架为零。零可能会导致布局引擎出现一些奇怪的行为。当我们以编程方式创建约束时,我们正在创建一个不等式、等式和优先级的组合,以将视图限制在特定的框架内。如果这些约束方程的值不正确,则会更改相关视图的显示方式。避免使用
leftAnchor
righAnchor
也是一种很好的做法,因为视图可能会根据语言(书写方向)和用户设置反转方向

ViewController.swift

import UIKit

class ViewController: UIViewController {

    var editInfoScrollView : UIScrollView = {
        let view = UIScrollView()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.isUserInteractionEnabled = true
        view.alwaysBounceVertical = true
        view.isScrollEnabled = true
        view.contentSize.height = 700
        view.backgroundColor = UIColor.red.withAlphaComponent(0.3)
        // Does nothing because `translatesAutoresizingMaskIntoConstraints = false`
        // Instead, set the content size after activating constraints in viewDidAppear
        //view.frame = CGRect(x: 0, y: 220, width: 375, height: 400)
        return view
    }()

    var vehicleNumberLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.textColor = UIColor.black
        label.text = "Vehicle Number"
        label.textAlignment = .left
        return label
    }()

    lazy var vehicleNumberButton: UIButton = {
        let button = UIButton()
        button.translatesAutoresizingMaskIntoConstraints = false
        button.tag = 1
        button.setTitleColor(UIColor.black, for: .normal)
        button.setTitle("Go to Vehicle", for: .normal)
        button.tintColor = UIColor.white
        button.backgroundColor = UIColor.clear
        button.layer.cornerRadius = 30 // about half of button.frame.height
        button.layer.borderColor = UIColor.black.cgColor
        button.layer.borderWidth = 2.0
        button.layer.masksToBounds = true
        button.addTarget(self, action: #selector(handelButtons(_:)), for: .touchUpInside)
        return button
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white

        self.setupSubviews()

    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.editInfoScrollView.contentSize = CGSize(width: self.view.frame.width, height: 700.0)
    }

    func setupSubviews() {
        self.view.addSubview(editInfoScrollView)
            editInfoScrollView.addSubview(vehicleNumberLabel)
            editInfoScrollView.addSubview(vehicleNumberButton)

        let spacing: CGFloat = 12.0

        let constraints:[NSLayoutConstraint] = [

            editInfoScrollView.widthAnchor.constraint(equalTo: self.view.widthAnchor),
            editInfoScrollView.heightAnchor.constraint(equalToConstant: 400.0),
            editInfoScrollView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
            editInfoScrollView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor, constant: 220.0),

            vehicleNumberLabel.leadingAnchor.constraint(equalTo: editInfoScrollView.leadingAnchor, constant: spacing),
            vehicleNumberLabel.trailingAnchor.constraint(equalTo: editInfoScrollView.trailingAnchor, constant: -spacing),
            vehicleNumberLabel.centerXAnchor.constraint(equalTo: editInfoScrollView.centerXAnchor, constant: -50),
            vehicleNumberLabel.heightAnchor.constraint(equalToConstant: 75.0),

            vehicleNumberButton.widthAnchor.constraint(equalTo: editInfoScrollView.widthAnchor, multiplier: 0.66),
            vehicleNumberButton.heightAnchor.constraint(equalToConstant: 65.0),
            vehicleNumberButton.topAnchor.constraint(equalTo: vehicleNumberLabel.bottomAnchor, constant: spacing),
            vehicleNumberButton.centerXAnchor.constraint(equalTo: editInfoScrollView.centerXAnchor),

        ]

        NSLayoutConstraint.activate(constraints)
    }



    @objc func handelButtons(_ sender: UIButton) {

        switch sender.tag {
        case 0:
            print("Default button tag")
        case 1:
            print("vehicleNumberButton was tapped")
        default:
            print("Nothing here yet")
        }

    }


}

为什么在将约束添加到视图后再添加约束?也许你应该先把它添加到视图中,在你设置了ConstraintsJonathan之后,我在把它添加到视图中之后再添加约束,因为如果我之前添加到视图中,它会给我这个错误(线程1:SIGABRT信号)。这种方法只适用于标签,而不适用于按钮?好的,在哪个功能中添加按钮和标签?在viewDidLoad中?我在VC中声明它们,在viewDidLoad中定义它们,并以单独的方法添加到视图中,仅用于约束和设置,标签和按钮也是如此。看看这个,我认为您应该在
init
函数中添加元素:@vgvishs231上面的代码有助于解决问题吗?brother您的代码在iphone中工作,所以我想我会重写我的整个观点,伊玛很快让你知道,真的很欣赏这部作品,但部分原因是,我现在可以添加按钮,但它们的大小是一个大长方形,重叠其他不能更改,我将尝试使用标签,使其可触摸等