Применение преобразования к UITextView - предотвращение изменения содержимого
Когда я применяю преобразование вращения к UITextView
, а затем щелкните внутри, чтобы начать редактирование, кажется, что размер контента автоматически расширяется. Новая ширина представления содержимого - это ширина ограничивающего окна с повернутым представлением. Например, с учетом текстового поля шириной 500 и высоты 400 и повернутого на 30 градусов, новая ширина содержимого будет:
(500 * cos(30)) + (400 * sin(30)) = 633
Или графически:
![enter image description here]()
Интересно, что если вы уже редактируете текстовое представление, а THEN применяете это преобразование, то оказывается, что размер содержимого не изменяется. Таким образом, кажется, что когда-то вокруг начала редактирования текста текстовое представление просматривает его свойство frame
и корректирует размер содержимого на основе ширины кадра. Я предполагаю, что решение этого заключается в том, чтобы сказать ему использовать свойство bounds
, но я не знаю, где это сделать, поскольку я не уверен, где именно текстовое представление решает изменить размер содержимого.
У меня есть googled, но не могу найти ссылок на использование преобразованных UITextView. Есть ли у кого-нибудь идеи об этом?
EDIT (действие кнопки из тестового проекта):
- (IBAction)rotateButtonTapped:(id)sender {
if (CGAffineTransformIsIdentity(self.textView.transform)) {
self.textView.transform = CGAffineTransformMakeRotation(30.0 * M_PI / 180.0);
}
else {
self.textView.transform = CGAffineTransformIdentity;
}
NSLog(@"contentsize: %.0f, %.0f", textView.contentSize.width, textView.contentSize.height);
}
Ответы
Ответ 1
Я тоже застрял в этой проблеме.
Единственное решение, которое я нашел, это создать экземпляр UIView и добавить UITextView в качестве подвью. Затем вы можете повернуть экземпляр UIView, и UITextView будет работать нормально.
UITextView *myTextView = [[UITextView alloc] init];
[myTextView setFrame:CGRectMake(0, 0, 100, 100)];
UIView *myRotateView = [[UIView alloc] init];
[myRotateView setFrame:CGRectMake(20, 20, 100, 100)];
[myRotateView setBackgroundColor:[UIColor clearColor]];
[myRotateView addSubview:myTextView];
myRotateView.transform = CGAffineTransformMakeRotation(0.8);
[[self view] addSubview:myRotateView];
Ответ 2
Вы пытались применить поворот, сделав преобразование слоя, а не преобразование в представлении?
#import <QuartzCore/QuartzCore.h>
mytextField.layer.transform = CATransform3DMakeRotation (angle, 0, 0, 1);
Этого может быть достаточно, чтобы обмануть любую сломанную логику внутри кода текстового поля ядра.