iPhone UITextField - Mengubah warna teks placeholder


566

Saya ingin mengubah warna teks placeholder yang saya atur di UITextFieldkontrol saya , untuk membuatnya hitam.

Saya lebih suka melakukan ini tanpa menggunakan teks normal sebagai placeholder dan harus mengganti semua metode untuk meniru perilaku placeholder.

Saya percaya jika saya mengganti metode ini:

- (void)drawPlaceholderInRect:(CGRect)rect

maka saya harus bisa melakukan ini. Tapi saya tidak yakin cara mengakses objek placeholder sebenarnya dari dalam metode ini.

Jawaban:


804

Sejak pengenalan string yang dikaitkan di UIViews di iOS 6, dimungkinkan untuk memberi warna pada teks placeholder seperti ini:

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
Ini bagus - tapi ingat Anda harus menetapkan nilai placeholder dalam IB sebelum ini bekerja
gheese

4
ini juga layak untuk dibungkus dengan panggilan ResponssToSelektor - karena tanpa kode ini akan macet pada target penyebaran pra 6.0 (pemilih yang tidak dikenal dikirim ke instance)
gheese

5
Dokumen untuk attributedPlaceholderkata yang menggunakan atribut teks, kecuali untuk warna.
Matt Connolly

1
Tahu mengapa itu tidak bekerja untuk atribut - NSFontAttributeName [[NSAttributedString alloc] initWithString:@"placeholder" attributes: @{NSForegroundColorAttributeName: color, NSFontAttributeName : font}];
dev4u

3
Di iOS 7 saya mendapat kesalahan ini:[<UITextField 0x11561d90> valueForUndefinedKey:]: this class is not key value coding-compliant for the key _field.
i_am_jorf

237

Mudah dan tanpa rasa sakit, bisa menjadi alternatif yang mudah bagi sebagian orang.

_placeholderLabel.textColor

Tidak disarankan untuk diproduksi, Apple dapat menolak kiriman Anda.


1
Apakah Anda menggunakan ini dalam produksi? Maksud saya mengakses properti pribadi.
Geri Borbás

11
Mungkin menambahkan teks ke jawaban Anda untuk salin dan tempel cepat. _placeholderLabel.textColor
Philiiiiiipp

47
Jangan gunakan metode ini, saya telah menggunakan ini dan toko itune, telah menolak aplikasi saya.
Asad ali

1
Saya pikir segala jenis metode perpustakaan pribadi TIDAK PERNAH direkomendasikan sebagai solusi untuk apa pun
Skrew

2
@jungledev _placeholderLabeladalah properti pribadi. Solusi ini dapat ditolak untuk penggunaan API pribadi.
Sean Kladek

194

Anda dapat mengesampingkan drawPlaceholderInRect:(CGRect)rectuntuk merender teks placeholder secara manual:

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

44
Sesuatu seperti [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];mungkin lebih baik. Dengan begitu Anda akan menghormati textAlignmentproperti. Saya telah menambahkan ini ke kelas SSTextField saya . Jangan ragu untuk menggunakannya dalam proyek Anda.
Sam Soffes

52
Benar-benar JANGAN melakukan apa yang dikatakan Koteg. JANGAN PERNAH menimpa metode melalui kategori. PERNAH
Joshua Weinberg

8
@ JoshuaWeinberg Apakah ada alasan khusus di balik sugestion Anda.
Krishnan

5
@ Krishnan menerapkan metode duplikat dalam kategori tidak didukung, dan Anda tidak pernah dapat memastikan metode mana yang akan dipanggil, atau jika keduanya dengan dipanggil, atau urutan di mana mereka akan dipanggil.
sean woodward

8
Di iOS7 Anda dapat mengubah kotak dengan menggunakan CGRectInset (rect, 0, (rect.size.height - self.font.lineHeight) / 2.0) untuk memusatkan teks secara vertikal.
Brian S

171

Anda bisa mengubah warna teks Placeholder ke warna apa pun yang Anda inginkan dengan menggunakan kode di bawah ini.

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

6
Jawaban terbaik disarankan. Bekerja, dan menggunakan API yang terdokumentasi.
Ian Hoar

2
Bagaimana Anda membuat ini berfungsi untuk UISearchBar? Tidak ada properti yang dikaitkan dengan Pemilik.
gilsaints88

