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.
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. –
Prova questo: http://stackoverflow.com/questions/18933321/deleting-contents-from-xcode-derived-data-folder – ullstrm