iPhone UITextField - Cambia il colore del testo segnaposto


566

Vorrei cambiare il colore del testo segnaposto che ho impostato nei miei UITextFieldcontrolli, per renderlo nero.

Preferirei farlo senza usare il testo normale come segnaposto e dover sostituire tutti i metodi per imitare il comportamento di un segnaposto.

Credo che se sovrascrivo questo metodo:

- (void)drawPlaceholderInRect:(CGRect)rect

allora dovrei essere in grado di farlo. Ma non sono sicuro su come accedere all'oggetto segnaposto effettivo all'interno di questo metodo.

Risposte:


804

Dall'introduzione delle stringhe attribuite in UIViews in iOS 6, è possibile assegnare un colore al testo segnaposto in questo modo:

if ([textField respondsToSelector:@selector(setAttributedPlaceholder:)]) {
  UIColor *color = [UIColor blackColor];
  textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholderText attributes:@{NSForegroundColorAttributeName: color}];
} else {
  NSLog(@"Cannot set placeholder text's color, because deployment target is earlier than iOS 6.0");
  // TODO: Add fall-back code to set placeholder color.
}

2
Questo è buono - ma ricorda che devi impostare un valore di segnaposto in IB prima che funzioni
gheese

4
vale anche la pena racchiuderlo in una chiamata respondsToSelector - poiché senza di esso questo codice si arresterà in modo anomalo sulla destinazione di distribuzione pre 6.0 (selettore non riconosciuto inviato all'istanza)
gheese

5
La documentazione per attributedPlaceholderdice che usa attributi di testo, ad eccezione del colore.
Matt Connolly,

1
Qualche idea sul perché non funzioni per l'attributo - NSFontAttributeName [[NSAttributedString alloc] initWithString:@"placeholder" attributes: @{NSForegroundColorAttributeName: color, NSFontAttributeName : font}];
dev4u

3
Su iOS 7 ho [<UITextField 0x11561d90> valueForUndefinedKey:]: this class is not key value coding-compliant for the key _field.
riscontrato

237

Facile e indolore, potrebbe essere un'alternativa semplice per alcuni.

_placeholderLabel.textColor

Non suggerito per la produzione, Apple potrebbe rifiutare l'invio.


1
Lo stai usando in produzione? Intendo accedere a una proprietà privata.
Geri Borbás,

11
Forse aggiungi il testo alla tua risposta per copia e incolla veloci. _placeholderLabel.textColor
Philiiiiiipp

47
Non usare questo metodo, ho usato questo e itune store, ha respinto la mia domanda.
Assad ali

1
Penso che qualsiasi tipo di metodo di biblioteca privata non dovrebbe MAI essere raccomandato come soluzione a nulla
Skrew

2
@jungledev _placeholderLabelè una proprietà privata. Questa soluzione è soggetta a rifiuto per l'uso di API private.
Sean Kladek,

194

Puoi eseguire drawPlaceholderInRect:(CGRect)rectl' override in quanto tale per eseguire il rendering manuale del testo segnaposto:

- (void) drawPlaceholderInRect:(CGRect)rect {
    [[UIColor blueColor] setFill];
    [[self placeholder] drawInRect:rect withFont:[UIFont systemFontOfSize:16]];
}

44
Qualcosa del genere [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];è probabilmente migliore. In questo modo rispetterai la textAlignmentproprietà. Ho aggiunto questo alla mia classe SSTextField . Sentiti libero di usare nei tuoi progetti.
Sam Soffes,

52
Assolutamente NON fare quello che ha detto Koteg. MAI sostituire i metodi attraverso le categorie. MAI
Joshua Weinberg,

8
@JoshuaWeinberg C'è qualche motivo specifico dietro la tua richiesta.
Krishnan,

5
@Krishnan l'implementazione di un metodo duplicato in una categoria non è supportato e non si può mai essere certi del metodo che verrà chiamato, se entrambi verranno chiamati o dell'ordine in cui verranno chiamati.
sean woodward,

8
In iOS7 puoi modificare il rettangolo usando CGRectInset (rect, 0, (rect.size.height - self.font.lineHeight) / 2.0) per centrare verticalmente il testo.
Brian S,

171

È possibile modificare il colore del testo segnaposto in qualsiasi colore desiderato utilizzando il codice seguente.

UIColor *color = [UIColor lightTextColor];
YOURTEXTFIELD.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"PlaceHolder Text" attributes:@{NSForegroundColorAttributeName: color}];

