Резюме:Как вертикального центрирования текста в UITextView с помощью Text Kit (IOS 7)
В IOS 6, я по центру текста по вертикали в UITextView по ключ-значение-наблюдающей текстового вида по contentSize собственности (https://stackoverflow.com/a/12591299/1239263). Когда я обновился до iOS 7, последний метод работал непоследовательно.
Вместо того, чтобы пытаться исправить технику KVO, я предпочел бы использовать Text Kit для вертикального выравнивания текста в UITextView.
Я разработал решение с использованием текстового набора, но оно прерывается при вращении устройства.
UITextView оранжевый.
Когда представление текста изначально загружает, текст центрируется правильно:
Когда устройство поворачивается в ландшафт, текст по-прежнему сосредоточен должным образом:
Однако , когда устройство поворачивается назад к портрету, текст не центрируется должным образом. Текст должен быть на одной строке, как это было на первом снимке экрана выше.
В последнем скриншоте, протоколирование геометрий консоли показывает, что ширина текста контейнера текстового вида не слишком узкая.
Детали:
@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 Да, я не понимаю, почему я должен был бы установить размер текста контейнера на всех. И если мне нужно установить ширину текстового контейнера, почему правильное значение, похоже, зависит от количества отображаемых строк?
Попробуйте использовать автозапуск и ограничения. Мне повезло с их использованием, поскольку они запрашивают объекты системного представления для их собственного размера. –
@DavidH В оранжевом текстовом представлении используется автоматическая компоновка, а рамка текстового представления соответствует вращению. В IB ограничения текстового вида привязаны к четырем сторонам корневого представления. Я добавлю эту информацию. на почту. – bilobatum
Имеет ли свойство textView свойство contentHugging, установленное на высокий для горизонтальной оси? –