Chciałbym wstawka ten tekst od a UITextField
.
czy to możliwe?
ios
cocoa-touch
uitextfield
RunLoop
źródło
źródło
Odpowiedzi:
Zastąpienie
-textRectForBounds:
zmieni tylko wstawkę tekstu zastępczego. Aby zmienić wstawkę edytowalnego tekstu, musisz również zastąpić-editingRectForBounds:
źródło
UITextField
znajduje się w ciąguUIScrollView
.- (CGRect)clearButtonRectForBounds:(CGRect)bounds { return CGRectMake(x, y, w, h); }
Znaleziono tutaj: stackoverflow.com/questions/5361369/…Byłem w stanie to zrobić poprzez:
Oczywiście pamiętaj, aby zaimportować QuartzCore, a także dodać Framework do swojego projektu.
źródło
UITextField
nakłada się na treść po prawej stronie.Jeśli potrzebujesz tylko lewego marginesu, możesz spróbować:
Mi to pasuje. Mam nadzieję, że to może pomóc.
źródło
leftView.backgroundColor = textField.backgroundColor;
... Inne niż to świetne rozwiązanie ... Dzięki (:W klasie pochodnej od UITextField, przesłoń przynajmniej te dwie metody:
To może być tak proste, jeśli nie masz dodatkowej zawartości:
UITextField zapewnia kilka metod pozycjonowania, które można zastąpić.
źródło
- (CGRect)borderRectForBounds:(CGRect)bounds; - (CGRect)placeholderRectForBounds:(CGRect)bounds; - (CGRect)clearButtonRectForBounds:(CGRect)bounds; - (CGRect)leftViewRectForBounds:(CGRect)bounds; - (CGRect)rightViewRectForBounds:(CGRect)bounds;
Jak o
@IBInspectable
,@IBDesignable
szybkiej klasie.Zobaczysz to w swojej serii ujęć.
Aktualizacja - Swift 3
źródło
let rect = CGRect(x: bounds.minX, y: bounds.minY + insetY, width: bounds.width, height: bounds.height) return CGRectInset(rect , insetX , 0)
textRect
/editingRect
) wpływa na wydajność przewijania (przynajmniej w iOS 12), gdy tekst przepełnia widoczny prostokąt. Przy wstawce 15 przestaje nawet przewijać.Jeśli masz wyraźny przycisk, zaakceptowana odpowiedź nie zadziała. Powinniśmy również chronić się przed zmianami Apple w przyszłości, dzwoniąc
super
.Tak więc, aby upewnić się, że tekst nie nakłada się na czysty przycisk,
super
najpierw uzyskamy wartość „domyślną” , a następnie dostosujemy w razie potrzeby.Ten kod doda wstawki 10px w górnej, lewej i dolnej części pola tekstowego:
Uwaga: UIEdgeInsetsMake przyjmuje parametry w kolejności: góra , lewo , dół , prawo .
źródło
textRectForBounds:
ieditingRectForBounds:
metody bezclearButtonRectForBounds:
na iOS 7+ działały dla mnie.clearButtonRectForBounds:
po prostu pomaga przesunąć nieco przycisk usuwania w lewo. Może chcesz to pominąć. Moje pole tekstowe było na ciemnym tle, a wyraźny przycisk wymagał trochę dopełnienia po prawej stronie.Myślałem, że dostarczę szybkie rozwiązanie
Swift 3+
źródło
override func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
textRectForBounds
, zmieniony zostanie również symbol zastępczy - więc dodanie zastąpienia zastępczego wstawia symbol zastępczy o kolejne 10 punktów. Jeśli tego właśnie szukasz, 👍🏼, ale jeśli nie, dobrze jest być tego świadomym.Używanie
textRectForBounds:
jest właściwym podejściem. Zawarłem to w mojej podklasie, abyś mógł po prostu użyćtextEdgeInsets
. Zobacz SSTextField .źródło
Szybki
źródło
Dla osób, które szukają łatwiejszego rozwiązania.
Dodaj
UITextField
wnętrze aUIView
. Aby zasymulować wstawkę wokół pola tekstowego, pozostaję 10 pikseli na lewo, a szerokość jest o 20 pikseli mniejsza niż widok. Aby zaokrąglić obramowanie narożnika wokół pola tekstowego, użyj obramowania widokuźródło
UITextView
może?Możesz ustawić wstawkę tekstu dla UITextField, ustawiając leftView.
Lubię to:
źródło
imageView.contentMode = UIViewContentMode.Center imageView.frame = CGRectMake(0.0, 0.0, imageView.image!.size.width + 16.0, imageView.image!.size.height)
Szybki
źródło
Dobrym podejściem do dodawania dopełnienia do UITextField jest podklasa UITextField i dodanie właściwości edgeInsets. Następnie ustawisz edgeInsets, a pole UITextField zostanie odpowiednio narysowane. Będzie to również działać poprawnie z niestandardowym zestawem leftView lub rightView.
OSTextField.h
OSTextField.m
źródło
Swift 3 / Designable in Builder Interface / Oddzielne owady poziome i pionowe / użyteczne po wyjęciu z pudełka
stosowanie:
I
źródło
Zrobiłem to w IB, gdzie utworzyłem UIView Behind the textView, który był nieco dłuższy. Po wyczyszczeniu koloru tła textField.
źródło
To najszybszy sposób, jaki udało mi się znaleźć bez robienia podklas:
W Swift:
źródło
Oto ta sama podklasa UITextField napisana w Swift 3. Zupełnie różni się od poprzednich wersji Swift, jak zobaczysz:
Nawiasem mówiąc, możesz również wykonać następujące czynności, jeśli chcesz kontrolować wstawkę tylko jednej strony. Ten konkretny przykład dopasowania tylko lewej wstawki jest przydatny, jeśli umieścisz obraz na polu UITextField, ale chcesz, aby pojawił się on w polu tekstowym:
źródło
Wersja Swift 4.2 :
źródło
Możesz dostosować położenie tekstu w polu tekstowym, czyniąc go podklasą
UITextField
i zastępując-textRectForBounds:
metodę.źródło
Absurdalne jest, że trzeba
UITextField
podklasować , ponieważ już implementuje metody, jak wskazuje @Adam Waite. Oto szybkie rozszerzenie, które ujawnia fabryczną metodę, dostępną również w naszym repozytorium kategorii :źródło
Podklasowałem UITextField, aby obsłużyć tę funkcję, która obsługuje również wstawkę lewą, górną, prawą i dolną, a także wyraźne pozycjonowanie przycisków.
MRDInsetTextField.h
MRDInsetTextField.m
Przykład użycia, w którym * _someTextField * pochodzi z widoku stalówki / serii ujęć z niestandardową klasą MRDInsetTextField
źródło
Nie jest to tak krótkie jak inne przykłady, ale ma zupełnie inne podejście do rozwiązania tego problemu. Uwaga: kursor nadal zacznie być wyrównany do lewej krawędzi, ale po wpisaniu / wyświetleniu tekst będzie odpowiednio wcięty. Działa to bez tworzenia podklasy, jeśli szukasz tylko lewego marginesu i już używasz
UITextFieldDelegate
pól tekstowych. Musisz ustawić zarówno domyślne atrybuty tekstu, jak i atrybuty pisania. Domyślne atrybuty tekstu ustawia się podczas tworzenia pola tekstowego. Atrybuty pisania, które należy ustawić w delegacie. Jeśli używasz również symbolu zastępczego, chcesz ustawić go również na tym samym marginesie. Podsumowując, otrzymujesz coś takiego.Najpierw utwórz kategorię w
UITextField
klasie.Następnie, jeśli używasz uchwytów umieszczonych, upewnij się, że używasz przypisanego elementu zastępczego, który ustawia to samo wcięcie. Utwórz domyślny słownik z właściwymi atrybutami, podobny do tego:
Następnie zaimportuj powyższą kategorię i za każdym razem, gdy utworzysz pole tekstowe, ustaw domyślne wcięcie, deleguj i użyj domyślnych atrybutów symboli zastępczych zdefiniowanych powyżej. Na przykład:
Na koniec, w delegacie, zaimplementuj
textFieldDidBeginEditing
metodę, mniej więcej tak:źródło
defaultTextAttributes
zawiera,NSMutableParagraphStyle
jest dość niebezpieczne. Wolę mutable. Skopiuj to wszystko.Zwykle staram się unikać podklas, ale działa to, jeśli masz już:
źródło
Aby wprowadzić inne rozwiązanie, które nie wymaga podklasowania:
Testowane z iOS 7 i iOS 8. Oba działają. Nadal może istnieć szansa, że Apple zmodyfikuje hierarchię warstw UITextField, co źle psuje.
źródło
Oto wyczerpująca odpowiedź Swift, która zawiera lewy widok (ikona niestandardowa) i niestandardowy przycisk czyszczenia, oba ustawione w Konstruktorze interfejsów z dostosowywanymi wstawkami.
źródło
Rozwiązanie, które faktycznie działa i obejmuje wszystkie przypadki:
offsetBy
nieinsetBy
.Rect
.Próba:
źródło
Jeśli chcesz zmienić wcięcie GÓRA i LEWO tylko wtedy
// pozycja zastępcza
// pozycja tekstu
źródło
Szybkie rozwiązanie bez podklasy i również sprawdzalne
źródło