2013-04-16 10 views
6

Sto cercando di creare un'app in cui un utente può modificare le dimensioni e l'orientamento di UITextField. Stavo controllando l'app Aviary e quello che vedo è che gli utenti non solo possono aumentare o diminuire la dimensione del testo, ma possono anche cambiare il proprio orientamento.è questo CoreText? - Pizzico di testo Aviary zoom expand

enter image description here

Così le domande che vorrei chiedere sono

1) Stanno usando CoreText per fare questo stanno usando semplicemente un vecchio UILabel o UIText?

2) Non so come ridimensionare dinamicamente? Stanno usando UIView?

3) Ho esercitato su Google tutorial, esempi, documenti Apple controllati e progetti di esempio, ho esaminato i controlli del cacao e github e non vedo ancora esempi di codice o tutorial che mostrino come è fatto.

Qualcuno sarebbe così gentile da indicarmi in qualche direzione o un tutorial?

risposta

7

Per quanto riguarda l'aspetto del carattere, ci sono un paio di opzioni:

  1. È possibile utilizzare lo standard UILabel per ottenere la maggior parte degli effetti (font, dimensione, colore, rotazione) che vedete qui . L'unica caratteristica oltre lo standard UILabel è il tratto bianco attorno al carattere. Ma, efficace iOS 6, puoi anche ottenere l'effetto del tratto bianco attorno al testo rosso con uno standard UILabel usando la sua proprietà attributedText, che è un NSAttributedString.

  2. Nelle versioni iOS precedenti alla 6.0, per ottenere il tratto di colore bianco attorno al testo, è stato necessario utilizzare CoreGraphics o CoreText.

Per quanto riguarda il ridimensionamento dinamico, la rotazione e lo spostamento del testo, sono senza dubbio solo utilizzando sistemi di riconoscimento gesto che regolano la proprietà transform della vista (più precisamente, probabilmente regolando transform per la rotazione, la regolazione della center o frame per il trascinamento, e la regolazione sia la dimensione del carattere frame e per il ridimensionamento (se si utilizza scale trasformazione, si può finire con pixelation indesiderabili).

si otterrà un bel paio di buoni colpi se si cerca Stack Overflow per domande riguardanti i riconoscimenti di gesti e trascinamento, ridimensionamento e rotazione ng di punti di vista.


In iOS 6, se si desidera che il testo rosso con un bordo bianco con una UILabel, si potrebbe fare qualcosa di simile:

// create attributes dictionary 

NSDictionary *attributes = @{ 
          NSFontAttributeName   : [UIFont systemFontOfSize:48.0], 
          NSForegroundColorAttributeName : [UIColor redColor], 
          NSStrokeColorAttributeName  : [UIColor whiteColor], 
          NSStrokeWidthAttributeName  : @(-3) 
          }; 

// make the attributed string 

NSAttributedString *stringToDraw = [[NSAttributedString alloc] initWithString:@"bigcat" 
                    attributes:attributes]; 

self.label.attributedText = stringToDraw; 

Per informazioni sulle stringhe attribuite in iOS, vedi:


Se è necessario supportare le versioni iOS prima di iOS 6, è necessario utilizzare CoreText o CoreGraphics. Una resa CoreText potrebbe essere simile:

- (void)drawRect:(CGRect)rect 
{ 
    [super drawRect:rect]; 

    if (!self.text) 
     return; 

    // create a font 

    CTFontRef sysUIFont = CTFontCreateUIFontForLanguage(kCTFontSystemFontType, self.fontSize, NULL); 

    // create attributes dictionary 

    NSDictionary *attributes = @{ 
           (__bridge id)kCTFontAttributeName   : (__bridge id)sysUIFont, 
           (__bridge id)kCTForegroundColorAttributeName : (__bridge id)[self.fillColor CGColor], 
           (__bridge id)kCTStrokeColorAttributeName  : (__bridge id)[self.borderColor CGColor], 
           (__bridge id)kCTStrokeWidthAttributeName  : @(-3) 
           }; 

    // make the attributed string 

    NSAttributedString *stringToDraw = [[NSAttributedString alloc] initWithString:self.text 
                     attributes:attributes]; 

    // begin drawing 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // flip the coordinate system 

    CGContextSetTextMatrix(context, CGAffineTransformIdentity); 
    CGContextTranslateCTM(context, 0, self.bounds.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    // create CTLineRef 

    CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)stringToDraw); 

    // figure out the size (which we'll use to center it) 

    CGFloat ascent; 
    CGFloat descent; 
    CGFloat width = CTLineGetTypographicBounds(line, &ascent, &descent, NULL); 
    CGFloat height = ascent + descent; 
    CGSize stringSize = CGSizeMake(width, height); 

    // draw it 

    CGContextSetTextPosition(context, 
          (self.bounds.size.width - stringSize.width)/2.0, 
          (self.bounds.size.height - stringSize.height + descent)/2.0); 
    CTLineDraw(line, context); 

    // clean up 

    CFRelease(line); 
    CFRelease(sysUIFont); 
} 

Un'implementazione più completa di quanto sopra può essere trovato nel mio GitHub CoreText Demonstration.


Ecco una semplice implementazione Graphics Core di drawRect che scrive il testo con un contorno intorno al testo:

@implementation CustomView 

- (void)drawRect:(CGRect)rect 
{ 
    [super drawRect:rect]; 

    if (!self.text) 
     return; 

    // begin drawing 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // flip the coordinate system 

    CGContextSetTextMatrix(context, CGAffineTransformMakeRotation(M_PI_4/2.0)); 
    CGContextTranslateCTM(context, 0, self.bounds.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    // write the text 

    CGContextSelectFont (context, "Helvetica", self.fontSize, kCGEncodingMacRoman); 
    CGContextSetTextDrawingMode (context, kCGTextFillStroke); 
    CGContextSetStrokeColorWithColor(context, [[UIColor whiteColor] CGColor]); 
    CGContextSetLineWidth(context, 1.5); 
    CGContextSetFillColorWithColor(context, [[UIColor redColor] CGColor]); 
    CGContextShowTextAtPoint (context, 40, 100, [self.text UTF8String], [self.text length]); 
} 

@end 
+0

Ciao Rob, Vorrei emulare esattamente ciò che stanno facendo cioè linea fuori bianco confine, ruotare il testo, ecc. Capisco il testo di base, forse un po 'impegnativo con cui lavorare, ma se ho il giusto tutorial o esempio per guidarmi so che questo effetto può essere raggiunto. Sfortunatamente non mi sono imbattuto in un singolo progetto di esempio che possa mostrarmi come farlo. (cercato su Google per 2 giorni prima di postare una domanda qui) –

+0

@ SamBudda Alcuni buoni tutorial includono http://www.cocoanetics.com/2011/01/befriending-core-text/ e http://weblog.invasivecode.com/core -text – Rob

+0

Ho fatto google e ho esaminato questi due tutorial. Immagino che quello di cui ho bisogno è un tutorial/progetto di esempio sul testo di base che mostra come disegnare una scatola attorno al testo principale (come mostrato nella foto) e quando lo trascino o lo aumento o diminuisco, come aumenta o diminuisce anche il testo con nella scatola. Io so come creare il testo principale, è solo una seconda parte del puzzle che sto combattendo con –

Problemi correlati