Puste miejsce u góry UITextView w iOS 10

116

Mam UITextView z jakimś tekstem. Wszystko było w porządku z iOS 6, ale teraz w iOS 7 pozostawia puste miejsce na górze, a następnie umieszcza tekst poniżej środka widoku tekstu.wprowadź opis obrazu tutaj

Nie ustawiłem żadnego contentOffSet. Proszę pomóż!

Ali Sufyan
źródło

Odpowiedzi:

217

Widok tekstowy to widok przewijania. Kontrolery widoku dodają automatycznie przesunięcie zawartości do widoków przewijania, ponieważ zakłada się, że będą chciały przewijać w górę za paskiem nawigacji i paskiem stanu.

Aby temu zapobiec, ustaw następującą właściwość na kontrolerze widoku zawierającym widok tekstu:

self.automaticallyAdjustsScrollViewInsets = NO
jrturton
źródło
7
Jest to lepsza odpowiedź, ponieważ dotyczy nie tylko tego, jak rozwiązać problem, ale przede wszystkim dlaczego tak się dzieje.
Stephen Melvin
1
BTW, nie musisz tworzyć podklas i przesłonić. Po prostu ustaw automatycznieAdjustsScrollViewInsets na NO po utworzeniu wystąpienia UITextView.
leftspin
1
@leftspin jest to dość rzadki przypadek, w którym nie utworzono podklasy kontrolera widoku. Zastępowanie metody oznacza, że ​​kod będzie nadal działał na niższych wersjach systemu iOS - ustawienie właściwości oznacza, że ​​najpierw musisz sprawdzić zgodność.
jrturton
1
Jeśli więc kontroler widoku modelu znajduje się poza UINavigationController, przesunięcie zostanie wyczyszczone? To trochę szalone ... To zachowanie jest poprawne TYLKO, gdy mój widok tekstu jest wyrównany do góry, w przeciwnym razie jest to bzdura ... Czy ktoś mógłby wyjaśnić, dlaczego Apple zrobił coś takiego?
Paul Brewczyński
@jrturton przepraszam za to, że jest to starszy post i proszę mi wybaczyć, ponieważ jestem nowy w goal-c, ale obecnie jest to właściwość UIViewController ... czy to była metoda?
Craig,
58

Obecna odpowiedź, której udzielił IronManGill, nie jest dobrym rozwiązaniem, ponieważ nie opiera się na zrozumieniu, dlaczego problem występuje w pierwszej kolejności.

Odpowiedź jrturtona również nie jest najczystszym sposobem rozwiązania tego problemu. Nie musisz nadpisywać. Nie komplikuj!

Wystarczy, że ustawisz:

self.automaticallyAdjustsScrollViewInsets = NO;

w metodzie viewDidLoad.

Sprawdź dokumenty: https://developer.apple.com/documentation/uikit/uiviewcontroller/1621372-automaticallyadjustsscrollviewin

Dumoko
źródło
1
Czasami zmiana w scenorysie jest lepsza. Przejdź do „Identity Inspector” -> „User Defined Runtime Attributes” i dodaj tam definicję.
hufeng03
automaticallyAdjustsScrollViewInsets jest przestarzałe. Z iOS11 użyjcontentInsetAdjustmentBehavior
Cœur
47

W programie Interface Builder

  • Wybierz kontroler widoku, który zawiera UITextView.
  • Przejdź do inspektora atrybutów.
  • Odznacz „Dostosuj przewijane wstawki widoku”.
user2268026
źródło
To najłatwiejsze rozwiązanie dla mojego przypadku w ios8
platinor 28.07.15
3
Uwaga: jest to właściwość UIViewController. Nie mogłem go znaleźć, a potem zdałem sobie sprawę, że nie przeczytałem całego tekstu
Maik639,
37

To zadziałało dla mnie

textView.textContainerInset = UIEdgeInsetsZero;  
textView.textContainer.lineFragmentPadding = 0;
Ravi Bihani
źródło
24