6
La migliore risposta suggerita. Funziona e utilizza API documentate.
Ian Hoar,

2
Come si fa a farlo funzionare per UISearchBar? Non esiste proprietà attribuita a PlacePlace.
gilsaints88,

1
Questa risposta non è corretta - secondo i documenti, le informazioni sul colore del testo di attributoPlaceholder sono ignorate developer.apple.com/library/ios/documentation/UIKit/Reference/…
Adlai Holler il

Grazie a tutti. Spero sia stato di qualche aiuto. Adlai Holler provalo fratello !!! Questa risposta era per la versione precedente di iOS. Se hai una risposta migliore siamo aperti ai suggerimenti.
Manju,

Non funziona su iOS8 in quanto non è stata attribuita la proprietà di Placeholder
Ben Clayton,

157

Forse vuoi provare in questo modo, ma Apple potrebbe avvisarti dell'accesso a Ivar privato:

[self.myTextField setValue:[UIColor darkGrayColor] 
                forKeyPath:@"_placeholderLabel.textColor"];

NOTA
Questo non funziona più su iOS 7, secondo Martin Alléus.


6
Uso questo metodo nella mia app. La recensione è stata OK. Quindi penso che vada bene usarlo.
Michael A.

9
Questo non è un app store sicuro e non dovrebbe essere incoraggiato, non sei garantito per ottenere l'approvazione o rimanere in approvato con queste tecniche.
Sveinung Kval Bakken,

31
Non dovrebbe importare davvero se è approvato o meno. L'importante è che questo possa interrompere la tua app in futuri aggiornamenti del sistema operativo.
Pablasso,

2
Non avendo alcun problema con iOS 7 ... Ci ho provato nonostante la nota e sembra funzionare bene e ho usato questo approccio in passato senza problemi.
WCByrne,

6
Questa è sempre stata una cattiva idea, e ora non funziona su iOS 13: Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug😈
Ryder Mackay,

154

Funziona in Swift <3.0:

myTextField.attributedPlaceholder = 
NSAttributedString(string: "placeholder text", attributes: [NSForegroundColorAttributeName : UIColor.redColor()])

Testato su iOS 8.2 e iOS 8.3 beta 4.

Swift 3:

myTextfield.attributedPlaceholder =
NSAttributedString(string: "placeholder text", attributes: [NSForegroundColorAttributeName : UIColor.red])

Swift 4:

myTextfield.attributedPlaceholder =
NSAttributedString(string: "placeholder text", attributes: [NSAttributedStringKey.foregroundColor: UIColor.red])

Swift 4.2:

myTextfield.attributedPlaceholder =
NSAttributedString(string: "placeholder text", attributes: [NSAttributedString.Key.foregroundColor: UIColor.red])

Utilizzando la tua soluzione su iOS8.2, funziona come un fascino. Soluzione perfetta qui. Usando anche nell'obiettivo C.
Akshit Zaveri,

73

In Swift:

if let placeholder = yourTextField.placeholder {
    yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder, 
        attributes: [NSForegroundColorAttributeName: UIColor.blackColor()])
}

In Swift 4.0:

if let placeholder = yourTextField.placeholder {
    yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder, 
        attributes: [NSAttributedStringKey.foregroundColor: UIColor.black])
}

Se non hai impostato il testo segnaposto prima di chiamare che si bloccherà l'app
apinho

Questo è il migliore, grazie. @apinho niente andrà in crash qui
Markus

// In Swift 4 se let placeholder = yourTextField.placeholder {yourTextField.attributedPlaceholder = NSAttributedString (stringa: segnaposto, attributi: [NSAttributedStringKey.foregroundColor: UIColor.white])}
Ronaldo Albertini,

Attenzione che la modifica del valore del segnaposto dopo l'esecuzione di questo codice ripristinerà il colore predefinito del segnaposto.
Alessandro Vendruscolo,

66

Swift 3.0 + Storyboard

Per cambiare il colore del segnaposto nello storyboard, crea un'estensione con il codice successivo. (sentiti libero di aggiornare questo codice, se pensi, può essere più chiaro e più sicuro).

extension UITextField {
    @IBInspectable var placeholderColor: UIColor {
        get {
            guard let currentAttributedPlaceholderColor = attributedPlaceholder?.attribute(NSForegroundColorAttributeName, at: 0, effectiveRange: nil) as? UIColor else { return UIColor.clear }
            return currentAttributedPlaceholderColor
        }
        set {
            guard let currentAttributedString = attributedPlaceholder else { return }
            let attributes = [NSForegroundColorAttributeName : newValue]

            attributedPlaceholder = NSAttributedString(string: currentAttributedString.string, attributes: attributes)
        }
    }
}

