2013-02-22 31 views
13

Sto provando a rendere i segnaposto nei miei campi di testo in corsivo e, poiché la mia app ha come target iOS 6.0 o versione successiva, ho deciso di utilizzare la proprietà attributedPlaceholder invece di eseguire il rollover su qualcosa di più personalizzato. Il codice è la seguente:UITextField attributePlaceholder non ha alcun effetto

NSString *plString = @"optional"; 
NSAttributedString *placeholder = [[NSAttributedString alloc] initWithString:plString 
     attributes:@{NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-LightItalic" size:15]}]; 
for (UITextField *t in myTextfields){ 
    t.placeholder = plString; 
    t.attributedPlaceholder = placeholder; 
} 

ma lo stile del segnaposto non è ancora in corsivo, ma lo stesso come testo normale, solo dimmer. Cosa mi manca per far funzionare lo NSAttributedString?

+1

posso riprodurre il problema e penso questo è un bug in iOS. – Florian

risposta

16

Come notato da warren, attualmente lo stile non può essere realizzato nel modo in cui si sta provando. Una buona soluzione sarebbe quella di impostare gli attributi del carattere del campo di testo nel modo in cui si desidera che il segnaposto venga visualizzato e quindi modificare il carattere del campo di testo ogni volta che l'utente inizia a digitare. Sembrerà il segnaposto e il testo sono caratteri diversi.

È possibile farlo attraverso la creazione di un delegato del campo di testo e utilizzando shouldChangeCharactersinRange come questo:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{  
    // If there is text in the text field 
    if (textField.text.length + (string.length - range.length) > 0) { 
     // Set textfield font 
     textField.font = [UIFont fontWithName:@"Font" size:14]; 
    } else { 
     // Set textfield placeholder font (or so it appears) 
     textField.font = [UIFont fontWithName:@"PlaceholderFont" size:14]; 
    } 

    return YES; 
} 
10

Questo è quasi certamente un bug. Lo documentation for the attributedPlaceholder property afferma che la stringa verrà disegnata utilizzando un colore grigio indipendentemente dall'attributo del colore di primo piano, ma non è questo il caso: puoi impostare sia i colori di primo piano che di sfondo. Sfortunatamente, l'attributo font sembra essere rimosso e ripristinato sul font di sistema.

Per ovviare al problema, suggerisco di ignorare drawPlaceholderInRect: e di disegnare il segnaposto. Inoltre, si dovrebbe archiviare un radar su questo e includere un progetto di esempio minimo che mostri il bug.

+0

Sembra che drawPlaceholderInRect: non venga chiamato in un UITextField. Vedi http://stackoverflow.com/questions/1920783/drawtextinrect-on-uitextfield-not-called –

+0

Per favore, ignora il mio commento, che la domanda SO è vecchia e ora sembra funzionare. –

8

Ho appena imbattuto in questo problema io stesso. Apparentemente, il segnaposto prenderà qualsiasi carattere con cui viene assegnato il campo di testo. Basta impostare il carattere del campo di testo e sei bravo.

Per tutto il resto, come il colore del segnaposto, sarei ancora tornare a attributedPlaceholder

+0

Risposta stupenda. Ha funzionato per me! – nimeshdesai

-1

iOS 8/9/Swift 2.0 - esempio di lavoro

func colorPlaceholderText(){ 
    var multipleAttributes = [String : NSObject]() 
    multipleAttributes[NSForegroundColorAttributeName] = UIColor.appColorCYAN() 
    //OK - comment in if you want background color 
    //multipleAttributes[NSBackgroundColorAttributeName] = UIColor.yellowColor() 
    //OK - Adds underline 
    //multipleAttributes[NSUnderlineStyleAttributeName] = NSUnderlineStyle.StyleDouble.rawValue 


    let titleString = "Search port/country/vessel..." 
    let titleAttributedString = NSAttributedString(string: titleString, 
     attributes: multipleAttributes) 


    self.textFieldAddSearch.attributedPlaceholder = titleAttributedString 
} 
+0

Questo funziona per il colore. Ma non per il carattere stesso – dmclean

Problemi correlati