2012-04-05 14 views
5

Ho un'applicazione Mac OS X Cocoa, basata su documenti.Mac OS X: come forzare un editor di campi a scorrere invece del testo a capo?

Una funzione che ho nella mia app è un elenco di elementi di testo che è possibile fare doppio clic per modificare. Quando l'utente fa doppio clic su uno degli elementi di testo, posiziono il campo di testo fieldEditor della finestra corrente sulla voce di testo su cui è stato fatto clic per consentire la modifica.

Tutto funziona bene, tranne per un problema. Non riesco a capire come rendere + anziché inviando il testo clip anziché. Ecco quello che attualmente appare come:

enter image description here

Vedere come il testo è avvolgente ad una seconda linea? Non lo voglio Mi piacerebbe che rimanesse una riga che scorre (e appare ritagliata).

Ecco un esempio di farlo funzionare correttamente su un elemento della lista che ha meno del testo:

enter image description here

Ecco quello che sto cercando, a mio avviso regolatore:

NSWindow *win = [listItemView window]; 
NSText *fieldEditor = [win fieldEditor:YES forObject:listItemView]; 
[fieldEditor setFont:[TDListItemView titleFont]]; 
[fieldEditor setAlignment:NSLeftTextAlignment]; 
[fieldEditor setDrawsBackground:YES]; 
[fieldEditor setBackgroundColor:[NSColor whiteColor]]; 
[fieldEditor setString:str]; 
[fieldEditor setDelegate:self]; 
[fieldEditor selectAll:nil]; 

if ([fieldEditor isKindOfClass:[NSTextView class]]) { 
    NSTextView *tv = (NSTextView *)fieldEditor; 
    NSMutableParagraphStyle *style = [[[tv defaultParagraphStyle] mutableCopy] autorelease]; 
    [style setLineBreakMode:NSLineBreakByClipping]; 
    [tv setDefaultParagraphStyle:style]; 
} 

CGRect r = [self fieldEditorRectForBounds:[listItemView bounds] index:idx]; // height here is 10.0 
[fieldEditor setFrame:r]; 
[fieldEditor setNeedsDisplay:YES]; 
[[self view] addSubview:fieldEditor]; 
[win makeFirstResponder:fieldEditor]; 

Si noti che parte nel mezzo: controllo se questo fieldEditor è un'istanza di NSTextView per chiamare il metodo setDefaultParagraphStyle: su di esso. Questo è il mio tentativo di ottenere il fieldEditor di ritagliare il suo testo - tramite il valore NSLineBreakByClipping. Non sta avendo alcun effetto. E non sono nemmeno sicuro che questo è ciò che dovrei fare per far sì che lo fieldEditor scorra su una riga.

Si noti inoltre che l'altezza del rettangolo che computo nel mio metodo -fieldEditorRectForBounds:index: è corretta e fornisce un valore corretto per una singola riga di testo (14,0 pixel in questo caso).

Cosa mi manca per fare in modo che lo fieldEditor visualizzi una singola riga di testo scorrevole/ritagliato?


Ho anche provato ad aggiungere queste linee alla sezione centrale:

[[tv textContainer] setHeightTracksTextView:YES]; 
    [[tv textContainer] setWidthTracksTextView:YES]; 

Questo ha l'effetto desiderato di ridimensionare la porzione visibile della fieldEditor che è buono. Ma la cattiva notizia è che non cambia il fatto che il testo è ancora avvolto, piuttosto che ritagliato + fatto scorrere. :(


Questo sembra essere legata a questa costante:

NSStringDrawingUsesLineFragmentOrigin 

che può essere utilizzato nel options: argomento:

-[NSAttributedString drawWithRect:options:attributes:] 

ma nel mio caso, sto lavorando da un editor di campi NSText, non uno NSAttributedString. Non riesco a capire come fare questo genere di cose con un editor di campo NSText.

risposta

3

Hmmm ... NSTextView si basa su un NSScrollView interamente per il suo comportamento di scorrimento. Non sono sicuro se c'è più a questo che io non sto vedendo, ma sembra che la soluzione "storica" ​​per il vostro problema è o di:

utilizzare un controllo diverso

È possibile utilizzare un NSTextField modificabile nella sua configurazione IB standard con modifica abilitata e scorrimento selezionato come comportamento. Fa tutto il lavoro pesante già per te se configurato correttamente - non c'è bisogno di fare confusione con l'editor di campi direttamente.

... o ...

frode

Slap l'editor campo in un NSScrollView opportunamente dimensionato e configurato (consentire solo scorrimento orizzontale, non mostrano i scrollers) dinamicamente, quindi rimuovere la vista di scorrimento al termine della modifica.

+0

Ho la sensazione che tu abbia ragione. Speravo che ci fosse un metodo o due semplici che potrei chiamare per ottenere il comportamento che volevo. Ma sono sempre più convinto che la tua risposta sia corretta. –

+1

Se solo più persone a casa capissero che ho ragione (anche quando ho torto), le cose andrebbero molto più agevolmente ... ;-) –

+1

Queste persone "a casa" * sanno * quanto sei alto StackOverflow la reputazione è? Forse dovrebbero essere ricordati;). Grazie per il tuo consiglio. La tua opzione numero uno si è rivelata un cambiamento relativamente semplice e mi dà il comportamento che voglio. Grazie ancora. –

0
NSMutableParagraphStyle* style = [[NSMutableParagraphStyle alloc] init]; 
[style setLineBreakMode:NSLineBreakByTruncatingHead]; 

NSMutableDictionary* attributes = [[NSMutableDictionary alloc] init]; 
[attributes setObject:style forKey:NSParagraphStyleAttributeName]; 

NSTextView* textView = [[NSTextView alloc] init]; 
[textView setTypingAttributes:attributes]; 
Problemi correlati