这是我第一次面对这个陌生的问题。我有一个用它创建的UIViewController
文件。屏幕有两个视图viewA和viewB。viewA具有这些值XIB
,top = 0
,leading = 0
。trailing = 0
。viewB约束是viewA.height = safeArea.height/2
,top = 0
,leading = 0
,trailing = 0
。在bottom = 0
中,我有一个名为viewA
的view
对其容器(viewAbackground
)有top = 0
,leading = 0
,trailing = 0
约束,并且在bottom = 0
中也有一些viewA
。我使用这个labels
来添加一个viewA
,因为如果我直接将它添加到viewAbackground
中,它会出现在标签前面。这就是我添加渐变的方式:
func createGradientLayer(theView: UIView) {
let gradientLayer = CAGradientLayer()
gradientLayer.frame = theView.frame
gradientLayer.startPoint = CGPoint(x: 0.5, y: 1.0)
gradientLayer.endPoint = CGPoint(x: 0.5, y: 0.0)
gradientLayer.colors = [UIColor(hexString: Colors.startColor)?.cgColor, UIColor(hexString: Colors.endColor)?.cgColor]
//add the gradient to the view
theView.layer.addSublayer(gradientLayer)
}
然后在viewDidLoad中调用
gradient
添加了
viewA
,但问题是它与createGradientLayer(theView: viewA)
不同。经过数小时的尝试,我发现应用的gradient
值与我在size
的viewA
中选择的值相同,而不是设备屏幕的值。例如:如果在size
中我有在device
interface Builder
中,当我在view as
中运行时,我得到的xib
的大小与view as
中的iPhone SE
相同。我已经
iPhone 6
9.2了,我正在使用gradient
有谁能解释我为什么会有这么大的问题吗?
编辑以获取更多信息:这是视图的层次结构。
viewA
。iPhone SE
高度等于安全区域高度。scrollView的实用程序适用于iPhone 4等小型设备。在这种情况下,我给Xcode
一个定义的高度值以获得滚动效果。 最佳答案
当视图从XIB或故事板加载时,布局将与加载的内容相匹配。正如你所注意到的,这不一定会和它运行的设备一样。
因此在viewDidLoad
中,您将从数据中加载大小。
在第一次调用viewWillAppear
时,您会看到相同的大小。viewDidLayoutSubviews
在每次视图边界更改时调用。这将是第一次机会,让您的视图布局,正如您所期望的设备,您正在运行。
但是要小心,因为你不想每次调用这个方法时都添加渐变。但是,如果大小可能因设备旋转而改变(例如),则可能需要更新它。
更新
由于使用的是滚动视图,viewDidLayoutSubviews可能无法报告正确的值。可能是SDK中的一个bug。您可以尝试从viewDidAppear
获取正确的值,或者如果太晚,请尝试下面的解决方案。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.setNeedsLayout()
scrollView.layoutIfNeeded()
createGradientLayer(theView: viewA)
}
关于ios - 比例高度值是从xib文件而不是设备中获取的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48210395/