gpt4 book ai didi

ios - UIView的contentScaleFactor依赖于实现drawRect :?

转载 作者:技术小花猫 更新时间:2023-10-29 11:20:27 27 4
gpt4 key购买 nike

我偶然发现了一件奇怪的事情。看起来 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 设置正确,否则图像无法在 Retina 设备上正确拉伸(stretch),即使使用了 @2x 图像也是如此。准确地说,它可以正常工作除非使用@2x 图像。我猜这是一个错误。

谁能分享您对为什么 contentScaleFactor 以这种方式表现的见解?它仅特定于 iOS 5 吗?

最佳答案

据推测,如果您不覆盖 drawRect:,那么 UIKit 知道 UIView 不会绘制任何东西,因此它需要(大概)快速的情况内容比例为 1 的图层。不过,一旦您重写 drawRect:,它就会知道它需要设置一个内容比例正确的图层,如果您愿意,可以在其中绘制.它不知道你在 drawRect: 中什么也没做,所以它不能做出与以前相同的假设。

事实上,文档中提到的所有内容:

For views that implement a custom drawRect: method and are associated with a window, the default value for this property is the scale factor associated with the screen currently displaying the view.

你为什么不直接覆盖 drawRect: 并在其中绘制你的图像?或者您可能会摆脱当前正在做的事情并拥有一个 stub drawRect:。鉴于文档所说的内容,我认为假设它将继续工作并且是正确的行为是完全合理的。

关于ios - UIView的contentScaleFactor依赖于实现drawRect :?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9479001/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com