这是我第一次面对这个陌生人的问题。我使用UIViewController
文件创建了XIB
。屏幕有两个视图viewA和viewB。 viewA具有top = 0
,leading = 0
,trailing = 0
这些值。 viewA.height = safeArea.height/2
。top = 0
。 viewB约束为leading = 0
,trailing = 0
,bottom = 0
,viewA
。在view
内,我有一个名为viewAbackground
的{{1}},top = 0
,leading = 0
,trailing = 0
,bottom = 0
限制其容器( viewA
)我在labels
中也有一些viewA
。我使用此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
,但问题是它与size
的{{1}}不同。在尝试了解错误的几个小时之后,我发现应用的viewA
值与我在size
device
中选择的interface Builder
相同不是我的设备屏幕的值。例如:如果我在view as
xib
的{{1}}中,当我在view as
中运行时,我的iPhone SE
大小为iPhone 6
gradient
中的viewA
。
我有iPhone SE
9.2,我正在使用Xcode
任何人都可以解释我为什么会遇到这个尺码问题吗?
编辑更多信息:这是视图的层次结构。 Swift 4
。 ScrollView <- MainView <- viewA and viewB
高度等于safeArea高度。 scrollView的实用程序适用于iPhone 4等小型设备。在这种情况下,我为mainView
提供了一个定义的高度值,以获得滚动效果。
答案 0 :(得分:0)
此问题与UIViewController生命周期的误解有关。
ViewDidLoad
- 在创建类并从xib加载时调用。所有视图都将具有您在xib中设置的大小。
ViewWillAppear
- 在你的观点出现之前调用。此时,您的所有视图都将具有正确的大小,因此您可以使用它们的大小和位置。
此外,CALayer
不支持自动调整大小,因此,您可能需要在didLayoutSubviews
更新其大小。
答案 1 :(得分:0)
当您从xib或storyboard加载视图时,布局将与加载的内容相匹配。正如您所注意到的那样,它不一定与它正在运行的设备相同。
因此,在viewDidLoad
中,您将从数据中加载大小。
在第一次调用viewWillAppear
时,您会看到相同的尺寸。
viewDidLayoutSubviews
。这将是第一次获得您正在运行的设备所期望的视图的机会。
请注意,因为每次调用此方法时都不想添加渐变。但是,如果尺寸因设备旋转而发生变化,您可能需要更新它。
<强>更新强>
由于您使用的是滚动视图,因此viewDidLayoutSubviews可能无法报告正确的值。可能是SDK中的错误。您可以尝试从viewDidAppear
获取正确的值,或者如果为时已晚,请尝试以下解决方案。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.setNeedsLayout()
scrollView.layoutIfNeeded()
createGradientLayer(theView: viewA)
}