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

2
นี่เป็นสิ่งที่ดี - แต่โปรดจำไว้ว่าคุณต้องกำหนดค่าตัวยึดตำแหน่งใน IB ก่อนที่จะใช้งานได้
gheese

4
ห่อยังคุ้มค่าในการโทร respondsToSelector - เป็นโดยไม่ได้รหัสนี้จะผิดพลาดในการใช้งานก่อนเป้าหมาย 6.0 (เลือกที่ไม่รู้จักส่งไปเป็นต้น)
gheese

5
เอกสารสำหรับattributedPlaceholderข้อความที่แจ้งว่าใช้ข้อความเป็นคุณลักษณะยกเว้นสี
Matt Connolly

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
คุณใช้สิ่งนี้ในการผลิตหรือไม่? ฉันหมายถึงการเข้าถึงทรัพย์สินส่วนตัว
Geri Borbás

11
อาจเพิ่มข้อความในคำตอบเพื่อคัดลอกและวางอย่างรวดเร็ว _placeholderLabel.textColor
Philiiiiiipp

47
อย่าใช้วิธีนี้ฉันใช้สิ่งนี้และร้านค้า itune ปฏิเสธแอปพลิเคชันของฉัน
Asad ali

1
ฉันคิดว่าวิธีการห้องสมุดส่วนตัวทุกประเภทไม่ควรได้รับการแนะนำเพื่อแก้ปัญหาใด ๆ
Skrew

2
@jungledev _placeholderLabelเป็นทรัพย์สินส่วนตัว วิธีการแก้ปัญหานี้อาจถูกปฏิเสธการใช้งานส่วนตัว API
Sean Kladek

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ของฉัน รู้สึกอิสระที่จะใช้ในโครงการของคุณ
Sam Soffes

52
ห้ามทำสิ่งที่ Koteg พูด ไม่เคยแทนที่วิธีการผ่านหมวดหมู่ เคย
Joshua Weinberg

8
@JoshuaWeinberg มีเหตุผลใดที่อยู่เบื้องหลังการกินอาหารของคุณ
Krishnan

5
@Krishnan ใช้วิธีการที่ซ้ำกันในหมวดหมู่ไม่ได้รับการสนับสนุนและคุณไม่สามารถมั่นใจได้ว่าจะเรียกวิธีการใดหรือถ้าทั้งคู่ถูกเรียกหรือลำดับที่จะถูกเรียก
ฌอนวู้ดเวิร์ด

8
ใน iOS7 คุณสามารถแก้ไข rect ได้โดยใช้ CGRectInset (rect, 0, (rect.size.height - self.font.lineHeight) / 2.0) เพื่อจัดกึ่งกลางข้อความ
Brian S

170

คุณสามารถเปลี่ยนสีตัวยึดตำแหน่งเป็นสีใดก็ได้ที่คุณต้องการโดยใช้รหัสด้านล่าง

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

6
คำตอบที่ดีที่สุดแนะนำ ใช้งานได้และใช้ API ที่ทำเป็นเอกสาร
Ian Hoar

2
คุณทำงานนี้ให้กับ UISearchBar ได้อย่างไร ไม่มีคุณสมบัติของส่วนที่เป็นเจ้าของ
gilsaints88

1
คำตอบนี้ไม่ถูกต้อง - ตามเอกสารข้อมูลสีข้อความของ formededPlaceholder จะถูกละเว้นdeveloper.apple.com/library/ios/documentation/UIKit/Reference/
......

ขอบคุณทุกคน หวังว่ามันจะช่วยได้บ้าง Adlai Holler ลองดูสิ !!! คำตอบนี้สำหรับ iOS เวอร์ชันก่อนหน้า หากคุณมีคำตอบที่ดีกว่าเราเปิดรับข้อเสนอแนะ
Manju

ไม่ทำงานบน iOS8 เนื่องจากไม่มีคุณสมบัติที่เป็นเจ้าของตัวแทน
Ben Clayton

157

