0

在 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?

谢谢

4

1 回答 1

1

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

在此处输入图像描述


我将分两个阶段证明这一点。首先,我们只说代码中添加的图像视图。这是我的科学测试代码(它在 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 像素的黑色子视图构建了一种“标尺”。然后我创建图像视图并添加它,指定图像的宽度和高度。

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

在此处输入图像描述

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

在此处输入图像描述

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


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

在此处输入图像描述

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

在此处输入图像描述

这两个图像看起来大小相同,因为我在 Storyboard 中设计的界面是在为 iPhone 8 调整视图大小时设计的。

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

在此处输入图像描述

啊哈!由于自动调整大小设置,故事板图像更小。所以你看,并不是代码图像太大了;这是故事板图像有时太小了。


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

于 2018-12-23T04:30:36.947 回答