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:
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:
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
.
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. –
Se solo più persone a casa capissero che ho ragione (anche quando ho torto), le cose andrebbero molto più agevolmente ... ;-) –
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. –