2013-10-09 3 views
28

Sto lavorando a una nuova versione della mia app e sto tentando di sostituire i messaggi deprecati, ma non riesco a superare questo.drawInRect: withAttributes vs drawInRect: withFont: lineBreakMode: allineamento

Non riesco a capire perché drawInRect:withAttributes non funziona. Il codice viene visualizzato correttamente quando viene inviato il messaggio drawInRect:withFont:lineBreakMode:alignment, ma non funziona quando viene inviato drawInRect:withAttributes.

Sto usando lo stesso rect e font e io quello che credo sia lo stesso stile di testo. Le costanti stanno posizionando il rect appena sotto un'immagine, ma sto usando lo stesso rect per entrambe le chiamate, quindi sono certo che il rettangolo sia corretto.

(si noti che bs.name utilizzato sotto è un oggetto NSString)

 CGRect textRect = CGRectMake(fCol*kRVCiPadAlbumColumnWidth, 
            kRVCiPadAlbumColumnWidth-kRVCiPadTextLabelYOffset, 
            kRVCiPadAlbumColumnWidth, 
            kRVCiPadTextLabelHeight); 
     NSMutableParagraphStyle *textStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy]; 
     textStyle.lineBreakMode = NSLineBreakByWordWrapping; 
     textStyle.alignment = NSTextAlignmentCenter; 
     UIFont *textFont = [UIFont systemFontOfSize:16]; 

Questo non funziona (non viene disegnata sullo schermo) utilizzando le variabili dall'alto

 [bs.name drawInRect:textRect 
      withAttributes:@{NSFontAttributeName:textFont, 
           NSParagraphStyleAttributeName:textStyle}]; 

Questo funziona (la stringa è disegnata correttamente sullo schermo) utilizzando le stesse variabili dall'alto

 [bs.name drawInRect:textRect 
        withFont:textFont 
       lineBreakMode:NSLineBreakByWordWrapping 
        alignment:NSTextAlignmentCenter]; 

Qualsiasi assistenza sarebbe grande. Grazie.

+0

Che cosa intendi dicendo che 'drawInRect: withAttributes:' non funziona? –

+0

Ottima domanda. Scusa non ho elaborato. La stringa contenuta in bs.name viene disegnata correttamente sullo schermo usando drawInRect: withFont: lineBreakMode: messaggio di allineamento ma non appare quando si usa drawInRect: con il messaggio Atributes (non viene disegnato nulla). –

risposta

28

ho fatto un UIView con drawRect: contenente solo il codice che hai fornito

- (void)drawRect:(CGRect)frame 
{ 
    NSMutableParagraphStyle *textStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy]; 
    textStyle.lineBreakMode = NSLineBreakByWordWrapping; 
    textStyle.alignment = NSTextAlignmentCenter; 
    UIFont *textFont = [UIFont systemFontOfSize:16]; 

    NSString *text = @"Lorem ipsum"; 

    // iOS 7 way 
    [text drawInRect:frame withAttributes:@{NSFontAttributeName:textFont, NSParagraphStyleAttributeName:textStyle}]; 

    // pre iOS 7 way 
    CGFloat margin = 16; 
    CGRect bottomFrame = CGRectMake(0, margin, frame.size.width, frame.size.height - margin); 
    [text drawInRect:bottomFrame withFont:textFont lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentCenter]; 
} 

non vedo alcuna differenza tra le uscite di questi due metodi. Forse il problema è da qualche altra parte nel tuo codice?

+0

Grazie per il tuo lavoro nel fornire questa risposta. Il mio codice viene eseguito anche da un drawRect: su un UIView. Sono d'accordo che deve essere da qualche altra parte, ma se commento l'uno o l'altro, uno funziona l'altro no. Forse il rettangolo deve essere ricalcolato, per qualsiasi ragione, diverso su iOS 7 (solo per informazioni, il modo iOS 7 è drawInRect: withAttributes). Mi divertirò un po 'di più con il rettangolo. Grazie ancora. –

+0

Assicurati che 'CGRect' sia passato a entrambi i metodi. Puoi anche provare a 1) cambiare il colore del testo, 2) disegnare uno sfondo sul tuo rettangolo, giusto per assicurarti che sia posizionato dove vuoi che sia. Questi passaggi sono piuttosto semplicistici, ma forse aiuteranno a trovare dov'è il problema. –

+0

Sto usando lo stesso identico codice esattamente nello stesso metodo (non due metodi). Se si sostituisce drawRect: (vecchio) con drawRect: (nuovo) esattamente nello stesso punto del codice usando lo stesso identico rettangolo, uno funziona, l'altro no. Sono ancora perplesso. Se trovo qualcosa, posterò. –

36

Per impostare il colore del testo è necessario passare NSForegroundColorAttributeName nell'attributo come parametro aggiuntivo.

NSDictionary *dictionary = @{ NSFontAttributeName: self.font, 
           NSParagraphStyleAttributeName: paragraphStyle, 
           NSForegroundColorAttributeName: self.textColor};