iPhone UITextField - Yer tutucu metin rengini değiştirme


566

UITextFieldDenetimlerimde belirlediğim yer tutucu metnin rengini siyah yapmak için değiştirmek istiyorum .

Bunu yer tutucu olarak normal metin kullanmadan ve bir yer tutucunun davranışını taklit etmek için tüm yöntemleri geçersiz kılmak zorunda kalmadan yapmayı tercih ederim.

Bu yöntemi geçersiz kılarsam inanıyorum:

- (void)drawPlaceholderInRect:(CGRect)rect

o zaman bunu yapabilmeliyim. Ancak gerçek yer tutucu nesneye bu yöntemle nasıl erişeceğinizden emin değilim.

Yanıtlar:


804

İOS 6'da UIViews'ta ilişkilendirilmiş dizelerin kullanılmaya başlanmasından bu yana, yer tutucu metne aşağıdaki gibi bir renk atamak mümkündür:

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
Bu iyi - ama işe
yaramadan

4
Ayrıca, bir yanıt olarak
TOSelector

5
Bu sözler için dokümanlar attributedPlaceholderrenk hariç metin niteliklerini kullanır.
Matt Connolly

1
Neden bu özellik için çalışmadığına dair herhangi bir fikir - NSFontAttributeName [[NSAttributedString alloc] initWithString:@"placeholder" attributes: @{NSForegroundColorAttributeName: color, NSFontAttributeName : font}];
dev4u

3
[<UITextField 0x11561d90> valueForUndefinedKey:]: this class is not key value coding-compliant for the key _field.
İOS 7'de

237

Kolay ve ağrısız, bazıları için kolay bir alternatif olabilir.

_placeholderLabel.textColor

Üretim için önerilmez, Apple başvurunuzu reddedebilir.


1
Bunu üretimde mi kullanıyorsunuz? Özel bir mülke erişmek istiyorum.
Geri Borbás

11
Hızlı kopyalama ve yapıştırma için metni cevabınıza ekleyin. _placeholderLabel.textColor
Philiiiiiipp

47
Bu yöntemi kullanmayın, bunu kullandım ve itune store, başvurumu reddetti.
Asad ali

1
Her türlü özel kütüphane yönteminin ASLA hiçbir şeye çözüm olarak önerilmemesi gerektiğini düşünüyorum
Skrew

2
@jungledev _placeholderLabelözel bir tesistir. Bu çözüm, özel API kullanımı için reddedilmeye tabidir.
Sean Kladek

194

Yer drawPlaceholderInRect:(CGRect)recttutucu metnini manuel olarak oluşturmak için bu şekilde geçersiz kılabilirsiniz :

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

44
Böyle bir [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];şey muhtemelen daha iyidir. Bu şekilde textAlignmentmülke saygı duyacaksınız . Bu benim SSTextField sınıfına ekledim . Projelerinizde kullanmaktan çekinmeyin.
Sam Soffes

52
Kesinlikle Koteg'in söylediklerini YAPMAYIN. ASLA yöntemleri kategoriler üzerinden geçersiz kılmayın. EVER
Joshua Weinberg

8
@JoshuaWeinberg Talebinizin arkasında belirli bir neden var mı?
Krishnan

5
@Krishnan bir kategoride yinelenen bir yöntem uygulamak desteklenmez ve hangi yöntemin çağrılacağından veya her ikisinin de çağrılıp çağrılmayacağından veya çağrılma sırasından asla emin olamazsınız.
sean woodward

8
İOS7'de, metni dikey olarak ortalamak için CGRectInset (rect, 0, (rect.size.height - self.font.lineHeight) / 2.0) kullanarak rektifi değiştirebilirsiniz.
Brian S

170

Aşağıdaki kodu kullanarak Yer Tutucu metin rengini istediğiniz herhangi bir renkle değiştirebilirsiniz.

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

6
En iyi cevap önerildi. Belgelendirilmiş API'ları çalışır ve kullanır.
Ian Hoar

2
Bunu UISearchBar için nasıl çalışırsınız? AttributePlaceholder özelliği yoktur.
gilsaints88

