iPhone UITextField - Изменить цвет текста заполнителя

я хотел бы изменить цвет текста заполнителя, который я установил в своемUITextField контроли, чтобы сделать его черным.

Я предпочел бы сделать это без использования обычного текста в качестве заполнителя и необходимости переопределять все методы для имитации поведения заполнителя.

Я считаю, что если я переопределю этот метод:

- (void)drawPlaceholderInRect:(CGRect)rect

тогда я должен быть в состоянии сделать это. Но я'Я не уверен, как получить доступ к фактическому объекту-заполнителю из этого метода.

Ответы на вопрос(30)

Также в вашей раскадровке, без единой строки кода

 Petr Syrov29 апр. 2016 г., 16:01
Это'очень универсальный. Как только вы это знаете, используйте его везде;)
 Yawar29 апр. 2016 г., 14:44
Откуда ты это знаешь? Я думаю, что это лучший подход, но как об этом узнать? Пожалуйста, скажите, что я новичок в программировании на ios.
 David Ganster02 июн. 2016 г., 16:22
@Yawar Вы можете использовать инспектор иерархии представления в XCode, или исследовать представление в отладчике.
 Naishta05 июл. 2017 г., 18:25
хороший, независимо от текстового поля, вы можете использовать один и тот жеплитка / имя» для ключевого пути
 Yawar30 апр. 2016 г., 08:11
Я знаю, как только я пойму, что за этим стоит, я буду часто этим пользоваться. Но я имею в виду_placeholderLabel.textColor» это должно быть дочернее представление текстового поля. Есть ли способ увидеть этот тип информации об элементе управления?

Легко и безболезненно, может быть легкой альтернативой для некоторых.

_placeholderLabel.textColor

Компания Apple не может предлагать производство, но может отклонить вашу заявку.

 Quanlong12 июл. 2015 г., 18:19
Работает нормально на iOS 8.4
 Jack12 мар. 2014 г., 00:51
@ Джери, да, я делаю.
 पवन09 мая 2014 г., 13:58
Не уверен, что это работает в производстве, но это отличное решение. Спасибо :)
 Geri11 мар. 2014 г., 19:59
Вы используете это в производстве? Я имею в виду доступ к частной собственности.
 Philiiiiiipp22 июл. 2014 г., 20:00
Возможно, добавьте текст в ответ для быстрого копирования и вставки. _placeholderLabel.textColor
 vinbhai4u23 мая 2015 г., 13:45
работает со swift также спасибо
 Muhammad Adil11 янв. 2018 г., 11:33
@ Asadali у тебя, должно быть, другая причина, я неЯ думаю, что с одной стороны, Apple предоставляет такую функцию для настройки вещей, а с другой стороны, они отвергнут ее. Хорошо работает для меня.
 Adam G29 мар. 2018 г., 00:17
Я использовал это во многих, многих приложениях и никогда не имел ни одного отклонения ... по этой причине, во всяком случае :)
 Asad ali29 дек. 2015 г., 10:53
Дон»Я не использовал этот метод, я использовал этот и itune store, отклонил мое приложение.
 user194032117 мар. 2015 г., 04:34
у меня работал iOS8 Swift!
 dreamBegin09 июн. 2016 г., 12:46
почему нет ничего плохого? @Asadali
 Skrew10 авг. 2018 г., 15:00
Я думаю, что любой вид метода частной библиотеки НИКОГДА не должен быть рекомендован как решение чего-либо
 Sean Kladek30 авг. 2018 г., 17:33
@jungledev_placeholderLabel это частная собственность. Это решение может быть отклонено для использования частного API.
 jungledev26 июн. 2017 г., 16:59
@dreamBegin он, вероятно, был отклонен по несвязанной причине. Там'Нет причин, по которым Apple отклонит приложение из-за этого.
 vietnguyen0920 июн. 2014 г., 09:37
Хорошо работает на IOS 7.0, спасибо за лучшие решения.

Это решение для Swift 4.1

    textName.attributedPlaceholder = NSAttributedString(string: textName.placeholder!, attributes: [NSAttributedStringKey.foregroundColor : UIColor.red])
Для iOS 6.0 +
[textfield setValue:your_color forKeyPath:@"_placeholderLabel.textColor"];

