我偶然發現了一件奇怪的事情。它看起來像UIView
的contentScaleFactor
始終是1,即使在Retina設備上,除非您實施drawRect:
。考慮以下代碼:UIView的contentScaleFactor依賴於實現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
在視網膜上的裝置,它打印如下:
-[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
將圖像拉伸。但是,除非contentScaleFactor
設置正確,否則即使使用@2x
圖像,圖像在Retina設備上的伸展也不正確。準確地說,它可以正常工作,除非使用 a @2x
圖像。我猜這是一個錯誤。
任何人都可以分享你的見解,爲什麼contentScaleFactor
表現這樣?它僅針對iOS 5嗎?
非常感謝!實質上,我也這麼認爲,但「對於實現自定義'drawRect:'方法和**與窗口**相關聯的視圖」(強調我的意思)意味着只有在將視圖添加到窗口。正如你所看到的,它與一個被忽略的窗口相關聯。也許只是一個文檔錯誤。至於繪製'drawRect:',我避免了它,因爲視圖非常大,我有十幾個,而我拉伸的圖像是31x31像素。基本上,我只是儘量保持內存佔用儘可能低。 – Costique 2012-02-28 13:07:19
謝謝。我在自定義CALayer中完成所有繪圖,並且始終將其contentScale重置爲1.現在,它看起來非常漂亮,視網膜清晰。 – 2013-11-29 16:07:08