1
Bu cevap doğru değil - dokümanlara göre, attributedPlaceholder'ın metin rengi bilgileri yok sayılır developer.apple.com/library/ios/documentation/UIKit/Reference/…
Adlai Holler

Herkese teşekkürler. Umarım biraz yardımcı olmuştur. Adlai holler ver bu bir deneyin kardeşim Bu cevap iOS'un önceki sürümü içindi. Daha iyi bir cevabınız varsa önerilere açığız.
Manju

Yer tutucu özelliği olmadığı için iOS8'de çalışmıyor
Ben Clayton

157

Belki bu şekilde denemek istersiniz, ancak Apple sizi özel ivar'a erişim konusunda uyarabilir:

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

NOT
Martin Alléus'a göre, bu artık iOS 7'de çalışmıyor.


6
Uygulamamda bu yöntemi kullanıyorum. İnceleme, Tamam oldu. Bu yüzden onu kullanmanın iyi olduğunu düşünüyorum.
Michael A.

9
Bu uygulama mağazası güvenli değildir ve teşvik edilmemelidir, bu tekniklerle onaylanmanız veya onaylanmanız garanti edilmez.
Sveinung Kval Bakken

31
Onaylanıp onaylanmadığı gerçekten önemli değil. Önemli olan, bunun gelecekteki işletim sistemi güncellemelerinde uygulamanızı bozabilmesidir.
pablasso

2
İOS 7 ile herhangi bir sorun yaşamadım ... Nota rağmen denedim ve iyi çalışıyor gibi görünüyor ve bu yaklaşımı geçmişte sorunsuz olarak kullandım.
WCByrne

6
Bu her zaman kötü bir fikirdi ve şimdi iOS 13'te kırıldı: Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug😈
Ryder Mackay

154

Bu Swift <3.0 çalışır:

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

İOS 8.2 ve iOS 8.3 beta 4'te test edilmiştir.

Hızlı 3:

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

Hızlı 4:

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

Hızlı 4.2:

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

Çözümünüzü iOS8.2'de kullanmak cazibe gibi çalışır. Burada mükemmel çözüm. Amaç C de kullanmak.
Akshit Zaveri

73

Swift'te:

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

Swift 4.0'da:

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


Bu en iyisi, teşekkürler. @apinho burada hiçbir şey çökmeyecek
Markus

// Swift 4'te, placeholder = yourTextField.placeholder {yourTextField.attributedPlaceholder = NSAttributedString (dize: yer tutucu, özellikler: [NSAttributedStringKey.foregroundColor: UIColor.white])}
Ronaldo Albertini

Bu kod yürütüldükten sonra yer tutucu metin değerini değiştirmenin varsayılan yer tutucu rengini geri getireceğini unutmayın.
Alessandro Vendruscolo

66

Swift 3.0 + Film şeridi

Film şeridindeki yer tutucu rengini değiştirmek için sonraki kodla bir uzantı oluşturun. (bu kodu güncellemekten çekinmeyin, düşünüyorsanız, daha net ve daha güvenli olabilir).

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

resim açıklamasını buraya girin

Swift 4 sürümü

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 sürümü

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

Derleyici bulamaz NSAttributedStringKey.
Milan Kamilya


43

