【问题标题】:Force label to display it's text强制标签显示它的文本
【发布时间】:2018-10-08 16:57:45
【问题描述】:

我想包含一个类似于 reddit 应用程序的投票功能。我认为UIStackView 非常适合这个。现在我正在努力使投票和投票按钮之间的标签显示它的文本。

我尝试将 contentCompression 更改为 .fittingSizeLevel.defaultHigh 但这似乎没有任何改变。在您可以看到的图像上,将有足够的空间来容纳整个文本,但事实并非如此。我缺少什么方面?

class VotingStackView: UIStackView {

    let arrowUpButton: UIButton = {
        let button = UIButton()
        button.backgroundColor = .clear
        button.tintColor = GSSettings.UI.Colors.tintColor
        button.imageView?.contentMode = .scaleAspectFit
        button.contentEdgeInsets = UIEdgeInsets(top: 16, left: 0, bottom: 16, right: 0)
        button.clipsToBounds = true
        return button
    }()

    let arrowDownButton: UIButton = {
        let button = UIButton()
        button.backgroundColor = .clear
        button.tintColor = GSSettings.UI.Colors.tintColor
        button.imageView?.contentMode = .scaleAspectFit
        button.contentEdgeInsets = UIEdgeInsets(top: 16, left: 0, bottom: 16, right: 0)
        button.clipsToBounds = true
        return button
    }()

    let percentageLabel: UILabel = {
        let label = UILabel()
        label.text = "100%"
        label.textColor = GSSettings.UI.Colors.regularTextColor
        label.font = GSSettings.UI.Fonts.helveticaLight?.withSize(20)
        label.clipsToBounds = false
        label.setContentCompressionResistancePriority(UILayoutPriority.fittingSizeLevel, for: .horizontal)
        return label
    }()

    var views: [UIView] = [UIView]()

    //MARK: - Init & View Loading
    override init(frame: CGRect) {
        super.init(frame: frame)
        views = [arrowUpButton, percentageLabel ,arrowDownButton]
        setupStackView()
        setupImages()
        setupSubviews()
    }

    //MARK: - Setup
    func setupStackView() {
        self.axis           = .horizontal
        self.spacing        = 0
        self.alignment      = .center
        self.distribution   = .fillEqually
    }

    func setupImages() {
        let upImage = UIImage(named: "arrow_up")
        let downImage = UIImage(named: "arrow_down")

        arrowUpButton.setImage(upImage, for: .normal)
        arrowDownButton.setImage(downImage, for: .normal)
    }

    func setupSubviews() {
        for view in views {
            addArrangedSubview(view)
        }
        layoutIfNeeded()
    }

    required init(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

votingStackView 是另一个 StackView 的一部分:

class BottomStackView: UIStackView {

    let votingStackView: VotingStackView = {
        let stackview = VotingStackView()
        return stackview
    }()

    let addFriendButton: UIButton = {
        let button = UIButton()
        button.backgroundColor = .clear
        button.tintColor = GSSettings.UI.Colors.tintColor
        button.setImage(UIImage(named: "plus")?.withRenderingMode(.alwaysTemplate), for: .normal)
        return button
    }()

    let redView: UIView = {
        let view = UIView()
        view.backgroundColor = .red
        return view
    }()

    var views: [UIView] = [UIView]()

    //MARK: - Init & View Loading
    override init(frame: CGRect) {
        super.init(frame: frame)
        views = [votingStackView, addFriendButton, redView]
        setupStackView()
        setupSubviews()
    }

    //MARK: - Setup
    func setupStackView() {
        self.axis           = .horizontal
        self.spacing        = 0
        self.alignment      = .leading
        self.distribution   = .fillEqually
    }

    func setupSubviews() {
        for view in views {
            addArrangedSubview(view)
        }
        layoutIfNeeded()
    }

    required init(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

【问题讨论】:

  • 您是否使用约束来控制堆栈视图的宽度?如果是这样,请展示您是如何设置约束的。如果没有,请说明您是如何设置框架的。
  • 好的,我现在就这样做了。
  • 好的,但这仍然没有显示您的约束/框架。在您发布的图像中,堆栈视图的宽度 - 基于您的箭头图像和标签 - 与图片的宽度相差无几。那么...您是否设置了一些约束来阻止堆栈视图填充宽度?
  • 不,我已将领先锚点设置为与超级视图的领先锚点相等,它会填满整个屏幕。与尾随相同,
  • 我厌倦了使用 UIStackView 并使用简单的 UIView 构建它。感谢您的帮助!

标签: ios swift uilabel uistackview


【解决方案1】:

改变

label.setContentCompressionResistancePriority(UILayoutPriority.fittingSizeLevel, for: .horizontal)

label.setContentCompressionResistancePriority(UILayoutPriority.defaultHigh, for: .horizontal)

docs 看来fittingSizeLevel 似乎没有考虑到父约束,因此使用defaultHigh 似乎是更安全的选择。

【讨论】:

  • 正如我在问题中所写,我已经尝试过了,结果是一样的。
  • 我测试了您的代码,我可以重现您的错误,在将其更改为defaultHigh 后,问题已得到纠正。我能想到的唯一其他变量是,您如何将堆栈视图添加到父视图?
  • 在我的问题中添加了更多细节。
  • 我用您的更新进行了测试,但仍然无法重现问题。您能否包含最少数量的代码以使您的问题完全可重现? (即显示将其添加到视图控制器视图的代码)。您可以查看这篇文章了解我的意思的详细信息:stackoverflow.com/help/mcve
  • 对不起,我已经删除了我的旧代码。但我向你保证,我只是在超级视图中添加了前导和尾随约束。
猜你喜欢
  • 2023-01-29
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多