iPhone UITextField – Modificarea culorii textului de tip placeholder (Programare, Ios, Uitextfield)

adam a intrebat.

Aș dori să schimb culoarea textului placeholder pe care l-am setat în câmpul meu UITextField controale, pentru a-l face negru.

Aș prefera să fac acest lucru fără să folosesc un text normal ca și placeholder și să fiu nevoit să suprascriu toate metodele pentru a imita comportamentul unui placeholder.

Cred că dacă suprascriu această metodă:

- (void)drawPlaceholderInRect:(CGRect)rect

atunci ar trebui să pot face acest lucru. Dar nu sunt sigur cum să accesez obiectul placeholder real din această metodă.

32 răspunsuri
user1071136

De la introducerea șirurilor de caractere atribuite în UIViews în iOS 6, este posibil să atribuiți o culoare textului de tip „placeholder” astfel:

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

Comentarii

  • Acest lucru este bun – dar nu uitați că trebuie să setați o valoare de placeholder în IB înainte ca acest lucru să funcționeze –  > Por gheese.
  • merită, de asemenea, să includeți acest lucru într-un apel de răspuns la Selector – deoarece, fără acesta, acest cod se va bloca pe o țintă de implementare pre 6.0 („selector nerecunoscut trimis la instanță”).  > Por gheese.
  • Documentația pentru attributedPlaceholder spune că se utilizează atributele textului, cu excepția culorii. –  > Por Matt Connolly.
  • Vreo idee de ce nu funcționează pentru atributul – NSFontAttributeName [[NSAttributedString alloc] initWithString:@"placeholder" attributes: @{NSForegroundColorAttributeName: color, NSFontAttributeName : font}]; –  > Por dev4u.
  • Pe iOS 7 am primit această eroare: [<UITextField 0x11561d90> valueForUndefinedKey:]: this class is not key value coding-compliant for the key _field. –  > Por i_am_jorf.
Jack

Ușor și fără durere, ar putea fi o alternativă ușoară pentru unii.

_placeholderLabel.textColor

Nu este sugerat pentru producție, Apple ar putea să vă respingă trimiterea.

Comentarii

  • Folosiți acest lucru în producție? Adică pentru a accesa o proprietate privată. –  > Por Geri Borbás.
  • Poate adăugați textul la răspunsul dvs. pentru copiere și lipire rapidă. _placeholderLabel.textColor –  > Por Philiiiiiipp.
  • 51

  • Nu folosiți această metodă, am folosit acest lucru și magazinul itune, a respins cererea mea. –  > Por Asad ali.
  • Cred că orice fel de metodă de bibliotecă privată nu ar trebui să fie recomandată NICIODATĂ ca soluție la nimic – -.  > Por Skrew.
  • @jungledev _placeholderLabel este o proprietate privată. Această soluție este susceptibilă de a fi respinsă pentru utilizarea unui API privat. –  > Por Sean Kladek.
adam

Puteți suprascrie drawPlaceholderInRect:(CGRect)rect ca atare pentru a reda manual textul de tip placeholder:

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

Comentarii

    45

  • Ceva de genul [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment]; este probabil mai bun. În acest fel, veți respecta textAlignment proprietatea. Am adăugat acest lucru la pagina mea SSTextField clasă. Nu ezitați să o folosiți în proiectele dumneavoastră. –  > Por Sam Soffes.
  • 52

  • Categoric NU faceți ceea ce a spus Koteg. Nu suprascrieți NICIODATĂ metodele prin categorii. NICIODATĂ –  > Por Joshua Weinberg.
  • @JoshuaWeinberg Există vreun motiv specific în spatele sugestiei dvs. –  > Por Krishnan.
  • @Krishnan Implementarea unei metode duplicate într-o categorie nu este acceptată și nu puteți fi niciodată sigur ce metodă va fi apelată, sau dacă ambele vor fi apelate, sau ordinea în care vor fi apelate. –  > Por Sean Woodward.
  • În iOS7 puteți modifica rectul folosind CGRectInset(rect, 0, (rect.size.height – self.font.lineHeight) / 2.0) pentru a centra vertical textul. –  > Por Brian S.
