iPhone UITextField - Alterar a cor do texto do espaço reservado

566

Gostaria de mudar a cor do texto do espaço reservado que defini nos meus UITextFieldcontroles, para torná-lo preto.

Prefiro fazer isso sem usar texto normal como espaço reservado e ter que substituir todos os métodos para imitar o comportamento de um espaço reservado.

Eu acredito que se eu substituir esse método:

- (void)drawPlaceholderInRect:(CGRect)rect

então eu deveria ser capaz de fazer isso. Mas não tenho certeza de como acessar o objeto de espaço reservado real de dentro desse método.

Adão
fonte

Respostas:

804

Desde a introdução de cadeias atribuídas em UIViews no iOS 6, é possível atribuir uma cor ao texto do espaço reservado como este:

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.
}
user1071136
fonte
2
Isso é bom - mas lembre-se que você precisa para definir um valor de espaço reservado no IB antes deste trabalho vontade
gheese
4
sua também vale embrulho isto em uma chamada respondsToSelector - pois sem ele este código irá falhar no alvo pre 6,0 implantação (selector não reconhecido enviada à instância)
gheese
5
Os documentos para o attributedPlaceholderque diz usa atributos de texto, exceto para cores.
Matt Connolly
1
Qualquer idéia de por que ele não está funcionando para o atributo - NSFontAttributeName [[NSAttributedString alloc] initWithString:@"placeholder" attributes: @{NSForegroundColorAttributeName: color, NSFontAttributeName : font}];
Dev4u
3
No iOS 7, recebi este erro:[<UITextField 0x11561d90> valueForUndefinedKey:]: this class is not key value coding-compliant for the key _field.
i_am_jorf
237

Fácil e sem dor, pode ser uma alternativa fácil para alguns.

_placeholderLabel.textColor

Não sugerido para produção, a Apple pode rejeitar seu envio.

Jack
fonte
1
Você está usando isso na produção? Eu pretendo acessar uma propriedade privada.
Geri Borbás
11
Talvez adicione o texto à sua resposta para copiar e colar rapidamente. _placeholderLabel.textColor
Philiiiiiipp
47
Não use esse método, eu usei isso e a loja do itune rejeitou meu aplicativo.
Asad Ali
1
Eu acho que qualquer tipo de método de biblioteca privada NUNCA deve ser recomendada como solução para qualquer coisa
Skrew
2
@jungledev _placeholderLabelé uma propriedade privada. Esta solução está sujeita a ser rejeitada pelo uso da API privada.
Sean Kladek
194

Você pode substituir drawPlaceholderInRect:(CGRect)rectcomo tal para renderizar manualmente o texto do espaço reservado:

- (void) drawPlaceholderInRect:(CGRect)rect {
    [[UIColor blueColor] setFill];
    [[self placeholder] drawInRect:rect withFont:[UIFont systemFontOfSize:16]];
}
Adão
fonte
44
Algo como [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];é provavelmente melhor. Dessa forma, você respeitará a textAlignmentpropriedade. Eu adicionei isso à minha classe SSTextField . Sinta-se livre para usar em seus projetos.
Sam Soffes
52
Absolutamente NÃO faça o que Koteg disse. NUNCA substitua métodos por categorias. SEMPRE
Joshua Weinberg
8
@JoshuaWeinberg Existe algum motivo específico por trás da sua sugestão.
Krishnan
5
O @Krishnan que implementa um método duplicado em uma categoria não é suportado, e você nunca pode ter certeza de qual método será chamado, ou se ambos serão chamados, ou a ordem em que serão chamados.
Sean Woodward
8
No iOS7, você pode alterar o rect usando CGRectInset (rect, 0, (rect.size.height - self.font.lineHeight) / 2.0) para centralizar verticalmente o texto.
Brian S
171

Você pode alterar a cor do texto do espaço reservado para qualquer cor que desejar, usando o código abaixo.

