这是我第一次面对这个陌生的问题。我有一个用它创建的UIViewController文件。屏幕有两个视图viewA和viewB。viewA具有这些值XIBtop = 0leading = 0trailing = 0。viewB约束是viewA.height = safeArea.height/2top = 0leading = 0trailing = 0。在bottom = 0中,我有一个名为viewAview对其容器(viewAbackground)有top = 0leading = 0trailing = 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值与我在sizeviewA中选择的值相同,而不是设备屏幕的值。例如:如果在size中我有在deviceinterface Builder中,当我在view as中运行时,我得到的xib的大小与view as中的iPhone SE相同。
我已经iPhone 69.2了,我正在使用gradient
有谁能解释我为什么会有这么大的问题吗?
编辑以获取更多信息:这是视图的层次结构。viewAiPhone 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/

10-12 04:20