UIStackView和截断的多行UILabels

14
我想在一个UIStackView中添加多行标签,但我的标签总是被截断。如这个屏幕截图所示: truncated as it is 但我希望它更像这样(我伪造的屏幕截图): truncated as it should be 这是我的代码。首先我创建了父/主StackView,将其放入一个ScrollView中(该ScrollView隐藏在屏幕中)
    stackView = UIStackView()
    stackView.axis = .Vertical
    stackView.distribution = .Fill
    stackView.spacing = 2
    stackView.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(stackView)
    NSLayoutConstraint.activateConstraints(stackConstraints)


    let s1 = createHeaderStackView()
    stackView.insertArrangedSubview(s1, atIndex: 0)

    let lbl2 = makeLabel()
    lbl2.text = "Second One"
    stackView.insertArrangedSubview(lbl2, atIndex: 1)

    scrollView.setNeedsLayout()

虽然makeLabelmakeButton只是辅助函数

func makeButton() -> UIButton {
    let btn = UIButton(type: .Custom)
    btn.backgroundColor = UIColor.lightGrayColor()
    return btn
}

func makeLabel() -> UILabel {
    let lbl = UILabel()
    lbl.font = UIFont.systemFontOfSize(18)
    lbl.setContentCompressionResistancePriority(1000, forAxis: .Vertical)
    lbl.setContentHuggingPriority(10, forAxis: .Vertical)
    lbl.preferredMaxLayoutWidth = scrollView.frame.width
    lbl.numberOfLines = 0
    lbl.textColor = UIColor.blackColor()
    lbl.backgroundColor = UIColor.redColor()
    return lbl
}

createHeaderStackView方法是用来配置我的StackView,将所有标题内容放入一个StackView中。

func createHeaderStackView() -> UIStackView {
    let lblHeader = makeLabel()
    lblHeader.text = "UIStackView"
    lblHeader.textAlignment = .Center

    let lblInfo = makeLabel()
    lblInfo.text = "This is a long text, over several Lines. Because why not and am able to to so, unfortunaltey Stackview thinks I'm not allowed."
    lblInfo.textAlignment = .Natural
    lblInfo.layoutIfNeeded()

    let lblInfo2 = makeLabel()
    lblInfo2.text = "This is a seconds long text, over several Lines. Because why not and am able to to so, unfortunaltey Stackview thinks I'm not allowed."
    lblInfo2.textAlignment = .Natural
    lblInfo2.layoutIfNeeded()

    let btnPortal = makeButton()
    btnPortal.setTitle("My Button", forState: .Normal)
    btnPortal.addTarget(self, action: "gotoPushWebPortalAction", forControlEvents: .TouchUpInside)

    let headerStackView = UIStackView(arrangedSubviews: [lblHeader, btnPortal, lblInfo, lblInfo2])
    headerStackView.axis = .Vertical
    headerStackView.alignment = .Center
    headerStackView.distribution = .Fill
    headerStackView.spacing = 2
    headerStackView.setContentCompressionResistancePriority(1000, forAxis: .Vertical)
    headerStackView.setContentHuggingPriority(10, forAxis: .Vertical)
    headerStackView.setNeedsUpdateConstraints()
    headerStackView.setNeedsLayout()
    //headerStackView.layoutMarginsRelativeArrangement = true
    return headerStackView
}

简而言之,我需要如何调整我的堆栈视图,使每个堆栈视图和标签都以完整的尺寸显示?我尝试压缩和挤压所有内容,但似乎没有起作用。而搜索 uistackview uilabel multiline truncated 似乎也是一条死路。

非常感谢任何帮助, 问候 Flori


3
如https://dev59.com/C1sW5IYBdhLWcg3w-rMA#34430212所示,关键是为您的堆栈视图设置一个固定宽度,以便使您的多行标签有地方换行。 - GlennRay
1
@SpaceDog 我认为它们并不是规划不良,而是与其他控件有不同的逻辑,需要在更复杂的布局中采用不同的思考方式,特别是因为它们的填充规则。 - Zoltán Matók
3个回答

2

您需要指定堆栈视图的尺寸。如果堆栈视图的尺寸不明确,标签将不会“溢出”到下一行。

这段代码并不完全是您想要的输出,但您可以了解其中的思路:

override func viewDidLoad() {
    super.viewDidLoad()
    let stackView = UIStackView()
    stackView.axis = .Vertical
    stackView.distribution = .Fill
    stackView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(stackView)
    let views = ["stackView" : stackView]
    let h = NSLayoutConstraint.constraintsWithVisualFormat("H:|-50-[stackView]-50-|", options: [], metrics: nil, views: views)
    let w = NSLayoutConstraint.constraintsWithVisualFormat("V:|-100-[stackView]-50-|", options: [], metrics: nil, views: views)
    view.addConstraints(h)
    view.addConstraints(w)
    let lbl = UILabel()
    lbl.preferredMaxLayoutWidth = stackView.frame.width
    lbl.numberOfLines = 0
    lbl.text = "asddf  jk;v ijdor vlb otid jkd;io dfbi djior dijt ioure f i;or dfuu;nfg ior mf;drt asddf  jk;v ijdor vlb otid jkd;io dfbi djior dijt ioure f infg ior mf;drt asddf  jk;v ijdor vlb otid jkd;io dfbi djior dijt ioure f i;or dfuu;nfg ior mf;drt "
    dispatch_async(dispatch_get_main_queue(), {
        stackView.insertArrangedSubview(lbl, atIndex: 0)
    })
}

2
据我所知,如果您正在UITableViewCell中使用它,则每次旋转都必须重新加载tableView。 您可以使用stackView.distribution = .fillProportionally,它可以很好地工作。

1
你应该在故事板上尝试这个方法。将堆栈视图的高度设置为视图的60%或70%。将乘数设置为0.6或0.7。

See here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接