iPhone UITextField - Zmień kolor tekstu zastępczego

566

Chciałbym zmienić kolor tekstu zastępczego, który ustawiłem w moich UITextFieldkontrolkach, aby był czarny.

Wolałbym to zrobić bez użycia zwykłego tekstu jako symbolu zastępczego i bez konieczności zastępowania wszystkich metod naśladowania zachowania symbolu zastępczego.

Wierzę, że jeśli zastąpię tę metodę:

- (void)drawPlaceholderInRect:(CGRect)rect

wtedy powinienem być w stanie to zrobić. Ale nie jestem pewien, jak uzyskać dostęp do rzeczywistego obiektu zastępczego z tej metody.

Adam
źródło

Odpowiedzi:

804

Od czasu wprowadzenia przypisywanych ciągów w UIViews w iOS 6, możliwe jest przypisanie koloru do tekstu zastępczego w następujący sposób:

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.
}
użytkownik1071136
źródło
2
To dobrze - ale pamiętaj, że musisz ustawić wartość zastępczą w IB, zanim to zadziała
gheese
4
warto również zawinąć to w wywołanie respondsToSelector - ponieważ bez niego ten kod ulegnie awarii w celu wdrożenia przed
wersją
5
Dokumenty attributedPlaceholdermówią, że używa atrybutów tekstowych, z wyjątkiem koloru.
Matt Connolly,
1
Każdy pomysł, dlaczego nie działa dla atrybutu - NSFontAttributeName [[NSAttributedString alloc] initWithString:@"placeholder" attributes: @{NSForegroundColorAttributeName: color, NSFontAttributeName : font}];
dev4u
3
Na iOS 7 dostałem ten błąd:[<UITextField 0x11561d90> valueForUndefinedKey:]: this class is not key value coding-compliant for the key _field.
i_am_jorf
237

Łatwy i bezbolesny, dla niektórych może być łatwą alternatywą.

_placeholderLabel.textColor

Nie sugerowane do produkcji, Apple może odrzucić twoje zgłoszenie.

Jacek
źródło
1
Czy używasz tego w produkcji? Mam na myśli dostęp do prywatnej własności.
Geri Borbás,
11
Może dodaj tekst do swojej odpowiedzi, aby szybko skopiować i wkleić. _placeholderLabel.textColor
Philiiiiiipp
47
Nie używaj tej metody, skorzystałem z tego sklepu itune, odrzuciłem moją aplikację.
Asad ali
1
Myślę, że każdy rodzaj metody biblioteki prywatnej NIGDY nie powinny być zalecane jako rozwiązanie do wszystkiego
Skrew
2
@jungledev _placeholderLabeljest własnością prywatną. To rozwiązanie może zostać odrzucone z powodu korzystania z prywatnego interfejsu API.
Sean Kladek
194

Możesz zastąpić drawPlaceholderInRect:(CGRect)rectjako taki, aby ręcznie renderować tekst zastępczy:

- (void) drawPlaceholderInRect:(CGRect)rect {
    [[UIColor blueColor] setFill];
    [[self placeholder] drawInRect:rect withFont:[UIFont systemFontOfSize:16]];
}
Adam
źródło
44
Coś takiego [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];jest prawdopodobnie lepsze. W ten sposób będziesz szanował textAlignmentnieruchomość. Dodałem to do mojej klasy SSTextField . Zapraszam do korzystania w swoich projektach.
Sam Soffes,
52
Absolutnie NIE rób tego, co powiedział Koteg. NIGDY nie zastępuj metod poprzez kategorie. KIEDYKOLWIEK
Joshua Weinberg,
8
@JoshuaWeinberg Czy jest jakiś konkretny powód Twojej sugestii?
Krishnan
5
@Krishnan implementujący zduplikowaną metodę w kategorii nie jest obsługiwany i nigdy nie można mieć pewności, która metoda zostanie wywołana, czy obie będą wywoływane, ani w kolejności, w której zostaną wywołane.
Sean Woodward,
8
W iOS7 możesz zmienić prostokąt za pomocą CGRectInset (rect, 0, (rect.size.height - self.font.lineHeight) / 2.0), aby pionowo wyśrodkować tekst.
Brian S
170

Możesz zmienić kolor tekstu zastępczego na dowolny kolor, korzystając z poniższego kodu.