บางทีคุณอาจต้องการลองด้วยวิธีนี้ แต่ Apple อาจเตือนคุณเกี่ยวกับการเข้าถึง ivar ส่วนตัว:

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

หมายเหตุ
นี่ไม่ทำงานบน iOS 7 อีกต่อไปตาม Martin Alléus


6
ฉันใช้วิธีนี้ในแอพของฉัน ความเห็นก็โอเค ดังนั้นฉันคิดว่ามันใช้ได้ดี
Michael A.

9
นี่ไม่ใช่แอปสโตร์ที่ปลอดภัยและไม่ควรได้รับการสนับสนุนคุณไม่รับประกันว่าจะได้รับการอนุมัติหรืออยู่ในการอนุมัติด้วยเทคนิคเหล่านี้
Sveinung Kval Bakken

31
มันไม่ควรสำคัญว่าจะได้รับการอนุมัติหรือไม่จริง ๆ สิ่งสำคัญคือการทำเช่นนี้อาจทำให้แอปของคุณเสียหายในการอัปเดตระบบปฏิบัติการในอนาคต
pablasso

2
ไม่มีปัญหาใด ๆ กับ iOS 7 ... ฉันลองดูทั้งๆที่ทราบแล้วและดูเหมือนว่ามันจะทำงานได้ดีและฉันก็เคยใช้วิธีนี้ในอดีตโดยไม่มีปัญหา
WCByrne

6
นี่เป็นความคิดที่ไม่ดีอยู่เสมอและตอนนี้มันแตกบน iOS 13: Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug😈
Ryder Mackay

154

ใช้งานได้ใน Swift <3.0:

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

ทดสอบใน iOS 8.2 และ iOS 8.3 เบต้า 4

สวิฟท์ 3:

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

สวิฟท์ 4:

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

สวิฟท์ 4.2:

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

การใช้โซลูชันของคุณกับ iOS8.2 นั้นทำงานได้อย่างมีเสน่ห์ โซลูชั่นที่สมบูรณ์แบบที่นี่ ใช้ในวัตถุประสงค์ C ด้วย
Akshit Zaveri

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

หากคุณไม่ได้ตั้งค่าข้อความตัวแทนก่อนที่จะโทรมามันจะขัดข้องแอพ
apinho

นี่คือสิ่งที่ดีที่สุดขอบคุณ ไม่มีอะไร @apinho จะผิดพลาดที่นี่
มาร์คุส

// ใน Swift 4 ถ้าให้ตัวยึด = yourTextField.placeholder {yourTextField.attributedPlaceholder = NSAttributedString (สตริง: ตัวยึด, แอตทริบิวต์: [NSAttributedStringKey.foregroundColor: UIColor.white])
Ronaldo Albertini

ระวังว่าการเปลี่ยนค่าข้อความตัวยึดหลังจากโค้ดนี้ถูกเรียกใช้จะนำสีตัวยึดเริ่มต้นกลับมา
Alessandro Vendruscolo

66

Swift 3.0 + Storyboard

ในการเปลี่ยนสีตัวยึดตำแหน่งในกระดานเรื่องราวให้สร้างส่วนขยายด้วยรหัสถัดไป (โปรดอัปเดตรหัสนี้หากคุณคิดว่าสามารถชัดเจนและปลอดภัยกว่า)

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คอมไพเลอร์ไม่สามารถหา
มิลาน Kamilya

ทำงานใน iOS 13
Jalil

43

ต่อไปนี้กับ iOS6 + เท่านั้น (ตามที่ระบุในข้อคิดเห็นของ Alexander W):

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

33

ฉันประสบปัญหานี้แล้ว ในกรณีของฉันด้านล่างรหัสถูกต้อง

วัตถุประสงค์ C

