UITextview случайно обрезается при использовании Autolayout и / или предпочитаемого шрифта ForTextStyle.

Autolayout будет случайным образом обрезать текст в моем UITextView. Он изменяет размер UITextContainerView при повороте вперед и назад от альбомной ориентации к портретной. Он будет работать правильно несколько раз, но случайным образом изменит контейнер и обрежет статический текст.

Если я отключу Autolayout, проблема исчезнет. Это также, кажется, исчезнет, ​​если я уберу код PreferredFontForTextStyle и оставлю Autolayout.

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

Кто-нибудь видел это? Это баг или нужно что-то делать не так?

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

Here is the code

//  BugTest_ViewController.h
//
//
//
//

#import <UIKit/UIKit.h>

@interface BugTest_ViewController : UIViewController



@property (weak, nonatomic) IBOutlet UIImageView *image1;

@property (weak, nonatomic) IBOutlet UITextView *text1;



@end

//  BugTest_ViewController.m
//
//
//  
//

#import "BugTest_ViewController.h"

@interface BugTest_ViewController ()


@end

@implementation BugTest_ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
   
}

-(void)viewWillAppear:(BOOL)animated
{

    self.text1.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
    [self.text1 setContentOffset:CGPointZero animated:YES];
    
}

Вот контейнер, когда представление выглядит так, как должно Хороший контейнер

Вот контейнер, когда представление обрезается. Плохой контейнер обрезает мой текст


person user3259366    schedule 25.01.2016    source источник
comment
Проверьте свои ограничения текстового представления.   -  person Lumialxk    schedule 25.01.2016
comment
Я сделал. Конфликтов и предупреждений не было.   -  person user3259366    schedule 25.01.2016
comment
Присутствуют 4 ограничения. Ведущий пробел до : Superview = -7.0 Нижнее пространство до: Superview = 0 Выровнять центр x по: Image 1 Верхний пробел до :Image 1 = по умолчанию.   -  person user3259366    schedule 26.01.2016
comment
Повторно протестирован с последней версией Xcode (версия 7.2.1 (7C1002)) и проблема не устранена. Ответа от Apple тоже нет.   -  person user3259366    schedule 04.02.2016


Ответы (4)


Решение из этого вопроса помогает меня. Я пишу что-то вроде этого:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    _textView.scrollEnabled = NO;
    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
        _textView.scrollEnabled = YES;
    }];
}
person Andrew Egorov    schedule 06.06.2016

Причина, по-видимому, в том, что преобразование, примененное к UITextView, иногда может повредить динамическую компоновку представления. Поворот экрана эффективно применяет преобразования поворота и перемещения к представлениям во время перехода.

Та же проблема возникает, когда CGAffineTransform применяется к UITextView. Вот наглядный пример, где _UITextContainerView (синяя рамка) меньше, чем UITextView (зеленый фон) после CGAffineTransform, в результате чего текст выглядит обрезанным.

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

Одним из решений, которое сработало в этом случае, было установить вставку содержимого после завершения преобразования:

textView.contentInset = .zero
view.layoutIfNeeded()
person Manuel    schedule 13.09.2018

Похоже, это происходит из-за вызова setContentOffset:, который путает scrollView в UITextView. Мое решение для прокрутки UITextView:

NSRange range = NSMakeRange(self.outputTextView.text.length - 1, 1);
[self.outputTextView scrollRangeToVisible:range];
self.outputTextView.scrollEnabled = NO;
self.outputTextView.scrollEnabled = YES;

Это повторное включение прокрутки исправляет это.

person Dmitry Soloviov    schedule 03.04.2018

Использовать

[text1 setNeedsLayout];
[text1 layoutIfNeeded]; 

при изменении рамки текстового представления. Это должно решить проблему.

person almas    schedule 02.04.2018