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óż!

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

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


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”.

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;

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


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?



6

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

yourTextView.textContainerInset = UIEdgeInsetsZero;

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)

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.

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;
}


0

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


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];
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.