Надеюсь, поможет.

Замечания: Apple может отклонить (0,01% шансов) ваше приложение, когда мы обращаемся к частному API. Я использую это во всех своих проектах с двух лет, но Apple непросить об этом.

 Fahim Parkar22 окт. 2016 г., 09:58
@ Яр: я все еще использую в iOS 10 Tooo ...
 Yar21 окт. 2016 г., 20:51
бросаетterminating with uncaught exception of type NSException для iOS8
 nburk06 янв. 2015 г., 12:57
немного хакерский, но работает как шарм! :)

Для установки заполнителя текстового поля Attributed с несколькими цветами,

Просто укажите текст,

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

Выход :-

Лучшее, что я могу сделать для iOS7 и меньше, это:

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

Категории FTW. Может быть оптимизирован для проверки эффективного изменения цвета.

#import 

@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

Я уже сталкивался с этой проблемой. В моем случае приведенный ниже код является правильным.

Цель С

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

Для Swift 4.X

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

Надеюсь, это может помочь вам.

 Yar21 окт. 2016 г., 20:48
Безразлично»т работает для iOS8
 Raviteja_DevObal02 апр. 2019 г., 15:32
@Ashu Спасибос заранее
 Raviteja_DevObal01 апр. 2019 г., 22:42
Безразлично»т работает для iOS 11
 Ashu02 апр. 2019 г., 07:39
@Raviteja_DevObal Позвольте мне проверить, скоро обновлю вас.
Решение Вопроса

Вы можете переопределитьdrawPlaceholderInRect:(CGRect)rect как таковой, чтобы вручную визуализировать текст заполнителя:

- (void) drawPlaceholderInRect:(CGRect)rect {
    [[UIColor blueColor] setFill];
    [[self placeholder] drawInRect:rect withFont:[UIFont systemFontOfSize:16]];
}
 Fred Collins01 дек. 2011 г., 23:38
Где я должен положить этот метод?drawPlaceholerInRect:
 Muhammad Aamir Ali21 мар. 2013 г., 13:38
что такое заполнитель в [self placeholder] ???
 Daniel Wood19 апр. 2012 г., 12:01
Еще лучше было бы использовать:[self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeClip alignment:self.textAlignment] поэтому textAlignment также распространяется.
 Krishnan01 дек. 2011 г., 15:28
@JoshuaWeinberg Есть ли какая-то конкретная причина вашего предложения.
 Tom Redman12 авг. 2013 г., 22:38
@MuhammadAamirALi Когда вы подклассUITextField, Это'переменная экземпляра NSStringplaceholder вашего классасуперкласс (UITextField). Узнать большеВот
 sean woodward10 дек. 2012 г., 18:05
@Krishnan, реализующий дублирующий метод в категории, не поддерживается, и вы никогда не можете быть уверены, какой метод будет вызван, или будут вызваны оба метода, или порядок, в котором они будут вызваны.
 Brian S01 окт. 2013 г., 03:55
В iOS7 вы можете изменить прямоугольник, используя CGRectInset (rect, 0, (rect.size.height - self.font.lineHeight) / 2.0) для вертикального центрирования текста.
 Daniel Wood19 апр. 2012 г., 11:54
Было бы намного лучше использоватьself.font скорее, чем[UIFont systemFontOfSize:16] так что изменение шрифта textfields все еще распространяется на заполнитель.
 Joshua Weinberg10 нояб. 2011 г., 18:17
Абсолютно НЕ делайте того, что сказал Котег. НИКОГДА не переопределяйте методы через категории. КОГДА-ЛИБО
 Sam Soffes12 сент. 2011 г., 20:36
Что-то вроде[self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment]; наверное лучше. Таким образом, вы будете уважатьtextAlignment имущество. Я добавил это в мойSSTextField учебный класс. Не стесняйтесь использовать в своих проектах.

ПереопределениеdrawPlaceholderInRect: будет правильным способом, но он не работает из-за ошибки в API (или документации).

Метод никогда не вызывается на.UITextField

Смотрите такжеdrawTextInRect на UITextField не вызывается

Вы могли бы использовать digdog 'с решением. Поскольку я не уверен, пройдет ли это через проверку Apple, я выбрал другое решение: наложить текстовое поле на собственную метку, которая имитирует поведение заполнителя.

