【问题标题】:Swift - viewing different position on viewDidLoad and viewDidAppearSwift - 在 vi​​ewDidLoad 和 viewDidAppear 上查看不同的位置
【发布时间】:2016-06-27 14:32:30
【问题描述】:

我有一个理解问题... 我创建了两个相似的视图(相同的原点和相同的大小)和剖面视图, 当我创建这些视图时——一个在viewDidLoad 中,另一个在viewDidAppear 中——当我在每个视图的原点 x 和 y 中放置类似的起点时,我会在不同的位置获得这些视图。 谁能解释一下这些观点不在同一位置的原因是什么?

import UIKit

class ViewController: UIViewController {

    @IBOutlet var sec: UIView!

    override func viewDidLoad() {
        let shape = UIView(frame: CGRect(x: sec.frame.width/2, y: sec.frame.height/2, width: 100, height: 100));
        shape.backgroundColor = UIColor.redColor();
        view.addSubview(shape); 
    }

    override func viewDidAppear(animated: Bool) {    
        let shape2 = UIView(frame: CGRect(x: sec.frame.width/2, y: sec.frame.height/2, width: 100, height: 100));
        shape2.backgroundColor = UIColor.greenColor();
        view.addSubview(shape2);
    }
}

【问题讨论】:

    标签: ios swift viewdidload viewdidappear


    【解决方案1】:

    原因是因为 viewDidAppear 方法在自动布局引擎完成工作后调用,viewDidLoad - 之前。在自动布局完成之前,屏幕上任何视图的帧在大多数情况下都是不正确的。当自动布局完成且帧正确时,您可以使用方法viewDidLayoutSubviews 作为最近点。请注意,此方法可以多次调用。

    更新。 自动布局默认用于UIViewController 中的view,以及故事板中的视图;您在代码中添加了不使用自动布局的自定义视图。您应该仔细混合自动布局和帧初始化视图。

    【讨论】:

    • @r.pul 应该没有编译错误,这就是它的工作原理。自动布局是相当新的功能(仅从 iOS 6 或 7 开始)。因此,在引入自动布局引擎之前,所有坐标系都清晰而笔直,就像您在问题中所期望的那样。您只能通过框架属性管理所有坐标(有时设置自动调整大小的蒙版)。随着时间的流逝,出现了具有新屏幕分辨率的新设备,因此手动管理(调整大小)所有帧变得越来越困难。这就是 Apple 引入自动布局引擎的原因,当然,它基于现有的框架系统
    • 非常感谢您的快速而有帮助的评论,我认为这是问题所在......对我来说还是有点奇怪......为什么编译器没有显示任何错误?幕后发生了什么......他是否在猜测我在 viewDidLoad 上引用它们的那些使用自动布局的视图帧的大小?
    • @r.pul 你可能会认为自动布局引擎就像隐藏函数一样,它在视图最终出现在屏幕上之前执行,并且这个函数只是使用预定义的规则改变视图的框架。当屏幕上实时发生变化时,也可以执行此功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 2012-09-20
    • 2014-06-17
    • 2013-03-28
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多