我遇到了一个奇怪的问题。看起来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
看起来无论视图是否在任何视图层级中以及显示在什么类型的屏幕上都没有关系。唯一重要的是查看是否实现了drawRect:
方法。
这是一个错误还是特性?我知道我可以像下面一样更改didMoveToWindow
来修复它。
- (void) didMoveToWindow
{
if (self.window)
self.contentScaleFactor = self.window.screen.scale;
}
但是默认行为仍然让我感到困扰。
你可能会问,如果我什么都不画,为什么还需要contentScaleFactor
。因为我只是将self.layer.contents
设置为一个现成的图像,然后用contentStretch
拉伸图像。然而,在Retina设备上,如果没有正确设置contentScaleFactor
,图像就无法正确地拉伸,即使使用了@2x
图像。准确地说,它可以正常工作,除非使用@2x
图像,这可能是一个错误。
有人能分享一下为什么contentScaleFactor
会表现出这种方式吗? 这是否只适用于iOS 5?
drawRect:
方法并且与窗口相关联的视图”(强调我的)意味着只有在将视图添加到窗口后才能做出决定。正如您所看到的,被忽略的是与窗口的关联。也许只是文档错误。至于在drawRect:
中绘制,我避免这样做,因为视图非常大,而且我有十几个这样的视图,而我正在拉伸的图像是31x31像素。基本上,我只是尽可能地保持内存占用量低。 - Costique