除非在情节提要中设置设备,否则视图无法正确缩放(视图为: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)的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有情节提要的 Xamarin.iOS UIViewController 中设置 RestorationClass?
我可以在情节提要中设置分组的 tableView 部分编号吗?