使用contentScaleFactor属性缩放UITextView

问题描述 投票:3回答:3

我正在尝试创建更高分辨率的UIView图像,特别是UITextView

这个问题和答案正是我想要弄清楚的:

但是,当我这样做时,我的文字仍然模糊:

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

我也在苹果样本项目“UICatalog”中对UILabel做了同样的尝试,它也很模糊。

我无法理解为什么它可以从另一个问题为Warrior工作,而不是为我。我会问那里 - 但我似乎无法在那里留下评论或问题。

objective-c iphone uiview uitextview scaling
3个回答
7
投票

正如@dbotha指出的那样,设置contentScaleFactorcontentsScale实际上是关键,但是你必须分别走视图和层次结构,以便到达实际进行文本渲染的每个内部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
投票

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
投票

确保将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];
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.