我偶然发现了一件奇怪的事。看起来UIView
的contentScaleFactor
始终为1,即使在Retina设备上也是如此,除非您实现drawRect:
。考虑以下代码:
@interface MyView : UIView
@end
@implementation MyView
- (id) initWithFrame: (CGRect) frame
{
self = [super initWithFrame: frame];
if (self) {
NSLog(@"%s %g %g %g", __PRETTY_FUNCTION__, self.contentScaleFactor, self.layer.contentsScale, [UIScreen mainScreen].scale);
}
return self;
}
- (void) didMoveToWindow
{
if (self.window)
NSLog(@"%s %g %g %g", __PRETTY_FUNCTION__, self.contentScaleFactor, self.layer.contentsScale, [UIScreen mainScreen].scale);
}
@end
在Retina设备上,它打印以下内容:
-[MyView initWithFrame:] 1 1 2
-[MyView didMoveToWindow] 1 1 2
如果我像这样添加一个空的
drawRect:
实现:- (void) drawRect: (CGRect) rect
{
}
它按预期工作:
-[MyView initWithFrame:] 2 2 2
-[MyView didMoveToWindow] 2 2 2
因此,该 View 是否处于任何 View 层次结构中以及显示在哪种屏幕上似乎并不重要。唯一重要的是 View 是否实现
drawRect:
。那是错误还是功能?我知道我可以按以下方式更改
didMoveToWindow
进行修复- (void) didMoveToWindow
{
if (self.window)
self.contentScaleFactor = self.window.screen.scale;
}
但是默认行为仍然困扰着我。
您可能会问,如果我什么都没画,为什么我根本需要
contentScaleFactor
。那是因为我只是将self.layer.contents
设置为现成的图像,然后使用contentStretch
拉伸(stretch)图像。但是,除非使用正确的contentScaleFactor
图像,否则除非正确设置@2x
,否则图像无法在Retina设备上正常拉伸(stretch)。确切地说,除非使用@2x
图像,否则它可以正常工作。我猜这是一个错误。谁能分享您对
contentScaleFactor
为何如此行为的见解?它仅适用于iOS 5吗? 最佳答案
大概,如果您不覆盖drawRect:
,则UIKit知道UIView
不会绘制任何内容,因此(大概)可以快速完成一个内容比例为1的图层。知道它需要建立一个具有正确内容比例的图层,如果需要,可以将其绘制到该图层中。它不知道您虽然在drawRect:
中什么也不做,所以它不能像以前那样做出相同的假设。
实际上,文档中提到了所有这些内容:
为什么不覆盖drawRect:
并在其中绘制图像呢?或者,您可能会摆脱目前的工作,并添加一个 stub drawRect:
。鉴于文档所说的话,我想假设它会继续工作并且是正确的行为是完全合理的。
关于ios - UIView的contentScaleFactor取决于实现drawRect :?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9479001/