iPhone UITextField - Thay đổi màu văn bản giữ chỗ


566

Tôi muốn thay đổi màu của văn bản giữ chỗ tôi đặt trong UITextField điều khiển , để làm cho nó thành màu đen.

Tôi muốn làm điều này mà không sử dụng văn bản bình thường như trình giữ chỗ và phải ghi đè tất cả các phương thức để bắt chước hành vi của trình giữ chỗ.

Tôi tin rằng nếu tôi ghi đè phương thức này:

- (void)drawPlaceholderInRect:(CGRect)rect

sau đó tôi sẽ có thể làm điều này. Nhưng tôi không chắc làm thế nào để truy cập vào đối tượng giữ chỗ thực tế từ bên trong phương thức này.

Câu trả lời:


804

Kể từ khi giới thiệu các chuỗi được gán trong UIViews trong iOS 6, có thể gán màu cho văn bản giữ chỗ như thế này:

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
Điều này là tốt - nhưng hãy nhớ rằng bạn cần đặt giá trị giữ chỗ trong IB trước khi nó hoạt động
gheese

4
nó cũng có giá trị bao bọc điều này trong một cuộc gọi trả lời ToSelector - vì nếu không có nó, mã này sẽ sập vào mục tiêu triển khai trước 6.0 (bộ chọn không được nhận dạng được gửi đến ví dụ)
gheese

5
Các tài liệu cho attributedPlaceholderbiết đó là sử dụng các thuộc tính văn bản, ngoại trừ màu sắc.
Matt Connolly

1
Bất cứ ý tưởng tại sao nó không hoạt động cho thuộc tính - NSFontAttributionName [[NSAttributedString alloc] initWithString:@"placeholder" attributes: @{NSForegroundColorAttributeName: color, NSFontAttributeName : font}];
dev4u

3
Trên iOS 7 tôi gặp lỗi này:[<UITextField 0x11561d90> valueForUndefinedKey:]: this class is not key value coding-compliant for the key _field.
i_am_jorf

237

Dễ dàng và không đau, có thể là một sự thay thế dễ dàng cho một số người.

_placeholderLabel.textColor

Không được đề xuất cho sản xuất, Apple có thể từ chối trình của bạn.


1
Bạn đang sử dụng điều này trong sản xuất? Tôi có nghĩa là để truy cập một tài sản tư nhân.
Geri Borbás

11
Có thể thêm văn bản vào câu trả lời của bạn để sao chép và dán nhanh. _placeholderLabel.textColor
Philiiiiiipp

47
Đừng sử dụng phương pháp này, tôi đã sử dụng cửa hàng này và itune, đã từ chối ứng dụng của tôi.
Asad ali

1
Tôi nghĩ rằng bất kỳ loại phương pháp thư viện riêng nào KHÔNG BAO GIỜ được đề xuất là giải pháp cho mọi thứ
Skrew

2
@jungledev _placeholderLabellà một tài sản tư nhân. Giải pháp này có thể bị từ chối vì sử dụng API riêng.
Sean Kladek

194

Bạn có thể ghi đè drawPlaceholderInRect:(CGRect)rectnhư vậy để hiển thị thủ công văn bản giữ chỗ:

- (void) drawPlaceholderInRect:(CGRect)rect {
    [[UIColor blueColor] setFill];
    [[self placeholder] drawInRect:rect withFont:[UIFont systemFontOfSize:16]];
}

44
Một cái gì đó như [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];có lẽ là tốt hơn. Bằng cách đó bạn sẽ tôn trọng textAlignmenttài sản. Tôi đã thêm nó vào lớp SSTextField của tôi . Hãy sử dụng trong các dự án của bạn.
Sam Soffes

52
Tuyệt đối KHÔNG làm những gì Koteg nói. KHÔNG BAO GIỜ ghi đè các phương thức thông qua các danh mục. EVER
Joshua Weinberg

8
@JoshuaWeinberg Có bất kỳ lý do cụ thể đằng sau sự tắc nghẽn của bạn.
Krishnan