UIColor *color = [UIColor lightTextColor];
YOURTEXTFIELD.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"PlaceHolder Text" attributes:@{NSForegroundColorAttributeName: color}];
Manju
źródło
6
Sugerowana najlepsza odpowiedź. Działa i wykorzystuje udokumentowane interfejsy API.
Ian Hoar
2
Jak to działa dla UISearchBar? Nie ma atrybutu atrybutuPlaceholder.
gilsaints88
1
Ta odpowiedź jest niepoprawna - zgodnie z dokumentami informacje o kolorze tekstu atrybutu atrybutuPlaceholder są ignorowane developer.apple.com/library/ios/documentation/UIKit/Reference/…
Adlai Holler
Dziękuję wszystkim. Mam nadzieję, że to pomogło. Adlai Holler, spróbuj! Ta odpowiedź dotyczyła poprzedniej wersji systemu iOS. Jeśli masz lepszą odpowiedź, jesteśmy otwarci na sugestie.
Manju
Nie działa na iOS8, ponieważ nie ma przypisanej właściwościPlaceholder
Ben Clayton
157

Może chcesz spróbować w ten sposób, ale Apple może ostrzec Cię o dostępie do prywatnego ivar:

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

UWAGA
Według Martina Alléusa nie działa to już na iOS 7.

digdog
źródło
6
Używam tej metody w mojej aplikacji. Opinia była OK. Myślę więc, że można z niego korzystać.
Michael A.
9
Nie jest to bezpieczne w sklepie z aplikacjami i nie należy zachęcać, nie ma gwarancji, że uzyskasz zgodę lub pozostanie w zgodzie z tymi technikami.
Sveinung Kval Bakken
31
To naprawdę nie powinno mieć znaczenia, czy jest zatwierdzone, czy nie. Ważne jest to, że może to uszkodzić twoją aplikację w przyszłych aktualizacjach systemu operacyjnego.
pablasso
2
Nie mam żadnego problemu z iOS 7 ... spróbowałem pomimo notatki i wydaje się, że działa dobrze i korzystałem z tego podejścia w przeszłości bez problemów.
WCByrne
6
To zawsze był zły pomysł, a teraz jest zepsuty na iOS 13: Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug😈
Ryder Mackay
153

Działa to w Swift <3.0:

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

Testowane w iOS 8.2 i 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
źródło
Korzystanie z rozwiązania na iOS 8.2 działa jak urok. Idealne rozwiązanie tutaj. Wykorzystanie w celu C również.
Akshit Zaveri
73

W Swift:

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

W Swift 4.0:

if let placeholder = yourTextField.placeholder {
    yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder, 
        attributes: [NSAttributedStringKey.foregroundColor: UIColor.black])
}
Beninho85
źródło
Jeśli nie ustawiłeś tekstu zastępczego przed wywołaniem, że spowoduje to awarię aplikacji
apinho
To jest najlepsze, dziękuję. @apinho nic się tu nie zawiesi
Markus
// W Swift 4, jeśli let placeholder = yourTextField.placeholder {yourTextField.attortedPlaceholder = NSAttributString (ciąg: symbol zastępczy, atrybuty: [NSAttributStringKey.foregroundColor: UIColor.white])}
Ronaldo Albertini
Uwaga: zmiana wartości tekstu zastępczego po wykonaniu tego kodu przywróci domyślny kolor symbolu zastępczego.
Alessandro Vendruscolo,
66

Swift 3.0 + Storyboard

Aby zmienić kolor zastępczy w serii ujęć, utwórz rozszerzenie z następnym kodem. (zaktualizuj ten kod, jeśli uważasz, że może być jaśniejszy i bezpieczniejszy).

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

wprowadź opis zdjęcia tutaj

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

Wersja 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
źródło
Kompilator nie może się dowiedzieć NSAttributedStringKey.
Milan Kamilya
Działa w iOS 13
Jalil
43

Poniższe tylko z iOS6 + (jak wskazano w komentarzu Aleksandra W.):

UIColor *color = [UIColor grayColor];
nameText.attributedPlaceholder =
   [[NSAttributedString alloc]
       initWithString:@"Full Name"
       attributes:@{NSForegroundColorAttributeName:color}];
Gaurav Gilani
źródło
33

Miałem już do czynienia z tym problemem. W moim przypadku poniższy kod jest poprawny.

Cel C

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

Dla Swift 4.X

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

Dla iOS 13 Swift Code

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

Możesz także użyć poniższego kodu dla iOS 13

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

Mam nadzieję, że to może ci pomóc.

Ashu
źródło
@Ashu powoduje to awarię w systemie iOS 13 'Dostęp do _placeholderLabel ivar UITextField jest zabroniony. To jest błąd aplikacji „nie będzie nawet kompilacji Nie mówię o umieszczeniu w AppStore
Melany,
1
System iOS 13 był ograniczony, nie można go już używać
Kishore Kumar
Kod Objc jest testowany na IOS 13 i nie działa.
Mehdico
1
@ Mehdico Zaktualizowałem odpowiedź na iOS 13. Mam nadzieję, że to ci pomoże.
Ashu
Zbyt długo zajęło mi nauczenie się, że muszę wprowadzić tę zmianę w viewWillAppearlub viewDidAppear. viewDidLoadjest za wcześnie.
Cztery
32