Aşağıdakiler yalnızca iOS6 + ile (Alexander W'nun yorumunda belirtildiği gibi):

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

33

Bu sorunla zaten karşılaşmıştım. Benim durumumda aşağıdaki kod doğrudur.

Hedef C

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

Swift 4.X için

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

İOS 13 Swift Kodu için

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

İOS 13 için aşağıdaki kodu da kullanabilirsiniz

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

Umarım bu size yardımcı olabilir.


@Ashu bu ios'ta çökmeye neden oluyor 13 'UITextField'ın _placeholderLabel ivar'ına erişim yasaktır. Bu bir uygulama hatası 'Bu bile inşa olmayacak Ben AppStore yerleştirmekten bahsetmiyorum
Melany

1
IOS 13 bu kısıtlandı artık kullanamazsınız
Kishore Kumar

Objc kodu IOS 13 üzerinde test edilmiştir ve çalışmaz.
Mehdico

1
@Mehdico iOS 13 için cevabı güncelledim. Umarım bu size yardımcı olacaktır.
Ashu

Bu değişikliği yapmak zorunda olduğumu öğrenmek için çok uzun sürdü viewWillAppearveya viewDidAppear. viewDidLoadçok erken.
Dört

32

Bununla, iOS'ta metin alanının yer tutucu metninin rengini değiştirebiliriz

[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
İOS13'ten başlayarak bu işe yaramaz
Teddy

@Teddy şimdi nasıl yaptın? Bununla ilgili sorun yaşamaya başladım.
Jalil

@Jalil Umarım senin için hala vaktindeyim. textField.attributedPlaceholder = [[NSAttributedString ayır] initWithString: @ "text" öznitelikleri: @ {NSForegroundColorAttributeName: [UIColor colorWithHexString: @ "ffffff55"]}];
Teddy

18

Neden sadece UIAppearanceyöntemi kullanmıyorsunuz :

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

Harika çalışıyor! Metnin rengi etkilenmez (En azından textColor özelliği için farklı proxy sunucularda)
HotJard

18

Ayrıca film şeridinizde, tek bir kod satırı olmadan

resim açıklamasını buraya girin


1
Bunu nereden biliyorsun? En iyi yaklaşım bence ama bunu nasıl bilebilirsiniz? Lütfen ios programlamasında yeni olduğumu söyleyin.
Yawar

2
Çok evrensel. Her yerde kullandığını öğrendikten sonra;)
Petr Syrov

Biliyorum bir kere onun arkasında ne koştuğunu anlıyorum, ben çok kullanacağım. Ama "_placeholderLabel.textColor" demek istediğim, bu metin alanının alt görünümü olmalıdır. Bir kontrol hakkında bu tür bilgileri görmenin bir yolu var mı?
Yawar

2
@Yawar Xcode'da görünüm hiyerarşisi denetçisini kullanabilir veya hata ayıklayıcıdaki görünümü denetleyebilirsiniz.
David Ganster


16

hızlı 3.X

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

hızlıca 5

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

12

İOS 6.0 + için

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

Umarım yardımcı olur.

Not: Apple, özel API'ye erişirken uygulamanızı reddedebilir (% 0,01). Bunu iki yıldan beri tüm projelerimde kullanıyorum, ancak Apple bunu istemedi.


terminating with uncaught exception of type NSExceptioniOS8 için atar
Yar

10

Xamarin.iOS geliştiricileri için bu belgeden https://developer.xamarin.com/api/type/Foundation.NSAttributedString/ adresini buldum.

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

Teşekkür ederim !! İlk önce UTStringAttributes değil CTStringAttributes kullanıyordum ve anlayamadım. Bunu kullanmamaya dikkat edin:new NSAttributedString("placeholderstring", new CTStringAttributes() { ForegroundColor = UIColor.Blue.CGColor });
Yohan Dahmani

9

Hızlı sürüm. Muhtemelen birine yardım eder.

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

6

Kategoriler FTW. Etkili renk değişimini kontrol etmek için optimize edilebilir.


#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

İOS7'de yer tutucunun renginin yanı sıra dikey ve yatay hizalamayı da ele almak için. drawInRect ve drawAtPoint artık geçerli bağlam fillColor'u kullanmıyor.

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

Metni dikey olarak ortalayan bu özel çözüm için teşekkürler (özel yazı tiplerinde kullanışlı). Eklemek istiyorum tek şey bu çözüm taraftaki geri düşen düzeltme için iOS 6 ve üstü (kolay, yeterli uzunlukta uyumlu olmamasıdır [: rect withFont: self.font lineBreakMode: self.placeholder drawInRect NSLineBreakByTruncatingTail hizalama: self.textAlignment];
lifjoy

6

iOS 6 ve sonraki sürümler attributedPlaceholderaçık UITextField. iOS 3.2 ve sonraki teklifler setAttributes:range:üzerindeNSMutableAttributedString .

Aşağıdakileri yapabilirsiniz:

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;

Soruna neyin neden olduğundan emin değilim, bu kodu viewdidLoad'da çağırdım. yeni renk ve yazı tipi boyutu yalnızca yeniden çizimden sonra görünür. bununla birlikte başka bir şey yapılması gerekiyor mu?
Vinayaka Karjigi

çözüldü, yer tutucu metin için bu yazı tipini kullanmadan önce UITextfield için yazı tipi ayarlamayı unuttum. benim kötü
Vinayaka Karjigi

6

Swift 4.1 için bu çözüm

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

4

Geçersiz kılma drawPlaceholderInRect:doğru yol olacaktır, ancak API'deki (veya dokümantasyondaki) bir hata nedeniyle çalışmaz.

Yöntem asla bir UITextField.

Ayrıca bakınız bkz. UITextField üzerinde drawTextInRect çağrılmadı

Digdog'un çözümünü kullanabilirsiniz. Bu elma incelemesi geçmiş olsun emin değilim, farklı bir çözüm seçtim: Metin alanı yer tutucu davranış taklit kendi etiket ile bindirme.

Bu biraz dağınık olsa. Kod şöyle görünüyor (Not bunu bir TextField alt sınıfı içinde yapıyorum):

@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;
}

inceleme dostu çözümünüzü paylaşmak konusunda ne düşünürdünüz?
adam

Kullandığım çözümü ekledim. Bu biraz zaman önce olduğu gibi biraz kazma yapmak zorunda kaldım :)
henning77

