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.

adam
sumber

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

Mendongkrak
sumber
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]];
}
adam
sumber
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}];
Manju
sumber
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.

digdog
sumber
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])
Tomino
sumber
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])
}
Beninho85
sumber
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)
        }
    }
}
Nik Kov
sumber
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}];
Gaurav Gilani
sumber
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
sumber
@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"];
Uma Madhavi
sumber
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]];
Valerii Lider
sumber
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

Petr Syrov
sumber
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])
MAhipal Singh
sumber
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.

Fahim Parkar
sumber
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 });
ManuQiao
sumber
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
        }
    }
}
Max Tymchii
sumber
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
osxdirk
sumber
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
aumansoftware
sumber
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;
William Power
sumber
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])
Mantosh Kumar
sumber
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;
}
henning77
sumber
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: |

amar
sumber
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.

HenryRootTwo
sumber
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];
  }
}
Aleksei Minaev
sumber
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);
    }
}
Diego
sumber
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];
}
Tomer Even
sumber
UILineBreakModeTailTruncationsudah tidak berlaku lagi di iOS 6.
Supertecnoboff
1
[txt_field setValue:ColorFromHEX(@"#525252") forKeyPath:@"_placeholderLabel.textColor"];
Mubin Shaikh
sumber
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

Badal Shah
sumber
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 ..)

kolinko
sumber
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