2016-07-05 6 views
1

Ich versuche, eine Unteransicht zu der keyWindow der App hinzuzufügen, und positioniere sie mithilfe des automatischen Layouts. Das automatische Layout scheint jedoch überhaupt nicht zu funktionieren, während das Setzen eines Frames dies tut. Ich möchte, dass meine Ansicht infoSc auf dem Boden des keyWindow mit dem folgenden Code auszurichten:Verwenden Sie das automatische Layout in der Ansicht, das zu UIWindow hinzugefügt wurde

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)) 

Jedoch scheint es, einen Rahmen von CGRectZero diese Methode zu haben, verwenden. Irgendwelche Ideen, wie das funktioniert? Idealerweise würde ich es auch auf etwas ausrichten wollen, das sich innerhalb von self.view befindet, aber das wirft einen Fehler auf, der self.view nicht in der Ansichtshierarchie von keyWindow ist.

+0

vollständigen Fehler anzeigen – anders

Antwort

1

Wenn Sie auf das gesamte Fenster zeichnen müssen, ist hier Code, um es zu tun (in diesem Beispiel bin ich in der AppDelegate, so Fenster ist die AppDelegate.window Eigenschaft).

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") 
    } 
} 

Dadurch können Sie über alles, was in der Ansichtshierarchie ist, zeichnen. In meiner Test-App habe ich ein Textfeld und ein blaues Rechteck hinzugefügt und das Overlay war orange mit 40% Deckkraft. Denken Sie daran, dass die Überlagerungsansicht standardmäßig alle Abzweigungen verbraucht.

+0

Ich habe das Fenster verwendet, weil mein 'InfoScreenView' über allen Ansichten (einschließlich aller Navbars usw.) stehen muss. Im Grunde genommen zeichnet es Kreise, um Bereiche auf dem Bildschirm hervorzuheben. Ihr Code funktioniert, wird aber durch die 'Ansicht' eingeschränkt, die in einem Nav-Controller/Tab-Controller enthalten sein kann. – Tometoyou

+0

Ok, aktualisiert die Antwort, um zu reflektieren, was Sie versuchen zu tun. –

Verwandte Themen