Это немного грязно, хотя. Код выглядит следующим образом (обратите внимание, я делаю это внутри подкласса 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;
}
 mrdavenz29 янв. 2013 г., 01:13
Я сделал что-то похожее на это, но я поместил код в категорию, и мне нужно было проверить в mustChangeCharacters, нужно ли делать его видимым, что было вторым методом в категории - (void) overlayPlaceholderVisible: (BOOL) visible ;
 henning7702 мая 2010 г., 11:25
Я добавил решение, которое использовал. Мне пришлось немного покопаться, как это было некоторое время назад :)
 adam06 апр. 2010 г., 12:18
как бы вы поделились своим решением, дружественным к обзору?

При этом мы можем изменить цвет текстового поляs заполнитель текста в 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"];
 Moxarth14 июл. 2017 г., 15:13
это то, что я искал.
 imjaydeep14 июл. 2016 г., 07:47
Спасибо, приятель!! это работает отлично
Swift 3.0 + раскадровка

Чтобы изменить цвет заполнителя в раскадровке, создайте расширение со следующим кодом. (не стесняйтесь обновлять этот код, если вы думаете, он может быть яснее и безопаснее).

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

Версия 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)
        }
    }
}
 Milan Kamilya15 нояб. 2018 г., 12:17
Компилятор можетне узнать.NSAttributedStringKey

Следующие только с iOS6 + (как указано в Александр W 'комментарий):

UIColor *color = [UIColor grayColor];
nameText.attributedPlaceholder =
   [[NSAttributedString alloc]
       initWithString:@"Full Name"
       attributes:@{NSForegroundColorAttributeName:color}];
 Gaurav Gilani19 мая 2014 г., 14:53
да, теперь iOS6 + используется только.
 Alexander W19 мая 2014 г., 13:31
Это работает только для iOS6 +

Еще один вариант, который не• не требует подклассов - оставьте заполнитель пустым и поместите метку поверх кнопки редактирования. Управляйте меткой так же, как вы управляете местозаполнителем (очищая, когда пользователь вводит что-либо ...)

 Will Jenkins24 сент. 2013 г., 16:54
Насколько я могу судить, это самый разумный путь.
 James Parker09 июл. 2014 г., 15:03
Я думаю, что это будет эффективно, если у вас есть одно текстовое поле, но если выПопытка внести это изменение в более глобальном масштабе, это решение добавило бы значительный объем накладных расходов вашему проекту.

Это работает в Swift <3,0:

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

Протестировано в iOS 8.2 и iOS 8.3 beta 4.

Свифт 3:

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

Свифт 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])
 Daniel Benedykt17 февр. 2019 г., 16:02
По состоянию на 2019 год это должно быть решением
 Akshit Zaveri05 февр. 2015 г., 20:37
Использование вашего решения на iOS8.2 работает как шарм. Идеальное решение здесь. Использование в цели C также.

Почему Дон'т вы просто используетеUIAppearance метод:

[[UILabel appearanceWhenContainedIn:[UITextField class], nil] setTextColor:[UIColor whateverColorYouNeed]];
 HotJard03 авг. 2015 г., 14:10
Работает отлично! Цвет текста неt затронут (по крайней мере, с другим прокси для свойства textColor)
 Eduardo Costa30 дек. 2013 г., 18:10
Это также меняет цвет текста UITextField ...
 Mashhadi19 февр. 2014 г., 10:14
Вы удивительный человек, недурно. я думаю, это самый простой способ

с Адамаответ, переведенный на C #:

public class MyTextBox : UITextField
{
    public override void DrawPlaceholder(RectangleF rect)
    {
        UIColor.FromWhiteAlpha(0.5f, 1f).SetFill();
        new NSString(this.Placeholder).DrawString(rect, Font);
    }
}
 Wolfgang Schreurs06 дек. 2013 г., 21:55
Отлично. Это было не совсем очевидно, вы, вероятно, сэкономили мне некоторое время :) Я действительно редактировал ваше решение, так как я думаю, что это 'Лучше использовать набор шрифтов вFont свойство текстового поля.

Мне нужно было сохранить выравнивание заполнителя, так что АдамМне не хватило ответа.