UIColor *color = [UIColor lightTextColor];
YOURTEXTFIELD.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"PlaceHolder Text" attributes:@{NSForegroundColorAttributeName: color}];
Manju
fonte
6
Melhor resposta sugerida. Funciona e usa APIs documentadas.
Ian Hoar
2
Como você faz isso funcionar para o UISearchBar? Não há propriedade attributePlaceholder.
gilsaints88
1
Esta resposta não está correta - de acordo com os documentos, as informações de cor do texto do attributePlaceholder são ignoradas developer.apple.com/library/ios/documentation/UIKit/Reference/…
Adlai Holler
Obrigado a todos. Espero que tenha sido de alguma ajuda. Adlai Holler experimentá-lo mano !!! Esta resposta foi para a versão anterior do iOS. Se você tiver uma resposta melhor, estamos abertos a sugestões.
Manju
Não funciona em iOS8 como não há nenhuma propriedade attributedPlaceholder
Ben Clayton
157

Talvez você queira tentar dessa maneira, mas a Apple pode avisá-lo sobre o acesso ao ivar privado:

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

OBSERVAÇÃO
Isso não está mais funcionando no iOS 7, de acordo com Martin Alléus.

digdog
fonte
6
Eu uso esse método no meu aplicativo. A revisão foi boa. Então eu acho que é bom usá-lo.
Michael A.
9
Isso não é seguro para a loja de aplicativos e não deve ser incentivado, você não tem garantia de obter aprovação ou permanecer aprovado com essas técnicas.
Sveinung Kval Bakken
31
Realmente não importa se é aprovado ou não. O importante é que isso pode interromper seu aplicativo em futuras atualizações do sistema operacional.
Pablasso
2
Não tendo nenhum problema com o iOS 7 ... Tentei apesar da nota e parece funcionar bem e usei essa abordagem no passado sem problemas.
WCByrne
6
Este foi sempre uma má idéia, e agora está quebrado no iOS 13: Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug😈
Ryder Mackay
154

Isso funciona no Swift <3.0:

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

Testado no 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])
Tomino
fonte
Usando sua solução no iOS8.2, funciona como um encanto. Solução perfeita aqui. Usando no objetivo C também.
Akshit Zaveri
73

Em Swift:

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

No Swift 4.0:

if let placeholder = yourTextField.placeholder {
    yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder, 
        attributes: [NSAttributedStringKey.foregroundColor: UIColor.black])
}
Beninho85
fonte
Se você não definir o texto do espaço reservado antes de chamar que ele irá travar o aplicativo
apinho
Este é o melhor, obrigado. @apinho nada vai falhar aqui #
Markus
// No Swift 4, se placeholder = yourTextField.placeholder {yourTextField.attributedPlaceholder = NSAttributedString (string: placeholder, attribute: [NSAttributedStringKey.foregroundColor: UIColor.white])}
Ronaldo Albertini
Lembre-se de que alterar o valor do texto do espaço reservado após a execução desse código trará de volta a cor padrão do espaço reservado.
Alessandro Vendruscolo
66

Swift 3.0 + Storyboard

Para alterar a cor do espaço reservado no storyboard, crie uma extensão com o próximo código. (fique à vontade para atualizar esse código, se você acha que pode ser mais claro e seguro).

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

insira a descrição da imagem aqui

Versão 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)
        }
    }
}

Versão 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)
        }
    }
}
Nik Kov
fonte
O compilador não pode descobrir NSAttributedStringKey.
Milan Kamilya 15/11/19
Funciona no iOS 13
Jalil
43

A seguir, apenas com iOS6 + (conforme indicado no comentário de Alexander W):

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

Eu já havia enfrentado esse problema. No meu caso, o código abaixo está correto.

Objetivo C

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

Para Swift 4.X

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

Para iOS 13 Swift Code

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

Você também pode usar o código abaixo para iOS 13

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

Espero que isso possa ajudá-lo.

Ashu
fonte
@Ashu isso causa falha no iOS 13 'É proibido o acesso ao _placeholderLabel ivar do UITextField. Este é um erro de aplicação' não vai ser até mesmo construir não estou falando sobre a colocação em AppStore
Melany
1
IOS 13 este era restrito não pode usar mais isso
Kishore Kumar
O código Objc é testado no IOS 13 e não funciona.
Mehdico 26/11/19
1
@Mehdico Atualizei a resposta para o iOS 13. Espero que isso ajude você.
Ashu
Demorei muito para saber que eu tinha que fazer essa mudança viewWillAppearouviewDidAppear . viewDidLoadé muito cedo.
Quatro
32