5
@Krishnan thực hiện một phương thức trùng lặp trong một danh mục không được hỗ trợ và bạn không bao giờ có thể chắc chắn phương thức nào sẽ được gọi, hoặc nếu cả hai được gọi, hoặc thứ tự chúng sẽ được gọi.
sean woodward

8
Trong iOS7, bạn có thể thay đổi chỉnh lưu bằng cách sử dụng CGRectInset (orth, 0, (orth.size.height - self.font.lineHeight) / 2.0) để căn giữa văn bản theo chiều dọc.
Brian S

171

Bạn có thể Thay đổi màu văn bản giữ chỗ thành bất kỳ màu nào bạn muốn bằng cách sử dụng mã dưới đây.

UIColor *color = [UIColor lightTextColor];
YOURTEXTFIELD.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"PlaceHolder Text" attributes:@{NSForegroundColorAttributeName: color}];

6
Câu trả lời tốt nhất đề nghị. Hoạt động và sử dụng các tài liệu API.
Ian Hoar

2
Làm thế nào để bạn thực hiện công việc này cho UISearchBar? Không có thuộc tính AttributionPlaceholder.
gilsaints88

1
Câu trả lời này không chính xác - theo các tài liệu, thông tin màu văn bản của AttributionPlaceholder bị bỏ qua developer.apple.com/l
Library / ios / document / UIKit / Reference / Ad

Cảm ơn mọi người. Hy vọng nó là một số trợ giúp. Adlai Holler hãy dùng thử bro !!! Câu trả lời này dành cho phiên bản iOS trước. Nếu bạn có câu trả lời tốt hơn, chúng tôi sẵn sàng để đề xuất.
Manju

Không hoạt động trên iOS8 vì không có tài sản thuộc tínhPlaceholder
Ben Clayton

157

Có thể bạn muốn thử theo cách này, nhưng Apple có thể cảnh báo bạn về việc truy cập ivar private:

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

LƯU Ý
Điều này không hoạt động trên iOS 7 nữa, theo Martin Alléus.


6
Tôi sử dụng phương pháp này trong ứng dụng của tôi. Đánh giá là OK. Vì vậy, tôi nghĩ rằng nó tốt để sử dụng nó.
Michael A.

9
Đây không phải là cửa hàng ứng dụng an toàn và không nên được khuyến khích, bạn không được đảm bảo để được chấp thuận hoặc tiếp tục được phê duyệt với các kỹ thuật này.
Sveinung Kval Bakken

31
Nó không thực sự quan trọng nếu nó được phê duyệt hay không thực sự. Điều quan trọng là điều này có thể phá vỡ ứng dụng của bạn trong các bản cập nhật hệ điều hành trong tương lai.
pablasso

2
Không gặp vấn đề gì với iOS 7 ... Tôi đã dùng thử mặc dù có ghi chú và nó dường như hoạt động tốt và tôi đã sử dụng phương pháp này trong quá khứ mà không gặp vấn đề gì.
WCByrne

6
Đây luôn là một ý tưởng tồi và bây giờ nó đã bị hỏng trên iOS 13:Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug
Ryder Mackay

154

Điều này hoạt động trong Swift <3.0:

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

Đã thử nghiệm trong iOS 8.2 và 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])

Sử dụng giải pháp của bạn trên iOS8.2, hoạt động như một sự quyến rũ. Giải pháp hoàn hảo ở đây. Sử dụng trong mục tiêu C cũng có.
Akshit Zaveri 5/2/2015

73

Trong Swift:

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

Trong Swift 4.0:

if let placeholder = yourTextField.placeholder {
    yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder, 
        attributes: [NSAttributedStringKey.foregroundColor: UIColor.black])
}

Nếu bạn không đặt văn bản giữ chỗ trước khi gọi rằng nó sẽ sập ứng dụng
apinho

Đây là một trong những tốt nhất, cảm ơn bạn. @apinho sẽ không có gì sụp đổ ở đây
Markus

