在 iPhone X,Xs 上以编程方式加载时图像会变大?

images render larger when loaded programmatically on iPhone X,Xs?

在 iPhone X,Xs 上以编程方式加载图像时,是否有人遇到过渲染变大的问题?

如果我在故事板中添加图像,它会正确调整大小,但是如果我以编程方式加载它,它会显得更大。我正在使用 Xcode 10.1。我已经尝试了 launch.storyboard 和启动图像来验证我是否正确访问了 iPhone X,Xs。

图像在 XsMax 和 XR 上正确加载。我知道 X,Xs 以不同方式呈现像素。这是单张图片,我没有使用@2x、@3x等...

如果我在故事板视图中放置一个 UIImageView 元素并且它的框架矩形是 (3,95) 和 (130x253),图像在故事板和我 运行 模拟器中看起来是正确的。 如果我加载相同的图像但以编程方式执行,例如:

UIImageView *dot =[[UIImageView alloc] initWithFrame:CGRectMake(3,95,130,253)];
dot.image=[UIImage imageNamed:@"apple.png"];
[TestView addSubview:dot];

以编程方式显示的 UIImageView 看起来大于 130x253。也许大 1/3?

谢谢

这是一个 x-y 问题:您错误地识别了问题。您在代码中添加的图像视图在所有设备上始终显示相同的大小。问题是 other 图像视图,您通过情节提要添加的图像视图:that 是在不同设备上更改大小的图像视图。原因是:这就是你告诉它要做的,你的自动调整大小设置,看起来像这样(我直接从你发布的项目中拿来让我看):


我将分两个阶段证明这一点。首先,我们只讨论在代码中添加的图像视图。这是我的科学测试代码(它在 Swift 但我相信你可以阅读它):

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        for i in stride(from: 0, to: 500, by: 100) {
            let v = UIView(frame:CGRect(
                x: CGFloat(i), y: 20, width: 10, height: 50))
            v.backgroundColor = .black
            self.view.addSubview(v)
        }
        let im = UIImage(named:"bullwinkle2.jpg")!
        let iv = UIImageView(frame:CGRect(
            x: 0, y: 50, width: im.size.width, height: im.size.height))
        iv.image = im
        self.view.addSubview(iv)
    }
}

你看到我在做什么了吗?首先,我用间隔 100 像素的黑色子视图构建了一种 "ruler"。然后我创建图像视图并添加它,指定图像的宽度和高度。

这是它在 iPhone 5s 模拟器上的样子:

这是它在 iPhone X 模拟器上的样子:

如您所见,它们都显示相同尺寸的图片:图片的宽度正好在两个设备上的第三个标记处(图片必须恰好为 200 像素宽)。


好的,进入第二阶段。现在我将在情节提要中添加一个图像视图,在水平和垂直方向上使用内部带有弹簧的自动调整大小设置:

现在我将在 iPhone 8 模拟器上再次 运行 相同的代码:

两个图像看起来大小相同,因为我在故事板中设计界面时视图的大小为 iPhone 8.

好的,但现在让我们在 iPhone 5s 模拟器上再次 运行:

啊哈!由于自动调整大小设置,故事板图像较小。所以你看,并不是代码图像太大了;而是因为代码图像太大了。就是分镜图片有时会显得太小了。


最后说明:您的最终目标是在代码中创建与故事板中的图像视图大小相同的图像视图。但是 that 并不总是有效的原因是您将该代码放入 viewDidLoad,这太早了。在自动调整大小生效之前,您不知道情节提要图像视图的大小,这意味着必须调用 viewDidLayoutSubviews。这种情况比 viewDidLoad.