OK, mam problem z plikiem UITextView
. Oto problem:
Dodaję tekst do pliku UITextView
. Następnie użytkownik klika dwukrotnie, aby coś wybrać. Następnie zmieniam tekst w UITextView
(programowo jak powyżej) i UITextView
przewija się na dół strony, gdzie znajduje się kursor.
Jednak NIE tam kliknął użytkownik. ZAWSZE przewija się na sam dół UITextView
niezależnie od tego, gdzie użytkownik kliknął.
Oto moje pytanie: jak zmusić UITextView
przewijanie do góry za każdym razem, gdy zmieniam tekst? Próbowałem contentOffset
i scrollRangeToVisible
. Żadna praca.
Wszelkie sugestie będą mile widziane.
iphone
ios
uitextview
Sam Stewart
źródło
źródło
viewDidAppear()
.Jeśli ktoś ma ten problem w iOS 8, stwierdziliśmy, że po prostu ustawiając
UITextView's
właściwość text, a następnie dzwoniscrollRangeToVisible
ze związkiemNSRange
zlocation:0
,length:0
pracował. Mojego widoku tekstu nie można było edytować i przetestowałem zarówno możliwość wyboru, jak i niemożność wyboru (żadne ustawienie nie wpłynęło na wynik). Oto przykład języka Swift:źródło
A oto moje rozwiązanie ...
źródło
Powołanie
działa, ale zadzwoń
źródło
Używałem atrybutu atrybutu w HTML z nieedytowalnym widokiem tekstu. U mnie też nie działa ustawienie przesunięcia zawartości. To zadziałało dla mnie: wyłącz przewijanie włączone, ustaw tekst, a następnie włącz ponownie przewijanie
źródło
viewDidAppear
ramach szerszej poważnej poprawkiPonieważ żadne z tych rozwiązań nie działało dla mnie i zmarnowałem zbyt dużo czasu na ich łączenie, to ostatecznie rozwiązało problem.
To naprawdę głupie, że nie jest to domyślne zachowanie dla tej kontrolki.
Mam nadzieję, że to pomoże komuś innemu.
źródło
self.textView.contentOffset.y
opartego na tej odpowiedzi: stackoverflow.com/a/25366126/1736679Nie jestem pewien, czy rozumiem Twoje pytanie, ale czy próbujesz po prostu przewinąć widok do góry? Jeśli tak, powinieneś to zrobić
[textview scrollRectToVisible:CGRectMake(0,0,1,1) animated:YES];
źródło
Dla iOS 10 i Swift 3 zrobiłem:
U mnie zadziałało, nie jestem pewien, czy masz problem z najnowszą wersją Swift i iOS.
źródło
Mam zaktualizowaną odpowiedź, dzięki której widok tekstu będzie wyświetlany poprawnie i bez animacji przewijania przez użytkownika.
źródło
Tak to działało w wydaniu iOS 9, ponieważ textView jest przewijany na górze przed pojawieniem się na ekranie
źródło
Tak to zrobiłem
Swift 4:
źródło
To zadziałało dla mnie
źródło
DispatchQueue.main.async(...
nie jest konieczne, ale z jakiegoś powodu (np.) IPhone 5s (iOS 12.1) nie działa, dopóki nie wyślesz. Ale jak donosi stos wywołań w debugerze, we wszystkich przypadkachviewWillAppear()
już działa w głównej kolejce ... - WTF, Apple ???Spróbuj tego, aby przesunąć kursor na górę tekstu.
Zobacz, jak to idzie. Upewnij się, że zadzwonisz po tym, jak wszystkie wydarzenia zostały uruchomione lub cokolwiek robisz, zostanie zrobione.
źródło
Moim problemem jest ustawienie textView na przewijanie do góry, gdy pojawi się widok. W przypadku iOS 10.3.2 i Swift 3.
Rozwiązanie 1:
Rozwiązanie 2:
źródło
Połącz poprzednie odpowiedzi, teraz powinno działać:
źródło
scrollRangeToVisible
jednak usunąć .Ta linia kodu działa dla mnie.
źródło
po prostu możesz użyć tego kodu
źródło
Odpowiedź Swift 2:
Zapobiega to przewijaniu textView do końca tekstu po ustawieniu go.
źródło
W Swift 3:
viewWillLayoutSubviews to miejsce do wprowadzania zmian. viewWillAppear również powinien działać, ale logicznie układ powinien być wykonywany w viewWillLayoutSubviews .
Jeśli chodzi o metody, będą działać zarówno scrollRangeToVisible , jak i setContentOffset . Jednak setContentOffset umożliwia wyłączenie lub włączenie animacji.
Załóżmy, że UITextView nosi nazwę yourUITextView . Oto kod:
źródło
Musiałem wywołać następujący inside viewDidLayoutSubviews (wywołanie inside viewDidLoad było zbyt wczesne):
źródło
To zadziałało dla mnie. Opiera się na odpowiedzi RyanTCB, ale jest to wariant Objective-C tego samego rozwiązania:
źródło
źródło
ViewWillappear
zrobi to natychmiast, zanim użytkownik zauważy, aleViewDidDisappear
sekcja będzie to leniwie animować.[mytextView setContentOffset:CGPointZero animated:YES];
czasami NIE działa (nie wiem dlaczego), więc używaj raczej scrollrangetovisible.źródło
Rozwiązany problem: iOS = 10.2 Swift 3 UITextView
Właśnie użyłem następującej linii:
źródło
viewDidLayoutSubviews
więc dzieje się tak, gdy ekran się obraca. W przeciwnym razie przesunięcie zawartości zostanie niewyrównane.źródło
Miałem problem, ale w moim przypadku textview to podwidok jakiegoś niestandardowego widoku i dodałem go do ViewController. Żadne z rozwiązań nie działało dla mnie. Aby rozwiązać problem, dodano opóźnienie 0,1 sekundy, a następnie włączono przewijanie. U mnie to zadziałało.
źródło
Dla mnie dobrze działa ten kod:
Aby przewinąć do dokładnej pozycji i pokazać ją na górze ekranu, używam tego kodu:
Ustawienie contentOffset.y powoduje przewijanie do końca tekstu, a następnie scrollRangeToVisible przewija do wartości scrollToLocation. W ten sposób potrzebna pozycja pojawia się w pierwszym wierszu scrollView.
źródło
U mnie w iOS 9 przestało działać dla mnie z przypisanym ciągiem za pomocą metody scrollRangeToVisible (1 wiersz był pogrubioną czcionką, inne wiersze były zwykłą czcionką)
Musiałem więc użyć:
gdzie opóźnienie to:
źródło
Spróbuj użyć tego rozwiązania 2-liniowego:
źródło
Oto moje kody. To działa dobrze.
źródło