这是我第一次面对这个陌生人的问题。我有一个UIViewController
,我用它创建的XIB
文件。屏幕有两个视图: viewA和viewB。viewA具有top = 0
、leading = 0
、trailing = 0
等值。viewA.height = safeArea.height/2
。viewB约束是top = 0
、leading = 0
、trailing = 0
、bottom = 0
。在viewA
中,我有一个名为viewAbackground
的view
,它对其容器(viewA
)具有top = 0
、leading = 0
、trailing = 0
、bottom = 0
约束,并且在viewA
中也有一些labels
。我使用这个viewAbackground
来添加一个gradient
,因为如果我直接将它添加到viewA
中,它就会出现在标签前面。我是这样添加梯度的:
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中我称之为createGradientLayer(theView: viewA)
添加了gradient
,但问题是它没有与viewA
相同的size
。经过几个小时的尝试,我发现应用的size
值与我在interface Builder
中选择的view as
中的值相同,而不是设备屏幕上的值。例如:如果在xib
中有view as
iPhone SE
,那么当我在iPhone 6
中运行时,就会得到iPhone SE
中viewA
大小的gradient
。我有Xcode
9.2,我正在使用Swift 4
有人能解释我为什么有这么大的尺寸问题吗?
编辑获取更多信息:--这是视图的层次结构。ScrollView <- MainView <- viewA and viewB
。mainView
高度等于safeArea高度。scrollView的实用工具是用于诸如iPhone 4这样的小型设备。在这种情况下,为了获得滚动效果,我给mainView
一个定义的高度值。
发布于 2018-01-11 07:53:55
当您的视图从xib或情节提要加载时,布局将与加载的内容匹配。正如您已经注意到的,这并不一定会与运行它的设备相同。
因此,在viewDidLoad
中,您将从数据中加载大小。
在第一次调用viewWillAppear
时,您会看到相同的大小。
每次视图的边界发生变化时都会调用viewDidLayoutSubviews
。这将是第一次像你所期望的那样得到你正在运行的设备的视图。
但是要小心,因为每次调用该方法时,您都不想添加梯度。但是,如果大小可能因设备旋转而发生更改,则可能需要更新它。
更新因为您使用滚动视图,viewDidLayoutSubviews可能无法报告正确的值。可能是SDK中的一个bug。您可以尝试从viewDidAppear
中获得正确的值,或者如果太晚了,请尝试下面的解决方案。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.setNeedsLayout()
scrollView.layoutIfNeeded()
createGradientLayer(theView: viewA)
}
发布于 2018-01-11 07:29:27
这个问题与对UIViewController生命周期的误解有关。
在创建类并从xib加载时调用ViewDidLoad
。所有视图都有您在xib中设置的大小。
在视图出现之前调用ViewWillAppear
。此时,您的所有视图都将具有正确的大小,因此您可以使用它们的大小和位置。
另外,CALayer
不支持自动调整大小,因此可能需要在didLayoutSubviews
中更新它的大小。
https://stackoverflow.com/questions/48210395
复制