Com isso, podemos mudar a cor do texto do espaço reservado no campo de texto no 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"];
Uma Madhavi
fonte
1
A partir de iOS13 isso não vai funcionar
Teddy
@Teddy, como você fez isso agora? Comecei a ter problemas com isso.
Jalil
@ Jalil Espero ainda chegar a tempo para você. textField.attributedPlaceholder = [[alocação de NSAttributedString] initWithString: @ atributos "text": @ {NSForegroundColorAttributeName: [UIColor colorWithHexString: @ "ffffff55"]}];
Teddy
18

Por que você não usa apenas o UIAppearancemétodo:

[[UILabel appearanceWhenContainedIn:[UITextField class], nil] setTextColor:[UIColor whateverColorYouNeed]];
Valerii Lider
fonte
Funciona bem! Cor do texto não afetado (pelo menos com proxy diferente para textColor propriedade)
HotJard
18

Também no seu storyboard, sem uma única linha de código

insira a descrição da imagem aqui

Petr Syrov
fonte
1
Como você sabe disso? É a melhor abordagem, eu acho, mas como alguém pode saber disso? Por favor, diga que eu sou novo na programação iOS.
Yawar
2
É muito universal. Depois que você souber usá-lo em todos os lugares;)
Petr Syrov 29/04
Sei que, depois de entender o que está por trás, vou usá-lo bastante. Mas quero dizer "_placeholderLabel.textColor", que deve ser uma visão filho do campo de texto. Existe uma maneira de ver esse tipo de informação sobre um controle?
Yawar
2
@Yawar Você pode usar o inspetor de hierarquia de visualizações no Xcode ou fazer uma inspeção interna da visualização no depurador.
David Ganster
bom, independentemente do campo de texto, você pode usar o mesmo 'telha / name' para caminho-chave
Naishta
16

no rápido 3.X

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

no rápido 5

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

Para iOS 6.0 +

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

Espero que ajude.

Nota: a Apple pode rejeitar (chances de 0,01%) seu aplicativo enquanto estamos acessando a API privada. Estou usando isso em todos os meus projetos há dois anos, mas a Apple não pediu isso.

Fahim Parkar
fonte
joga um terminating with uncaught exception of type NSExceptionpara iOS8
Yar
10

Para desenvolvedores do Xamarin.iOS, encontrei-o neste documento https://developer.xamarin.com/api/type/Foundation.NSAttributedString/

textField.AttributedPlaceholder = new NSAttributedString ("Hello, world",new UIStringAttributes () { ForegroundColor =  UIColor.Red });
ManuQiao
fonte
Obrigado !! Eu estava usando CTStringAttributes e não UIStringAttributes e não consegui descobrir. Cuidado para não usar isso:new NSAttributedString("placeholderstring", new CTStringAttributes() { ForegroundColor = UIColor.Blue.CGColor });
Yohan Dahmani 7/17
9

Versão rápida. Provavelmente ajudaria alguém.

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

Categorias FTW. Pode ser otimizado para verificar se há alteração de cor eficaz.


#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
osxdirk
fonte
6

