Chciałbym zmienić kolor tekstu zastępczego, który ustawiłem w moich UITextField
kontrolkach, 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.
ios
uitextfield
Adam
źródło
źródło
attributedPlaceholder
mówią, że używa atrybutów tekstowych, z wyjątkiem koloru.[[NSAttributedString alloc] initWithString:@"placeholder" attributes: @{NSForegroundColorAttributeName: color, NSFontAttributeName : font}];
[<UITextField 0x11561d90> valueForUndefinedKey:]: this class is not key value coding-compliant for the key _field.
Łatwy i bezbolesny, dla niektórych może być łatwą alternatywą.
Nie sugerowane do produkcji, Apple może odrzucić twoje zgłoszenie.
źródło
_placeholderLabel
jest własnością prywatną. To rozwiązanie może zostać odrzucone z powodu korzystania z prywatnego interfejsu API.Możesz zastąpić
drawPlaceholderInRect:(CGRect)rect
jako taki, aby ręcznie renderować tekst zastępczy:źródło
[self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];
jest prawdopodobnie lepsze. W ten sposób będziesz szanowałtextAlignment
nieruchomość. Dodałem to do mojej klasy SSTextField . Zapraszam do korzystania w swoich projektach.Możesz zmienić kolor tekstu zastępczego na dowolny kolor, korzystając z poniższego kodu.
źródło
Może chcesz spróbować w ten sposób, ale Apple może ostrzec Cię o dostępie do prywatnego ivar:
UWAGA
Według Martina Alléusa nie działa to już na iOS 7.
źródło
Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug
😈Działa to w Swift <3.0:
Testowane w iOS 8.2 i iOS 8.3 beta 4.
Swift 3:
Swift 4:
Swift 4.2:
źródło
W Swift:
W Swift 4.0:
źródło
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).
Wersja Swift 4
Wersja Swift 5
źródło
NSAttributedStringKey
.Poniższe tylko z iOS6 + (jak wskazano w komentarzu Aleksandra W.):
źródło
Miałem już do czynienia z tym problemem. W moim przypadku poniższy kod jest poprawny.
Cel C
Dla Swift 4.X
Dla iOS 13 Swift Code
Możesz także użyć poniższego kodu dla iOS 13
Mam nadzieję, że to może ci pomóc.
źródło
viewWillAppear
lubviewDidAppear
.viewDidLoad
jest za wcześnie.Dzięki temu możemy zmienić kolor tekstu zastępczego pola tekstowego w iOS
źródło
Dlaczego po prostu nie użyjesz
UIAppearance
metody:źródło
Również w twojej serii ujęć, bez jednego wiersza kodu
źródło
w wersji 3.X
w szybkim 5
źródło
Dla iOS 6.0 +
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ł.
źródło
terminating with uncaught exception of type NSException
na iOS8Dla programistów Xamarin.iOS znalazłem go w tym dokumencie https://developer.xamarin.com/api/type/Foundation.NSAttributString/
źródło
new NSAttributedString("placeholderstring", new CTStringAttributes() { ForegroundColor = UIColor.Blue.CGColor });
Wersja szybka. Prawdopodobnie pomogłoby to komuś.
źródło
Kategorie FTW. Można zoptymalizować, aby sprawdzić efektywną zmianę koloru.
źródło
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
źródło
iOS 6 i nowsze oferty
attributedPlaceholder
naUITextField
. iOS 3.2 i nowsze ofertysetAttributes:range:
naNSMutableAttributedString
.Możesz wykonać następujące czynności:
źródło
To rozwiązanie dla Swift 4.1
źródło
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):
źródło
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
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: |
źródło
Swift 5 WITH CAVEAT.
Zastrzeżenie polega na tym, że MUSISZ wprowadzić niepuste miejsce, w
String
któ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.źródło
Najlepsze, co mogę zrobić zarówno dla iOS7, jak i mniej, to:
źródło
Dla tych, którzy używają Monotouch (Xamarin.iOS), oto odpowiedź Adama przetłumaczona na C #:
źródło
Font
właściwości pola tekstowego.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:
źródło
UILineBreakModeTailTruncation
jest przestarzałe od iOS 6.źródło
Aby ustawić obiekt zastępczy pola tekstowego z wieloma kolorami,
Po prostu określ tekst,
Wynik :-
źródło
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ś…)
źródło