2010-02-11 19 views
9

Ho bisogno di impostare una dimensione del testo (ad esempio a 42) del rich text selezionato che utilizza più font.Come modificare solo la dimensione del carattere per l'intero testo in stile in NSTextView

Immagino di poter controllare gli attributi di ciascun gruppo di caratteri, modificare la dimensione del carattere e impostare gli attributi, ma guardando il pannello Font mobile sembra che ci dovrebbe essere un modo molto semplice e diretto per farlo. Mi manca qualcosa di ovvio?

risposta

11

Su 10.6 c'è un modo conveniente per scorrere gli attributi e aumentare la dimensione del carattere. Questo metodo può essere aggiunto a una categoria NSTextView.

- (IBAction)increaseFontSize:(id)sender 
{ 
    NSTextStorage *textStorage = [self textStorage]; 
    [textStorage beginEditing]; 
    [textStorage enumerateAttributesInRange: NSMakeRange(0, [textStorage length]) 
            options: 0 
            usingBlock: ^(NSDictionary *attributesDictionary, 
               NSRange range, 
               BOOL *stop) 
    { 
#pragma unused(stop) 
     NSFont *font = [attributesDictionary objectForKey:NSFontAttributeName]; 
     if (font) { 
      [textStorage removeAttribute:NSFontAttributeName range:range]; 
      font = [[NSFontManager sharedFontManager] convertFont:font toSize:[font pointSize] + 1]; 
      [textStorage addAttribute:NSFontAttributeName value:font range:range]; 
     } 
    }]; 
    [textStorage endEditing]; 
    [self didChangeText]; 

} 
2

Nota: Presumo che si stia utilizzando un NSTextView e che sia possibile accedere alla sua memoria di testo (NSTextStorage).

Penso che non sia possibile modificare le dimensioni del carattere solo su un testo che utilizza più tipi di carattere. In NSAttributedString, la dimensione del carattere fa parte dell'attributo NSFontAttributeName che controlla sia il carattere che la dimensione.

Una soluzione è quella di iterare la selezione e utilizzare il attribute:atIndex:longestEffectiveRange:inRange: per catturare la gamma quando applicare ogni tipo di carattere, modificare la dimensione del carattere e quindi utilizzare il addAttribute:value:range: per impostare il nuovo font su tutta la gamma.

Aggiornamento:

Se si dà un'occhiata alla GNUstep GUI source code for NSTextView (sotto LGPL), si vedrà che la loro attuazione utilizzano la gamma di iterazione.

+0

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

+0

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 ... –

+0

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

1

Poiché NSTextView è una sottoclasse di NSView, è possibile utilizzare -scaleUnitSquareToSize: per modificare il livello di ingrandimento della visualizzazione del testo. Ad esempio, per rendere tutto il testo di dimensioni doppie che si definirebbe:

[textView scaleUnitSquareToSize:NSMakeSize(2.0, 2.0)]; 

potrebbe essere necessario apportare alcune modifiche alle dimensioni del testo di vista di NSTextContainer dopo l'esecuzione di questa operazione per garantire il testo è disposto in modo corretto.

+0

Ho solo bisogno di cambiare la dimensione del carattere, non di ridimensionare una vista, ma grazie comunque, non sapevo che quel metodo esistesse. – Indoor

+1

@Rob questo è fantastico! È esattamente ciò che era necessario invece di ciò che * pensavo * sarebbe stato necessario (ad esempio, enumerare gli attributi dei font per cambiare le loro dimensioni relative, il che probabilmente infastidirebbe gli utenti e creerebbe altri problemi). – Dalmazio

8

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 
1

Questo raddoppierà la dimensione del carattere, ma è possibile modificare la proprietà della scala su qualsiasi valore o fornire la dimensione fissa

NSFont * font = ...; 
    CGFloat fontSize = [[font fontDescriptor].fontAttributes[NSFontSizeAttribute] floatValue]; 
    font = [NSFont fontWithDescriptor:[font fontDescriptor] size:fontSize * 2.]; 

    self.textField.font = font; 
+0

Questo ha funzionato per me e sembra più semplice delle altre risposte. Ecco una versione di Swift 3 'font = NSFont.init (descrittore: font.fontDescriptor, dimensione: ...)' –

Problemi correlati