[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

หวังว่านี่อาจช่วยคุณได้


@Ashu สิ่งนี้ทำให้เกิดความผิดพลาดใน ios 13 'ไม่อนุญาตให้เข้าถึง _placeholderLabel ivar ของ UITextField นี่เป็นข้อบกพร่องของแอปพลิเคชัน 'มันจะไม่สร้างแม้กระทั่งฉันไม่ได้พูดถึงการวางลงใน AppStore
Melany

1
IOS 13 นี้ถูก จำกัด ไม่สามารถใช้มันได้อีกต่อไป
Kishore Kumar

รหัส Objc ทดสอบบน IOS 13 แล้วไม่ทำงาน
Mehdico

1
@ Mehdico ฉันอัปเดตคำตอบสำหรับ iOS 13. หวังว่านี่จะช่วยคุณได้
Ashu

ผมใช้เวลานานเกินไปที่จะเรียนรู้ว่าฉันมีเพื่อให้การเปลี่ยนแปลงนี้หรือviewWillAppear เร็วเกินไป viewDidAppearviewDidLoad
Four

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 สิ่งนี้จะใช้ไม่ได้
Teddy

@ เท็ดดี้คุณทำยังไงตอนนี้? ฉันเริ่มมีปัญหากับสิ่งนี้
Jalil

@ Jalil ฉันหวังว่าฉันยังคงตรงเวลาสำหรับคุณ textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString: @ "ข้อความ" คุณลักษณะ: @ {NSForegroundColorAttributeName: [UIColor colorWithHexString: @ "ffffff55"]}
เท็ดดี้

18

ทำไมคุณไม่ใช้UIAppearanceวิธีการ:

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

ใช้งานได้ดี! สีของข้อความไม่ได้รับผลกระทบ (อย่างน้อยกับพร็อกซีที่แตกต่างกันสำหรับคุณสมบัติ textColor)
HotJard

18

นอกจากนี้ในกระดานเรื่องราวของคุณโดยไม่ต้องใช้รหัสบรรทัดเดียว

ป้อนคำอธิบายรูปภาพที่นี่


1
คุณรู้เรื่องนี้ได้อย่างไร มันเป็นวิธีที่ดีที่สุดที่ฉันคิด แต่จะมีใครรู้ได้บ้าง กรุณาบอกฉันใหม่กับการเขียนโปรแกรม iOS
Yawar

2
เป็นสากลมาก เมื่อคุณรู้ว่ามันใช้งานได้ทุกที่)
Petr Syrov

ฉันรู้เมื่อฉันเข้าใจสิ่งที่ทำงานอยู่ข้างหลังฉันจะใช้มันมาก แต่ฉันหมายถึง "_placeholderLabel.textColor" นี่ควรเป็นมุมมองลูกของฟิลด์ข้อความ มีวิธีดูข้อมูลประเภทนี้เกี่ยวกับการควบคุมหรือไม่?
Yawar

2
@Yawar คุณสามารถใช้ตัวตรวจสอบลำดับชั้นของมุมมองใน Xcode หรือวิปัสสนามุมมองในดีบักเกอร์
David Ganster

สิ่งที่ดีโดยไม่คำนึงถึงฟิลด์ข้อความคุณสามารถใช้ '
ไท

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 ไม่ได้ขอสิ่งนี้


ทุ่ม a terminating with uncaught exception of type NSExceptionสำหรับ iOS8
Yar

10

สำหรับนักพัฒนา Xamarin.iOS ฉันพบจากเอกสารนี้ https://developer.xamarin.com/api/type/Foundation.NSAttributedString/

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

ขอบคุณ !! ฉันเป็นคนแรกที่ใช้ CTStringAttributes ไม่ใช่ UIStringAttributes และไม่สามารถหาได้ ระวังอย่าใช้สิ่งนี้:new NSAttributedString("placeholderstring", new CTStringAttributes() { ForegroundColor = UIColor.Blue.CGColor });
Yohan Dahmani

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

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

