Używam a UITextField
z a UIPickerView
jako jego inputView
, więc gdy użytkownik dotknie pola tekstowego, zostanie przywołany selektor, aby wybrać opcję.
Prawie wszystko działa, ale mam jeden problem: kursor nadal miga w polu tekstowym, gdy jest aktywny, co jest brzydkie i niewłaściwe, ponieważ użytkownik nie powinien pisać w polu i nie jest wyświetlany z klawiaturą. Wiem, że mógłbym hackily rozwiązać ten problem przez ustawienie editing
się NO
na polu tekstowym i śledzenia akcenty na nim, lub poprzez zastąpienie go za pomocą przycisku niestandardowego stylu i wzywanie próbnika poprzez kod. Jednak chcę użyć UITextFieldDelegate
metod do obsługi wszystkich zdarzeń w polu tekstowym, a hacki, takie jak zamiana pola tekstowego na przycisk, nie pozwalają na to podejście.
Jak mogę po prostu ukryć kursor UITextField
zamiast tego?
źródło
Od iOS 7 możesz teraz po prostu ustawić
tintColor = [UIColor clearColor]
na textField, a daszek zniknie.źródło
caretRectForPosition:
rozwiązanie zastępcze.Możesz po prostu wyczyścić tintColor pola tekstowego
Swift 3.0
źródło
Możesz również chcieć uniemożliwić użytkownikowi wybieranie, kopiowanie lub wklejanie dowolnego tekstu, tak aby jedyne dane wejściowe pochodziły z widoku selektora.
http://b2cloud.com.au/tutorial/disiring-the-caret-and-text-entry-in-uitextfields/
źródło
Sprawdź właściwość
selectedTextRange
tego protokołuUITextInput
, do której klasyUITextField
są zgodne. Mało! To lekcja programowania obiektowego.Ukryj Caret
Aby ukryć daszek, zeruj zaznaczony zakres tekstu pola tekstowego.
Odkryj Caret
Oto dwa sposoby odkrywania daszka.
Ustaw zakres tekstu zaznaczonego pola tekstowego na koniec dokumentu.
Aby zachować daszek w tym samym miejscu, najpierw zapisz zakres tekstu zaznaczonego pola tekstowego w zmiennej instancji.
Następnie, gdy chcesz odkryć daszek, po prostu ustaw zaznaczony zakres tekstu pola tekstowego z powrotem na pierwotny:
źródło
caretRectForPosition
. Jest bardziej jasne, co robi, a dokumenty, które zacytowałeś, nie wyjaśniają, jakie powinno być zachowanie karetki, gdy nie ma aktualnego wyboru. Gdyby twierdzenie @ ArtGeigel, że to nie działa, było poprawne (co nie jest, przynajmniej o ile widzę), nie byłoby jasne, że to był błąd.Odpowiedź udzielona przez PO, skopiowana z części pytań, aby pomóc uporać się z coraz większą liczbą pytań bez odpowiedzi.
Znalazłem inne rozwiązanie: podklasę
UIButton
i zastąpienie tych metodTeraz przycisk jako a
UIResponder
zachowuje się podobnie,UITextField
a implementacja jest całkiem prosta.źródło
UITextFieldDelegate
z tym do obsługi zdarzeń rozpoczęcia i zakończenia edycji. Zamiast tego - chyba że istnieje sposób na obsłużenie tych zdarzeń, o których nie wiem - musisz nadpisaćbecomeFirstResponder
iresignFirstResponder
w podklasie przycisku i ewentualnie utworzyć własny protokół delegata, dodaćdelegate
właściwość i wywołać delegata z wyżej wymienionej metody. To o wiele więcej pracy niż tylko nadpisywaniecaretRectForPosition
wUITextField
podklasie.UIResponder
odwołaniom do klasy i nie miałem pojęcia, że taka sztuczka jest możliwa.UITextField
i ukrycie kursora, co jest w zasadzie hackowaniem, ponieważ używamy wtedy pola tekstowego jako etykiety podczas nieużywanie żadnej z funkcjiUITextField
.Swift 5 wersja posta Net
źródło
ustaw tintColor na Clear Color
i możesz również ustawić w konstruktorze interfejsu
źródło
Jeśli chcesz ukryć kursor, możesz z łatwością tego użyć! U mnie zadziałało ...
źródło
Odpowiedź udzielona przez PO, skopiowana z części pytań, aby pomóc uporać się z coraz większą liczbą pytań bez odpowiedzi.
Myślę, że mam poprawne rozwiązanie, ale jeśli da się je ulepszyć, będę mile widziany :) No cóż, zrobiłem podklasę UITextField i nadpisałem metodę, która zwraca CGRect dla granic
Problem? Tekst nie jest wyświetlany, ponieważ prostokąt ma wartość zero. Ale dodałem UILabel jako podwidok kontrolki i nadpisałem metodę setText, więc kiedy wpisujemy tekst jak zwykle, tekst pola tekstowego jest zerowy i jest etykietą, która pokazuje tekst
Dzięki temu rzecz działa zgodnie z oczekiwaniami. Czy znasz jakiś sposób, aby to poprawić?
źródło
Aby wyłączyć kursor i menu, używam podklasy z tymi 2 metodami:
źródło
Po prostu podklasuję
UITextField
i nadpisujęlayoutSubviews
w następujący sposób:To brudny hack i może się nie powieść w przyszłości (w tym momencie kursor będzie ponownie widoczny - Twoja aplikacja nie ulegnie awarii), ale działa.
źródło
Możesz dodać
BOOL cursorless
właściwość doUITextField
kategorii poprzez skojarzone obiekty.Następnie użyj swizzling metody, aby przesunąć się
caretRectForPosition:
za pomocą metody, która przełącza się międzyCGRectZero
i jej wartością domyślną za pomocącursorless
.Prowadzi to do prostego interfejsu za pośrednictwem rozwijanej kategorii. Pokazują to poniższe pliki.
Po prostu wrzuć je i skorzystaj z tego prostego interfejsu
UITextField
kategoria: https://github.com/rexmas/RexDK/blob/master/RexDK/UI/UITextField%2BRXCursorless.h https://github.com/rexmas/RexDK/blob/master/RexDK/UI/UITextField%2BRXCursorless .mMetoda Swizzling: https://github.com/rexmas/RexDK/blob/master/RexDK/Foundation/NSObject%2BRXRuntimeAdditions.h https://github.com/rexmas/RexDK/blob/master/RexDK/Foundation/NSObject% 2BRXRuntimeAdditions.m
źródło