// Trong Swift 4 if let placeholder = yourTextField.placeholder {yourTextField.attributionPlaceholder = NSAttributionString (chuỗi: giữ chỗ, thuộc tính: [NSAttributionStringKey.forgroundColor: UIColor.white])}
Ronaldo Albertini

Lưu ý rằng việc thay đổi giá trị văn bản giữ chỗ sau khi mã này được thực thi sẽ mang lại màu giữ chỗ mặc định.
Alessandro Vendruscolo

66

Bảng phân cảnh Swift 3.0 +

Để thay đổi màu giữ chỗ trong bảng phân cảnh, hãy tạo một phần mở rộng với mã tiếp theo. (vui lòng cập nhật mã này, nếu bạn nghĩ, nó có thể rõ ràng và an toàn hơn).

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

nhập mô tả hình ảnh ở đây

Phiên bản 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)
        }
    }
}

Phiên bản 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)
        }
    }
}

Trình biên dịch không thể tìm ra NSAttributedStringKey.
Milan K Familya

Hoạt động trong iOS 13
Jalil

43

Chỉ sau đây với iOS6 + (như được nêu trong nhận xét của Alexander W):

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

33

Tôi đã phải đối mặt với vấn đề này. Trong trường hợp của tôi dưới đây mã là chính xác.

Mục tiêu C

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

Dành cho Swift 4.X

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

Dành cho mã iOS 13 Swift

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

Bạn cũng có thể sử dụng mã bên dưới cho iOS 13

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

Hy vọng, điều này có thể giúp bạn.


@Ashu điều này gây ra sự cố trong ios 13 'Truy cập vào _placeholder của UITextField bị cấm. Đây là một lỗi ứng dụng 'thậm chí sẽ không được xây dựng. Tôi không nói về việc đặt vào AppStore
Melany

1
Phiên bản iOS 13 này đã bị hạn chế không thể sử dụng nữa
Kishore Kumar

Mã Objc được thử nghiệm trên iOS 13 và không hoạt động.
Mehdico

1
@Mehdico Tôi đã cập nhật câu trả lời cho iOS 13. Hy vọng điều này sẽ giúp bạn.
Ashu

Mất quá nhiều thời gian để biết rằng tôi phải thực hiện thay đổi này trong viewWillAppearhoặc viewDidAppear. viewDidLoadlà quá sớm.
Bốn

32

Với điều này, chúng ta có thể thay đổi màu của văn bản giữ chỗ của trường văn bản trong 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
Bắt đầu từ iOS13, điều này sẽ không hoạt động
Teddy

@Teddy làm thế nào bạn làm điều đó bây giờ? Tôi bắt đầu có vấn đề với điều này.
Jalil

@Jalil Tôi hy vọng tôi vẫn đúng giờ cho bạn. textField.attributionPlaceholder = [[NSAttributionString alloc] initWithString: @ "text" thuộc tính: @ {NSForegroundColorAttributionName: [UIColor colorWithHexString: @ "ffffff55"]}];
Teddy

18

Tại sao bạn không sử dụng UIAppearancephương pháp:

[[UILabel appearanceWhenContainedIn:[UITextField class], nil] setTextColor:[UIColor whateverColorYouNeed]];

Hoạt động tuyệt vời! Màu văn bản không bị ảnh hưởng (Ít nhất là với proxy khác nhau cho thuộc tính textColor)
HotJard

18

Cũng trong bảng phân cảnh của bạn, không có một dòng mã nào

nhập mô tả hình ảnh ở đây


1
Làm thế nào bạn biết điều này? Đó là cách tiếp cận tốt nhất tôi nghĩ nhưng làm thế nào người ta có thể biết điều này? Xin vui lòng cho tôi biết tôi mới lập trình ios.
Yawar

2
Nó rất phổ quát. Một khi bạn biết nó sử dụng nó ở mọi nơi;)
Petr Syrov

Tôi biết một khi tôi hiểu những gì chạy đằng sau nó tôi sẽ sử dụng nó rất nhiều. Nhưng ý tôi là "_placeholderLabel.textColor" đây phải là một khung nhìn con của trường văn bản. Có cách nào để xem loại thông tin này về kiểm soát không?
Yawar