inserisci qui la descrizione dell'immagine

Versione Swift 4

extension UITextField {
    @IBInspectable var placeholderColor: UIColor {
        get {
            return attributedPlaceholder?.attribute(.foregroundColor, at: 0, effectiveRange: nil) as? UIColor ?? .clear
        }
        set {
            guard let attributedPlaceholder = attributedPlaceholder else { return }
            let attributes: [NSAttributedStringKey: UIColor] = [.foregroundColor: newValue]
            self.attributedPlaceholder = NSAttributedString(string: attributedPlaceholder.string, attributes: attributes)
        }
    }
}

Versione Swift 5

extension UITextField {
    @IBInspectable var placeholderColor: UIColor {
        get {
            return attributedPlaceholder?.attribute(.foregroundColor, at: 0, effectiveRange: nil) as? UIColor ?? .clear
        }
        set {
            guard let attributedPlaceholder = attributedPlaceholder else { return }
            let attributes: [NSAttributedString.Key: UIColor] = [.foregroundColor: newValue]
            self.attributedPlaceholder = NSAttributedString(string: attributedPlaceholder.string, attributes: attributes)
        }
    }
}

Il compilatore non può scoprirlo NSAttributedStringKey.
Milano Kamilya,

Funziona su iOS 13
Jalil

43

Quanto segue solo con iOS6 + (come indicato nel commento di Alexander W):

UIColor *color = [UIColor grayColor];
nameText.attributedPlaceholder =
   [[NSAttributedString alloc]
       initWithString:@"Full Name"
       attributes:@{NSForegroundColorAttributeName:color}];

33

Avevo già affrontato questo problema. Nel mio caso il codice seguente è corretto.

Obiettivo C

[textField setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];

Per Swift 4.X

tf_mobile.setValue(UIColor.white, forKeyPath: "_placeholderLabel.textColor")

Per iOS 13 Swift Code

tf_mobile.attributedPlaceholder = NSAttributedString(string:"PlaceHolder Text", attributes: [NSAttributedString.Key.foregroundColor: UIColor.red])

Puoi anche utilizzare il codice seguente per iOS 13

let iVar = class_getInstanceVariable(UITextField.self, "_placeholderLabel")!
let placeholderLabel = object_getIvar(tf_mobile, iVar) as! UILabel
placeholderLabel.textColor = .red

Spero che questo possa aiutarti.


@Ashu questo provoca un arresto anomalo in iOS 13 'È vietato l'accesso al _placeholderLabel ivar di UITextField. Si tratta di un bug dell'applicazione 'non sarà nemmeno compilato Non sto parlando di inserirli in AppStore
Melany

1
IOS 13 questo è stato limitato non può più usarlo
Kishore Kumar il

Il codice Objc è testato su IOS 13 e non funziona.
Mehdico,

1
@Mehdico Ho aggiornato la risposta per iOS 13. Spero che questo ti aiuti.
Ashu,

Mi ci è voluto troppo tempo per apprendere che dovevo apportare questo cambiamento in viewWillAppearo viewDidAppear. viewDidLoadè troppo presto.
Quattro

32

Con questo possiamo cambiare il colore del testo segnaposto del campo di testo in iOS

[self.userNameTxt setValue:[UIColor colorWithRed:41.0/255.0 green:91.0/255.0 blue:106.0/255.0 alpha:1.0] forKeyPath:@"_placeholderLabel.textColor"];

1
A partire da iOS13 questo non funzionerà
Teddy

@Teddy come hai fatto ora? Ho iniziato ad avere problemi con questo.
Jalil,