Для решения этой проблемы я использовал небольшой вариант, который, надеюсь, поможет и некоторым из вас:

- (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];
}
 Supertecnoboff28 июл. 2015 г., 08:20
UILineBreakModeTailTruncation устарела с iOS 6.

Для разработчиков Xamarin.iOS я нашел это из этого документаhttps://developer.xamarin.com/api/type/Foundation.NSAttributedString/

textField.AttributedPlaceholder = new NSAttributedString ("Hello, world",new UIStringAttributes () { ForegroundColor =  UIColor.Red });
 Yohan Dahmani07 июн. 2017 г., 10:08
Спасибо !! Сначала я использовал CTStringAttributes, а не UIStringAttributes и не могне могу понять это. Будьте осторожны, чтобы не использовать это:new NSAttributedString("placeholderstring", new CTStringAttributes() { ForegroundColor = UIColor.Blue.CGColor });

iOS 6 и более поздние предложенияattributedPlaceholder наUITextField, iOS 3.2 и более поздние предложенияsetAttributes:range: на.NSMutableAttributedString

Вы можете сделать следующее:

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;
 Vinayaka Karjigi02 окт. 2013 г., 07:21
это было решено, я забыл установить шрифт для UITextfield, прежде чем использовать этот шрифт для текста заполнителя. моя вина
 Vinayaka Karjigi02 окт. 2013 г., 07:17
Не уверен, что является причиной проблемы, этот код я вызвал в viewdidLoad. новый цвет и размер шрифта появляется только после перерисовки. что-нибудь еще должно быть сделано вместе с этим?

Для обработки вертикального и горизонтального выравнивания, а также цвета заполнителя в iOS7. drawInRect и drawAtPoint больше не используют текущий контекст 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
 lifjoy03 июл. 2014 г., 01:48
Спасибо за это отличное решение, которое правильно центрирует текст по вертикали (полезно с пользовательскими шрифтами). Единственное, что я хотел бы добавить, - это то, что это решение не совместимо с iOS 6 или более ранней версией (достаточно просто исправить, воспользовавшись [self.placeholder drawInRect: rect withFont: self.font lineBreakMode: NSLineBreakByTruncatingTail alignment: self.textAlignment];

В Свифте:

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

В Swift 4.0:

if let placeholder = yourTextField.placeholder {
    yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder, 
        attributes: [NSAttributedStringKey.foregroundColor: UIColor.black])
}
 Markus28 сент. 2017 г., 17:31
Это лучший, спасибо. @apinho здесь ничего не вылетит
 Ronaldo Albertini25 окт. 2017 г., 22:15
// В Swift 4, если let placeholder = yourTextField.placeholder {yourTextField.attributedPlaceholder = NSAttributedString (string: placeholder, attribute: [NSAttributedStringKey.foregroundColor: UIColor.white])}
 apinho05 февр. 2016 г., 15:32
Если бы ты неt установить текст местозаполнителя перед вызовом, что это приведет к падению приложения
 Alessandro Vendruscolo27 дек. 2017 г., 16:09
Помните, что изменение значения текста заполнителя после выполнения этого кода вернет цвет заполнителя по умолчанию.

В Свифт 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
    }
}

Я новичок в Xcode, и я нашел способ обойти тот же эффект.

Я поместил uilabel в место заполнителя с желаемым форматом и скрыл его в

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

        case 1:
            lblPassword.hidden=YES;
            break;

        default:
            break;
    }
}

Я согласен, что это обходной путь, а не реальное решение, но эффект был тот же, получил это от этогоссылка на сайт

НОТА: Все еще работает на iOS 7: |

Начиная с введения приписанных строк в UIViews в iOS 6, это 'Можно назначить цвет для текста заполнителя следующим образом:

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.
}
 Norbert01 янв. 2014 г., 15:23
Это должно быть помечено как правильный ответ!
 user107113617 окт. 2013 г., 03:05
Отредактировано, чтобы убедиться, что разработчики знают о том, что этот ответ требует iOS 6.0.
 Durai Amuthan.H30 июл. 2013 г., 17:41
голосование за указание NSAttributed string ...
 Yunus Nedim Mehel24 окт. 2013 г., 17:08