Manju

Puteți schimba culoarea textului Placeholder în orice culoare doriți folosind codul de mai jos.

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

Comentarii

  • Cel mai bun răspuns sugerat. Funcționează și utilizează API-uri documentate. –  > Por Ian Hoar.
  • Cum faci ca acest lucru să funcționeze pentru UISearchBar? Nu există o proprietate attributedPlaceholder. –  > Por gilsaints88.
  • Acest răspuns nu este corect – conform documentației, informațiile despre culoarea textului din attributedPlaceholder sunt ignorate developer.apple.com/library/ios/documentation/UIKit/Reference/… –  > Por Adlai Holler.
  • Vă mulțumim tuturor. Sper că a fost de ajutor. Adlai Holler dă-i o șansă frate!!! Acest răspuns a fost pentru versiunea anterioară de iOS. Dacă aveți un răspuns mai bun, suntem deschiși la sugestii. –  > Por Manju.
  • Nu funcționează pe iOS8, deoarece nu există o proprietate attributedPlaceholder –  > Por Ben Clayton.
Tomino

Acest lucru funcționează în Swift <3.0:

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

Testat în iOS 8.2 și 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])

Comentarii

  • Folosind soluția dvs. pe iOS8.2, funcționează ca un farmec. Soluție perfectă aici. Folosind în obiectiv C, de asemenea. –  > Por Akshit Zaveri.
digdog

Poate că doriți să încercați acest mod, dar Apple ar putea să vă avertizeze cu privire la accesarea ivar privat:

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

NOTĂ
Acest lucru nu mai funcționează pe iOS 7, potrivit lui Martin Alléus.

Comentarii

  • Eu folosesc această metodă în aplicația mea. Revizuirea a fost OK. Deci cred că este bine să o folosiți. –  > Por Michael A..
  • Acest lucru nu este sigur pentru App Store și ar trebui să nu să fie încurajată, nu aveți garanția că veți fi aprobat sau că veți rămâne aprobat cu aceste tehnici. –  > Por Sveinung Kval Bakken.
  • 32

  • Nu ar trebui să conteze dacă este aprobat sau nu cu adevărat. Lucrul important este că acest lucru ar putea să vă strice aplicația în viitoarele actualizări ale sistemului de operare. –  > Por pablasso.
  • Nu am nicio problemă cu iOS 7… Am încercat în ciuda notei și pare să funcționeze bine și am folosit această abordare în trecut fără probleme. –  > Por WCByrne.
  • Aceasta a fost întotdeauna o idee proastă, iar acum este stricată pe iOS 13: Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug –  > Por Ryder Mackay.
Nik Kov

Swift 3.0 + Storyboard

Pentru a schimba culoarea locului în storyboard, creați o extensie cu următorul cod. (nu ezitați să actualizați acest cod, dacă credeți că poate fi mai clar și mai sigur).

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)
        }
    }
}

Versiunea 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)
        }
    }
}

Versiunea 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)
        }
    }
}

Comentarii

  • Compilatorul nu poate afla NSAttributedStringKey. –  > Por Milan Kamilya.
  • Funcționează în iOS 13 –  > Por Jalil.
Beninho85

În Swift:

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

În Swift 4.0:

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

Comentarii

  • Dacă nu ați setat textul de tip placeholder înainte de a apela că se va bloca aplicația –  > Por apinho.
  • Acesta este cel mai bun, vă mulțumesc. @apinho nimic nu se va bloca aici –  > Por Markus.
  • //În Swift 4 if let placeholder = yourTextField.placeholder { yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder, attributes: [NSAttributedStringKey.foregroundColor: UIColor.white]) } –  > Por Ronaldo Albertini.
  • Atenție, modificarea valorii textului de tip placeholder după ce acest cod a fost executat va readuce culoarea implicită a placeholder-ului. –  > Por Alessandro Vendruscolo.
