2016-02-11 14 views
5

Ich bin ein Android-Entwickler versucht meine Hand bei Xcode und es war bisher unangenehm. Was ich versuche, eine benutzerdefinierte Ansicht zu tun ist, haben die drei Unteransichten hat:Xcode schnelle Ansicht Wrap Inhalt

  • UIImageView (für ein Symbol)
  • UILabel (für den Titel)
  • UILabel (für den Inhalt)

ich will es so, dass die Höhe des Content-Label wächst und schrumpft den Text wickeln sie es (wie Android wrap_content) enthält. Und dann möchte ich, dass die benutzerdefinierte Ansicht auch vergrößert und verkleinert wird, um alle drei Unteransichten zu umbrechen.

Allerdings kann ich für mein Leben nicht herausfinden, wie diese automatischen Layouts/Einschränkungen funktionieren.

01) Wie würde ich die Höhe meiner UILabel vergrößern/verkleinern, um sie dem enthaltenen Text anzupassen?

02) Wie würde ich die Höhe meiner benutzerdefinierten Ansicht so anpassen, dass sie den enthaltenen Unteransichten entspricht?

override func layoutSubviews() { 
    super.layoutSubviews() 
    img_icon = UIImageView() 
    txt_title = UILabel() 
    txt_content = UILabel() 

    img_icon.backgroundColor = Palette.white 
    img_icon.image = icon 
    txt_title.text = title 
    txt_title.textAlignment = .Center 
    txt_title.font = UIFont(name: "Roboto-Bold", size:14) 
    txt_title.textColor = Palette.txt_heading1 
    txt_content.text = content 
    txt_content.textAlignment = .Center 
    txt_content.font = UIFont(name: "Roboto-Regular", size:12) 
    txt_content.textColor = Palette.txt_dark 
    txt_content.numberOfLines = 0 
    txt_content.preferredMaxLayoutWidth = self.frame.width 
    txt_content.lineBreakMode = NSLineBreakMode.ByWordWrapping 
    self.backgroundColor = Palette.white 
    addSubview(img_icon) 
    addSubview(txt_title) 
    addSubview(txt_content) 

    /*snip img_icon and txt_title constraints*/ 

    let txt_content_x = NSLayoutConstraint(item: txt_content, attribute: .CenterX, relatedBy: .Equal, toItem: self, attribute: .CenterX, multiplier: 1, constant: 0) 
    let txt_content_y = NSLayoutConstraint(item: txt_content, attribute: .Top, relatedBy: .Equal, toItem: self, attribute: .Top, multiplier: 1, constant: 80) 
    let txt_content_w = NSLayoutConstraint(item: txt_content, attribute: .Width, relatedBy: .Equal, toItem: self, attribute: .Width, multiplier: 1, constant: 0) 
    let txt_content_h = NSLayoutConstraint(item: txt_content, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 40) 
    txt_content.translatesAutoresizingMaskIntoConstraints = false 
    NSLayoutConstraint.activateConstraints([ 
     txt_content_x, 
     txt_content_y, 
     txt_content_w, 
     txt_content_h 
    ]) 
} 

Ich verstehe, dass in dem obigen Code, den ich versucht habe, ich habe die auf eine konstante 40 eingestellt Höhe. Das liegt nur daran, dass ich nicht weiß, wie ich erreichen kann, was ich will.

[EDIT]

Ich habe versucht, zu einem größeren Höhenbeschränkung Einstellung als oder gleich, aber es Xcode gerade abstürzt.

[EDIT]

Es stürzt Xcode, wenn ich versuche, es zu betrachten, sondern arbeitet völlig in Ordnung im Simulator. Frage ist jetzt, warum?

Meine Höhe Einschränkung ist jetzt:

let txt_content_h = NSLayoutConstraint(item: txt_content, attribute: .Height, relatedBy: .GreaterThanOrEqual, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 40) 

Es funktioniert im Simulator und hat das gewünschte Verhalten. Wenn ich jedoch das Storyboard öffne, das die Ansicht enthält, stürzt es ab. Es ist definitiv diese Codezeile, weil das Zurücksetzen auf .Equal den Absturz behebt.

[EDIT]

Meine temporäre Lösung ist:

#if TARGET_INTERFACE_BUILDER 
    //use .Equal for height constraint 
#else 
    //use .GreaterThanOrEqual for height constraint 
#endif 

Auf diese Weise ist es nicht Xcode abstürzen und macht immer noch so, wie ich es auf dem Simulator wollen.

[EDIT]

entfernte ich den Scheck Pre-Prozessor, weil ich keine wirkliche Sache gibt es realisiert so definiert und es noch jetzt Werke. Ich schwöre, ich habe nichts anderes geändert.

Ich bin diese kurz vor dem Aufgeben auf iOS-Entwicklung, weil der Schnittstellenerzeuger Xcode ohne Grund abstürzt, wenn alles im Simulator funktioniert. Dann mache ich einige Unsinn-Bearbeitungen und es funktioniert wieder gut.

Antwort

4

01) Wie würde ich die Höhe meines UILabels vergrößern/verkleinern, um dem enthaltenen Text zu entsprechen?

Setzen Sie einfach oben, links und rechts-Constraint auf die Etiketten Superview. Setzen Sie die Eigenschaft number of lines auf 0. Dann beginnt es mit dem Zeilenumbruch.

02) Wie würde ich die Höhe meiner benutzerdefinierten Ansicht so anpassen, dass sie den enthaltenen Unteransichten entspricht?

Durch die Verwendung von Interface Builder ist dies viel einfacher zu erreichen.

Mein Vorschlag an Sie ist es, mit Ihren Einschränkungen im Storyboard zu beginnen. Sie müssen Ihren Code nicht kompilieren, um zu sehen, was die Einschränkungen bewirken. Außerdem erhalten Sie Warnungen und Fehler direkt im Interface Builder.

Wenn Sie programmatische Einschränkungen verwenden möchten, ist mein Vorschlag, ein Framework dafür zu verwenden. Zum Beispiel: https://github.com/SnapKit/SnapKit

+0

Danke für den Rat, Mann erinnern. Ich dachte, der einzige Weg wäre, die bevorzugte Breite programmatisch auf die Superview-Breite zu setzen. Daran habe ich nicht gedacht. Mein einziges Problem ist jetzt, dass der Interface Builder und Xcode immer wieder willkürlich beschließen, mit der Arbeit aufzuhören, bis ich etwas Code umgebe, der nichts beeinflusst. Es passiert alle paar Minuten und ich kann Xcode immer wieder neu starten und es hilft erst, wenn ich beschließe, Code umzuschalten, wie zum Beispiel die Höhe von "45" auf "125" oder irgendwas anderes zu ändern. Oder, wie in meinen Änderungen zu sehen ist, Hinzufügen eines Schecks zu einem Wert, der nicht existiert und dann entfernen. –

+0

Versuchen Sie Folgendes: http://stackoverflow.com/questions/18933321/deleting-contents-from-xcode-derived-data-folder – ullstrm

0

Oft sauber wird viel Gutes tun, wenn Code Konfitüren ohne Grund ar alle, cmd-shift-k, wenn ich richtig

+0

Dies ist eher wie ein Kommentar als eine Antwort. –

+0

Ich weiß nicht, ich habe Rechte, andere noch zu kommentieren. – sakumatto

Verwandte Themen