1
Jawaban ini tidak benar - menurut dokumen, informasi warna teks dari attributedPlaceholder diabaikan developer.apple.com/library/ios/documentation/UIKit/Reference/…
Adlai Holler

Terimakasih semuanya. Semoga itu bisa membantu. Adlai Holler mencobanya bro !!! Jawaban ini untuk versi iOS sebelumnya. Jika Anda memiliki jawaban yang lebih baik, kami terbuka untuk saran.
Manju

Tidak berfungsi di iOS8 karena tidak ada properti yang dikaitkan dengan properti
Ben Clayton

157

Mungkin Anda ingin mencoba cara ini, tetapi Apple mungkin memperingatkan Anda tentang mengakses private ivar:

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

CATATAN
Ini tidak lagi berfungsi pada iOS 7, menurut Martin Alléus.


6
Saya menggunakan metode ini di aplikasi saya. Ulasan itu ok. Jadi saya pikir tidak masalah untuk menggunakannya.
Michael A.

9
Ini bukan app store aman dan tidak boleh didorong, Anda tidak dijamin disetujui atau tetap disetujui dengan teknik ini.
Sveinung Kval Bakken

31
Seharusnya tidak masalah jika disetujui atau tidak. Yang penting adalah ini bisa merusak aplikasi Anda di pembaruan OS di masa depan.
pablasso

2
Tidak memiliki masalah dengan iOS 7 ... Saya mencobanya meskipun catatan dan tampaknya berfungsi dengan baik dan saya telah menggunakan pendekatan ini di masa lalu tanpa masalah.
WCByrne

6
Ini selalu merupakan ide yang buruk, dan sekarang rusak di iOS 13: Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug😈
Ryder Mackay

154

Ini berfungsi di Swift <3.0:

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

Diuji di iOS 8.2 dan 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])

Menggunakan solusi Anda di iOS8.2, bekerja seperti pesona. Solusi sempurna di sini. Menggunakan dalam tujuan C juga.
Akshit Zaveri

73

Dalam Swift:

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

Dalam Swift 4.0:

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

Jika Anda tidak menyetel teks pengganti sebelum menelepon bahwa itu akan merusak aplikasi
apinho

Ini yang terbaik, terima kasih. @apinho tidak akan terjadi kecelakaan di sini
Markus

// Di Swift 4 jika membiarkan placeholder = yourTextField.placeholder {yourTextField.attributedPlaceholder = NSAttributedString (string: placeholder, atribut: [NSAttributedStringKey.foregroundColor: UIColor.white])}
Ronaldo Albertini

Berhati-hatilah bahwa mengubah nilai teks placeholder setelah kode ini dijalankan akan mengembalikan warna placeholder default.
Alessandro Vendruscolo

66

Swift 3.0 + Storyboard

Untuk mengubah warna placeholder di storyboard, buat ekstensi dengan kode berikutnya. (jangan ragu untuk memperbarui kode ini, jika Anda pikir, ini bisa menjadi lebih jelas dan aman)

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

masukkan deskripsi gambar di sini

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

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

Kompiler tidak dapat mengetahuinya NSAttributedStringKey.
Milan Kamilya

Berfungsi di iOS 13
Jalil

43

Berikut ini hanya dengan iOS6 + (seperti yang ditunjukkan dalam komentar Alexander W):

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

33

Saya sudah menghadapi masalah ini. Dalam kasus saya, kode di bawah ini benar.

Tujuan C

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

Untuk Swift 4.X

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

Untuk iOS 13 Swift Code

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

Anda juga dapat menggunakan kode di bawah ini untuk iOS 13

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

Semoga ini bisa membantu Anda.


@Ashu ini menyebabkan crash di ios 13 'Akses ke _placeholderLabel _itholder UITextField dilarang. Ini adalah bug aplikasi 'bahkan tidak akan membangun saya tidak berbicara tentang penempatan ke AppStore
Melany

1
IOS 13 ini dibatasi tidak dapat digunakan lagi
Kishore Kumar

Kode Objc diuji pada iOS 13 dan tidak berfungsi.
Mehdico

1
@ Mehdico Saya memperbarui jawaban untuk iOS 13. Semoga ini bisa membantu Anda.
Ashu

