我正在努力复习我的UIKit,但我想不明白为什么在try 在其中添加一些自定义视图时我的堆栈视图间距如此小.我在过go 的一些项目中try 过这种堆栈视图大小,但它们并不一样,这意味着在我的其他项目中,堆栈视图间距显示预期的间距为10,与之相反,当我在下面的代码上设置10间距时,几乎没有任何间距.

class ViewController: UIViewController {
    
    private lazy var vStackView: UIStackView = {
        let stack = UIStackView(arrangedSubviews: [customButtonOne, customButtonTwo])
        stack.translatesAutoresizingMaskIntoConstraints = false
        stack.axis = .vertical
        stack.distribution = .fill
        stack.spacing = 10
        return stack
    }()
        
    private lazy var customButtonOne: CustomView = {
        let button = CustomView()
        return button
    }()
    
    private lazy var customButtonTwo: CustomView = {
        let button = CustomView()
        button.buttonView.setTitle("This is button two", for: .normal)
        return button
    }()
    
    init() {
        super.init(nibName: nil, bundle: nil)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        configure()
    }
    
    func configure() {
        view.addSubview(vStackView)


        NSLayoutConstraint.activate([
            vStackView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            vStackView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
        ])
    }
}

这就是自定义按钮视图内部的内容:

class CustomView: UIView {
    lazy var buttonView: UIButton = {
        let button: UIButton = UIButton()
        button.translatesAutoresizingMaskIntoConstraints = false
        button.backgroundColor = .systemBlue
        button.setTitle("Hello World", for: .normal)
        button.layer.cornerRadius = 8
        //button.configuration = buttonConfig
        return button
    }()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        translatesAutoresizingMaskIntoConstraints = false
        addSubview(buttonView)
        setupView()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func setupView() {
        NSLayoutConstraint.activate([
            buttonView.centerXAnchor.constraint(equalTo: centerXAnchor),
            buttonView.centerYAnchor.constraint(equalTo: centerYAnchor)
        ])
    }
}

enter image description here

推荐答案

问题是CustomView的大小为零.堆栈视图本质上是以0的间距布置两个"点",因此这两个"点"相距10点,并且按钮以这些点为中心.

您使用let button = CustomView()创建了CustomView.这为它提供了一个框架(0,0,0,0).即使CustomView的大小为零,您仍然可以看到按钮,因为clipsToBounds是假的.

您可以在CustomView中重写intrinsicContentSize,与按钮相同:

override var intrinsicContentSize: CGSize {
    buttonView.intrinsicContentSize
}

堆栈视图将使用此来调整您的CustomView大小.

Ios相关问答推荐

preferredCompactColumn作为NavigationSplitViewColumn.sidebar传递,但仍能在iOS上看到详细信息页面

在SwiftUI中使用系统图像和色调创建圆形按钮

如何在SwiftUI中拥有基于操作系统版本的条件修饰符?

如何在不将应用程序留在SwiftUI上的情况下更改语言?

如何删除NavigationView中的默认透明标头?

为什么在Actor内部使用withTaskGroupwork并行运行?

如何在Swift/Combine中从timer.publish属性传递两个参数到任意方法

查找东南亚语言(泰语、高棉语、老挝语、缅甸语)中的单词边界

如何使用 pushViewController 从 UIHostingController 的 SwiftUI 视图中推送 ViewController?

SwiftUI - TextField - 在焦点上清除 Double 类型的值,在取消 Select 时恢复

iOS - 判断开发者模式是否开启 (Swift)

禁用 UITextField 的自动更正

UILabel - 字符串作为文本和链接

在 iOS 编程中使用 Storyboard 代替 xib 文件有什么好处?

如何使用 swift 添加速率按钮的链接?

文件是为存档而构建的,它不是被链接的体系 struct (i386)

如何防止 iOS 设备上的显示屏变暗和关闭?

如果我的分发证书过期会怎样?

NSURL 到带有 XCTest 的测试包中的文件路径

请在您的 Podfile 中为此目标指定一个平台?