Отличный ответ и благодарность за обновление ответа в соответствии с отзывами
 Matt Connolly08 сент. 2013 г., 23:49
Документы дляattributedPlaceholder говорит, что использует текстовые атрибуты, кроме цвета.
 user52323423 июн. 2013 г., 15:15
Для того, чтобы мини-заполнительs тусклый цвет, я также использовал: [color colorWithAlphaComponent: 0.5];
 user107113609 апр. 2014 г., 21:29
Да, я неМне тоже не нравится это редактирование моего ответа (часть о Интерфейсном Разработчике). Если это не такя не работаюЯ удалю это.
 user107113610 сент. 2013 г., 01:29
Я считаю, что они изменили интерфейс. Я нек сожалению, у меня нет старых, закешированных версий документа, но яЯ уверен, что описание было другим. РЕДАКТИРОВАТЬ: по-видимому, яЯ не прав, по крайней мере, в соответствии с Wayback Machine.
 Macistador22 июн. 2014 г., 16:10
IB часть не делалая работал в IOS8 beta2, вместо этого этот атрибут key-path сделал свою работу: _placeholderLabel.textColor
 gnasher72918 янв. 2016 г., 16:33
@MattConnolly: моя документация все еще говорит, что она использует атрибуты, за исключением цвета, который установлен на 70% серого. Пробовал только сейчас, кажется, что NSForegroundColorAttributeName работает, и 70% серый используется только если не задан цвет переднего плана. По крайней мере, [UIColor redColor], [UIColor blackColor] и [UIColor whiteColor] работали просто отлично.
 johnboiles31 мая 2014 г., 22:32
IB чаевые не делалиу меня тоже не работает.
 i_am_jorf09 апр. 2014 г., 21:37
Это неработать на меня; Я'буду проверять перед удалением. Но кажется, что это зависит от некоторых внутренних деталей реализации, которые могут не сохраняться вечно.attributedPlaceholder решение работает.
 Aron19 февр. 2014 г., 01:19
Отличный ответ, работает в iOS 7. Вот почемустоит прокрутить вниз :)
 gheese16 янв. 2013 г., 16:26
Это хорошо - но помните, что вам нужно установить значение заполнителя в IB, прежде чем это сработает
 dev4u21 мар. 2014 г., 11:11
Любая идея, почему этоне работает для атрибута - NSFontAttributeName[[NSAttributedString alloc] initWithString:@"placeholder" attributes: @{NSForegroundColorAttributeName: color, NSFontAttributeName : font}];
 user107113628 июн. 2013 г., 04:07
@ einsteinx2 - ям против включения этого кода в чек; это просто приведет к нарушению поведения в iOS < 6,0. Это означает, что вы не улучшили ответ, потому что вымы не предоставилиеще» пункт. Это'в любом случае
 gheese07 мар. 2013 г., 19:49
Стоит также обернуть это в вызовы RespondsToSelector, так как без него этот код будет аварийно завершен на цели развертывания до 6.0 (нераспознанный селектор отправлен на экземпляр).
 i_am_jorf09 апр. 2014 г., 21:27
На iOS 7 я получил эту ошибку:[ valueForUndefinedKey:]: this class is not key value coding-compliant for the key _field.

в быстрой 3.X

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

Свифт версия. Возможно, это кому-то поможет.

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

Вы можете изменить текстовый цвет заполнителя на любой другой цвет, используя приведенный ниже код.

UIColor *color = [UIColor lightTextColor];
YOURTEXTFIELD.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"PlaceHolder Text" attributes:@{NSForegroundColorAttributeName: color}];
 ZeMoon26 сент. 2014 г., 15:24
Чисто и максимально эффективно.
 AncAinu11 мая 2018 г., 13:11
Очень хорошо работает на iOS 11
 Dima Deplov04 дек. 2013 г., 23:59
Работает на UISearchBar, очень просто и круто
 Yar21 окт. 2016 г., 20:43
это так же, как выбранный ответ и нет работает для iOS7 +
 Manju24 февр. 2015 г., 16:28
Спасибо всем. Надеюсь, это помогло. Адлай Холлер попробуй, братан !!! Этот ответ был для предыдущей версии iOS. Если у вас есть лучший ответ, мы открыты для предложений.
 Manju02 апр. 2014 г., 11:30