ขอบคุณสำหรับการแก้ปัญหาที่ยอดเยี่ยม - ซึ่งจัดกึ่งกลางข้อความในแนวตั้ง (มีประโยชน์กับแบบอักษรที่กำหนดเอง) สิ่งเดียวที่ฉันจะเพิ่มคือโซลูชันนี้เข้ากันไม่ได้กับ iOS 6 หรือเก่ากว่า (ง่ายพอที่จะแก้ไขได้โดยถอยกลับมาที่ [self.placeholder drawInRect: rect withFont: self.font lineBreakMode: NSLineBreakByTruncatingTail alignment: 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 สีใหม่และขนาดตัวอักษรจะปรากฏขึ้นหลังจากวาดใหม่เท่านั้น มีอะไรอีกบ้างที่ต้องทำพร้อมกับสิ่งนี้?
Vinayaka Karjigi

มันได้รับการแก้ไขแล้วฉันลืมตั้งค่าแบบอักษรสำหรับ UITextfield ก่อนที่จะใช้แบบอักษรนั้นสำหรับข้อความตัวยึดตำแหน่ง my bad
Vinayaka Karjigi

6

โซลูชันนี้สำหรับ Swift 4.1

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

4

การเอาชนะdrawPlaceholderInRect:จะเป็นวิธีที่ถูกต้อง แต่ไม่สามารถใช้งานได้เนื่องจากข้อบกพร่องใน API (หรือเอกสารประกอบ)

UITextFieldวิธีการที่ไม่เคยได้รับการเรียกบน

ดูเพิ่มเติมdrawTextInRect บน UITextField ไม่ได้เรียก

คุณอาจใช้โซลูชันของ digdog เนื่องจากฉันไม่แน่ใจว่าได้รับการตรวจสอบแอปเปิ้ลที่ผ่านมาฉันเลือกโซลูชันอื่น: ซ้อนทับฟิลด์ข้อความด้วยป้ายชื่อของฉันเองซึ่งเลียนแบบพฤติกรรมของตัวยึดตำแหน่ง

นี่มันค่อนข้างยุ่งนิดหน่อย รหัสมีลักษณะเช่นนี้ (หมายเหตุฉันกำลังทำเช่นนี้ภายในคลาสย่อยของ 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

ฉันทำสิ่งที่คล้ายกับสิ่งนี้ แต่ฉันวางโค้ดในหมวดหมู่และจำเป็นต้องทำการตรวจสอบในควรเปลี่ยนตัวอักษรว่าจะทำให้มองเห็นได้หรือไม่ซึ่งเป็นวิธีที่สองในหมวดหมู่ที่เรียกว่า - (void) overlayPlaceholderVisible: (BOOL) ;
David van Dugteren

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

Swift 5 With CAVEAT

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

ข้อแม้ที่คุณต้องป้อนไม่ว่างStringโดยที่ "DON'T_DELETE" อยู่แม้ว่าสตริงนั้นจะถูกตั้งค่าในรหัสที่อื่น อาจช่วยให้คุณประหยัดได้ห้านาที


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) นี่คือคำตอบของ Adam แปลเป็น 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คุณสมบัติของฟิลด์ข้อความ
Wolfgang Schreurs

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 ได้รับการพิจารณาเล็กน้อยเกี่ยวกับการทำเช่นนั้น :)
Alexander W

1

สำหรับตั้งค่าตัวยึดฟิลด์ข้อความที่มีหลายสี

เพียงระบุข้อความ

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

ตัวเลือกอื่นที่ไม่ต้องการ subclassing - ปล่อยให้ตัวยึดพื้นที่ว่างและใส่ป้ายกำกับไว้ที่ปุ่มด้านบน จัดการป้ายกำกับเช่นเดียวกับที่คุณจัดการตัวยึดตำแหน่ง (การล้างข้อมูลเมื่อผู้ใช้ป้อนข้อมูลอะไรก็ตาม .. )


ฉันคิดว่าสิ่งนี้จะมีประสิทธิภาพหากคุณมี textfield เพียงแห่งเดียว แต่ถ้าคุณพยายามทำให้การเปลี่ยนแปลงระดับโลกยิ่งขึ้นโซลูชันนี้จะเพิ่มค่าใช้จ่ายจำนวนมากให้กับโครงการของคุณ
James Parker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.