Большой текст обрезается в UITextView, который находится внутри UIScrollView
У меня серьезная проблема, которую я просто не могу решить, и это сводит меня с ума в течение последних двух дней. Я искал далеко и широко, и я не могу найти решение, хотя я пробовал много.
у меня есть UITextView
внутри UIScrollView
, Я могу динамически изменять размер UITextView
внутри прокрутки для отображения текста. Но когда UITextView
содержит очень большой текст, который обрезается, когда я прокручиваю почти до конца. Тем не менее UIScrollView
Размер кадра по-прежнему корректен.
Я прочитал эти посты: этот, этот и многие подобные.
UIScrollview
а также UITextview
оба создаются в xib с использованием AutoLayout.
Вот мой текущий код и скриншот, поскольку вы можете видеть, что пустое место на скриншоте должно быть заполнено текстом. пожалуйста помоги.
- (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];
}
16 ответов
Эта проблема существует с iOS 7 и до сих пор присутствует в iOS 11.
Тем не менее, я не смог сохранить нормальное поведение прокрутки, установив scrollEnabled = NO
до изменения размера, как рекомендуется @igz. Вместо этого я переключил прокрутку on
а также off
после изменения размера
// Resize text view here
textView.scrollEnabled = NO;
textView.scrollEnabled = YES;
Это заставило обрезанный текст правильно отображаться.
Спасибо всем за вашу помощь. Это в конечном итоге то, что в конечном итоге работает для меня в iOS7.
Мне пришлось отключить автоматическую разметку для этого конкретного XIB.
Затем сделал следующее:
[textView setScrollEnabled:YES];
[textView setText:text];
[textView sizeToFit];
[textView setScrollEnabled:NO];
Для меня решение было поставить sizeToFit
после настройки textView
[self.yourTextView sizeToFit];
Это должно быть последним, что вы делаете при манипулировании просмотром текста, не должно быть до того, как вы заполните текст контента.
Эту проблему можно исправить, установив для свойства непрерывного макета значение false.
textView.layoutManager.allowsNonContiguousLayout = false
Хотя в документации говорится, что по умолчанию установлено значение false, для UITextView оно фактически установлено в значение true.
Определенно 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
У меня была похожая проблема, когда длинный текст обрезался после изменения размера текстового представления. Отключение scrollingEnabled до изменения размера, казалось, исправило это. Конечно, похоже на ошибку IOS 7.
Попробуй это
[self.textView setContentInset:UIEdgeInsetsMake(-8.0, 0, -8.0, 0)];
Это работает для отображения отрезанного текста в UITextView.
Просто попробуй это.
В IOS 8 и Xcode 6.3,
textview.scrollEnabled=YES;
[self.textview setContentInset:UIEdgeInsetsMake(-10.0, 0, -5.0, 0)];
У нас была та же проблема, за исключением того, что левая половина или правая половина UITextView была обрезана. Произошло как на iOS 7, так и на iOS 6, на самых разных телефонах. Вызов:
myTextView.scrollEnabled = NO;
во взгляде WillAppear обошел проблему.
Это сработало для меня:
textView.scrollEnabled = NO;
//resize here
textView.scrollEnabled=YES;
У меня та же проблема для просмотра текста (без просмотра прокрутки). Решил это (Xcode 7.3.1, iOS 9.3), просто сняв флажок "Прокрутка включена" в Инспекторе атрибутов.
Это происходит полностью, в Интерфейсном Разработчике также.
Когда текстовое представление выбрано, в Инспекторе утилит снимите флажок Показывать вертикальный индикатор. Обрезанный текст появляется сейчас.
Ни один из этих ответов не работал для меня.
Я дурачился с раскадровкой, и теперь она как-то работает. В раскадровке все равно выглядит неправильно, но на устройстве теперь отображается нормально.
Я делал разные вещи, включая переключение многих опций для текстового поля.
Я думаю, что для меня это исправило, так это то, что я увеличил изображение, выстроил его и снова сделал правильный размер.
Мои извинения за неопределенный неопределенный ответ, но, возможно, это поможет. Этот проект изначально был написан для iOS 5, и с тех пор текстовое представление, возможно, не было сильно перепутано.
У нас была такая проблема с развертыванием iOS7. Когда мы вызывали setText, который добавил новую строку (или строки) в наш UITextView, textview не использовал правильную новую высоту для перерисовки. SetNeedsDisplay, setNeedsLayout, перерисовка слоев, перерисовка всего представления и т. Д. Не работали. Наконец мы форсировали потери и усиление фокуса:
[textView resignFirstResponder];
[textView becomeFirstResponder];
Это заставило пересчитать высоту и правильно перерисовать. К счастью, это не приводит к тому, что клавиатура выскочила и выдвинулась, но стоит регрессионное тестирование, которое поддерживается на любых версиях iOS, которые поддерживает ваше приложение.
Я сталкиваюсь с той же ситуацией. Я должен отключить прокрутку 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];
}
Я могу ошибаться, но я не совсем понимаю вашу проблему, но какая польза от использования UIScrollView, так как класс UITextView реализует поведение для прокручиваемой многострочной текстовой области?
Вы должны отказаться от UIScrollView.
В Swift я исправил эту проблему, просто установив textContainerInset
из моего UITextView
:
textView.textContainerInset = UIEdgeInsets(top: 0.0, left: 0.0,
bottom: 50.0, right: 0.0)