2017-08-24 1 views
1

Ich habe sehr einfache Einrichtung in viewDidLoad, nur eine Ansicht hinzufügen, und stecken Sie es durch ‚Anker‘ Stil Super Margen:Wie die Layout-Ränder programmatisch ändern

let myView = UIView(frame: .zero) 
myView.translatesAutoresizingMaskIntoConstraints = false 
view.addSubview(myView) 
myView.backgroundColor = UIColor.red 
myView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor).isActive = true 
myView.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor).isActive = true 
myView.bottomAnchor.constraint(equalTo: view.layoutMarginsGuide.bottomAnchor).isActive = true 
myView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor).isActive = true 
view.layoutMargins = .zero 

Das Problem ist, dass es noch eine Marge wenn dies im Simulator ausgeführt wird. Warum wird die Nullsetzung von LayoutMargins ignoriert?

enter image description here

+0

Wenn Sie Null wollen, warum 'view.leadingAnchor' nicht direkt verwenden? –

+0

kann ich nicht. Dies ist ein sehr vereinfachter Fall von einem Projekt. Ich baue keine rote Rechteck-App :-) –

+0

OK, ich habe das vermutet, also gibt es meine Antwort auf Ihr Problem –

Antwort

0

Dies scheint für iOS 11 festgelegt/geändert werden. Niedrigere Versionen sind kein Glück.

Ich habe mehr erarbeitet in this question

1

Sie müssen diese Methode in Ihrem UIViewControllerviewWillLayoutSubviews() hinzufügen

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 
    view.layoutMargins = .zero 
    view.layoutMarginsDidChange() 
} 

aber wenn Sie .zero der Margen benötigen, können Sie wie ich in meinem Kommentare verwenden view.leadingAnchor auch

+0

Hmmm, das wird mehrmals aufgerufen. Es funktioniert aber. Gibt es keinen anderen Ort/Weg, dies nur einmal zu tun? Ich möchte es nicht dynamisch während des Lebenszyklus der Ansicht ändern. –

+0

@ViktorKucera überprüfen Sie diese Frage https://StackOverflow.com/Questions/27421469/setting-layoutmargins-of-uiview-doesnt-work scheint dies ist die beste Aufnahme, die wir haben, aber Sie können eine Unteransicht als alternative Lösung hinzufügen –

+0

Interessanter Link . Scheint wie rootview ignoriert jeden benutzerdefinierten Rand .. –

0

bereits.

if #available(iOS 11, *) { 
    viewRespectsSystemMinimumLayoutMargins = false 
    view.layoutMargins = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 0) 
} 

Apple document als Referenz.

Verwandte Themen