如何在swift中更改设备大小时获取子视图的当前大小?

irk*_*sor 1 ios view-bound swift

我必须查看:view_1和view_2.view_1高度与主视图控制器高度成正比,我以编程方式将view_2添加为view_1的子视图,其比例高度.

问题

当设备大小改变从iPhone 6到iPhone 5时,view_1正确调整但其高度我传递给绘制其子视图view_2的功能仍然是在界面构建器中设置的,因此它在iPhone 4移动时超出界限来自iPhone 6

因此,我想知道如何获得正确大小的视图,以便自动调整大小以适应当前设备?

vac*_*ama 6

自动布局运行之前,不会建立视图的大小.您获得正确尺寸的第一个机会是viewDidLayoutSubviews:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    // access view size here
}
Run Code Online (Sandbox Code Playgroud)

这是一个完整的示例,它将第二个视图添加为第一个视图的子视图.故事板中添加了红色视图; 它水平和垂直居中,高度/宽度是其超视距的50%.

黄色视图以编程方式添加.它的帧是从红色视图的帧计算为红色视图宽度的50%.

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var view1: UIView!
    var view2: UIView?

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        if view2 == nil {
            view2 = UIView()
            view2?.backgroundColor = .yellowColor()
            view1.addSubview(view2!)
        }

        let width = view1.frame.size.width
        let height = view1.frame.size.height

        let frame = CGRect(x: width * 0.25, y: height * 0.25, width: width * 0.5, height: height * 0.5)

        view2?.frame = frame
    }
}
Run Code Online (Sandbox Code Playgroud)

不会viewDidLayoutSubviews多次调用,因此view2每次调用时都必须注意不要添加.这就是代码检查是否view2已添加的原因.


iPhone 4s模拟器肖像


iPhone 5s模拟器风景


iPhone 5s旋转exmaple