2015-11-02 12 views
10

UIStackViewに複数の複数行のラベルを追加したいとします。UIStackViewと切り捨てられた複数行のUILabels

しかし、私はいつも私のラベルが切り捨てられてしまいます。このスクリーンショット truncated as it is

で見られる。しかし、私はそれがより truncated as it should be

(私の偽造スクリーンショット)ここに示すように持つことが好きなようにここに私のコードです。最初に私はmakeLabelmakeButtoncreateHeaderStackView方法で構成することであるだけで、ヘルパー関数

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 
} 

ている間(画面に隠れている)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() 

をそれを置く、親/マスターStackViewを作成します私の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 
} 

ので、長い話を短くするために:私のstackviewsを調整するために必要なものなので、各stackviewため、ラベルが完全な栄光のサイズに示されていますか?私はすべてを圧縮して抱き締めようとしましたが、うまくいかないようでした。そしてuistackview uilabel multiline truncatedをグーグルでは、私は任意の助けに感謝あまりに

、行き止まりのようです、 はあなたがスタックビューの大きさを指定する必要がフローリ

+1

http://stackoverflow.com/questions/34386528/multiline-label-in-uistackview/34430212#34430212に示​​されているように、キーはスタックビューの固定幅を設定して、マルチラインラベルに何かを与えることです走り回って複数のラインになる。 – GlennRay

+1

@SpaceDog imho彼らはあまり計画されていませんが、より複雑なレイアウトのための異なる考え方を必要とする他のコントロールとは異なるロジックを持っています。特にフィルルール –

答えて

0

について。スタックビューの寸法があいまいである場合、ラベルは次の行に「オーバーフロー」しません。

このコードは正確にあなたがしたいと思う出力ではありませんが、あなたのアイデアを得るでしょう:あなたはストーリーボードでこれを試してみてください

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) 
    }) 
} 
0

を。 スタックビューの高さをビューの60%または70%に設定します。

乗数を0.6または0.7にします。

See here

1

私はあなたが、その後のUITableViewCell内の各回転を、これを使用している場合、のtableViewをリロードする必要があります知っているあたりとおり。 stackView.distribution = .fillを使用すると、それは正常に動作します。

関連する問題