Moja aplikacja używa UITextView
. Teraz chcę UITextView
mieć symbol zastępczy podobny do tego, który można ustawić dla UITextField
.
Jak to zrobić?
Moja aplikacja używa UITextView
. Teraz chcę UITextView
mieć symbol zastępczy podobny do tego, który można ustawić dla UITextField
.
Jak to zrobić?
UITextView
rozwiązanie staje się zupełnie inne. Oto kilka rozwiązań. PływająceOdpowiedzi:
Wprowadziłem kilka drobnych modyfikacji w rozwiązaniu bcd, aby umożliwić inicjalizację z
Xib
pliku, zawijanie tekstu i utrzymanie koloru tła. Mam nadzieję, że zaoszczędzi to innym kłopotów.UIPlaceHolderTextView.h:
UIPlaceHolderTextView.m:
źródło
W prosty sposób po prostu utwórz tekst zastępczy
UITextView
przy użyciu następującychUITextViewDelegate
metod:pamiętaj tylko, aby ustawić
myUITextView
dokładny tekst na temat tworzenia, npi uczyń klasę nadrzędną
UITextViewDelegate
wcześniej włączając te metody npKod dla Swift 3.1
pamiętaj tylko, aby ustawić
myUITextView
dokładny tekst na temat tworzenia, npi uczyń klasę nadrzędną
UITextViewDelegate
wcześniej włączając te metody npźródło
text
zmienia on atrybutu podglądu tekstu, co jest całkiem miłe .. tam, gdzie ta metoda go modyfikujeNie byłem zbyt zadowolony z żadnego z opublikowanych rozwiązań, ponieważ były one nieco ciężkie. Dodawanie widoków do widoku nie jest naprawdę idealne (szczególnie w
drawRect:
). Obaj mieli wycieki, co również jest nie do przyjęcia.Oto moje rozwiązanie: SAMTextView
SAMTextView.h
SAMTextView.m
Jest o wiele prostszy niż inne, ponieważ nie korzysta z widoków podrzędnych (lub ma przecieki). Możesz go używać.
Aktualizacja 11/10/11: Jest teraz udokumentowana i obsługuje użycie w Konstruktorze interfejsów.
Aktualizacja 11/24/13: Wskaż nowe repozytorium.
źródło
setText
aby zaktualizować symbol zastępczy podczas programowej zmiany właściwości tekstu: - (void) setText: (NSString *) string {[super setText: string]; [self _updateShouldDrawPlaceholder]; }notification
ostatniej metodzie argument jest jednak błędnie napisany i jest to zbyt mała zmiana, aby przesłać ją jako edycję.Znalazłem bardzo łatwy sposób naśladowania zastępcy
Edytować:
Zmieniono instrukcje if, aby porównywać tagi zamiast tekstu. Jeśli użytkownik usunął swój tekst, możliwe było również przypadkowe usunięcie części elementu
@"Foobar placeholder"
zastępczego. Oznacza to, że jeśli użytkownik ponownie wprowadzi tekst Wyświetl następującą metodę delegowania,-(BOOL) textViewShouldBeginEditing:(UITextView *) textView
nie zadziała zgodnie z oczekiwaniami. Próbowałem porównać według koloru tekstu w instrukcji if, ale okazało się, że jasnoszary kolor ustawiony w narzędziu do tworzenia interfejsów nie jest taki sam jak jasnoszary kolor ustawiony w kodzie z[UIColor lightGreyColor]
Możliwe jest również zresetowanie tekstu zastępczego, gdy klawiatura powróci, a [textView length] == 0
EDYTOWAĆ:
Aby wyjaśnić ostatnią część - oto jak można cofnąć tekst zastępczy:
źródło
Co można zrobić, to skonfigurować widok tekstowy z jakiejś początkowej wartości w
text
nieruchomości, a zmienićtextColor
się[UIColor grayColor]
lub coś podobnego. Następnie, ilekroć widok tekstu staje się edytowalny, usuń tekst i pokaż kursor, a jeśli pole tekstowe będzie ponownie puste, odłóż tekst zastępczy. Zmień kolor na[UIColor blackColor]
odpowiedni.Nie jest to dokładnie to samo, co funkcja zastępcza w polu UITextField, ale jest blisko.
źródło
Można ustawić etykietę na
UITextView
przezi ukryj to na
TextViewdidChange
metodzie.To jest prosty i łatwy sposób.
źródło
Jeśli ktoś potrzebuje rozwiązania dla Swift:
Dodaj UITextViewDelegate do swojej klasy
źródło
Proste rozwiązanie Swift 3
Dodaj
UITextViewDelegate
do swojej klasyZestaw
yourTextView.delegate = self
Utwórz
placeholderLabel
i umieść go w środkuyourTextView
Teraz wystarczy animować
placeholderLabel.alpha
natextViewDidChange
:być może będziesz musiał grać z
placeholderLabel
pozycją, aby ją odpowiednio ustawić, ale nie powinno to być zbyt trudneźródło
let alpha = CGFloat(textView.text.isEmpty ? 1.0 : 0.0) if alpha != lblPlaceholder.alpha { UIView.animate(withDuration: 0.3) { self.lblPlaceholder.alpha = alpha } }
Rozszerzyłem odpowiedź KmKndy, dzięki czemu symbol zastępczy pozostaje widoczny, dopóki użytkownik nie rozpocznie edycji,
UITextView
a nie tylko go stuknie . Odzwierciedla to funkcjonalność aplikacji Twitter i Facebook. Moje rozwiązanie nie wymaga subklasy i działa, jeśli użytkownik wpisze bezpośrednio lub wklei tekst!pamiętaj tylko, aby ustawić myUITextView dokładnym tekstem podczas tworzenia, np
i uczyń z klasy nadrzędnej delegata UITextView przed dołączeniem tych metod, np
źródło
Polecam użyć
SZTextView
.https://github.com/glaszig/SZTextView
Dodaj swoją domyślną
UITextView
odstoryboard
a następnie zmienić jego klasy niestandardowegoSZTextView
jak poniżej 👇👇👇👇Następnie zobaczysz dwie nowe opcje w
Attribute Inspector
👇👇👇👇źródło
Poniżej znajduje się port Swift kodu ObjC „SAMTextView” opublikowany jako jedna z pierwszych odpowiedzi na pytanie. Przetestowałem to na iOS 8. Poprawiłem kilka rzeczy, w tym przesunięcie granic dla umieszczenia tekstu zastępczego, ponieważ oryginał był zbyt wysoki i zbyt daleko w prawo (użyłem sugestii w jednym z komentarzy do tego postu).
Wiem, że istnieje wiele prostych rozwiązań, ale podoba mi się podejście do podklasowania UITextView, ponieważ jest ono wielokrotnego użytku i nie muszę zaśmiecać klas wykorzystujących go z mechanizmami.
Swift 2.2:
Swift 4.2:
źródło
tak to zrobiłem:
UITextView2.h
UITextView2.m
źródło
Oto o wiele łatwiejsze rozwiązanie, które zachowuje się dokładnie jak symbol zastępczy UITextField, ale nie wymaga rysowania niestandardowych widoków ani rezygnacji z pierwszej odpowiedzi.
(drugie zaznaczenie instrukcji else if dotyczy przypadku, gdy nic nie zostało wprowadzone, a użytkownik naciska klawisz Backspace)
Wystarczy ustawić klasę jako UITextViewDelegate. W viewDidLoad powinieneś zainicjować jak
źródło
Cześć, możesz użyć IQTextView dostępnego w IQKeyboard Manager. Jest prosty w użyciu i zintegrowany, po prostu ustaw klasę swojego widoku tekstowego na IQTextView i możesz użyć jego właściwości do ustawiania etykiety zastępczej odpowiednim kolorem. Możesz pobrać bibliotekę z IQKeyboardManager
lub możesz zainstalować go z cocoapods.
źródło
UITextViewDelegate
Przepraszam, że dodałem kolejną odpowiedź, ale właśnie ściągnąłem coś takiego, a to stworzyło symbol zastępczy najbliższy UITextField.
Mam nadzieję, że to komuś pomoże.
źródło
if(textView.textColor == [UIColor lightGrayColor]){ textView.textColor = [UIColor blackColor]; textView.text = [textView.text substringToIndex: 1];
W przeciwnym razie pierwszy znak wprowadzany do widoku tekstu został umieszczony na końcu tekstuProsty sposób użycia tego w ramach jednej linii kodu:
Weź jedną etykietę do UITextView w .nib łącząc tę etykietę ze swoim kodem, po nim.
źródło
Zmodyfikowałem implementację Sama Soffesa do pracy z iOS7:
Pamiętaj, aby ustawić
_placeholderAttribues = nil
metody, które mogą zmienić czcionkę i inne cechy, które mogą na nie wpływać. Możesz także pominąć „leniwe” tworzenie słownika atrybutów, jeśli nie spowoduje to błędu.EDYTOWAĆ:
Pamiętaj, aby wywołać setNeedsDisplay w przesłoniętej wersji setBounds, jeśli chcesz, aby symbol zastępczy wyglądał dobrze po animacjach automatycznego układania i tym podobnych.
źródło
Możesz także utworzyć nową klasę TextViewWithPlaceholder jako podklasę UITextView.
(Ten kod jest dość zgrubny - ale myślę, że jest na dobrej drodze).
Dodaj do swojego delegata:
źródło
Stworzyłem własną wersję podklasy „UITextView”. Podobał mi się pomysł Sama Soffesa dotyczący używania powiadomień, ale nie podobał mi się drawRect: overwrite. Wydaje mi się, że to przesada. Myślę, że wykonałem bardzo czyste wdrożenie.
Możesz zajrzeć na mojego podklasy tutaj . Projekt demo jest również uwzględniony.
źródło
Ten wątek miał wiele odpowiedzi, ale oto wersja, którą wolę.
To rozszerza istniejący
UITextView
klasa tak łatwo reuseable, a nie przechwytywać zdarzenia, takie jaktextViewDidChange
(co może złamać kod użytkownika, jeśli zostały one już przechwytywanie tych zdarzeń gdzie indziej).Korzystając z mojego kodu (pokazanego poniżej), możesz łatwo dodać symbol zastępczy do dowolnego z
UITextViews
takich:Kiedy ustawisz tę nową wartość zastępczą, po cichu dodaje ona
UILabel
twoją wartośćUITextView
, a następnie ukrywa / pokazuje ją w razie potrzeby:OK, aby wprowadzić te zmiany, dodaj plik „UITextViewHelper.h” zawierający ten kod:
... oraz plik UITextViewHelper.m zawierający:
Tak, to dużo kodu, ale po dodaniu go do projektu i dołączeniu pliku .h ...
... możesz łatwo używać symboli zastępczych w
UITextViews
.Jest jednak jeden problem.
Jeśli to zrobisz:
... symbol zastępczy pojawi się na górze tekstu. Gdy ustawisz tę
text
wartość, żadne zwykłe powiadomienia nie będą wywoływane, więc nie mogłem się dowiedzieć, jak wywołać moją funkcję, aby zdecydować, czy pokazać / ukryć symbol zastępczy.Rozwiązaniem jest ustawienie
textValue
raczej niżtext
:Alternatywnie możesz ustawić
text
wartość, a następnie zadzwonićcheckIfNeedToDisplayPlaceholder
.Lubię takie rozwiązania, ponieważ „wypełniają lukę” między tym, co zapewnia nam Apple, a tym, czego my (jako programiści) naprawdę potrzebujemy w naszych aplikacjach. Piszesz ten kod raz, dodajesz go do swojej biblioteki plików „pomocniczych” .m / .h, a wraz z upływem czasu SDK staje się coraz mniej frustrujący.
(Napisałem podobnego pomocnika do dodawania przycisku „wyczyść” do moich UITextViews, kolejnej rzeczy, która irytująco istnieje,
UITextField
ale nie wUITextView
…)źródło
Najpierw weź etykietę w pliku .h.
Tutaj biorę
Następnie w .m pod viewDidLoad zadeklaruj to
textview to mój TextView.
Teraz zadeklaruj
Twój symbol zastępczy Textview jest gotowy!
źródło
Polecam użycie kapsuły „UITextView + Placeholder”
na twoim kodzie
źródło
umieść etykietę nad widokiem tekstu.
źródło
Utworzenie symbolu zastępczego w UITextView nie jest możliwe, ale można wygenerować efekt podobny do symbolu zastępczego.
LUB możesz dodać etykietę w widoku tekstu tak jak
i nastaw
źródło
To doskonale naśladuje symbol zastępczy UITextField, w którym tekst symbolu zastępczego pozostaje, aż do momentu wpisania czegoś.
źródło
Oto jeszcze jeden sposób, aby to zrobić, który odtwarza niewielkie wcięcie
UITextField
symbolu zastępczego:Przeciągnij w
UITextField
prawo podUITextView
tak, aby ich lewe górne rogi były wyrównane. Dodaj tekst zastępczy do pola tekstowego.W viewDidLoad dodaj:
Następnie dodaj:
źródło
Ułatwmy to
Utwórz jeden UILabel i umieść go w widoku tekstu (Daj tekst jako szary kolor zastępczy - możesz to wszystko zrobić w swoim xib) Teraz w pliku nagłówkowym zadeklaruj UILabel, a także textviewDelegate Teraz możesz po prostu ukryć etykietę po kliknięciu widoku tekstu
pełny kod poniżej
nagłówek
realizacja
@koniec
Nie zapomnij podłączyć textView i UILabel do właściciela plików z Xib
źródło
Spójrz na UTPlaceholderTextView .
Jest to wygodna podklasa UITextView, która obsługuje symbole zastępcze podobne do UITextField. Główne cechy szczególne:
źródło
Przeczytałem je wszystkie, ale opracowałem bardzo krótkie rozwiązanie Swift 3, które zadziałało we wszystkich moich testach. Może stać się nieco bardziej ogólnikowy, ale proces jest prosty. Oto cała rzecz, którą nazywam „TextViewWithPlaceholder”.
źródło
layoutSubviews()
bezpośrednio. I nie usunąłeś obserwatora NotificationCenter.Szybko napisałem klasę. Możesz zaimportować tę klasę w dowolnym momencie.
klasa publiczna CustomTextView: UITextView {
}
źródło