使用contentScaleFactor属性对UITextView进行缩放

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在另一个问题中的解决方法适用于他,而对我则不适用。我本想在那里提问或留言,但似乎无法进行。

你找出来为什么它对你不起作用了吗? - fabb
3个回答

8

设置contentScaleFactorcontentsScale实际上是关键,正如@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];
    }
}

为什么这不是被选中的答案?有数十个问题都有完全相同的问题,而这绝对是唯一适用于我的解决方案。 - datWooWoo
1
嘿,你为什么在提到UITextView时说“CATiledLayer”?它不是常规的超类图层。你改过它了吗? - Roi Mulia

2

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;

如果您需要低质量(但更好的性能)缩放,请注释最后一行。

Transform使用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];
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接