xcode9模拟器布局故障

xcode 9 Simulator layout malfunction

我正在使用 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)
}

我现在完全没有任何线索了。任何帮助都感激不尽。

I am calling this in viewWillAppear

必须在viewDidAppear中调用,就这么简单

这是经典 "gotchya" !

PaulW11 已经给出了答案,我把它放在这里只是为了帮助 googlers。


在 viewWillAppear 中,显然视图 尚未出现 但它会出现。

在 viewDidAppear 中,视图 实际上确实出现了 。这意味着,毫无疑问,一切都在屏幕上,当然,因此,完全布局。

作为一个规则如果你是一个业余爱好者iOS程序员,就像一个"general rule"只使用viewDidAppear.

99% 的情况下 "everyday solution"。

公平地说 viewWillAppear 和 viewDidLayoutSubviews 和 viewDidLoad 仅供专业使用。 "Nothing bad will happen" 除了最微妙的无关紧要,例如,性能效果,如果您只使用 viewDidAppear。所以,很简单,总是使用 viewDidAppear。

关于 viewDidLayoutSubviews 等之间的细微差别,这确实是一个大问题,每个版本都略有不同,并且具有自动布局等特定的神秘细节;这超出了本次 QA 的范围。

我几乎可以说 Apple 不应该如此显着地暴露 viewDidLayoutSubviews 和 viewWillAppear 以及 viewDidLoad 给 "general public"。例如,如果您是初学者或业余程序员,则根本不需要使用 CALayer 之类的东西,也不需要传递触摸、构建自己的手势、操纵过渡动画等。

同样,使用 viewDidLayoutSubviews 或 viewWillAppear 或 viewDidLoad 的需求实际上为零。只需使用 "viewDidAppear"(在少数情况下您甚至需要它),一切就绪。

顺便说一句,值得注意的是,如果您只使用容器视图,您应该在任何时候都在任何地方使用它,(这里是关于容器视图的 epic tutorial!!)这些 UI 赛道很少出现问题。