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

Posted

技术标签:

【中文标题】除非在情节提要中设置设备,否则视图无法正确缩放(视图为:iphone 5s/8/etc)【英文标题】:Views not scaling correctly unless the device is set in the storyboard (view as: iphone 5s/8/etc) 【发布时间】:2019-04-28 14:49:55 【问题描述】:

用截图来描述最容易(我说的“视图”在每张图片的右下角):

模拟器:iPhone 8,情节提要视图为:iPhone 8 - 完美运行

模拟器:iPhone 8 plus,情节提要视图为:iPhone 8 - 不工作

模拟器:iPhone 8 plus,情节提要视图为:iPhone 8 plus - 完美运行

应该正常工作的代码示例,当情节提要设置为该型号手机时会正常工作,但在其他情况下不会:

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) 时,它在与上图相同的情况下工作/失败。

这里发生了什么?只是模拟器有问题吗?我是否错误地使用了自动布局?如果我在实际的手机而不是模拟器上尝试,这会起作用吗?

【问题讨论】:

【参考方案1】:

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

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

它非常适合具有与 storyboard 相同设置的模拟器,因为它的视图大小被考虑用于渲染,直到 viewDidLayoutSubviews 带有当前模拟器/设备的正确大小

【讨论】:

工作,谢谢!你的解释很有帮助。【参考方案2】:

您设置的框架不正确。 宽度和高度应该来自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

让我知道它是否有效。

【讨论】:

以上是关于除非在情节提要中设置设备,否则视图无法正确缩放(视图为:iphone 5s/8/etc)的主要内容,如果未能解决你的问题,请参考以下文章

iOS8 在情节提要中设置弹出框大小

我在情节提要中的对象没有与代码正确链接

如何在没有情节提要的 Xamarin.iOS UIViewController 中设置 RestorationClass?

我可以在情节提要中设置分组的 tableView 部分编号吗?

ios8/xcode6.1:在情节提要中设置时在运行时忽略自定义字体

在 Xcode 8.2 中设置特定于设备的字体