我偶然发现了一件奇怪的事。看起来UIViewcontentScaleFactor始终为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/

10-15 15:33