Buna benzer bir şey yaptım, ancak kodu bir kategoriye yerleştirdim ve - (void) overlayPlaceholderVisible: (BOOL) görünür kategorisinde ikinci bir yöntem olan, görünür hale getirilip getirilmeyeceği konusunda mustChangeCharacters'da bir kontrol yapmam gerekiyordu. ;
David van Dugteren

3

Ben xcode için yeni ve aynı etkiye bir yol buldum.

İstediğiniz formatta yer tutucunun yerine bir uilabel yerleştirdim ve

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

        case 1:
            lblPassword.hidden=YES;
            break;

        default:
            break;
    }
}

Onun etrafında bir çalışma ve gerçek bir çözüm değil katılıyorum ama etkisi aynıydı bu bağlantıdan aldım

NOT: Hala iOS 7'de çalışıyor: |


3

5 CAVEAT İLE TIKLAYIN.

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

String"DON'T_DELETE" ifadesinin bulunduğu yere boş olmayan bir değer girmeniz GEREKİR , bu dize başka bir yerde kodda ayarlanmış olsa bile. Beş dakika kafa çizilmesinden kurtarabilir.


2

Hem iOS7 hem de daha azı için yapabileceğim en iyi şey:

- (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) kullananlar için, Adam'ın C # diline çevirdiği cevabı:

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

Harika. Bu gerçekten açık değildi, muhtemelen beni biraz zaman kazandınız :) Çözümünüzü düzenledim, çünkü Fontmetin alanının özelliğinde yazı tipini kullanmak daha iyi bir fikir olduğunu düşünüyorum .
Wolfgang Schreurs

1

Adamın cevabı benim için yeterli değildi, bu yüzden yer tutucu hizalaması tutmak gerekiyordu.

Bunu çözmek için, bazılarınıza da yardımcı olacağını umduğum küçük bir varyasyon kullandım:

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

UILineBreakModeTailTruncationiOS 6 itibarıyla kullanımdan kaldırıldı.
Supertecnoboff

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

Bununla ilgili küçük bir ipucu, özel bir iVar'a (_placeholderLabel) eriştiğiniz ve geçmişte Apple'ın bunu yapmak konusunda biraz tuhaf olması. :)
Alexander W

1

Birden çok renge sahip Nitelikli Metin Alanı Yer Tutucu ayarlamak için,

Sadece Metni belirtin,

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

Çıktı :-

resim açıklamasını buraya girin


0

Alt sınıf gerektirmeyen başka bir seçenek - yer tutucuyu boş bırakın ve düzenleme düğmesinin üstüne bir etiket yerleştirin. Etiketi tıpkı yer tutucuyu yönettiğiniz gibi yönetin (kullanıcı herhangi bir şey girdikten sonra silin ..)


Bir metin alanınız varsa bunun verimli olacağını düşünüyorum, ancak bu değişikliği daha küresel ölçekte yapmaya çalışıyorsanız, bu çözüm projenize önemli miktarda ek yük getirecektir.
James Parker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.