@Jalil Spero di essere ancora in tempo per te. textField.attributedPlaceholder = [[[NSAttributedString alloc] initWithString: @ attributi "text": @ {NSForegroundColorAttributeName: [UIColor colorWithHexString: @ "ffffff55"]}];
Teddy,

18

Perché non usi semplicemente il UIAppearancemetodo:

[[UILabel appearanceWhenContainedIn:[UITextField class], nil] setTextColor:[UIColor whateverColorYouNeed]];

Funziona alla grande! Il colore del testo non è interessato (almeno con proxy diverso per la proprietà textColor)
HotJard

18

Anche nello storyboard, senza una singola riga di codice

inserisci qui la descrizione dell'immagine


1
Come mai lo sai? Penso che sia l'approccio migliore, ma come si può sapere questo? Si prega di dire che sono nuovo nella programmazione iOS.
Yawar,

2
È molto universale. Una volta che lo sai
usalo

So che una volta capito cosa c'è dietro, lo userò molto. Ma intendo "_placeholderLabel.textColor" questa dovrebbe essere una vista figlio del campo di testo. C'è un modo per vedere questo tipo di informazioni su un controllo?
Yawar,

2
@Yawar È possibile utilizzare la finestra di ispezione della gerarchia delle viste in Xcode o introspettare la vista nel debugger.
David Ganster,

buono, indipendentemente dal campo di testo, puoi usare lo stesso 'tile / name' per
keypath

16

in rapido 3.X

textField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes:[NSForegroundColorAttributeName: UIColor.black])

in rapido 5

textField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes: [NSAttributedString.Key.foregroundColor : UIColor.black])

12

Per iOS 6.0 +

[textfield setValue:your_color forKeyPath:@"_placeholderLabel.textColor"];

Spero che sia d'aiuto.

Nota: Apple potrebbe rifiutare (0,01% di probabilità) la tua app mentre stiamo accedendo all'API privata. Sto usando questo in tutti i miei progetti da due anni, ma Apple non lo ha chiesto.


lancia un terminating with uncaught exception of type NSExceptionper iOS8
Yar

10

Per gli sviluppatori Xamarin.iOS, l'ho trovato da questo documento https://developer.xamarin.com/api/type/Foundation.NSAttributedString/

textField.AttributedPlaceholder = new NSAttributedString ("Hello, world",new UIStringAttributes () { ForegroundColor =  UIColor.Red });

Grazie !! Prima stavo usando CTStringAttributes e non UIStringAttributes e non sono riuscito a capirlo. Fai attenzione a non usare questo:new NSAttributedString("placeholderstring", new CTStringAttributes() { ForegroundColor = UIColor.Blue.CGColor });
Yohan Dahmani,

9

Versione rapida. Probabilmente sarebbe d'aiuto a qualcuno.

class TextField: UITextField {
   override var placeholder: String? {
        didSet {
            let placeholderString = NSAttributedString(string: placeholder!, attributes: [NSForegroundColorAttributeName: UIColor.whiteColor()])
            self.attributedPlaceholder = placeholderString
        }
    }
}

6

Categorie FTW. Potrebbe essere ottimizzato per verificare l'effettivo cambio di colore.


#import <UIKit/UIKit.h>

@interface UITextField (OPConvenience)

@property (strong, nonatomic) UIColor* placeholderColor;

@end

#import "UITextField+OPConvenience.h"

@implementation UITextField (OPConvenience)

- (void) setPlaceholderColor: (UIColor*) color {
    if (color) {
        NSMutableAttributedString* attrString = [self.attributedPlaceholder mutableCopy];
        [attrString setAttributes: @{NSForegroundColorAttributeName: color} range: NSMakeRange(0,  attrString.length)];
        self.attributedPlaceholder =  attrString;
    }
}

- (UIColor*) placeholderColor {
    return [self.attributedPlaceholder attribute: NSForegroundColorAttributeName atIndex: 0 effectiveRange: NULL];
}

@end

6

Gestire sia l'allineamento verticale che orizzontale, nonché il colore del segnaposto in iOS7. drawInRect e drawAtPoint non utilizzano più il contesto corrente fillColor.

https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/CustomTextProcessing/CustomTextProcessing.html

Obj-C

@interface CustomPlaceHolderTextColorTextField : UITextField

@end


@implementation CustomPlaceHolderTextColorTextField : UITextField


-(void) drawPlaceholderInRect:(CGRect)rect  {
    if (self.placeholder) {
        // color of placeholder text
        UIColor *placeHolderTextColor = [UIColor redColor];

        CGSize drawSize = [self.placeholder sizeWithAttributes:[NSDictionary dictionaryWithObject:self.font forKey:NSFontAttributeName]];
        CGRect drawRect = rect;

        // verticially align text
        drawRect.origin.y = (rect.size.height - drawSize.height) * 0.5;

        // set alignment
        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        paragraphStyle.alignment = self.textAlignment;

        // dictionary of attributes, font, paragraphstyle, and color
        NSDictionary *drawAttributes = @{NSFontAttributeName: self.font,
                                     NSParagraphStyleAttributeName : paragraphStyle,
                                     NSForegroundColorAttributeName : placeHolderTextColor};


        // draw
        [self.placeholder drawInRect:drawRect withAttributes:drawAttributes];
    }
}

