我正在使用xcode 9.0.0。我有多个自定义类应用于不同的视图。每当我在一个真正的大尺寸设备上运行项目时,它会显示完美的视图,而当我在模拟器上构建它们时,布局会从右侧挤出。任何UIView类型都会发生这种情况。下面提供了一个例子。
在这里,我正在应用渐变,但是右侧的一部分被省略了。每一种观点都会发生这种情况。我上面例子的代码是:
func addBlackGradientLayer(frame: CGRect){
let gradient = CAGradientLayer()
gradient.frame = frame
gradient.colors = [UIColor.clear.cgColor, UIColor.black.cgColor]
gradient.locations = [0.0, 1.0]
self.layer.addSublayer(gradient)
}
我现在完全没有任何线索了。任何帮助都感激不尽。
答案 0 :(得分:2)
我在viewWillAppear中调用它
你必须在 viewDidAppear 中调用它,就这么简单。
这是经典的“gotchya”!
PaulW11已经给出了答案,我只是把它放在这里帮助googlers。
在viewWillAppear中,显然该视图尚未出现,但它会。
在viewDidAppear中,视图实际上已经出现。这意味着,毫无疑问,屏幕上的一切都在那里,当然,完全是布局的。
作为规则如果你是一个业余爱好者的iOS程序员,就像“一般规则”只使用viewDidAppear 。
这是99%的案例中的“日常解决方案”。
可以说viewWillAppear和viewDidLayoutSubviews和viewDidLoad仅供专业人士使用。如果你只是使用 viewDidAppear ,那么除了最微妙的无关紧要之外,“没有什么不好的事情会发生”,例如性能影响。所以,很简单,总是使用viewDidAppear。
关于viewDidLayoutSubviews等之间的细微差别,这是一个很大的问题,不同版本之间略有不同,并且具有autolayout等特定的神秘细节。它超出了本质量保证的范围。
我几乎可以说Apple不应该如此突出地显示viewDidLayoutSubviews并将viewWillAppear和viewDidLoad暴露给“普通大众”。例如,如果你是初学者或业余爱好者程序员,根本不需要使用像CALayer这样的东西,或者传递触摸,构建你自己的手势,操纵过渡动画等。
同样,实际上只需要使用viewDidLayoutSubviews或viewWillAppear或viewDidLoad。只需使用“viewDidAppear”(在少数情况下你就需要它)并且你已经完成了设置。
BTW值得注意的是,如果你只是使用容器视图,你应该随时随地使用它(这里是容器视图的epic tutorial !!)这些UI赛道问题很少出现。< / p>