2
@Yawar Bạn có thể sử dụng trình kiểm tra phân cấp chế độ xem trong Xcode hoặc xem xét chế độ xem trong trình gỡ lỗi.
David Ganster

tốt, bất kể trường văn bản, bạn có thể sử dụng cùng một 'ô / tên' cho keypath
Naishta

16

nhanh chóng

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

trong 5

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

12

Dành cho iOS 6.0 +

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

Hy vọng nó giúp.

Lưu ý: Apple có thể từ chối (0,01% cơ hội) ứng dụng của bạn khi chúng tôi đang truy cập API riêng. Tôi đang sử dụng điều này trong tất cả các dự án của mình từ hai năm nay, nhưng Apple đã không yêu cầu điều này.


ném một terminating with uncaught exception of type NSExceptioncho iOS8
Yar

10

Đối với các nhà phát triển Xamarin.iOS, tôi đã tìm thấy nó từ tài liệu này https://developer.xamarin.com/api/type/Foundation.NSAttributionString/

textField.AttributedPlaceholder = new NSAttributedString ("Hello, world",new UIStringAttributes () { ForegroundColor =  UIColor.Red });

Cảm ơn bạn !! Lần đầu tiên tôi sử dụng CTStringAttribut chứ không phải UIStringAttribut và không thể tìm ra nó. Hãy cẩn thận để không sử dụng điều này:new NSAttributedString("placeholderstring", new CTStringAttributes() { ForegroundColor = UIColor.Blue.CGColor });
Yohan Dahmani

9

Phiên bản Swift. Có lẽ nó sẽ giúp được ai đó.

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

6

Thể loại FTW. Có thể được tối ưu hóa để kiểm tra sự thay đổi màu sắc hiệu quả.


#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

Để xử lý cả căn chỉnh dọc và ngang cũng như màu của trình giữ chỗ trong iOS7. drawInRect và drawAtPoint không còn sử dụng fillColor bối cảnh hiện tại.

https://developer.apple.com/l Library / ios / document /StringsTextFonts / Conceptionual

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

Cảm ơn giải pháp tuyệt vời này - mà trung tâm đúng văn bản theo chiều dọc (hữu ích với phông chữ tùy chỉnh). Điều duy nhất tôi muốn nói thêm là giải pháp này là không tương thích với iOS 6 trở lên (dễ dàng, đủ để sửa chữa bằng cách rơi trở lại trên [self.placeholder drawInRect: rect withFont: self.font lineBreakMode: alignment NSLineBreakByTruncatingTail: self.textAlignment];
lifjoy

6

iOS 6 trở lên cung cấp attributedPlaceholdertrên UITextField. iOS 3.2 trở lên cung cấp setAttributes:range:trên NSMutableAttributedString.

Bạn có thể làm như sau:

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;

Không chắc chắn điều gì gây ra sự cố, mã này tôi đã gọi trong viewdidLoad. màu sắc và kích thước phông chữ mới chỉ xuất hiện sau khi vẽ lại. bất cứ điều gì khác cần phải được thực hiện cùng với điều này?
Vinayaka Karjigi

nó đã được giải quyết, tôi quên đặt phông chữ cho UITextfield trước khi sử dụng phông chữ đó cho văn bản giữ chỗ. xấu của tôi
Vinayaka Karjigi

6

Giải pháp này cho Swift 4.1

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

4

Ghi đè drawPlaceholderInRect: sẽ là cách chính xác, nhưng nó không hoạt động do lỗi trong API (hoặc tài liệu).

Phương thức không bao giờ được gọi trên UITextField .

Xem thêm drawTextInRect trên UITextField không được gọi

Bạn có thể sử dụng giải pháp của digdog. Vì tôi không chắc liệu điều đó có vượt qua đánh giá của Táo hay không, tôi đã chọn một giải pháp khác: Xếp chồng trường văn bản bằng nhãn của riêng tôi bắt chước hành vi giữ chỗ.

Điều này là một chút lộn xộn mặc dù. Mã trông như thế này (Lưu ý tôi đang làm điều này trong một lớp con của 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;
}

bạn cảm thấy thế nào về việc chia sẻ giải pháp thân thiện với đánh giá của bạn?
adam

Tôi đã thêm giải pháp tôi đã sử dụng. Tôi đã phải làm một chút việc đào bới, vì đây là một thời gian trước đây :)
henning77

