【问题标题】:Scaling UITextView using contentScaleFactor property使用 contentScaleFactor 属性缩放 UITextView
【发布时间】:2011-08-21 02:20:45
【问题描述】:

我正在尝试创建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,它也很模糊。

从另一个问题我不明白为什么它适用于 Warrior 而不是我。我会在那里问的——但我似乎不能在那里发表评论或问题。

【问题讨论】:

  • 你找到它为什么不适合你了吗?

标签: objective-c iphone uiview uitextview scaling


【解决方案1】:

设置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];
    }
}

【讨论】:

  • 为什么这不是选择的答案?有几十个问题都有相同的问题,这绝对是唯一适合我的解决方案。
  • 嘿,你为什么在提到 UITextView 时说“CATiledLayer”?它不是常规的超类层。你改了吗?
【解决方案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 作为缩放中心点,因此需要添加“平移变换”来围绕视图角进行缩放。

【讨论】:

    【解决方案3】:

    确保将 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];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      相关资源
      最近更新 更多