Butuh waktu terlalu lama bagi saya untuk mengetahui bahwa saya harus melakukan perubahan pada viewWillAppearatau viewDidAppear. viewDidLoadterlalu dini.
Empat

32

Dengan ini kita bisa mengubah warna teks placeholder textfield di 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
Mulai dari iOS13 ini tidak akan berfungsi
Teddy

@ Teddy, bagaimana kamu melakukannya sekarang? Saya mulai memiliki masalah dengan ini.
Jalil

@Jilil Saya harap saya masih tepat waktu untuk Anda. textField.attributedPlaceholder = [[Alokasi NSAttributedString] initWithString: @ "text" atribut: @ {NSForegroundColorAttributeName: [UIColor colorWithHexString: @ "ffffff55"]}];
Teddy

18

Mengapa Anda tidak menggunakan UIAppearancemetode saja:

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

Bagus sekali! Warna teks tidak terpengaruh (Setidaknya dengan proxy yang berbeda untuk properti textColor)
HotJard

18

Juga di storyboard Anda, tanpa satu baris kode

masukkan deskripsi gambar di sini


1
Kenapa Anda tahu ini? Ini adalah pendekatan terbaik yang saya pikir tetapi bagaimana orang bisa tahu ini? Tolong beri tahu saya baru mengenal pemrograman ios.
Yawar

2
Ini sangat universal. Setelah Anda tahu menggunakannya di mana-mana;)
Petr Syrov

Saya tahu begitu saya mengerti apa yang berjalan di belakangnya saya akan sering menggunakannya. Tapi maksud saya "_placeholderLabel.textColor" ini harus menjadi tampilan anak dari textfield. Apakah ada cara untuk melihat jenis informasi ini tentang kontrol?
Yawar

2
@ Yawar Anda dapat menggunakan inspektur hierarki tampilan dalam Xcode, atau mengintrospeksi tampilan dalam debugger.
David Ganster

bagus, terlepas dari bidang teks, Anda dapat menggunakan 'ubin / nama' yang sama untuk keypath
Naishta

16

dalam 3.X cepat

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

dalam cepat 5

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

12

Untuk iOS 6.0 +

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

Semoga ini bisa membantu.

Catatan: Apple dapat menolak (kemungkinan 0,01%) aplikasi Anda karena kami mengakses API pribadi. Saya menggunakan ini di semua proyek saya sejak dua tahun, tetapi Apple tidak meminta ini.


throws terminating with uncaught exception of type NSExceptionfor iOS8
Yar

10

Untuk pengembang Xamarin.iOS, saya menemukannya dari dokumen ini https://developer.xamarin.com/api/type/Foundation.NSAttributedString/

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

Terima kasih !! Saya pertama kali menggunakan CTStringAttributes dan bukan UIStringAttributes dan tidak bisa mengetahuinya. Hati-hati untuk tidak menggunakan ini:new NSAttributedString("placeholderstring", new CTStringAttributes() { ForegroundColor = UIColor.Blue.CGColor });
Yohan Dahmani

9

Versi cepat. Mungkin itu akan membantu seseorang.

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

6

Kategori FTW. Dapat dioptimalkan untuk memeriksa perubahan warna yang efektif.


#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

Untuk menangani perataan vertikal dan horizontal serta warna placeholder di iOS7. drawInRect dan drawAtPoint tidak lagi menggunakan konteks saat ini 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