Gaurav Gilani

Următoarele doar cu iOS6+ (așa cum este indicat în comentariul lui Alexander W.):

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

Ashu

M-am confruntat deja cu această problemă. În cazul meu, codul de mai jos este corect.

Obiectiv C

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

Pentru Swift 4.X

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

Pentru iOS 13 Codul Swift

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

De asemenea, puteți utiliza codul de mai jos pentru iOS 13

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

Sperăm că acest lucru vă poate ajuta.

Comentarii

  • @Ashu acest lucru provoacă un accident în iOS 13 ‘Accesul la UITextField’s _placeholderLabel ivar este interzis. Acesta este un bug al aplicației’ nu va fi nici măcar construit Nu vorbesc despre plasarea în AppStore –  > Por Melany.
  • IOS 13 acest lucru a fost restricționat nu mai pot folosi acest lucru –  > Por Kishore Kumar.
  • @Mehdico Am actualizat răspunsul pentru iOS 13. Sper că acest lucru vă va ajuta. –  > Por Ashu.
  • Mi-a luat mult prea mult timp să aflu că trebuie să fac această modificare în viewWillAppear sau viewDidAppear. viewDidLoad este prea devreme. –  > Por Patru.
  • A trebuit să folosesc UIColor(displayP3Red: 255, green: 255, blue: 255, alpha: 0.3) constructor pentru UIColor în loc de UIColor(red: 255, green: 255, blue: 255, alpha: 0.3) –  > Por Apreciez asta.
Uma Madhavi

Cu acest lucru putem schimba culoarea textului din câmpul de text al placeholderului în 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"];

Comentarii

  • @Teddy cum ai făcut-o acum? Am început să am probleme cu acest lucru. –  > Por Jalil.
  • @Jalil Sper că sunt încă la timp pentru tine. textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@”text” attributes:@{NSForegroundColorAttributeName:[UIColor colorWithHexString:@”ffffff55″]}]; –  > Por Teddy.
MAhipal Singh

în swift 3.X

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

în swift 5

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

Valerii Lider

De ce nu folosiți pur și simplu UIAppearance metoda:

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

Comentarii

  • Funcționează foarte bine! Culoarea textului nu este afectată (Cel puțin cu un proxy diferit pentru proprietatea textColor) –  > Por HotJard.
  • A funcționat foarte bine, dar afișează un avertisment pentru această metodă –  > Por Chandni.
Petr Syrov

De asemenea, în storyboard-ul tău, fără o singură linie de cod

Comentarii

  • De unde știi asta? Este cea mai bună abordare cred eu, dar cum se poate ști acest lucru? Vă rog să îmi spuneți că sunt nou în programarea ios. –  > Por Yawar.
  • Este foarte universal. Odată ce o știi, folosește-o peste tot 😉 –  > Por Petr Syrov.
  • Știu că odată ce am înțeles ce rulează în spatele ei o voi folosi foarte mult. Dar mă refer la „_placeholderLabel.textColor”, care ar trebui să fie o vizualizare copil a câmpului text. Există o modalitate de a vedea acest tip de informații despre un control? –  > Por Yawar.
  • @Yawar Puteți utiliza inspectorul de ierarhie a vizualizărilor din Xcode sau puteți introspecta vizualizarea în debugger. –  > Por David Ganster.
  • bun, indiferent de câmpul de text, puteți utiliza aceeași „țiglă / nume” pentru keypath –  > Por Naishta.
Fahim Parkar

Pentru iOS 6.0 +

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

Sper că vă ajută.

Notă: Apple poate respinge (0,01% șanse) aplicația dvs. deoarece accesăm API privat. Eu folosesc acest lucru în toate proiectele mele de doi ani, dar Apple nu a cerut acest lucru.

Comentarii

  • aruncă un terminating with uncaught exception of type NSException pentru iOS8 –  > Por Yar.
ManuQiao

