2013-11-14 3 views
5

Резюме:Как вертикального центрирования текста в UITextView с помощью Text Kit (IOS 7)

В IOS 6, я по центру текста по вертикали в UITextView по ключ-значение-наблюдающей текстового вида по contentSize собственности (https://stackoverflow.com/a/12591299/1239263). Когда я обновился до iOS 7, последний метод работал непоследовательно.

Вместо того, чтобы пытаться исправить технику KVO, я предпочел бы использовать Text Kit для вертикального выравнивания текста в UITextView.

Я разработал решение с использованием текстового набора, но оно прерывается при вращении устройства.

UITextView оранжевый.

Когда представление текста изначально загружает, текст центрируется правильно:

enter image description here

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

enter image description here

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

enter image description here

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

Детали:

@interface ViewController() 

// text view is created in storyboard; it's added to the root view and it's using auto layout 
@property (weak, nonatomic) IBOutlet UITextView *textView; 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSTextContainer *textContainer = self.textView.textContainer; 
    [textContainer setWidthTracksTextView:YES]; 
} 

- (void)centerText 
{ 
    NSTextContainer *container = self.textView.textContainer; 
    NSLayoutManager *layoutManager = container.layoutManager; 

    CGRect textRect = [layoutManager usedRectForTextContainer:container]; 

    UIEdgeInsets inset = UIEdgeInsetsZero; 
    inset.top = self.textView.bounds.size.height/2 - textRect.size.height/2; 
    inset.left = self.textView.bounds.size.width/2 - textRect.size.width/2; 

    self.textView.textContainerInset = inset; 
} 

- (void)viewDidLayoutSubviews 
{ 
    [self centerText]; 
} 

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; 

    [self centerText]; 
} 

То, что я пытался:

Я попытался вручную установить размер контейнера в методе centerText. В зависимости от того, какое значение я установил для размера контейнера, установка размера контейнера действительно работает в некоторых случаях. Какие случаи? Это зависит от количества отображаемых строк текста.

// fixes problem if a single line of text; clips multi-line text 
container.size = CGSizeZero; 

// fixes problem if multi-line text, but not if a single line of text 
container.size = CGSizeMake(self.textView.bounds.size.width, FLT_MAX); 

Поскольку я устанавливаю widthTracksTextView Да, я не понимаю, почему я должен был бы установить размер текста контейнера на всех. И если мне нужно установить ширину текстового контейнера, почему правильное значение, похоже, зависит от количества отображаемых строк?

+0

Попробуйте использовать автозапуск и ограничения. Мне повезло с их использованием, поскольку они запрашивают объекты системного представления для их собственного размера. –

+0

@DavidH В оранжевом текстовом представлении используется автоматическая компоновка, а рамка текстового представления соответствует вращению. В IB ограничения текстового вида привязаны к четырем сторонам корневого представления. Я добавлю эту информацию. на почту. – bilobatum

+0

Имеет ли свойство textView свойство contentHugging, установленное на высокий для горизонтальной оси? –

ответ

0

Я думаю, что нашел и объяснение, и решение. Сам контейнер имеет некоторые проблемы с фрагментом строк. Это то, что я видел в пакете.

Возвращает границы фрагмента строки внутри приемника для предлагаемогоRect. Это пересечение предлагаемогоRect и ограничивающего прямоугольника приемника, определяемого свойством -size. Регионы, определенные свойством -exclusionPaths, исключаются из возвращаемого значения. charIndex - это расположение символа внутри текстового хранилища для обрабатываемого фрагмента строки. Возможно, что предлагаемыйRect можно разделить на несколько фрагментов строки из-за путей исключения.

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

- (CGRect)lineFragmentRectForProposedRect:(CGRect)proposedRect atIndex:(NSUInteger)characterIndex writingDirection:(NSWritingDirection)baseWritingDirection remainingRect:(CGRect *)remainingRect; 

 Смежные вопросы

  • Нет связанных вопросов^_^