Idź do Interface Builder:

  1. Wybierz view controller który zawieratext view
  2. odznacz Adjusts Scroll View Insetswłaściwość

wprowadź opis obrazu tutaj

Aamir
źródło
to było to, czego szukałem. również możesz to zrobić, dodając „self.automaticallyAdjustsScrollViewInsets = false” do
viewController
To dobra i prosta odpowiedź, która akurat zakończyła moje poszukiwania „dlaczego ten tekst się nie wyświetla”.
UpSampler
10

Naprawdę zastanawiam się, czy to prawdziwa funkcja… Ta 64-punktowa automatyczna wstawka jest dodawana tylko wtedy, gdy UIScrollViewlubUITextView jako większa głębia wszystkich podwidoków widoku kontrolera widoku. Na przykład, jeśli dodasz widok za (tutaj mówię o buforze z, a nie o imbricacji widoku) widokiem przewijania, ta wstawka 64 punktów nie jest automatycznie dodawana.

Na przykład ten dodaje wstawkę:

wprowadź opis obrazu tutaj

W tym przypadku wstawka nie jest dodawana:

wprowadź opis obrazu tutaj

Wydaje mi się to naprawdę dziwne… Dlaczego system operacyjny miałby patrzeć na głębię widoku, aby zdecydować, czy powinien rozszerzyć widok?

MonsieurDart
źródło
6

Szybka (Xcode 6)

 self.automaticallyAdjustsScrollViewInsets = false
Claudio Barrozo Prado
źródło
Zrób to w viewDidLoadkontrolerze widoku z widokiem tekstowym.
Suragch
automaticallyAdjustsScrollViewInsets jest przestarzałe. Z iOS11 użyjcontentInsetAdjustmentBehavior
Cœur
6

Możesz usunąć puste miejsce u góry UITextView, dodając:

yourTextView.textContainerInset = UIEdgeInsetsZero;
lberyouk
źródło
5

Rozwiązałem ten problem, ustawiając przesunięcie zawartości na wartość ujemną. Oto kod Swift.

yourTextView.setContentOffset(CGPoint(x: 0, y: -150), animated: true)
Saqib Omer
źródło
To było najlepsze rozwiązanie zapewniające poprawne zachowanie wstawek i przewijanie pod półprzezroczystym paskiem. Sugerowałbym tę modyfikację. [self.textView setContentOffset:CGPointMake(0.f, -self.topLayoutGuide.length) animated:NO];
InitJason,
1
Nic nie działało dla mnie oprócz tego. Swift, Xcode 9.1.
Ashok
1

Musisz zrozumieć, że dotyczy to paska nawigacji:

  • Jeśli zawartość znajduje się pod paskiem nawigacyjnym, chcesz, aby kontroler widoku automatycznie dostosowywał wstawki widoku przewijania (domyślnie).
  • Jeśli zawartość nie znajduje się pod paskiem nawigacji (prawdopodobnie użyłeś górnego przewodnika po układzie dla ograniczenia górnej przestrzeni), możesz wyłączyć automatyczne dostosowywanie wstawki widoku przewijania, jak wspomniano w większości innych odpowiedzi.
CodeStage
źródło
1

Wypróbowałem następującą sztuczkę, zadziałało.

- (void)viewDidLoad{
   self.textView.scrollEnabled = NO;  
}       
- (void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
   self.textView.scrollEnabled = YES;
}
casillas
źródło
1

Rozwiązanie dla Swift 4:

textView.textContainerInset = UIEdgeInsets.zero
Kostas Tsoleridis
źródło
0

Jest to nieprofesjonalne rozwiązanie, jestem pewien ... Ale samo umieszczenie pustej etykiety za widokiem tekstu rozwiązuje problem.

Terence
źródło
1
to nie jest rozwiązanie =)
Ilker Baltaci
0

To właśnie zadziałało dla mnie (dostępne z iOS 7)

[<#your UITextViewInstance#> setTextContainerInset:UIEdgeInsetsZero];
RyanTCB
źródło