Pentru dezvoltatorii Xamarin.iOS, am găsit-o din acest documenthttps://developer.xamarin.com/api/type/Foundation.NSAttributedString/

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

Comentarii

  • Mulțumesc !!! Prima dată am folosit CTStringAttributes și nu UIStringAttributes și nu am reușit să înțeleg. Aveți grijă să nu folosiți acest : new NSAttributedString("placeholderstring", new CTStringAttributes() { ForegroundColor = UIColor.Blue.CGColor }); –  > Por Yohan Dahmani.
Max Tymchii

Versiunea Swift. Probabil că ar ajuta pe cineva.

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

William Power

iOS 6 și ofertele ulterioare attributedPlaceholder pe UITextField. iOS 3.2 și ofertele ulterioare setAttributes:range: pe NSMutableAttributedString.

Puteți face următoarele:

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;

Comentarii

  • Nu sunt sigur de ceea ce cauzează problema, acest cod pe care l-am apelat în viewdidLoad. noua culoare și dimensiunea fontului apare numai după redesenare. orice altceva trebuie făcut împreună cu acest lucru? –  > Por Vinayaka Karjigi.
  • s-a rezolvat, am uitat să setez fontul pentru UITextfield înainte de a folosi acel font pentru textul de tip „placeholder”. greșeala mea.  > Por Vinayaka Karjigi.
Mantosh Kumar

Această soluție pentru Swift 4.1

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

osxdirk

Categorii FTW. Ar putea fi optimizat pentru a verifica schimbarea efectivă a culorii.


#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

aumansoftware

Pentru a gestiona atât alinierea verticală și orizontală, cât și culoarea marcatorului de loc în iOS7. drawInRect și drawAtPoint nu mai utilizează contextul curent 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

Comentarii

  • Vă mulțumim pentru această soluție excelentă – care centrează corect textul pe verticală (util cu fonturi personalizate). Singurul lucru pe care l-aș adăuga este că această soluție nu este compatibilă cu iOS 6 sau mai vechi (destul de ușor de rezolvat prin revenirea la [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:NSLineBreakByTruncatingTail alignment:self.textAlignment]; –  > Por lifjoy.
HenryRootTwo

Swift 5 CU AVERTISMENT.

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

Avertismentul fiind că TREBUIE să introduceți un câmp nevid. String unde se află „DON’T_DELETE”, chiar dacă acest șir este setat în cod în altă parte. S-ar putea să vă economisiți cinci minute de zgârieturi de cap.

henning77

Suprascrierea drawPlaceholderInRect: ar fi calea corectă, dar nu funcționează din cauza unei erori în API (sau în documentație).

Metoda nu este niciodată apelată pe un fișier UITextField.

A se vedea, de asemenea, drawTextInRect pe UITextField nu este apelat

Ați putea folosi soluția lui digdog. Deoarece nu sunt sigur că aceasta trece de revizuirea Apples, am ales o soluție diferită: suprapunerea câmpului de text cu propria mea etichetă, care imită comportamentul de placeholder.

Codul arată astfel (rețineți că fac acest lucru în interiorul unei subclase de 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;
}

Comentarii

  • cum v-ați simți dacă ați împărtăși soluția dvs. de revizuire? –  > Por adam.
  • Am adăugat soluția pe care am folosit-o. A trebuit să fac câteva săpături, deoarece acest lucru a fost cu ceva timp în urmă 🙂 –  > Por henning77.
  • Am făcut ceva asemănător cu asta, dar am plasat codul într-o categorie și trebuia să fac o verificare în shouldChangeCharacters pentru a ști dacă să îl fac vizibil, care era o a doua metodă din categorie numită – (void) overlayPlaceholderVisible : (BOOL) visible; – (void) overlayPlaceholderVisible : (BOOL) visible; – –  > Por David van Dugteren.
amar

Iam nou la xcode și am găsit o cale de ocolire cu același efect.

Am plasat un uilabel în locul place holderului cu formatul dorit și îl ascund în

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

        case 1:
            lblPassword.hidden=YES;
            break;
 
        default:
            break;
    }
}

