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.

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

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.


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

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

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.


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

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

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

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

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 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"];

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

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


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

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.


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

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

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

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

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;

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

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

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: |


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.


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

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

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

UILineBreakModeTailTruncationestá obsoleto a partir do iOS 6.
Supertecnoboff

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

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


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.