除非在情节提要中设置设备,否则视图无法正确缩放(视图为:iphone 5s/8/etc)

Views not scaling correctly unless the device is set in the storyboard (view as: iphone 5s/8/etc)

用截图描述最简单(我说的"view as"在每张图片的右下角):

模拟器:iPhone 8,故事板视图为:iPhone 8 - 完美运行

模拟器:iPhone 8 加,故事板视图为:iPhone 8 - 不工作

模拟器:iPhone 8 plus,故事板视图为:iPhone 8 plus - 完美运行

应该正常工作的代码示例,当情节提要设置为该模型时可以正常工作phone,但在其他情况下不能正常工作:

gradientLayer.frame = CGRect(x: 0, y:0, width: self.view.bounds.width, height: self.view.bounds.height)
gradientLayer.colors = [Colors().bgRed.cgColor, Colors().mediumBlue.cgColor, Colors().highlitMedBlue.cgColor]
gradientLayer.startPoint = CGPoint(x: 0.1, y: 0.1)
gradientLayer.endPoint = CGPoint(x: 1, y: 1)
self.view.layer.addSublayer(gradientLayer)

其他失败的例子是当我使用 view.convert(viewX, to: viewY) 时,它 works/fails 在与上述图片相同的情况下。

这是怎么回事?难道只是模拟器出错了?我是否错误地使用了自动版式?如果我在实际 phone 上而不是在模拟器上尝试,它会起作用吗?

你可以试试把框线放在里面viewDidLayoutSubviews

override func viewDidLayoutSubviews() {
  super.viewDidLayoutSubviews() 
  gradientLayer.frame = self.view.bounds 
}

它非常适用于与故事板具有相同设置的模拟器,因为它的视图大小被考虑用于渲染,直到 viewDidLayoutSubviews 具有当前 simulator/device

的正确大小

您设置的框架不正确。 宽度和高度应来自 self.view.frame

尝试使用

gradientLayer.frame = CGRect(x: 0, y:0, width: self.view.frame.width, height: self.view.frame.height)

如果您想使用 self.view.bounds,

然后尝试

gradientLayer.frame = self.view.bounds

让我知道它是否有效。