Generalizzando sulla risposta di Jonathan un po ', ecco un interfaccia di categoria che si può semplicemente incollare nel file appropriati nel progetto Xcode:
@interface NSTextView (FrameworkAdditions)
- (IBAction)decrementFontSize:(id)sender;
- (IBAction)incrementFontSize:(id)sender;
@end
e la corrispondente realizzazione:
@implementation NSTextView (FrameworkAdditions)
- (void)changeFontSize:(CGFloat)delta;
{
NSFontManager * fontManager = [NSFontManager sharedFontManager];
NSTextStorage * textStorage = [self textStorage];
[textStorage beginEditing];
[textStorage enumerateAttribute:NSFontAttributeName
inRange:NSMakeRange(0, [textStorage length])
options:0
usingBlock:^(id value,
NSRange range,
BOOL * stop)
{
NSFont * font = value;
font = [fontManager convertFont:font
toSize:[font pointSize] + delta];
if (font != nil) {
[textStorage removeAttribute:NSFontAttributeName
range:range];
[textStorage addAttribute:NSFontAttributeName
value:font
range:range];
}
}];
[textStorage endEditing];
[self didChangeText];
}
- (IBAction)decrementFontSize:(id)sender;
{
[self changeFontSize:-1.0];
}
- (IBAction)incrementFontSize:(id)sender;
{
[self changeFontSize:1.0];
}
@end
fonte
2011-08-23 21:52:06
Sì, quella è stata la prima cosa che mi è venuta in mente. Ma c'è già un meccanismo per rendere il testo più grande o più piccolo. Se qualche elemento del menu o dispositivo di scorrimento ha un tag di 3 (o 4) e invia modifyFont: messaggio a NSFontManager, quindi NSFontManager comunica con NSTextView e cambia le dimensioni del testo in un valore più basso o più grande (e conserva font, stile, ecc.). È fatto automaticamente. E quindi penso che mi piacerebbe collegare questo meccanismo, ma non vedo dove posso farlo. Se è possibile a tutti. – Indoor
Esiste un meccanismo incorporato che funziona solo tra l'istanza NSText e NSFontManager (vedere http://developer.apple.com/Mac/library/documentation/Cocoa/Conceptual/FontHandling/Tasks/RespondingToFontChanges.html # // apple_ref/doc/uid/20.000.441). Fondamentalmente, quando FontPanel cambia il font (dimensione o tratto), invia un changeFont: message alla catena responder. Se viene trovato un risponditore, restituisce un messaggio convertFont: al FontManager per ciascun intervallo di testo. Ho paura di dover replicare ciò che viene fatto all'interno se non si utilizza FontPanel ... –
Sì, sembra così. Ho finito per usare attributo: atIndex: longestEffectiveRange: inRange: e convertFont: toSize: Ma è strano per me non esiste un metodo semplice per impostare la dimensione del font (considerando che ci sono modi per aumentare o diminuire la dimensione del font, che posso usare , ma proprio non ne ho bisogno). Grazie, Laurent. – Indoor