Tôi đã làm một cái gì đó tương tự như thế này, nhưng tôi đã đặt mã trong một danh mục và cần thực hiện kiểm tra ShouldChangeChar character về việc có hiển thị hay không, đó là phương thức thứ hai trong danh mục có tên - (void) overlayPlaceholderVisible: (BOOL) ;
David van Dugteren

3

Tôi mới sử dụng xcode và tôi đã tìm ra cách để có hiệu quả tương tự.

Tôi đã đặt một uilabel vào vị trí của trình giữ chỗ với định dạng mong muốn và ẩn nó vào

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

        case 1:
            lblPassword.hidden=YES;
            break;

        default:
            break;
    }
}

Tôi đồng ý rằng đây là một giải pháp xung quanh và không phải là một giải pháp thực sự nhưng hiệu quả cũng giống như vậy từ liên kết này

LƯU Ý: Vẫn hoạt động trên iOS 7: |


3

Swift 5 VỚI CAVEAT.

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

Thông báo trước rằng bạn PHẢI nhập không trống Stringtrong đó "DON'T_DELETE", ngay cả khi chuỗi đó được đặt trong mã ở nơi khác. Có thể giúp bạn tiết kiệm năm phút đầu.


2

Điều tốt nhất tôi có thể làm cho cả iOS7 trở xuống là:

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

Đối với những người sử dụng Monotouch (Xamarin.iOS), đây là câu trả lời của Adam, được dịch sang C #:

public class MyTextBox : UITextField
{
    public override void DrawPlaceholder(RectangleF rect)
    {
        UIColor.FromWhiteAlpha(0.5f, 1f).SetFill();
        new NSString(this.Placeholder).DrawString(rect, Font);
    }
}

Tuyệt quá. Điều này không thực sự rõ ràng, có lẽ bạn đã tiết kiệm cho tôi một chút thời gian :) Tôi đã chỉnh sửa giải pháp của bạn, vì tôi nghĩ rằng đó là một ý tưởng tốt hơn để sử dụng bộ phông chữ trong thuộc Fonttính của trường văn bản.
Wolfgang Schreurs

1

Tôi cần phải giữ liên kết giữ chỗ để câu trả lời của adam là không đủ cho tôi.

Để giải quyết điều này, tôi đã sử dụng một biến thể nhỏ mà tôi hy vọng cũng sẽ giúp được một số bạn:

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

UILineBreakModeTailTruncationkhông được dùng nữa kể từ iOS 6.
Supertecnoboff

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

Một gợi ý nhỏ về điều này là bạn đang truy cập một iVar riêng (_placeholderLabel) và trong quá khứ Apple đã có một chút miệt mài khi làm điều đó. :)
Alexander W

1

Để đặt Trình giữ chỗ trường văn bản được gán với nhiều màu,

Chỉ cần chỉ định Văn bản,

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

Đầu ra: -

nhập mô tả hình ảnh ở đây


0

Một tùy chọn khác không yêu cầu phân lớp - để trống chỗ dành sẵn và đặt nhãn trên đầu nút chỉnh sửa. Quản lý nhãn giống như bạn sẽ quản lý trình giữ chỗ (xóa khi người dùng nhập bất cứ thứ gì ..)


Tôi nghĩ rằng điều này sẽ hiệu quả nếu bạn có một trường văn bản, nhưng nếu bạn đang cố gắng thực hiện thay đổi này ở quy mô toàn cầu hơn, giải pháp này sẽ thêm một lượng chi phí đáng kể cho dự án của bạn.
James Parker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.