Приятно знать, что мой ответ помогает вам решить проблему. Спасибо всем!
 Ian Hoar04 февр. 2014 г., 22:46
Лучший ответ предложил. Работает и использует документированные API.
 Adlai Holler24 дек. 2014 г., 19:45
Этот ответ не правильный - в соответствии с документами, информация о цвете текста в attributePlaceholder игнорируется.developer.apple.com/library/ios/documentation/UIKit/Reference/...
 Daniel Springer23 дек. 2018 г., 08:33
Работает в iOS 12
 gilsaints8815 мая 2014 г., 07:17
Как вы делаете эту работу для UISearchBar? Свойство attribuPlaceholder отсутствует.
 Ben Clayton01 апр. 2015 г., 15:18
Безразлично»не работает на iOS8, как тамНет атрибута attribuPlaceholder

Возможно, вы захотите попробовать этот способ, но Apple может предупредить вас о доступе к частному ivar:

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

НОТА

Это не работает на iOS 7 больше, по словам Мартина Алленас.

 alleus06 сент. 2013 г., 16:43
Heads up: это вылетает в iOS 7
 digdog21 мая 2010 г., 23:09
Я пытался, Бог обзора AppStore, кажется, преуспевает с этим.
 Jared Egan30 авг. 2012 г., 23:50
Похоже, это победилоне получить, но я неНе думаю, что это будет гарантированно работать со всеми версиями iOS, особенно в будущем. Использование чего-либо недокументированного является справедливой игрой для Apple, чтобы изменить и, таким образом, сломать ваше приложение.
 Michael Chourdakis11 дек. 2013 г., 19:18
В iOS 7 нет проблем - плюс некоторые документированные функции уже сломаны, несмотря ни на что. Это'с Apple 'с игрой ... мы просто должны понять.
 Vignesh17 окт. 2011 г., 18:14
Это не работает для меня. Это все еще в оригинальном цвете. :(
 Sveinung Kval Bakken17 дек. 2012 г., 14:37
Это не магазин приложений безопасно и долженне будь воодушевлен, тыне гарантируется получение одобрения или пребывание в одобренных с этими методами.
 RodolfoAntonici21 июн. 2016 г., 18:45
iOS 8.2, это вызывает исключение
 Hless25 февр. 2014 г., 16:11
Я бы определенно поставил@try @catch блокировать вокруг этого. Я беспокоюсь о том, что произойдет с вашим приложением, если Apple решит удалить_placeholderLabel iVar и ты неправильно обработать исключение ^^
 Srinivas20 окт. 2011 г., 09:12
любое тело, пожалуйста, скажите мне, если мы будем использовать вышеуказанный код, он будет отклонен яблоком
 Michael A.08 мая 2012 г., 11:00
Я использую этот метод в своем приложении. Обзор был в порядке. Так что я думаю этоЭто нормально использовать.
 Chintan Patel27 авг. 2012 г., 07:22
@colorblue Это установит цвет текста, в то время как вопрос о цвете текста заполнителя.
 pablasso29 янв. 2013 г., 01:01
Это не должноне имеет значения, если этоодобрено или нет. Важно то, что это может сломать ваше приложение в будущих обновлениях ОС.
 WCByrne16 окт. 2013 г., 18:54
У меня нет проблем с iOS 7 ... Я попробовал, несмотря на заметку, и, кажется, она работает нормально, и я "Мы использовали этот подход в прошлом без проблем.
 Genevios16 нояб. 2017 г., 10:49
IOS 11 работает потрясающе!
 dlinsin07 мар. 2010 г., 10:18
кто-нибудь знает, проходит ли это через обзор?
 imcc23 мая 2012 г., 02:14
Это старый пост, но я просто хочу добавить мои 2 цента: [self.myTextField setTextColor: [UIColor darkGrayColor]];
[txt_field setValue:ColorFromHEX(@"#525252") forKeyPath:@"_placeholderLabel.textColor"];
 Alexander W04 нояб. 2014 г., 13:18
Небольшой намек на это заключается в том, что у вас есть доступ к частному iVar (_placeholderLabel), а в прошлом Apple немного привыкла к этому. :)

Ваш ответ на вопрос