Пустое место в верхней части UITextView в iOS 10

116

У меня есть UITextView с некоторым текстом. Все было хорошо с iOS 6, но теперь с iOS 7 он оставляет пустое пространство сверху, а затем помещает текст ниже середины текстового представления.введите описание изображения здесь

Я не устанавливал contentOffSet. Пожалуйста помоги!

Али Суфян
источник

Ответы:

217

Текстовое представление - это представление с прокруткой. Контроллеры представлений будут автоматически добавлять смещение содержимого для прокрутки представлений, поскольку предполагается, что они захотят прокрутить вверх за панелью навигации и строкой состояния.

Чтобы предотвратить это, установите следующее свойство в контроллере представления, содержащем текстовое представление:

self.automaticallyAdjustsScrollViewInsets = NO
jrturton
источник
7
Это лучший ответ, потому что он касается не только того, как исправить проблему, но и того, почему это происходит в первую очередь.
Стивен Мелвин
1
Кстати, вам не нужно создавать подклассы и переопределять. Просто установите для automaticAdjustsScrollViewInsets значение NO после создания экземпляра UITextView.
leftspin
1
@leftspin - довольно редкий случай, когда вы не создали подкласс контроллера представления. А переопределение метода означает, что ваш код по-прежнему будет работать с более ранними версиями iOS - установка свойства означает, что вам сначала потребуется проверка совместимости.
jrturton
1
Итак, если мой контроллер представления модели находится за пределами UINavigationController, смещение будет очищено? Это какое-то безумие ... Это поведение правильно ТОЛЬКО, когда мое текстовое представление выровнено по верхнему краю, иначе это мусор ... Кто-нибудь может объяснить, почему Apple сделала что-то подобное?
Paul Brewczynski
@jrturton извиняется за то, что это более старый пост, и, пожалуйста, извините меня, поскольку я новичок в objective-c, но в настоящее время это свойство UIViewController ... раньше это был метод?
Craig
58

Текущий ответ, который дал IronManGill, не является хорошим решением, потому что он не основан на понимании того, почему проблема возникает вообще.

Ответ jrturton также не самый чистый способ решить эту проблему. Вам не нужно отменять. Будь проще!

Все, что вам нужно, это установить следующее:

self.automaticallyAdjustsScrollViewInsets = NO;

в методе viewDidLoad.

Ознакомьтесь с документами: https://developer.apple.com/documentation/uikit/uiviewcontroller/1621372-automaticallyadjustsscrollviewin

Dumoko
источник
1
Иногда лучше внести изменения в раскадровку. Перейдите в «Инспектор идентичности» -> «Пользовательские атрибуты времени выполнения» и добавьте туда определение.
hufeng03,
automaticallyAdjustsScrollViewInsets устарела. Из iOS11, используйтеcontentInsetAdjustmentBehavior
Cœur
47

В Интерфейсном Разработчике

  • Выберите контроллер представления, который содержит UITextView.
  • Перейдите в инспектор атрибутов.
  • Снимите флажок «Настроить вставки прокрутки».
user2268026
источник
Это самое простое решение для моего случая на ios8
platinor
3
Примечание. Это свойство UIViewController. Не смог найти, а потом понял, что не прочитал текст полностью
Maik639
37

Это сработало для меня

textView.textContainerInset = UIEdgeInsetsZero;  
textView.textContainer.lineFragmentPadding = 0;
Рави Бихани
источник
24

Перейти к Interface Builder:

  1. Выбрать view controller который содержит вашtext view
  2. снять отметку с Adjusts Scroll View Insetsсобственности

введите описание изображения здесь

Аамир
источник
это было то, что я искал. также вы можете сделать это, добавив self.automaticallyAdjustsScrollViewInsets = false в viewController
CodeOverRide
Это хороший и простой ответ, который только что завершил мой поиск «почему этот текст не отображается».
UpSampler
10

Мне действительно интересно, настоящая ли это особенность… Эта автоматическая вставка на 64 пункта добавляется только тогда, когда UIScrollViewилиUITextView как большая глубина всех подвидов представления контроллера представления. Например, если вы добавляете представление позади (здесь я говорю о z-буфере, а не о включении представления) от представления прокрутки, эта 64-точечная вставка не добавляется автоматически.

Например, здесь добавлена ​​вставка:

введите описание изображения здесь

В этом случае вставка не добавляется:

введите описание изображения здесь

Мне это действительно кажется странным ... Почему ОС должна смотреть на глубину представления, чтобы решить, следует ли расширять представление?

MonsieurDart
источник
6

На Swift (Xcode 6)

 self.automaticallyAdjustsScrollViewInsets = false
Клаудио Баррозо Прадо
источник
Сделайте это в viewDidLoadконтроллере представления с текстовым представлением.
Suragch
automaticallyAdjustsScrollViewInsets устарела. Из iOS11 используйтеcontentInsetAdjustmentBehavior
Cœur
6

Вы можете удалить пустое пространство над своим UITextView, добавив:

yourTextView.textContainerInset = UIEdgeInsetsZero;
lberyouk
источник
5

Я решил эту проблему, установив для смещения содержимого отрицательное значение. Вот код Swift.

yourTextView.setContentOffset(CGPoint(x: 0, y: -150), animated: true)
Сакиб Омер
источник
Это было лучшее решение, позволяющее правильно сохранить вставки и прокрутку под полупрозрачной полосой. Я бы предложил эту модификацию. [self.textView setContentOffset:CGPointMake(0.f, -self.topLayoutGuide.length) animated:NO];
InitJason
1
У меня кроме этого ничего не работало. Swift, Xcode 9.1.
Ashok
1

Вы должны понимать, что это относится к панели навигации:

  • Если ваш контент находится под панелью навигации, вы хотите, чтобы контроллер представления автоматически настраивал вставки представления прокрутки (по умолчанию).
  • Если ваш контент не попадает под панель навигации (вы, вероятно, использовали верхнее руководство по макету для ограничения верхнего пространства), вы можете отключить автоматическую настройку вставки прокрутки, как упоминалось в большинстве других ответов.
CodeStage
источник
1

Я попробовал следующий трюк, все получилось.

- (void)viewDidLoad{
   self.textView.scrollEnabled = NO;  
}       
- (void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
   self.textView.scrollEnabled = YES;
}
Касильяс
источник
1

Решение для Swift 4:

textView.textContainerInset = UIEdgeInsets.zero
Костас Цолеридис
источник
0

Я уверен, что это непрофессиональное решение ... Но простая пустая метка позади текстового представления решает проблему.

Terence
источник
1
это не решение =)
Ilker Baltaci
0

Это просто сработало для меня (доступно с iOS 7)

[<#your UITextViewInstance#> setTextContainerInset:UIEdgeInsetsZero];
RyanTCB
источник