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

566

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

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

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

- (void)drawPlaceholderInRect:(CGRect)rect

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

Адам
источник

Ответы:

804

Начиная с введения приписанных строк в 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.
}
user1071136
источник
2
Это хорошо - но помните, что вам нужно установить значение заполнителя в IB, прежде чем это сработает
gheese
4
Стоит также обернуть это в вызовы
RespondsToSelector, так
5
Документы для attributedPlaceholderговорит, что использует текстовые атрибуты, за исключением цвета.
Мэтт Коннолли
1
Любая идея, почему это не работает для атрибута - NSFontAttributeName [[NSAttributedString alloc] initWithString:@"placeholder" attributes: @{NSForegroundColorAttributeName: color, NSFontAttributeName : font}];
dev4u
3
На iOS 7 я получил эту ошибку:[<UITextField 0x11561d90> valueForUndefinedKey:]: this class is not key value coding-compliant for the key _field.
i_am_jorf
237

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

_placeholderLabel.textColor

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

Джек
источник
1
Вы используете это в производстве? Я имею в виду доступ к частной собственности.
Джери Борбас
11
Возможно, добавьте текст в ответ для быстрого копирования и вставки. _placeholderLabel.textColor
Philiiiiiipp
47
Не используйте этот метод, я использовал это и itune store, отклонил мое приложение.
Асад Али
1
Я думаю, что НИКОГДА не следует рекомендовать какой-либо метод частной библиотеки в качестве решения чего-либо
Skrew
2
@jungledev _placeholderLabelявляется частной собственностью. Это решение может быть отклонено для использования частного API.
Шон Кладек
194

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

- (void) drawPlaceholderInRect:(CGRect)rect {
    [[UIColor blueColor] setFill];
    [[self placeholder] drawInRect:rect withFont:[UIFont systemFontOfSize:16]];
}
Адам
источник
44
Что-то вроде [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];, наверное, лучше. Таким образом, вы будете уважать textAlignmentсобственность. Я добавил это в мой класс SSTextField . Не стесняйтесь использовать в своих проектах.
Сэм Соффс
52
Абсолютно НЕ делайте того, что сказал Котег. НИКОГДА не переопределять методы через категории. EVER
Joshua Weinberg
8
@JoshuaWeinberg Есть ли какая-то конкретная причина вашего предложения.
Кришнан
5
@Krishnan, реализующий дублирующий метод в категории, не поддерживается, и вы никогда не можете быть уверены, какой метод будет вызван, или будут вызваны оба метода, или порядок, в котором они будут вызваны.
Шон Вудворд
8
В iOS7 вы можете изменить прямоугольник, используя CGRectInset (rect, 0, (rect.size.height - self.font.lineHeight) / 2.0) для вертикального центрирования текста.
Брайан С
171

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

UIColor *color = [UIColor lightTextColor];
YOURTEXTFIELD.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"PlaceHolder Text" attributes:@{NSForegroundColorAttributeName: color}];
Манжу
источник
6
Лучший ответ предложил. Работает и использует документированные API.
Ян Хоар
2
Как вы делаете эту работу для UISearchBar? Свойство attribuPlaceholder отсутствует.
gilsaints88
1
Этот ответ не верен - в соответствии с документами информация о цвете текста attribuPlaceholder игнорируется developer.apple.com/library/ios/documentation/UIKit/Reference/…
Adlai Holler
Спасибо всем. Надеюсь, это помогло. Адлай Холлер, попробуй, братан !!! Этот ответ был для предыдущей версии iOS. Если у вас есть лучший ответ, мы открыты для предложений.
Манджу
Не работает на iOS8, так как там нет свойства attribuPlaceholder
Бен Клэйтон,
157

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

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

ПРИМЕЧАНИЕ.
По словам Мартина Аллеуса, это больше не работает на iOS 7.

digdog
источник
6
Я использую этот метод в своем приложении. Обзор был в порядке. Так что я думаю, что это нормально.
Майкл А.
9
Это не безопасно для магазина приложений и не должно поощряться, вам не гарантировано одобрение или соблюдение этих методов.
Свейнунг Кваль Баккен
31
Не должно иметь значения, одобрено это или нет. Важно то, что это может сломать ваше приложение в будущих обновлениях ОС.
Паблассо
2
У меня не было проблем с iOS 7 ... Я попробовал, несмотря на заметку, и она, кажется, работает нормально, и я использовал этот подход в прошлом без проблем.
WCByrne
6
Это всегда была плохая идея, и теперь она не работает на iOS 13: Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bugRy
Райдер Маккей,
154

Это работает в 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])
Tomino
источник
Использование вашего решения на iOS8.2 работает как шарм. Идеальное решение здесь. Использование в цели C также.
Акшит Завери
73

В Свифте:

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])
}
Beninho85
источник
Если вы не установили текст местозаполнителя до вызова, что это приведет к сбою приложения
apinho
Это лучший, спасибо. @apinho здесь ничего не вылетит
Маркус
// В Swift 4, если let placeholder = yourTextField.placeholder {yourTextField.attributedPlaceholder = NSAttributedString (string: placeholder, attribute: [NSAttributedStringKey.foregroundColor: UIColor.white])}
Роналду Альбертини
Помните, что изменение значения текста заполнителя после выполнения этого кода вернет цвет заполнителя по умолчанию.
Алессандро Вендрусколо,
66

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

Версия 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)
        }
    }
}
Ник Ков
источник
Компилятор не может узнать NSAttributedStringKey.
Милан Камиля
Работает в iOS 13
Jalil
43

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

UIColor *color = [UIColor grayColor];
nameText.attributedPlaceholder =
   [[NSAttributedString alloc]
       initWithString:@"Full Name"
       attributes:@{NSForegroundColorAttributeName:color}];
