2015-04-14 23 views
6

Ho uno strano problema con il metodo sizeToFit su un NSTextField.NSTextField sizeToFit o aggiornamento del frame sposta il testo a sinistra

Ho un NSView dove sto creando un CALayer e un NSTextField. Io uso il metodo sizeToFit per ridimensionare il mio CALayer in base al valore del campo. Funziona bene, ma quando sto inserendo uno spazio, , il testo si sposta sulla sinistra del all'interno della cornice del campo (vedi immagine sotto).

I riquadri dei campi di entrambi i livelli e di testo sono posizionati correttamente (l'origine non si muove).

Qualsiasi indizio su questo sarebbe molto apprezzato.

text shift

EDIT aggiornamento Frame ha lo stesso comportamento, anche quando non si utilizza sizeToFit.

A volte si cambia quando si inserisce uno spazio o, a volte, si torna alla posizione desiderata quando si inserisce uno spazio.

Il livello sottostante non si sposta dalla sua origine.

EDIT Sembra che il contenitore della NSTextField ha bisogno di spazio sufficiente per visualizzare. Quello che ho scoperto è che ha bisogno di molto spazio.

Non possiamo accedere al contenitore di un NSTextField, quindi aggiungere un valore alla larghezza della stringa (a seconda delle dimensioni della fonte) prima di chiamare un aggiornamento cornice o [self sizeThatFits:stringSize]; e [self sizeToFit];.

+0

usi l'autolayout? – Astoria

+0

Sì, sarebbe diverso senza l'autolayout? Voglio dire: questo comportamento è correlato ad esso? –

risposta

1

Penso che non ci sia bisogno nel metodo -sizeToFit. Viene chiamato automaticamente quando si esegue il layout. Se è necessario regolare le dimensioni del proprio componente NSTextField, suddividerlo in sottoclasse e sovrascrivere il metodo -intrinsicContentSize.

Ho usato questo approccio con la maschera di testo "fade out" alla fine del campo di testo. Usando l'autolayout e la dimensione del contenuto intrinseco i miei campi di testo erano sempre con quella maschera anche se nella vista genitore c'era abbastanza spazio per il layout.

- (CGSize)intrinsicContentSize 
    { 
    CGSize size=[super intrinsicContentSize]; 
    // adjust size somehow (or may be not) 
    return(size); 
    } 

Ogni volta che avete bisogno di "aggiornare" dimensioni campo di testo (durante la digitazione?), Chiamare il -invalidateIntrinsicContentSize.