Масштабирование UITextView с использованием свойства contentScaleFactor - PullRequest
3 голосов
/ 08 мая 2011

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

Этот вопрос и ответ - именно то, что я пытаюсь выяснить:

Но, когда я делаю то же самое, мой текст все еще размыто:

self.view.transform = CGAffineTransformMakeScale(2.f, 2.f);
[myText setContentScaleFactor:2.f]; // myText is a subview of self.view object

Я также пробовал то же самое в примере проекта Apple "UICatalog" до UILabel, и он также размыт.

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

Ответы [ 3 ]

7 голосов
/ 18 июня 2015

Установка contentScaleFactor и contentsScale на самом деле является ключом, как указывало @dbotha, однако вы должны пройти иерархию вида и слоя отдельно, чтобы добраться до каждого внутреннего CATiledLayer, который фактически выполняет рендеринг текста. , Добавление масштаба экрана также может иметь смысл.

Таким образом, правильная реализация будет выглядеть примерно так:

- (void)updateForZoomScale:(CGFloat)zoomScale {
    CGFloat screenAndZoomScale = zoomScale * [UIScreen mainScreen].scale;
    // Walk the layer and view hierarchies separately. We need to reach all tiled layers.
    [self applyScale:(zoomScale * [UIScreen mainScreen].scale) toView:self.textView];
    [self applyScale:(zoomScale * [UIScreen mainScreen].scale) toLayer:self.textView.layer];
}

- (void)applyScale:(CGFloat)scale toView:(UIView *)view {
    view.contentScaleFactor = scale;
    for (UIView *subview in view.subviews) {
        [self applyScale:scale toView:subview];
    }
}

- (void)applyScale:(CGFloat)scale toLayer:(CALayer *)layer {
    layer.contentsScale = scale;
    for (CALayer *sublayer in layer.sublayers) {
        [self applyScale:scale toLayer:sublayer];
    }
}
1 голос
/ 19 мая 2017

UITextView имеет свойство textInputView, которое «одновременно рисует текст и предоставляет систему координат» (https://developer.apple.com/reference/uikit/uitextinput/1614564-textinputview)

. Поэтому я использую следующий код для масштабирования UITextView - без каких-либо изменений шрифта, безиспользуя любое свойство "CALayer" и сохраняя высокое качество:

float screenScaleFactor = [[UIScreen mainScreen] scale];
float scale = 5.0;
textView.transform = CGAffineTransformMakeScale(scale, scale);
textView.textInputView.contentScaleFactor = screenScaleFactor * scale;

Прокомментируйте последнюю строку, если вам нужно масштабирование низкого качества (но с лучшей производительностью).

Преобразование использует view.center в качестве центра масштабированияточка, поэтому добавление «translate transform» необходимо для масштабирования вокруг угла обзора.

0 голосов
/ 21 ноября 2013

Обязательно примените contentScaleFactor ко всем подпредставлениям UITextView.Я только что проверил следующее с UITextView и нашел его работать:

- (void)applyScale:(CGFloat)scale toView:(UIView *)view {
    view.contentScaleFactor = scale;
    view.layer.contentsScale = scale;
    for (UIView *subview in view.subviews) {
        [self applyScale:scale toView:subview];
    }
}
...