Гаурав Гилани
источник
33

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

Цель С

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

Для Swift 4.X

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

Для iOS 13 Swift Code

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

Вы также можете использовать приведенный ниже код для iOS 13

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

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

Ашу
источник
@ Ашу это приводит к сбою в ios 13 'Доступ к _placeholderLabel ivar UITextField запрещен. Это ошибка приложения, это даже не сборка. Я не говорю о размещении в AppStore
Мелани,
1
IOS 13, это было ограничено, больше не могу использовать это
Кишор Кумар
Код objc протестирован на IOS 13 и не работает.
Mehdico
1
@ Mehdico Я обновил ответ для iOS 13. Надеюсь, это поможет вам.
Ашу
Мне потребовалось слишком много времени, чтобы понять, что я должен был внести это изменение в viewWillAppearили viewDidAppear. viewDidLoadслишком рано
Четыре
32

При этом мы можем изменить цвет текста заполнителя текстового поля в 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
Начиная с iOS13 это не сработает
Тедди
@ Тедди, как ты это сделал сейчас? У меня начались проблемы с этим.
Джалил
@ Джалил Надеюсь, я все еще нахожусь для тебя. textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString: @ атрибуты "text": @ {NSForegroundColorAttributeName: [UIColor colorWithHexString: @ "ffffff55"]}];
Тедди
18

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

[[UILabel appearanceWhenContainedIn:[UITextField class], nil] setTextColor:[UIColor whateverColorYouNeed]];
Валерий Лидер
источник
Работает отлично! Цвет текста не
изменяется
18

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

введите описание изображения здесь

Петр Сыров
источник
1
Откуда ты это знаешь? Я думаю, что это лучший подход, но как об этом узнать? Пожалуйста, скажите, что я новичок в программировании на ios.
Явар
2
Это очень универсально. Как только вы узнаете, используйте его повсюду;)
Петр Сыров
Я знаю, как только я пойму, что за этим стоит, я буду часто этим пользоваться. Но я имею в виду "_placeholderLabel.textColor", это должно быть дочерним представлением текстового поля. Есть ли способ увидеть этот тип информации об элементе управления?
Явар
2
@Yawar Вы можете использовать инспектор иерархии представления в XCode, или исследовать представление в отладчике.
Дэвид Ганстер
хороший, независимо от текстового поля, вы можете использовать одну и ту же «плитку / имя» для keypath
Naishta
16

в быстрой 3.X

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

в кратчайшие сроки 5

textField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes: [NSAttributedString.Key.foregroundColor : UIColor.black])
Махапал Сингх
источник
12

Для iOS 6.0 +

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

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

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

Фахим Паркар
источник
выкидывает terminating with uncaught exception of type NSExceptionдля iOS8
Яр
10

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

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

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

class TextField: UITextField {
   override var placeholder: String? {
        didSet {
            let placeholderString = NSAttributedString(string: placeholder!, attributes: [NSForegroundColorAttributeName: UIColor.whiteColor()])
            self.attributedPlaceholder = placeholderString
        }
    }
}
Макс Тымчий
источник
6

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


#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
источник
6

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

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;
Уильям Пауэр
источник
Не уверен, что является причиной проблемы, этот код я вызвал в viewdidLoad. новый цвет и размер шрифта появляется только после перерисовки. что-нибудь еще должно быть сделано вместе с этим?
Винаяка Карджиги
это было решено, я забыл установить шрифт для UITextfield, прежде чем использовать этот шрифт для текста заполнителя. мой плохой
Винаяка Карджиги
6

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

    textName.attributedPlaceholder = NSAttributedString(string: textName.placeholder!, attributes: [NSAttributedStringKey.foregroundColor : UIColor.red])
Мантош Кумар
источник
4

Переопределение 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;
}
henning77
источник
как бы вы поделились своим решением, дружественным к обзору?
Адам
Я добавил решение, которое использовал. Мне пришлось немного покопаться, как это было некоторое время назад :)
henning77
Я сделал что-то похожее на это, но я поместил код в категорию, и мне нужно было проверить в mustChangeCharacters необходимость сделать его видимым, что было вторым методом в категории - (void) overlayPlaceholderVisible: (BOOL) visible ;
Дэвид ван Дугтерен
3

Я новичок в 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: |

амар
источник
3

Свифт 5 с плащом.

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

Предостережение в том, что вы ДОЛЖНЫ ввести непустое значение String"DON'T_DELETE", даже если эта строка установлена ​​в другом месте кода. Может сэкономить вам пять минут головокружения.

HenryRootTwo
источник
2

Лучшее, что я могу сделать для 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];
  }
}
Алексей Минаев
источник
2

Для тех, кто использует Monotouch (Xamarin.iOS), вот ответ Адама, переведенный на C #:

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

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

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

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

    [color setFill];
    [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];
}
Томер Эвен
источник
UILineBreakModeTailTruncationустарела с iOS 6.
Supertecnoboff
1
[txt_field setValue:ColorFromHEX(@"#525252") forKeyPath:@"_placeholderLabel.textColor"];
Мубин Шейх
источник
Небольшой намек на это заключается в том, что у вас есть доступ к частному iVar (_placeholderLabel), и в прошлом Apple немного привыкла к этому. :)
Александр W
1

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

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

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

Вывод :-

введите описание изображения здесь

Бадал Шах
источник
0

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

Колинько
источник
Я думаю, что это было бы эффективно, если бы у вас было одно текстовое поле, но если вы пытаетесь внести это изменение в более глобальном масштабе, это решение добавило бы значительную нагрузку на ваш проект.
Джеймс Паркер