Swift 5 : 根据 titleLabel 长度调整按钮大小

Swift 5 : Resizing a button according to titleLabel length with padding

我有一个水平 UIStackView,其中包含一个 UILabel 和一个 UIButton

我的 UILabel 正确地适合并包裹在 UIStackView 的中间,但问题是我的 UIButton 的中间内容被截断或没有填充。

我做的是:

        let container = UIStackView()
        self.addSubview(container)
        container.addArrangedSubview(debateName)
        container.addArrangedSubview(debateButton)
        container.axis = .horizontal
        container.distribution = .equalSpacing
        container.alignment = .center
        container.spacing = 15
        container.isLayoutMarginsRelativeArrangement = true
        container.layoutMargins = UIEdgeInsets(top: 0, left: 15, bottom: 0, right: 15)
        container.isUserInteractionEnabled = true
        
        container.addBorder(hexString: SettingsProvider.sharedInstance.borderBoxColor, width: 0.2)
        container.snp.makeConstraints { (make) -> Void in
            make.top.equalTo(self)
            make.left.equalTo(self)
            make.right.equalTo(self)
            make.height.greaterThanOrEqualTo(100)
        }
        
        myLabel.numberOfLines = 0

        myButton.setTitle(NSLocalizedString(self.textKey, comment: ""), for: .normal)
        myButton.uppercased()
        myButton.layer.cornerRadius = 6
        myButton.contentEdgeInsets = UIEdgeInsets(top: 8, left: 10, bottom: 8, right: 10)
        myButton.sizeToFit()
        myButton.addBorder(hexString: SettingsProvider.sharedInstance.borderBoxColor, width: 0.2)
        myButton.addShadow(offset: CGSize.init(width: 0, height: 1), color: UIColor.init(hexString: SettingsProvider.sharedInstance.borderBoxColor), radius: 4, opacity: 0.35)

我唯一能做的就是删除 contentEdgeInsets() 这样我的内容就不会被截断但是我丢失了我的填充 :

有什么方法可以结合这两个要求吗?

两件事...

  • 在您的堆栈视图中,设置 .distribution = .fill 而不是 .equalSpacing。你只有两个排列好的子视图(只有一个space)
  • 你不需要myButton.sizeToFit()

将此行添加到您的按钮设置中:

myButton.setContentCompressionResistancePriority(.required, for: .horizontal)

这应该可以防止您的按钮压缩/截断其标签。