【问题标题】:xcode 9 Simulator layout malfunctionxcode 9 模拟器布局故障
【发布时间】:2017-10-21 20:58:30
【问题描述】:

我使用的是 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)
}

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

【问题讨论】:

  • 您是否收到有关约束冲突或不足的警告?你设置了什么约束?你在哪里调用你显示的代码?
  • 你在哪里调用这个函数?您很可能在 viewframe 完全布局之前调用它。
  • @Paulw11 我尝试自动调整大小/添加缺少的约束/设置我自己的约束。此外,我没有收到任何关于约束的警告。即使是现在,图像仍处于自动布局状态,没有警告/问题。
  • @Paolo 我称之为awakeFromNibviewWillAppear。分别用于单元格和单个布局。
  • 会不会是 xcode 本身的问题?

标签: ios swift xcode ios-simulator


【解决方案1】:

我在 viewWillAppear 中调用它

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

这是经典的“gotchya”!

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


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

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

作为一项规则,如果您是一名 iOS 程序员爱好者,那么作为“一般规则”只使用 viewDidAppear

这是 99% 情况下的“日常解决方案”。

公平地说 viewWillAppear 和 viewDidLayoutSubviews 和 viewDidLoad 仅用于专业用途。如果您只使用 viewDidAppear,除了最细微的不相关(例如性能影响)之外,“不会发生任何不好的事情”。所以,很简单,总是使用 viewDidAppear。

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

我几乎要说 Apple 不应该将 viewDidLayoutSubviews 和 viewWillAppear 和 viewDidLoad 如此突出地暴露给“公众”。例如,如果您是初学者或业余程序员,则根本不需要使用 CALayer 之类的东西,或者传递触摸、构建自己的手势、操作过渡动画等。

同样,使用 viewDidLayoutSubviews 或 viewWillAppear 或 viewDidLoad 的需求实际上为零。只需使用“viewDidAppear”(在少数情况下您甚至需要它)就可以了。

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

【讨论】:

  • viewDidAppear vs viewWillAppear vs viewDidLayoutSubviews,在这种情况下它们到底有什么不同?
  • 嗨,我回答了你的问题@AakashDave。如果(出于某种原因)您想了解这方面的详细信息,这里有大量的文章、Apple 技术讲座等
猜你喜欢
  • 2022-10-01
  • 2018-05-04
  • 2019-10-15
  • 2014-07-19
  • 2018-03-03
  • 2017-11-07
  • 1970-01-01
  • 2021-12-30
  • 2014-11-28
相关资源
最近更新 更多