@end

Grazie per questa eccellente soluzione, che centra correttamente il testo in verticale (utile con caratteri personalizzati). L'unica cosa che vorrei aggiungere è che questa soluzione non è compatibile con iOS 6 o più anziani (abbastanza facile da risolvere, ricorrendo a [self.placeholder drawInRect: rect withFont: self.font lineBreakMode: allineamento NSLineBreakByTruncatingTail: self.textAlignment];
lifjoy,

6

iOS 6 e versioni successive attributedPlaceholdersu UITextField. iOS 3.2 e versioni successive setAttributes:range:su NSMutableAttributedString.

Puoi fare quanto segue:

NSMutableAttributedString *ms = [[NSMutableAttributedString alloc] initWithString:self.yourInput.placeholder];
UIFont *placeholderFont = self.yourInput.font;
NSRange fullRange = NSMakeRange(0, ms.length);
NSDictionary *newProps = @{NSForegroundColorAttributeName:[UIColor yourColor], NSFontAttributeName:placeholderFont};
[ms setAttributes:newProps range:fullRange];
self.yourInput.attributedPlaceholder = ms;

Non sono sicuro di ciò che sta causando il problema, questo codice che ho chiamato in viewdidLoad. il nuovo colore e la dimensione del carattere vengono visualizzati solo dopo il ridisegno. qualcos'altro deve essere fatto insieme a questo?
Vinayaka Karjigi,

è stato risolto, ho dimenticato di impostare il carattere per UITextfield prima di utilizzare quel carattere per il testo segnaposto. mio cattivo
Vinayaka Karjigi

6

Questa soluzione per Swift 4.1

    textName.attributedPlaceholder = NSAttributedString(string: textName.placeholder!, attributes: [NSAttributedStringKey.foregroundColor : UIColor.red])

4

Override drawPlaceholderInRect: sarebbe il modo corretto, ma non funziona a causa di un bug nell'API (o nella documentazione).

Il metodo non viene mai chiamato su un UITextField .

Guarda anche drawTextInRect su UITextField non chiamato

Potresti usare la soluzione di digdog. Dal momento che non sono sicuro che questo riesca a superare la revisione delle mele, ho scelto una soluzione diversa: sovrapporre il campo di testo con la mia etichetta che imita il comportamento del segnaposto.

Questo è un po 'disordinato però. Il codice è simile al seguente (nota che lo sto facendo all'interno di una sottoclasse di TextField):

@implementation PlaceholderChangingTextField

- (void) changePlaceholderColor:(UIColor*)color
{    
    // Need to place the overlay placeholder exactly above the original placeholder
    UILabel *overlayPlaceholderLabel = [[[UILabel alloc] initWithFrame:CGRectMake(self.frame.origin.x + 8, self.frame.origin.y + 4, self.frame.size.width - 16, self.frame.size.height - 8)] autorelease];
    overlayPlaceholderLabel.backgroundColor = [UIColor whiteColor];
    overlayPlaceholderLabel.opaque = YES;
    overlayPlaceholderLabel.text = self.placeholder;
    overlayPlaceholderLabel.textColor = color;
    overlayPlaceholderLabel.font = self.font;
    // Need to add it to the superview, as otherwise we cannot overlay the buildin text label.
    [self.superview addSubview:overlayPlaceholderLabel];
    self.placeholder = nil;
}

come ti sentiresti a condividere la tua soluzione favorevole alle recensioni?
Adamo,

Ho aggiunto la soluzione che ho usato. Ho dovuto fare un po 'di scavo, dato che è
successo

Ho fatto qualcosa di simile a questo, ma ho inserito il codice in una categoria e avevo bisogno di fare un check in shouldChangeCharacters su se renderlo visibile, che era un secondo metodo nella categoria chiamata - (void) overlayPlaceholderVisible: (BOOL) visible ;
David van Dugteren,

3

Sono nuovo su xcode e ho trovato un modo per aggirare lo stesso effetto.

Ho posizionato un uilabel al posto del segnaposto con il formato desiderato e l'ho nascosto

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    switch (textField.tag)
    {
        case 0:
            lblUserName.hidden=YES;
            break;

        case 1:
            lblPassword.hidden=YES;
            break;

        default:
            break;
    }
}