Dzięki temu możemy zmienić kolor tekstu zastępczego pola tekstowego w 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
źródło
1
Począwszy od iOS13 to nie zadziała
Teddy
@ Teddy, jak to zrobiłeś teraz? Zacząłem mieć z tym problemy.
Jalil
@Jalil Mam nadzieję, że wciąż jestem na czas. textField.attributePlaceholder = [[NSAttributString przydzielenie] initWithString: @ atrybuty „text”: @ {NSForegroundColorAttributeName: [UIColor colorWithHexString: @ „ffffff55”]}];
Teddy
18

Dlaczego po prostu nie użyjesz UIAppearancemetody:

[[UILabel appearanceWhenContainedIn:[UITextField class], nil] setTextColor:[UIColor whateverColorYouNeed]];
Valerii Lider
źródło
Działa świetnie! Kolor tekstu nie ma wpływu (Przynajmniej z innym proxy dla właściwości textColor)
HotJard
18

Również w twojej serii ujęć, bez jednego wiersza kodu

wprowadź opis zdjęcia tutaj

Petr Syrov
źródło
1
Skąd to wiesz? Myślę, że to najlepsze podejście, ale skąd to wiedzieć? Powiedz, że jestem nowy w programowaniu na iOS.
Yawar
2
To jest bardzo uniwersalne. Gdy się zorientujesz, użyj go wszędzie;)
Petr Syrov
Wiem, że kiedy zrozumiem, co za tym stoi, będę go często używać. Ale mam na myśli „_placeholderLabel.textColor”. Powinien to być widok potomny pola tekstowego. Czy istnieje sposób, aby zobaczyć tego rodzaju informacje o kontrolce?
Yawar 30.04.16
2
@Yawar Możesz użyć inspektora hierarchii widoków w Xcode lub introspekcji widoku w debuggerze.
David Ganster
dobry, niezależnie od pola tekstowego, możesz użyć tego samego „
kafelka
16

w wersji 3.X

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

w szybkim 5

textField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes: [NSAttributedString.Key.foregroundColor : UIColor.black])
MAhipal Singh
źródło
12

Dla iOS 6.0 +

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

Mam nadzieję, że to pomoże.

Uwaga: Apple może odrzucić (szanse 0,01%) twoją aplikację, ponieważ uzyskujemy dostęp do prywatnego interfejsu API. Używam tego we wszystkich moich projektach od dwóch lat, ale Apple o to nie prosił.

Fahim Parkar
źródło
rzuca a terminating with uncaught exception of type NSExceptionna iOS8
Yar
10

Dla programistów Xamarin.iOS znalazłem go w tym dokumencie https://developer.xamarin.com/api/type/Foundation.NSAttributString/

textField.AttributedPlaceholder = new NSAttributedString ("Hello, world",new UIStringAttributes () { ForegroundColor =  UIColor.Red });
ManuQiao
źródło
Dziękuję Ci !! Najpierw używałem CTStringAttributes, a nie UIStringAttributes i nie mogłem tego rozgryźć. Uważaj, aby nie użyć tego:new NSAttributedString("placeholderstring", new CTStringAttributes() { ForegroundColor = UIColor.Blue.CGColor });
Yohan Dahmani
9

Wersja szybka. Prawdopodobnie pomogłoby to komuś.

class TextField: UITextField {
   override var placeholder: String? {
        didSet {
            let placeholderString = NSAttributedString(string: placeholder!, attributes: [NSForegroundColorAttributeName: UIColor.whiteColor()])
            self.attributedPlaceholder = placeholderString
        }
    }
}
Max Tymchii
źródło
6

Kategorie FTW. Można zoptymalizować, aby sprawdzić efektywną zmianę koloru.


#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
źródło
6

