2015-10-28 5 views
7

Sto attraversando il corso Swift/iOS di Stanford Winter 2015 e mentre svolgo i compiti mi imbatto in un comportamento Mi piacerebbe cambiare.Proprietà testo UIL quando è impostata su zero o "" fa scomparire UILabel dalla vista (Swift/Autolayout/iOS9.1)

Uso l'Autolayout come descritto nei video (rendendo il pin dello schermo ai bordi di visualizzazione iniziali e finali) e l'app Calcolatrice "Display" UILabel funziona bene con un valore iniziale di 0 e ogni volta che si utilizza il valore per impostarlo (a String) è non-nil e non "".

Se è nullo o "", l'intera UILabel scompare. Quello che sto cercando di fare è "cancellare" il display ogni volta che non c'è alcun valore da visualizzare o un calcolo errato risulta in nullo.

Qualche consiglio su chi occuparsi di questo in generale? "Cancellare" un UILabel senza modificarne le dimensioni sullo schermo?


Edit (grazie Rob) L'UILabel ha i seguenti vincoli 1. Opzione-clic drag-sinistra per contenente UIView, seleziona "leader" qualcosa (sulla andare al lavoro non può controllare ancora per parole esatte . 2. lo stesso metodo usato (1) eccetto che la resistenza è sul bordo destro e selezionando "finali" 3. opzione click-trascina fino alla parte superiore della vista, selezionare l'opzione di menu "verticale". 4. Uguale (3) tranne che il trascinamento è su un UIButton sotto l'UILabel sulla GUI.

Con queste impostazioni, l'etichetta quando contiene un numero è sempre v isible e (se capisci, colorerà per verificare) si estende sullo schermo anche se il testo non lo fa.

Il layout appare corretto nel profilo e nel paesaggio purché il contenuto di UILabel non sia vuoto. Se vuoto, sembra "restringersi per adattarsi" così tanto che i pulsanti in basso vengono spostati verso l'alto.

Sono uno sviluppatore C++ poiché metà degli anni '90, ma ho poca esperienza utente e non più di un paio di settimane esperienza in iOS/sviluppo Swift.

Grazie!

+0

modificare la tua domanda per descrivere i vincoli che avete impostato sul vostro vista etichetta per controllare la sua posizione e le dimensioni. –

+0

Hai provato a chiamare 'label.sizeToFit()'? – Pranav

+0

Hai provato a fare un'istruzione if che restituisce: "" (cancellando l'etichetta) se il timer countDown == 0? @Varsuuk – lukaivicev

risposta

1

si può sempre dare l'UILabel una larghezza min e altezza min o vincoli che tiene il lato sinistro e destro dell'etichetta. Questo dovrebbe impedire all'etichetta di cambiare le sue dimensioni a zero.

+0

Grazie, lo farò controllare questo quando al Mac, ma c'è un modo per rendere la larghezza minima controllata da iOS per essere la larghezza della vista? Avevo creduto che era quello che stavo facendo quando l'opzione trascinava il mouse sui bordi sinistro e destro dal controllo, ma io sono nuovo, forse è l'intera larghezza ma forse è l'altezza, come hai detto, che potrebbe essere diminuita - colorerò l'UILabel in modo diverso dalla vista per ottenere maggiori informazioni. – Varsuuk

+0

Penso che quello che devi fare è dare – Moriya

+0

Grazie @animal, pensavo che, ma digitando sull'iPad con i miei pollici irritabili, mi ha fatto entrare in una riga troppo presto nel commento precedente. Controlleremo e aggiorneremo – Varsuuk

1

Nel mio caso ho finito rendendolo uno spazio, in modo da "" invece di ""

0

utilizzare una classe personalizzata UILabel assegnato in Interface Builder >> Identity inspector >> Custom Class >> Class per ignorare UILabel dimensioni contenuto intrinseco.

Non è necessario creare alcun vincolo di layout automatico superfluo.

Swift:

class UILabelNonCompressible: UILabel 
{ 
    private static let NonCompressibleInvisibleContent = " " 

    override var intrinsicContentSize: CGSize 
    { 
     if /* zero-width */ text == nil ? true : text!.isEmpty 
     { 
      // prefer mirror-and-calculate over modify-calculate-restore due to KVO 
      let doppelganger = createCopy() 

      // calculate for any non-zero -height content 
      doppelganger.text = UILabelNonCompressible.NonCompressibleInvisibleContent 

      // override 
      return doppelganger.intrinsicContentSize 
     } 
     else 
     { 
      return super.intrinsicContentSize 
     } 
    } 
} 

Sarà inoltre necessario "How do copy for UILabel?":

extension UILabel 
{ 
    func createCopy() -> UILabel 
    { 
     let archivedData = NSKeyedArchiver.archivedData(withRootObject: self) 
     return NSKeyedUnarchiver.unarchiveObject(with: archivedData) as! UILabel 
    } 
}