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.