Sunt de acord că este o soluție de lucru și nu o soluție reală, dar efectul a fost același, am luat-o de aici link

NOTĂ: Încă funcționează pe iOS 7 😐

Aleksei Minaev

Cel mai bun pe care îl pot face pentru ambele iOS7 și mai puțin este:

- (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];
  }
}

Diego

Pentru cei care folosesc Monotouch (Xamarin.iOS), iată răspunsul lui Adam, tradus în C#:

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

Comentarii

  • Minunat. Acest lucru nu era chiar evident, probabil că m-ai salvat de ceva timp 🙂 Am editat totuși soluția ta, deoarece cred că este o idee mai bună să folosești fontul setat în Font a câmpului de text. –  > Por Wolfgang Schreurs.
Tomer Even

Aveam nevoie să păstrez alinierea placeholder-ului, așa că răspunsul lui adam nu era suficient pentru mine.

Pentru a rezolva acest lucru am folosit o mică variație care sper că va ajuta și pe unii dintre 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];
}

Comentarii

  • UILineBreakModeTailTruncation este depreciat începând cu iOS 6. –  > Por Supertecnoboff.
Mubin Shaikh
[txt_field setValue:ColorFromHEX(@"#525252") forKeyPath:@"_placeholderLabel.textColor"];

Comentarii

  • Un mic indiciu cu privire la acest lucru este că accesați un iVar privat (_placeholderLabel) și în trecut Apple a fost un pic cam finuț în legătură cu acest lucru. 🙂 –  > Por Alexander W.
Badal Shah

Pentru a seta Atribuit Placeholder de câmp text atribuit cu mai multe culori ,

Trebuie doar să specificați textul ,

  //txtServiceText is your Textfield
 [email protected]"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;

Ieșire: –

kolinko

O altă opțiune care nu necesită subclasare – lăsați placeholder-ul gol și puneți o etichetă deasupra butonului de editare. Gestionați eticheta la fel cum ați gestiona placeholder-ul (ștergerea odată ce utilizatorul introduce ceva..)

Comentarii

  • Cred că acest lucru ar fi eficient dacă aveți un singur câmp de text, dar dacă încercați să faceți această schimbare la o scară mai globală, această soluție ar adăuga o cantitate considerabilă de cheltuieli suplimentare la proiectul dvs. –  > Por James Parker.
Amul4608

În Swift 3

import UIKit

let TEXTFIELD_BLUE  = UIColor.blue
let TEXTFIELD_GRAY  = UIColor.gray

class DBTextField: UITextField {
    /// Tetxfield Placeholder Color
    @IBInspectable var palceHolderColor: UIColor = TEXTFIELD_GRAY
    func setupTextField () {
        self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "",
                                                            attributes:[NSForegroundColorAttributeName: palceHolderColor])
    }
}

class DBLocalizedTextField : UITextField {
    override func awakeFromNib() {
        super.awakeFromNib()
        self.placeholder = self.placeholder
    }
}

anka

Aș sugera o altă soluție. Din moment ce textul de tip placeholder utilizează setările implicite de font ale câmpului de text, setați doar culoarea inițială a fontului la culoarea fontului de tip placeholder pe care o doriți. Apoi, setați delegatul UITextField și implementați următoarele metode:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    //set color for text input
    textField.textColor = [UIColor blackColor];
    return YES;
}

- (BOOL)textFieldShouldClear:(UITextField *)textField
{
    //set color for placeholder text
    textField.textColor = [UIColor redColor];
    return YES;
}

Astfel, dacă un utilizator începe să tasteze în câmpul de text, culoarea textului se schimbă în negru, iar după ce câmpul de text este golit din nou, textul de tip placeholder va apărea din nou în culoarea roșie.

Salutări, Anka

Comentarii

  • Nu cred că placeholder-ul folosește de fapt textColor. –  > Por TinkerTank.
  • Pot confirma că placeholder-ul nu folosește proprietatea textColor. –  > Por Maciej Swic.