Concordo sul fatto che sia una soluzione e non una vera soluzione, ma l'effetto è stato lo stesso ottenuto da questo link

NOTA: funziona ancora su iOS 7: |


3

Swift 5 CON CAVEAT.

let attributes = [ NSAttributedString.Key.foregroundColor: UIColor.someColor ]
let placeHolderString = NSAttributedString(string: "DON'T_DELETE", attributes: attributes)
txtField.attributedPlaceholder = placeHolderString

L'avvertenza è che DEVI inserire un non vuoto Stringdove "DON'T_DELETE" è, anche se quella stringa è impostata nel codice altrove. Potrebbe farti risparmiare cinque minuti di strappi alla testa.


2

Il meglio che posso fare sia per iOS7 che per meno è:

- (CGRect)placeholderRectForBounds:(CGRect)bounds {
  return [self textRectForBounds:bounds];
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
  return [self textRectForBounds:bounds];
}

- (CGRect)textRectForBounds:(CGRect)bounds {
  CGRect rect = CGRectInset(bounds, 0, 6); //TODO: can be improved by comparing font size versus bounds.size.height
  return rect;
}

- (void)drawPlaceholderInRect:(CGRect)rect {
  UIColor *color =RGBColor(65, 65, 65);
  if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [self.placeholder drawInRect:rect withAttributes:@{NSFontAttributeName:self.font, UITextAttributeTextColor:color}];
  } else {
    [color setFill];
    [self.placeholder drawInRect:rect withFont:self.font];
  }
}

2

Per coloro che usano Monotouch (Xamarin.iOS), ecco la risposta di Adam, tradotta in C #:

public class MyTextBox : UITextField
{
    public override void DrawPlaceholder(RectangleF rect)
    {
        UIColor.FromWhiteAlpha(0.5f, 1f).SetFill();
        new NSString(this.Placeholder).DrawString(rect, Font);
    }
}

Grande. Questo non era davvero ovvio, probabilmente mi hai fatto risparmiare un po 'di tempo :) Ho modificato la tua soluzione però, poiché penso che sia una migliore idea usare il set di caratteri nella Fontproprietà del campo di testo.
Wolfgang Schreurs,

1

Avevo bisogno di mantenere l'allineamento del segnaposto, quindi la risposta di Adam non era abbastanza per me.

Per risolvere questo ho usato una piccola variazione che spero possa aiutare anche alcuni di voi:

- (void) drawPlaceholderInRect:(CGRect)rect {
    //search field placeholder color
    UIColor* color = [UIColor whiteColor];

    [color setFill];
    [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];
}

UILineBreakModeTailTruncationè obsoleto a partire da iOS 6.
Supertecnoboff il

1
[txt_field setValue:ColorFromHEX(@"#525252") forKeyPath:@"_placeholderLabel.textColor"];

Un piccolo suggerimento su questo è che stai accedendo a un iVar privato (_placeholderLabel) e in passato Apple è stata un po 'schizzinosa nel farlo. :)
Alexander W,

1

Per il segnaposto del campo di testo attribuito impostato con più colori,

Basta specificare il testo,

  //txtServiceText is your Textfield
 _txtServiceText.placeholder=@"Badal/ Shah";
    NSMutableAttributedString *mutable = [[NSMutableAttributedString alloc] initWithString:_txtServiceText.placeholder];
     [mutable addAttribute: NSForegroundColorAttributeName value:[UIColor whiteColor] range:[_txtServiceText.placeholder rangeOfString:@"Badal/"]]; //Replace it with your first color Text
    [mutable addAttribute: NSForegroundColorAttributeName value:[UIColor orangeColor] range:[_txtServiceText.placeholder rangeOfString:@"Shah"]]; // Replace it with your secondcolor string.
    _txtServiceText.attributedPlaceholder=mutable;

Produzione :-

inserisci qui la descrizione dell'immagine


0

Un'altra opzione che non richiede la sottoclasse: lasciare vuoto il segnaposto e mettere un'etichetta sopra il pulsante di modifica. Gestisci l'etichetta proprio come faresti con il segnaposto (cancellando una volta che l'utente inserisce qualcosa ..)


Penso che questo sarebbe efficace se si dispone di un campo di testo, ma se si sta tentando di apportare questo cambiamento su una scala più globale, questa soluzione aggiungerebbe una notevole quantità di spese generali al progetto.
James Parker,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.