iPhone UITextField-изменение цвета текста заполнителя
Я хотел бы изменить цвет текста заполнителя, который я установил в моем UITextField элементы управления, чтобы сделать его черным.
Я бы предпочел сделать это без использования обычного текста в качестве заполнителя и переопределения всех методов для имитации поведения заполнителя.
Я считаю, что если я переопределить этот метод:
- (void)drawPlaceholderInRect:(CGRect)rect
затем я должен быть в состоянии сделать это. Но я не уверен, как получить доступ к фактическому объекту-заполнителю из этого метода.
30 ответов:
С момента введения атрибутивных строк в 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. }
легкий и безболезненный, может быть легкой альтернативой для некоторых.
_placeholderLabel.textColorне рекомендуется для производства, Apple может отклонить ваше представление.
можно переопределить
drawPlaceholderInRect:(CGRect)rectкак таковой, чтобы вручную отобразить текст заполнителя:- (void) drawPlaceholderInRect:(CGRect)rect { [[UIColor blueColor] setFill]; [[self placeholder] drawInRect:rect withFont:[UIFont systemFontOfSize:16]]; }
может быть, вы хотите попробовать этот способ, но Apple может предупредить вас о доступе к private ivar:
[self.myTextField setValue:[UIColor darkGrayColor] forKeyPath:@"_placeholderLabel.textColor"];Примечание
По словам Мартина Аллеуса, это больше не работает на iOS 7.
вы можете изменить заполнитель textcolor на любой цвет, который вы хотите, используя приведенный ниже код.
UIColor *color = [UIColor lightTextColor]; YOURTEXTFIELD.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"PlaceHolder Text" attributes:@{NSForegroundColorAttributeName: color}];
это работает в Swift
myTextField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes: [NSForegroundColorAttributeName : UIColor.redColor()])протестировано в iOS 8.2 и 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])
В Swift:
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]) }
следующее только с iOS6+ (как указано в комментарии Александра W):
UIColor *color = [UIColor grayColor]; nameText.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Full Name" attributes:@{NSForegroundColorAttributeName:color}];
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 version
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) } } }
С помощью этого мы можем изменить цвет текста заполнителя текстового поля в 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"];
Я уже сталкивался с этой проблемой. В mycase ниже код правильный.
[textField setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];надеюсь, это может помочь вам. Он работает на 7.0 и выше.
почему бы вам просто не использовать
UIAppearanceспособ:[[UILabel appearanceWhenContainedIn:[UITextField class], nil] setTextColor:[UIColor whateverColorYouNeed]];
для iOS 6.0 +
[textfield setValue:your_color forKeyPath:@"_placeholderLabel.textColor"];надеюсь, что это помогает.
Примечание:Apple может отклонить (0,01% шансов) ваше приложение, поскольку мы обращаемся к частному API. Я использую это во всех своих проектах с двух лет, но Apple не просила об этом.
Для Xamarin.разработчики iOS, я нашел его из этого документа https://developer.xamarin.com/api/type/Foundation.NSAttributedString/
textField.AttributedPlaceholder = new NSAttributedString ("Hello, world",new UIStringAttributes () { ForegroundColor = UIColor.Red });
Swift версия. Возможно, это кому-то поможет.
class TextField: UITextField { override var placeholder: String? { didSet { let placeholderString = NSAttributedString(string: placeholder!, attributes: [NSForegroundColorAttributeName: UIColor.whiteColor()]) self.attributedPlaceholder = placeholderString } } }
категории 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
для обработки как вертикального, так и горизонтального выравнивания, а также цвета заполнителя в iOS7. drawInRect и drawAtPoint больше не используют текущий контекст fillColor.
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
переопределение
drawPlaceholderInRect:было бы правильным, но он не работает из-за ошибки в API (или документации).метод никогда не вызывается на
UITextField.см. также drawTextInRect на UITextField не называется
вы можете использовать решение digdog. Поскольку я не уверен, что это пройдет проверку яблок, я выбрал другое решение: наложите текстовое поле с моей собственной меткой, которая имитирует заполнитель поведение.
Это немного грязно, хотя. Код выглядит так (Обратите внимание, что я делаю это внутри подкласса текстового поля):
@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; }
Я новичок в 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 :/
iOS 6 и более поздние предложения
attributedPlaceholderonUITextField. iOS 3.2 и более поздние предложенияsetAttributes:range:onNSMutableAttributedString.вы можете сделать следующее:
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;
лучшее, что я могу сделать для 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]; } }
для тех, кто использует 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); } }
в swift 3.X
passwordTxtField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes:[NSForegroundColorAttributeName: UIColor.black])
Мне нужно было сохранить выравнивание заполнителя, поэтому ответа Адама мне было недостаточно.
для решения этой проблемы я использовал небольшой вариант, который, я надеюсь, поможет некоторым из вас тоже:
- (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]; }
для набора Атрибутированного текстового поля заполнителя с несколькими цветами,
просто укажите текст,
//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;выход :-
Это решение для Swift 4.1
textName.attributedPlaceholder = NSAttributedString(string: textName.placeholder!, attributes: [NSAttributedStringKey.foregroundColor : UIColor.red])
еще один вариант, который не требует подклассов - оставьте заполнитель пустым и поместите метку поверх кнопки редактирования. Управляйте меткой так же, как вы управляете заполнителем (очистка после ввода пользователем чего-либо..)
В Swift 3
import UIKit let TEXTFIELD_BLUE = UIColor.blue let TEXTFIELD_GRAY = UIColor.gray class DBTextField: UITextField { /// Tetxfield Placeholder Color @IBInspectable var palceHolderColor: UIColor = TEXTFIELD_GRAY func setupTextField () { self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "", attributes:[NSForegroundColorAttributeName: palceHolderColor]) } } class DBLocalizedTextField : UITextField { override func awakeFromNib() { super.awakeFromNib() self.placeholder = self.placeholder } }




Comments