如何获得以编程方式创建的ViewController的安全区域框架?

时间:2017-11-18 11:30:57

标签: ios swift ios11

  

注意:未在故事板中创建ViewController

我在给予安全防护支持之后以编程方式创建了ViewController现在我的问题是我如何才能达到他的身高?

我尝试跟随但没有运气

let guide = view.safeAreaLayoutGuide
let height = guide.layoutFrame.size.height
print("\(height)")
print("\(self.view.frame.height)")
height = 812.0, self.view height = 812.0

还有其他办法吗?

2 个答案:

答案 0 :(得分:0)

iOS {11}的safeAreaLayoutGuide用于自动布局,并试图让框架接近尝试用柠檬制作橙汁。

如果您想要找到的是安全用于框架的内容,可以尝试这样的事情:

创建透明视图:

let mySafeView = UIView()

override func viewDidLoad() {
    super.viewDidLoad()
    mySafeView.backgroundColor = UIColor.clear
    mySafeView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(mySafeView)

    // if needed, send this view to the back of the hierarchy

    view.sendSubview(toBack: mySafeView)
}

接下来,在您的约束构建代码中,将其附加到 true 锚点:

// create generic layout guides

let layoutGuideTop = UILayoutGuide()
view.addLayoutGuide(layoutGuideTop)

let layoutGuideBottom = UILayoutGuide()
view.addLayoutGuide(layoutGuideBottom)

let margins = view.layoutMarginsGuide
view.addLayoutGuide(margins)

// get correct top/bottom margins based on iOS version

if #available(iOS 11, *) {
    let guide = view.safeAreaLayoutGuide
    layoutGuideTop.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0).isActive = true
    layoutGuideBottom.bottomAnchor.constraintEqualToSystemSpacingBelow(guide.bottomAnchor, multiplier: 1.0).isActive = true
} else {
    layoutGuideTop.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true
    layoutGuideBottom.bottomAnchor.constraint(equalTo: bottomLayoutGuide.topAnchor).isActive = true
}
    mySafeView.topAnchor.constraint(equalTo: layoutGuideTop.topAnchor).isActive = true
    mySafeView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    mySafeView.bottomAnchor.constraint(equalTo: layoutGuideBottom.bottomAnchor).isActive = true
    mySafeView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true

最后,获取框架尺寸:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    print(mySafeView.frame)
}

在运行iOS 11.1的iPhone 6上,你会得到:

(0.0,28.0,414.0,716.0)

在运行iOS 9.0的iPhone 6上,你会得到:

(0.0,20.0,414.0,716.0)

答案 1 :(得分:0)

首先,您无法在 viewDidLoad 中执行此操作。您必须等到 viewDidLayoutSubviews

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    myGlobalVars.sceneRect = view.frame
    
    if #available(iOS 11.0, *) {
        myGlobalVars.topSafeArea    = view.safeAreaInsets.top
        myGlobalVars.bottomSafeArea = view.safeAreaInsets.bottom
    } else {
        myGlobalVars.topSafeArea    = topLayoutGuide.length
        myGlobalVars.bottomSafeArea = bottomLayoutGuide.length
    }
}