2016-02-11 17 views
5

Sono uno sviluppatore Android che prova la mia mano a Xcode e finora è stato spiacevole. Quello che sto cercando di fare è di avere una visualizzazione personalizzata che ha tre punti di vista: subXcode swift view wrap content

  • UIImageView (per un'icona)
  • UILabel (per il titolo)
  • UILabel (per il contenuto)

Lo voglio in modo che l'altezza dell'etichetta del contenuto cresca e si restringa per avvolgere il testo che contiene (come Android wrap_content). E poi, voglio che anche la vista personalizzata cresca e si accorci per avvolgere tutte e tre le viste secondarie.

Tuttavia, non riesco, per la vita di me, a capire come funzionano questi layout/vincoli automatici.

01) Come potrei aumentare o ridurre l'altezza del mio UILabel in modo che corrisponda al testo contenuto?

02) Come posso aumentare o ridurre l'altezza della vista personalizzata in modo che corrisponda alle viste secondarie contenute?

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

capisco che, nel codice sopra ho provato, ho l'altezza impostata una costante 40. Questo è solo perché non so come ottenere ciò che voglio.

[EDIT]

Ho provato a fissare il vincolo di altezza maggiore o uguale a ma solo blocca Xcode.

[EDIT]

Si blocca Xcode se provo a vederlo, ma funziona perfettamente bene nel simulatore. Domanda ora è, perché?

mio vincolo altezza è ora:

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

Funziona nel simulatore e ha il comportamento desiderato. Tuttavia, se apro lo storyboard che contiene la vista, si blocca. È sicuramente quella linea di codice, perché il suo ritorno a .Equal risolve il crash.

[EDIT]

La mia soluzione temporanea è:

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

In questo modo, non va in crash Xcode e rende ancora il modo in cui voglio che sul simulatore.

[EDIT]

ho tolto il controllo pre-processore, perché mi sono reso conto non esiste una cosa reale come quello definito ed esso ancora ora funziona. Giuro di aver cambiato nient'altro.

I am questo vicino a rinunciare allo sviluppo iOS perché il generatore di interfacce continua ad arrestarsi Xcode senza un motivo quando tutto funziona nel simulatore. Quindi, eseguo alcune modifiche senza senso e funziona di nuovo bene.

risposta

4

01) Come potrei aumentare o ridurre l'altezza del mio UILabel in modo che corrisponda al testo contenuto?

Basta impostare il vincolo superiore, sinistro e destro per il superview delle etichette. Impostare la proprietà number of lines a 0. Quindi inizierà il wrapping del testo.

02) Come posso aumentare o ridurre l'altezza della vista personalizzata in modo che corrisponda alle viste secondarie contenute?

Utilizzando il generatore di interfaccia è molto più facile da ottenere.

Il mio suggerimento è di iniziare con i vincoli nello storyboard. Non dovrai compilare il tuo codice per vedere quali saranno i vincoli. Inoltre riceverai avvertimenti ed errori direttamente nel generatore di interfacce.

Se si desidera utilizzare vincoli programmatici, il mio suggerimento è di iniziare a utilizzare un framework per questo. Per esempio: https://github.com/SnapKit/SnapKit

+0

Grazie per il consiglio, l'uomo. Pensavo che l'unico modo fosse di impostare la larghezza preferita alla larghezza della superview programmaticamente. Non ci ho pensato. Il mio unico problema ora è che il generatore di interfacce e Xcode ripetutamente, arbitrariamente, decideranno di smettere di funzionare fino a quando non sposterò del codice attorno al quale non interessa nulla. Succede ogni pochi minuti e posso continuare a riavviare Xcode e non aiuta fino a quando non decido di spostare un po 'di codice come cambiare l'altezza da "45" a "125" o roba del tutto casuale come quella. Oppure, come visto nelle mie modifiche, aggiungendo un controllo a un valore che non esiste e quindi rimuovendo. –

+0

Prova questo: http://stackoverflow.com/questions/18933321/deleting-contents-from-xcode-derived-data-folder – ullstrm

0

Spesso pulita farà un sacco di bene, quando marmellate di codice per nessun motivo AR, cmd-shift-k se non ricordo male

+0

Questo è più un commento che una risposta. –

+0

Non so se ho ancora il diritto di commentare altri. – sakumatto