在视图出现在屏幕上之前进行转换时,自动布局错误地定位子视图

Posted

技术标签:

【中文标题】在视图出现在屏幕上之前进行转换时,自动布局错误地定位子视图【英文标题】:Autolayout incorrectly positioning subviews when transforming before view is on screen 【发布时间】:2014-09-09 03:53:02 【问题描述】:

我正在尝试在我的视图在屏幕上绘制之前对其进行缩放。但是,当我这样做时,视图的子视图(使用自动布局对齐)在视图最终出现在屏幕上时未对齐。这是我在viewDidLoad:中的缩放比例

let customView = CustomView(frame: CGRect(x: 0, y: 0, width: 320, height: 568)
self.view.addSubview(customView)
customView.transform = CGAffineTransformMakeScale(0.8, 0.8)

如果我将customView 添加到我的控制器的视图中并等待转换视图直到viewDidAppear:,最终呈现是预期的结果。但是,有一个瞬间没有缩放视图。

在我的视图绘制到屏幕上之前,我需要在我的自定义视图中实现什么以允许自动布局响应转换?

我的视图的基本结构是UIViewUITextView 作为它的孩子。文本视图的约束非常简单:

NSLayoutConstraint.constraintsWithVisualFormat("H:|-[textView]-|", options: NSLayoutFormatOptions(0), metrics: nil, views: ["textView": textView])
NSLayoutConstraint(item: textView, attribute: .CenterY, relatedBy: .Equal, toItem: self, attribute: .CenterY, multiplier: 1, constant: 0)

【问题讨论】:

【参考方案1】:

简答: 如果我正确理解您的问题,您想覆盖 viewDidLayoutSubviews 而不是 viewDidLoad / viewDidAppear。 viewWillAppear 可能也会起作用。

更长的答案:

viewDidLoad 的意思就是——它在视图加载后被调用,就是这样! Autolayout 尚未运行,或者 layoutSubviews 尚未运行。您应该只在布局发生期间或之后应用转换。最早这样做是在 viewDidLayoutSubviews 中。另外,别忘了打电话给超级!

【讨论】:

以上是关于在视图出现在屏幕上之前进行转换时,自动布局错误地定位子视图的主要内容,如果未能解决你的问题,请参考以下文章

表视图单元格仅在屏幕外时自动布局

按钮之间的自动布局边距仅在 4" 屏幕上不正确

如何使用自动布局约束在单个屏幕中放置两个视图

如何使用按钮动画实现自动布局

提交前 Swift segue 自定义转换布局

Swift - 大屏幕上的自动布局调整大小按钮