Aby obsłużyć wyrównanie w pionie i poziomie, a także kolor symbolu zastępczego w iOS7. drawInRect i drawAtPoint nie używają już bieżącego kontekstowego 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
źródło
Dzięki za to doskonałe rozwiązanie - które właściwie wyśrodkowuje tekst pionowo (przydatne w niestandardowych czcionkach). Jedyne, co chciałbym dodać, to to, że to rozwiązanie nie jest kompatybilne z iOS 6 lub starszym (wystarczająco łatwe do naprawienia przez powrót do [self.placeholder drawInRect: rect withFont: self.font lineBreakMode: NSLineBreakByTruncatingTail alignment: self.textAlignment];
lifjoy
6

iOS 6 i nowsze oferty attributedPlaceholderna UITextField. iOS 3.2 i nowsze oferty setAttributes:range:naNSMutableAttributedString .

Możesz wykonać następujące czynności:

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
źródło
Nie jestem pewien, co jest przyczyną problemu, ten kod wywołałem w viewdidLoad. nowy kolor i rozmiar czcionki pojawiają się dopiero po przerysowaniu. coś jeszcze trzeba zrobić z tym?
Vinayaka Karjigi
zostało rozwiązane, zapomniałem ustawić czcionkę dla pola UIText przed użyciem tej czcionki do tekstu zastępczego. mój zły
Vinayaka Karjigi
6

To rozwiązanie dla Swift 4.1

    textName.attributedPlaceholder = NSAttributedString(string: textName.placeholder!, attributes: [NSAttributedStringKey.foregroundColor : UIColor.red])
Mantosh Kumar
źródło
4

Przesłonięcie drawPlaceholderInRect:byłoby poprawnym sposobem, ale nie działa z powodu błędu w interfejsie API (lub dokumentacji).

Metoda nigdy nie zostaje wywołana UITextField.

Zobacz też drawTextInRect na UITextField nie wywołany

Możesz skorzystać z rozwiązania digdog. Ponieważ nie jestem pewien, czy przejdzie to przez przegląd Apples, wybrałem inne rozwiązanie: nałóż pole tekstowe na własną etykietę, która imituje zachowanie symbolu zastępczego.

To jest jednak trochę niechlujne. Kod wygląda następująco (uwaga: robię to wewnątrz podklasy 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
źródło
jak byś się czuł, dzieląc się swoim przyjaznym dla recenzji rozwiązaniem?
adam
Dodałem rozwiązanie, którego użyłem. Musiałem trochę kopać, bo to było jakiś czas temu :)
henning77
Zrobiłem coś podobnego do tego, ale umieściłem kod w kategorii i musiałem sprawdzić, czy powinien być widocznyCharangeCharacters, co było drugą metodą w kategorii o nazwie - (void) overlayPlaceholderVisible: (BOOL) ;
David van Dugteren
3

Jestem nowy w xcode i znalazłem sposób na uzyskanie tego samego efektu.

Umieściłem uilabel w miejscu uchwytu miejsca o żądanym formacie i ukryłem go

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

        case 1:
            lblPassword.hidden=YES;
            break;

        default:
            break;
    }
}

Zgadzam się, że jest to obejście i nie jest to prawdziwe rozwiązanie, ale efekt był taki sam, jak w przypadku tego linku

UWAGA: Nadal działa na iOS 7: |

amar
źródło
3

Swift 5 WITH CAVEAT.

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

Zastrzeżenie polega na tym, że MUSISZ wprowadzić niepuste miejsce, w Stringktórym znajduje się „DON'T_DELETE”, nawet jeśli ten ciąg znaków jest ustawiony w innym miejscu w kodzie. Może zaoszczędzisz pięć minut na drapaniu głowy.

HenryRootTwo
źródło
2

Najlepsze, co mogę zrobić zarówno dla iOS7, jak i mniej, to:

- (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
źródło
2

Dla tych, którzy używają Monotouch (Xamarin.iOS), oto odpowiedź Adama przetłumaczona na 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
źródło
Świetny. Nie było to tak naprawdę oczywiste, prawdopodobnie zaoszczędziłeś mi trochę czasu :) Jednak edytowałem twoje rozwiązanie, ponieważ myślę, że lepiej jest użyć zestawu czcionek we Fontwłaściwości pola tekstowego.
Wolfgang Schreurs,
1

Musiałem zachować wyrównanie symboli zastępczych, aby odpowiedź Adama nie była dla mnie wystarczająca.

Aby rozwiązać ten problem, zastosowałem małą odmianę, która, mam nadzieję, pomoże niektórym z was:

- (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
źródło
UILineBreakModeTailTruncationjest przestarzałe od iOS 6.
Supertecnoboff
1
[txt_field setValue:ColorFromHEX(@"#525252") forKeyPath:@"_placeholderLabel.textColor"];
Mubin Shaikh
źródło
Mała wskazówka na ten temat polega na tym, że uzyskujesz dostęp do prywatnego iVar (_placeholderLabel), a w przeszłości Apple był trochę wybredny. :)
Alexander W
1

Aby ustawić obiekt zastępczy pola tekstowego z wieloma kolorami,

Po prostu określ tekst,

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

Wynik :-

wprowadź opis zdjęcia tutaj

Badal Shah
źródło
0

Kolejna opcja, która nie wymaga podklasowania - pozostaw symbol zastępczy pusty i umieść etykietę nad przyciskiem edycji. Zarządzaj etykietą tak, jakbyś zarządzał symbolem zastępczym (czyszczenie po wprowadzeniu przez użytkownika czegoś…)

kolinko
źródło
Myślę, że byłoby to skuteczne, jeśli masz jedno pole tekstowe, ale jeśli próbujesz wprowadzić tę zmianę w bardziej globalnej skali, to rozwiązanie spowodowałoby znaczne obciążenie projektu.
James Parker