2015-11-02 12 views
10

Ich möchte mehrere Multiline-Etiketten zu einem UIStackView hinzufügen.UIStackView und abgeschnittene Multilinie UILabels

Aber ich habe immer meine Labels abgeschnitten. Wie in diesem Screenshot gesehen truncated as it is

Aber Ich mag es mehr als hier gezeigt (meine gefälschte Screenshot) truncated as it should be

Hier ist mein Code. Zuerst erstelle ich den Eltern/Master StackView, steckt es in eine Scrollview (das den Bildschirm versteckt)

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() 

während makeLabel und makeButton sind nur Hilfsfunktionen

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 
} 

Die createHeaderStackView Methode konfigurieren mein StackView, um einen StackView mit all meinen Header-Sachen zu erstellen.

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 
} 

so eine lange Geschichte kurz zu machen: Was sind meine stackviews anzupassen benötigt wird, so dass jeder stackview und wird daher Etikett in voller herrlicher Größe gezeigt? Ich versuchte alles zu komprimieren und zu umarmen, aber es schien nicht zu funktionieren. Und uistackview uilabel multiline truncated Googeln scheint eine Sackgasse zu sein, auch

Ich schätze jede mögliche Hilfe, Grüße Flori

+1

Wie in http://stackoverflow.com/questions/34386528/multiline-label-in-uistackview/34430212#34430212 gezeigt, ist der Schlüssel, eine feste Breite für Ihre Stapelansicht festzulegen, um Ihrem mehrzeiligen Etikett etwas zu geben hineinrennen und mehrzeilig werden. – GlennRay

+1

@SpaceDog imho sie sind nicht schlecht geplant, aber sie haben andere Logik als andere Steuerelemente, die eine andere Art des Denkens für komplexere Layouts erfordert, vor allem wegen ihrer Füllregeln –

Antwort

0

Sie haben die Abmessungen der Stapelansicht angeben. Das Label wird nicht in die nächste Zeile "überlaufen", wenn die Dimensionen der Stack-Ansicht mehrdeutig sind.

Dieser Code ist nicht gerade die Ausgabe, die Sie wollen würde, aber Sie bekommen die Idee:

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

Sie sollten dies auf Storyboard versuchen. machen Sie die stackview Höhe zu 60% oder 70% Ihrer Ansicht.

Stellen Sie den Multiplikator auf 0,6 oder 0,7 ein.

See here

1

Per ich weiß Wenn Sie dies innerhalb UITableViewCell dann jede Drehung verwenden Sie Tableview neu laden. Sie können stackView.distribution = .fillProportional verwenden, es funktioniert gut.