Подтвердить что ты не робот

Большой текст вырезается в 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];
}
4b9b3361

Ответ 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)