簡體   English   中英

在添加到UIWindow的視圖上使用autolayout

[英]Use autolayout on view added to UIWindow

我正在嘗試將子視圖添加到應用程序的keyWindow ,並使用autolayout定位它。 但是,autolayout似乎根本不起作用,而設置框架則可以。 我想我的觀點一致infoSc的底部keyWindow使用下面的代碼:

let infoSc = InfoScreenView()
infoSc.translatesAutoresizingMaskIntoConstraints = false

let keyWindow = UIApplication.sharedApplication().keyWindow!
keyWindow.addSubview(infoSc)
keyWindow.addConstraint(NSLayoutConstraint(item: infoSc, attribute: .Left, relatedBy: .Equal, toItem: keyWindow, attribute: .Left, multiplier: 1, constant: 0))
keyWindow.addConstraint(NSLayoutConstraint(item: infoSc, attribute: .Right, relatedBy: .Equal, toItem: keyWindow, attribute: .Right, multiplier: 1, constant: 0))
keyWindow.addConstraint(NSLayoutConstraint(item: infoSc, attribute: .Bottom, relatedBy: .Equal, toItem: keyWindow, attribute: .Bottom, multiplier: 1, constant: 0))
infoSc.addConstraint(NSLayoutConstraint(item: infoSc, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 100))

但是,它似乎有一個使用此方法的CGRectZero框架。 任何想法如何使這項工作? 理想我也想把它對准的東西,里面的self.view過,但拋出一個錯誤self.view不在的視圖層次keyWindow

如果你需要在整個窗口上繪圖,這里有代碼(在這個例子中我在AppDelegate ,因此窗口是AppDelegate.window屬性)。

func tryToDrawOnTheWindow()
{
    if let window = window, view = window.rootViewController?.view
    {
            print("I have a root view")

            let infoSc = InfoScreenView(frame: view.frame)
            let count = view.subviews.count
            view.insertSubview(infoSc, atIndex: count)
            infoSc.translatesAutoresizingMaskIntoConstraints = false
            let height = NSLayoutConstraint(item: infoSc, attribute: .Height, relatedBy: .Equal, toItem: view, attribute: .Height, multiplier: 1, constant: 0)
            let width = NSLayoutConstraint(item: infoSc, attribute: .Width, relatedBy: .Equal, toItem: view, attribute: .Width, multiplier: 1, constant: 0)
            let offset = NSLayoutConstraint(item: infoSc, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1, constant: 0)
            print([height, width, offset])
            view.addConstraints([height, width, offset])
    }
    else
    {
        print("No root view on which to draw")
    }
}

這將使您可以在視圖層次結構中的任何內容上繪制。 在我的測試應用程序中,我添加了一個文本字段和一個藍色矩形,覆蓋圖為橙色,不透明度為40%。 請記住,默認情況下,疊加視圖將消耗這種情況下的所有分接頭。

根據David S的答案,根據需要放置並調用下面的方法,將視圖作為變量傳遞。

func addToWindow(view : UIView) {
    guard let delegate = UIApplication.shared.delegate, let window = delegate.window!, let topView = window.rootViewController?.view else {
        print("No root view on which to draw")
        return
    }

    print("I have a root view")

    let count = topView.subviews.count
    topView.insertSubview(view, at: count)
    view.translatesAutoresizingMaskIntoConstraints = false
    let height = NSLayoutConstraint(item: view, attribute: .height, relatedBy: .equal, toItem: topView, attribute: .height, multiplier: 1, constant: 0)
    let width = NSLayoutConstraint(item: view, attribute: .width, relatedBy: .equal, toItem: topView, attribute: .width, multiplier: 1, constant: 0)
    let pinToTop = NSLayoutConstraint(item: view, attribute: .top, relatedBy: .equal, toItem: topView, attribute: .top, multiplier: 1, constant: 0)
    print([height, width, pinToTop])
    topView.addConstraints([height, width, pinToTop])
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM