我正在尝试创建更高分辨率的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工作,而不是为我。我会问那里 - 但我似乎无法在那里留下评论或问题。
正如@dbotha指出的那样,设置contentScaleFactor
和contentsScale
实际上是关键,但是你必须分别走视图和层次结构,以便到达实际进行文本渲染的每个内部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具有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”来缩放视角。
确保将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];
}
}