Terima kasih atas solusi luar biasa ini - yang memusatkan teks dengan benar secara vertikal (berguna dengan font khusus). Satu-satunya hal yang akan saya tambahkan adalah bahwa solusi ini tidak kompatibel dengan iOS 6 atau lebih tua (cukup mudah untuk memperbaikinya dengan mundur pada [self.placeholder drawInRect: rect withFont: self.font lineBreakMode: NSLineBreakByTruncatingTempel penyelarasan email: self.textAlignment];
selamat bersenang-senang

6

iOS 6 dan penawaran kemudian attributedPlaceholderpada UITextField. iOS 3.2 dan yang lebih baru menawarkan setAttributes:range:pada NSMutableAttributedString.

Anda dapat melakukan hal berikut:

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;

Tidak yakin apa yang menyebabkan masalah, kode ini saya panggil di viewdidLoad. warna dan ukuran font baru muncul hanya setelah menggambar ulang. ada hal lain yang perlu dilakukan bersamaan dengan ini?
Vinayaka Karjigi

itu dipecahkan, saya lupa mengatur font untuk UITextfield sebelum menggunakan font itu untuk teks placeholder. saya buruk
Vinayaka Karjigi

6

Solusi ini untuk Swift 4.1

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

4

Mengganti drawPlaceholderInRect:adalah cara yang benar, tetapi tidak berfungsi karena ada bug di API (atau dokumentasi).

Metode tidak pernah dipanggil pada UITextField.

Lihat juga drawTextInRect di UITextField tidak dipanggil

Anda mungkin menggunakan solusi digdog. Karena saya tidak yakin apakah itu dapat melewati tinjauan Apel, saya memilih solusi yang berbeda: Overlay bidang teks dengan label saya sendiri yang meniru perilaku placeholder.

Ini agak berantakan. Kode terlihat seperti ini (Catatan saya melakukan ini di dalam subkelas 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;
}

bagaimana perasaan Anda tentang berbagi solusi ramah-ulasan?
Adam

Saya menambahkan solusi yang saya gunakan. Saya harus melakukan sedikit penggalian, karena ini beberapa waktu yang lalu :)
henning77

Saya melakukan sesuatu yang mirip dengan ini, tetapi saya menempatkan kode dalam kategori, dan perlu melakukan pemeriksaan di shouldChangeCharacters tentang apakah akan membuatnya terlihat, yang merupakan metode kedua dalam kategori yang disebut - (void) overlayPlaceholderVisible: (BOOL) terlihat ;
David van Dugteren

3

Saya baru mengenal xcode dan saya menemukan jalan keluar untuk efek yang sama.

Saya menempatkan uilabel sebagai ganti place holder dengan format yang diinginkan dan menyembunyikannya

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

        case 1:
            lblPassword.hidden=YES;
            break;

        default:
            break;
    }
}

Saya setuju ini merupakan solusi dan bukan solusi nyata tetapi efeknya sama dengan mendapatkannya dari tautan ini

CATATAN: Masih berfungsi di iOS 7: |


3

Swift 5 DENGAN CAVEAT.

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

Peringatan adalah bahwa Anda HARUS memasukkan non-kosong di Stringmana "DON'T_DELETE" adalah, bahkan jika string itu diatur dalam kode di tempat lain. Mungkin menghemat lima menit head-sctratching.


2

Yang terbaik yang bisa saya lakukan untuk iOS7 dan lebih sedikit adalah:

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

Bagi mereka yang menggunakan Monotouch (Xamarin.iOS), inilah jawaban Adam, diterjemahkan ke C #:

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

Bagus. Ini tidak terlalu jelas, Anda mungkin menyelamatkan saya beberapa waktu :) Saya mengedit solusi Anda, karena saya pikir itu ide yang lebih baik untuk menggunakan set font di Fontproperti bidang teks.
Wolfgang Schreurs

1

Saya perlu menjaga penyelarasan placeholder sehingga jawaban Adam tidak cukup bagi saya.

Untuk mengatasi ini saya menggunakan variasi kecil yang saya harap akan membantu beberapa dari Anda juga:

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

UILineBreakModeTailTruncationsudah tidak berlaku lagi di iOS 6.
Supertecnoboff

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

Sedikit petunjuk tentang ini adalah bahwa Anda mengakses iVar pribadi (_placeholderLabel) dan di masa lalu Apple sedikit canggung dalam melakukan itu. :)
Alexander W

1

Untuk mengatur Placeholder Textfield Atribut dengan Banyak warna,

Cukup tentukan Teks,

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

Output: -

masukkan deskripsi gambar di sini


0

Opsi lain yang tidak memerlukan subklasifikasi - biarkan placeholder kosong, dan letakkan label di atas tombol edit. Kelola label seperti halnya Anda akan mengelola placeholder (membersihkan setelah pengguna memasukkan apa pun ..)


Saya pikir ini akan efisien jika Anda memiliki satu bidang teks, tetapi jika Anda mencoba untuk membuat perubahan ini pada skala yang lebih global, solusi ini akan menambah jumlah overhead yang cukup besar untuk proyek Anda.
James Parker
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.