Para lidar com o alinhamento vertical e horizontal, bem como a cor do espaço reservado no iOS7. drawInRect e drawAtPoint não usam mais o contexto atual 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
aumansoftware
fonte
Obrigado por esta excelente solução - que centraliza corretamente o texto verticalmente (útil com fontes personalizadas). A única coisa que gostaria de acrescentar é que esta solução não é compatível com o iOS 6 ou mais antigo (fácil de corrigir, recorrendo a [self.placeholder drawInRect: rect withFont: self.font lineBreakMode: NSLineBreakByTruncatingTail alignment: self.textAlignment];
lifjoy
6

iOS 6 e ofertas posteriores attributedPlaceholdersobre UITextField. iOS 3.2 e ofertas posteriores setAttributes:range:sobre NSMutableAttributedString.

Você pode fazer o seguinte:

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;
William Power
fonte
Não tenho certeza do que está causando o problema, esse código eu chamei em viewdidLoad. nova cor e tamanho da fonte aparecem somente após o redesenho. mais alguma coisa precisa ser feita junto com isso?
Vinayaka Karjigi
foi resolvido, esqueci de definir a fonte para o UITextfield antes de usar essa fonte para o texto do espaço reservado. meu mau
Vinayaka Karjigi
6

Esta solução para o Swift 4.1

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

Substituir drawPlaceholderInRect:seria a maneira correta, mas não funciona devido a um erro na API (ou na documentação).

O método nunca é chamado em um UITextField.

Consulte também drawTextInRect em UITextField não chamado

Você pode usar a solução do digdog. Como não tenho certeza se isso passa pela revisão da Apple, escolhi uma solução diferente: sobreponha o campo de texto com meu próprio rótulo, o que imita o comportamento do espaço reservado.

Isso é um pouco confuso. O código se parece com isso (observe que estou fazendo isso dentro de uma subclasse 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;
}
henning77
fonte
como você se sentiria em compartilhar sua solução ideal para revisão?
adam
Eu adicionei a solução que usei. Eu tive que cavar um pouco, pois isso foi há algum tempo :) :)
henning77
Fiz algo semelhante a isso, mas coloquei o código em uma categoria e precisava fazer check-shouldChangeCharacters para torná-lo visível, que era um segundo método na categoria chamado - (void) overlayPlaceholderVisible: (BOOL) visible ;
David van Dugteren
3

Sou novo no xcode e encontrei uma maneira de contornar o mesmo efeito.

Coloquei um uilabel no lugar do marcador de lugar com o formato desejado e o ocultei

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

        case 1:
            lblPassword.hidden=YES;
            break;

        default:
            break;
    }
}

Concordo que é uma solução alternativa e não uma solução real, mas o efeito foi o mesmo obtido neste link

NOTA: Ainda funciona no iOS 7: |

amar
fonte
3

Swift 5 COM CAVEAT.

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

A ressalva é que você DEVE inserir um não vazio Stringonde "DON'T_DELETE" esteja, mesmo que essa string esteja definida em código em outro lugar. Pode poupar cinco minutos de rastreamento de cabeça.

HenryRootTwo
fonte
2

O melhor que posso fazer pelo iOS7 e menos é:

- (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];
  }
}
Aleksei Minaev
fonte
2

Para aqueles que usam o Monotouch (Xamarin.iOS), aqui está a resposta de Adam, traduzida para C #:

public class MyTextBox : UITextField
{
    public override void DrawPlaceholder(RectangleF rect)
    {
        UIColor.FromWhiteAlpha(0.5f, 1f).SetFill();
        new NSString(this.Placeholder).DrawString(rect, Font);
    }
}
Diego
fonte
Ótimo. Isso não era realmente óbvio, você provavelmente me salvou um pouco :) No entanto, editei sua solução, já que acho melhor usar a fonte definida na Fontpropriedade do campo de texto.
Wolfgang Schreurs
1

Eu precisava manter o alinhamento do espaço reservado para que a resposta de Adam não fosse suficiente para mim.

Para resolver isso, usei uma pequena variação que, espero, também ajude alguns de vocês:

- (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];
}
Tomer Even
fonte
UILineBreakModeTailTruncationestá obsoleto a partir do iOS 6.
Supertecnoboff
1
[txt_field setValue:ColorFromHEX(@"#525252") forKeyPath:@"_placeholderLabel.textColor"];
Mubin Shaikh
fonte
Uma pequena dica disso é que você está acessando um iVar privado (_placeholderLabel) e, no passado, a Apple era um pouco instável em fazer isso. :)
Alexander W
1

Para definir espaço reservado para campo de texto atribuído com várias cores,

Basta especificar o texto,

  //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;

Resultado :-

insira a descrição da imagem aqui

Badal Shah
fonte
0

Outra opção que não requer subclassificação - deixe o espaço reservado em branco e coloque um rótulo no topo do botão de edição. Gerencie o rótulo da mesma maneira que gerenciaria o espaço reservado (limpando assim que o usuário inserir qualquer coisa ..)

Kolinko
fonte
Eu acho que isso seria eficiente se você tiver um campo de texto, mas se você estiver tentando fazer essa alteração em uma escala mais global, essa solução adicionaria uma quantidade considerável de sobrecarga ao seu projeto.
James Parker