Большой текст вырезается в UITextView, что внутри UIScrollView
У меня серьезная проблема, которую я просто не могу исправить, и это заставляет меня сумасшедшим в течение последних двух дней. Я искал по всему миру, и я не могу найти решение, хотя я пробовал много.
У меня есть UITextView
внутри a UIScrollView
. Я могу динамически изменять размер UITextView
внутри прокрутки, чтобы отобразить текст. Но когда UITextView
содержит очень большой текст, он обрезается, когда я прокручиваю почти до конца. Тем не менее, кадр UIScrollView
все еще правильно настроен.
Я прочитал эти сообщения: this и многие другие.
UIScrollView
и UITextView
создаются в xib с использованием AutoLayout.
Вот мой текущий код и скриншот, так как вы можете видеть, что пустое место на скриншоте должно быть заполнено текстом. пожалуйста помоги.
![enter image description here]()
- (void)viewDidAppear:(BOOL)animated
{
CGRect frame = self.longDescField.frame;
frame.size.height = self.longDescField.contentSize.height;
self.longDescField.frame = frame;
self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width, self.longDescField.contentSize.height + 200);
self.scrollView.scrollEnabled = YES;
[self.scrollView flashScrollIndicators];
}
Ответы
Ответ 1
Эта проблема существует с iOS 7 и до сих пор присутствует в iOS 12.
Однако я не смог сохранить нормальное поведение прокрутки, установив scrollEnabled = NO
перед изменением размера, как рекомендовано @igz. Вместо этого я переключился прокруткой on
и off
после изменения размера
// Resize text view here
textView.scrollEnabled = NO;
textView.scrollEnabled = YES;
Это заставило обрезанный текст правильно отображаться.
Ответ 2
Спасибо всем за вашу помощь. В конечном итоге это закончилось тем, что я работал в iOS7.
Мне пришлось отключить автоматический макет для этого конкретного xib.
Затем выполнялось следующее:
[textView setScrollEnabled:YES];
[textView setText:text];
[textView sizeToFit];
[textView setScrollEnabled:NO];
Ответ 3
Для меня решение заключалось в том, чтобы поместить sizeToFit
после настройки textView
[self.yourTextView sizeToFit];
Это должно быть последним, что вы делаете при манипулировании текстовым представлением, не должно быть, прежде чем заполнять текст содержимого.
Ответ 4
Определенно iOS7. У меня была та же проблема, применимая ко всем UITextViews, которые были изменены, как с xib, так и с кодом. Я обнаружил, что textContainer.size необходимо настроить после того, как кадр UITextView был изменен.
Я создал этот код категории, чтобы отредактировать textContainer.size, но, похоже, он также нуждается в настройке после установки текстового значения, поэтому мне нужно вызвать adjustAfterFrameChange после изменения любого текста, если за ними не следует установка размера кадра.
Этот код делает предположение о том, что UITextView ничего не делает с помощью setFrame: сам вынимает setFrame: а вызовите adjustAfterFrameChange вручную, если вы хотите избежать этого риска
Изменить: изменено
self.textContainer.size = self.frame.size; // fix for cut off text
к
self.textContainer.size = self.contentSize; // fix for cut off text
@interface UITextView(Extras)
- (void)adjustAfterFrameChange;
@end
@implementation UITextView(Extras)
- (void)adjustAfterFrameChange {
#if defined(__IPHONE_7_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_7_0
if ([self respondsToSelector:@selector(textContainer)])
self.textContainer.size = self.contentSize; // fix for cut off text
#endif
}
- (void)setFrame:(CGRect)frame {
[super setFrame:frame];
[self adjustAfterFrameChange];
}
@end
Ответ 5
Попробуйте это
[self.textView setContentInset:UIEdgeInsetsMake(-8.0, 0, -8.0, 0)];
Он работает для отключения текстового дисплея в UITextView.
Ответ 6
У меня была аналогичная проблема, в которой длинный текст обрезался после изменения размера текстового представления.
Отключение scrollingEnabled перед изменением размера, казалось, исправить. Конечно, похоже на ошибку IOS 7.
Ответ 7
Эту проблему можно исправить, установив для свойства непрерывного макета значение false.
textView.layoutManager.allowsNonContiguousLayout = false
Хотя в документации говорится, что по умолчанию установлено значение false, для UITextView оно фактически установлено в значение true.
Ответ 8
Просто попробуйте это.
В IOS 8 и Xcode 6.3,
textview.scrollEnabled=YES;
[self.textview setContentInset:UIEdgeInsetsMake(-10.0, 0, -5.0, 0)];
Ответ 9
У нас возникла проблема с развертыванием iOS7. Когда мы вызывали setText, который добавлял новую строку (или строки) в наш UITextView, текстовое представление не использовало правильную новую высоту для ее перерисовки. SetNeedsDisplay, setNeedsLayout, перерисовывая слои, перерисовывая весь вид и т.д., Все это не сработало. Наконец, мы заставили потерять и получить фокус:
[textView resignFirstResponder];
[textView becomeFirstResponder];
Это привело к перерасчету высоты и правильному перерисовке. К счастью, это не приводит к тому, что клавиатура выскакивает и появляется, но стоит попробовать регрессионное тестирование на любых версиях iOS, поддерживаемых вашим приложением.
Ответ 10
Это происходит полностью, из интерфейса Interface Builder.
Когда выбран режим просмотра текста, в "Утилиты инспектор" снимите флажок "Показывать вертикальный индикатор". Теперь появится обрезанный текст.
Ответ 11
У нас была та же проблема, за исключением того, что левая половина или правая половина UITextView обрезалась. Случилось как на iOS 7, так и на iOS 6, на разных телефонах. Призвание:
myTextView.scrollEnabled = NO;
в viewWillAppear работала над проблемой.
Ответ 12
У меня такая же проблема для текстового представления (без прокрутки). Решила это (Xcode 7.3.1, iOS 9.3), просто сняв флажок "Прокрутка включена" в Инспекторе атрибутов.
Ответ 13
Возможно, я ошибаюсь, но я не понимаю вашу проблему полностью, но зачем использовать UIScrollView, поскольку с классом UITextView реализует поведение для прокручиваемой многострочной области текста?
Вы должны отменить UIScrollView.
Ответ 14
Ни один из этих ответов не работал у меня.
Я обманывал раскадровки и как-то сейчас работал. Он по-прежнему выглядит неправильно в раскадровке, но на устройстве, которое сейчас отображается нормально.
Я сделал различные вещи, включая переключение многих параметров текстового поля.
Я думаю, что исправил его для меня, был , делающий вид более крупным, строя, и делал его правильным размером снова.
Мои извинения за неопределенный неопределенный ответ, но, возможно, это помогает. Этот проект был первоначально написан для iOS 5, и с тех пор текстовое представление, возможно, не было слишком много.
Ответ 15
Я столкнулся с такой же ситуацией. Мне нужно отключить прокрутку UITextView, и это приводит к тому, что последняя строка будет скопирована. Вот мое решение:
//In the UITextView subClass, override "gestureRecognizerShouldBegin" and let the scrolling of UITextView remain on.
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && gestureRecognizer.view == self){
return NO;
}
return [super gestureRecognizerShouldBegin:gestureRecognizer];
}
Ответ 16
В Swift я исправил эту проблему, просто установив textContainerInset
моего UITextView
:
textView.textContainerInset = UIEdgeInsets(top: 0.0, left: 0.0,
bottom: 50.0, right: 0.0)