2016-05-17 6 views
0

Also im Grunde, ich habe eine UITextView, die ich möchte in meiner Mitte zentriert UIView. Hier ist meine Ansicht Controller-Code unten:Center Storyboard Ansichten in Autolayout

import UIKit 

class OpeningScreenViewController: UIViewController { 

    @IBOutlet weak var topBarUIView: UIView! 
    @IBOutlet weak var topViewTextView: UITextView! 

    override func viewDidAppear(animated: Bool) { 
     let superViewWidth = view.frame.size.width 
     let superViewHeight = view.frame.size.height 

    //creating the top bar 
     topBarUIView.frame = CGRect(x: 0, y: 0, width: superViewWidth, height: superViewHeight * 0.1) 
     topBarUIView.backgroundColor = UIColor.grayColor().colorWithAlphaComponent(0.5) 

    //adding text to the top bar 
     topViewTextView.frame = CGRectMake(0, 0, superViewWidth, superViewHeight * 0.1) 
     topViewTextView.backgroundColor = UIColor.blueColor() 
     topViewTextView.text = "Hello World" 
     topViewTextView.textAlignment = NSTextAlignment.Center 
     topViewTextView.font = UIFont(name: "Arial", size: 24)   
    }  
} 

ich die Opazität meiner Hintergrundansicht auf 50% zu ändern und die Textview auf eine Hintergrundfarbe blau, aber wenn ich diese laufen, der blaue Hintergrund ist gut innerhalb der UIView, wie 10 Pixel auf der einen Seite und 20 auf der anderen Seite. Ich bin mir nicht sicher warum.

Ich habe es im Storyboard eingerichtet, und cnt-zog es an, und änderte dann die Eigenschaften der Ansichten in viewDidAppear, um das Storyboard zu überschreiben.

Auch habe ich versucht, Dinge wie tun:

override func viewDidAppear(animated: Bool) {  
    // Get the superview's layout 
    let margins = view.layoutMarginsGuide 

    // Pin the leading edge of myView to the margin's leading edge 
    topBarUIView.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor).active = true 

    // Pin the trailing edge of myView to the margin's trailing edge 
    topBarUIView.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor).active = true 

    // Give myView a 1:2 aspect ratio 
    topBarUIView.heightAnchor.constraintEqualToAnchor(topBarUIView.widthAnchor, multiplier: 2.0) 
} 

Und bekam sagen einen seltsamen Fehler, dass die Layoutbeschränkungen ein Problem mit wurden.

Wäre es einfacher, die Höhe und Breite der Ansicht sowie den Startpunkt separat festzulegen? Wenn ja, wie kann ich so etwas wie dieses Pseudo-Code tun:

topBar.startingPoint = (x,y) 
topBar.height = this 
topBar.width = this 

usw.

+0

Warum sind Sie nicht die Anwendung Einschränkungen in stroryboard ??: Ausgezeichnet Tutorials können raywenderlich.com finden –

+0

Ich wurde gebeten, es so programmatisch wie möglich zu tun und Storyboard so weit wie möglich zu vermeiden. – dnaland

+0

Bitte verwenden Sie Auto-Layout oder es wird ein Chaos für Sie zu handhaben.Ich weiß nicht, ob es Ihre Projekt-Anforderung nicht Auto-Layout verwenden oder jemand sagte Ihnen.Wenn jemand erzählt, als ich Ihnen aus Erfahrung sagen, ist es die falsche Richtung, die Sie sind folgende –

Antwort

1

In einer modernen Anwendung sollten Sie nie .frame direkt einstellen werden. Vor allem nicht in viewDidAppear - Ihr Layout ändert sich beim Drehen und in Slide Over oder Split View Multitasking während sichtbar bleibt.

Die richtige Vorgehensweise ist immer die Verwendung von Auto Layout und generell die Anwendung all Ihrer Auto Layout Einschränkungen in Interface Builder, ggf. Anpassung nach Größenklassen, und Vorschau dort. Irgendwelche Fehlspezifikationen können auf diese Weise viel leichter korrigiert werden.

+0

verstanden. Hier ist die Sache, das ist nur eine iPhone-App - und mehr oder weniger eine Übung in programmatischen Ansichten mit Storyboards als nur ein Prototyp zu tun. Vielleicht machen wir das als eine Übung, um uns zu zeigen, wie hart oder dumm oder was auch immer, der Ansatz ist, ich bin mir nicht sicher. Ich habe mich nur gefragt, warum das Textfeld nicht in den Rahmen ging, den ich eingestellt habe. Habe ich den Rahmen falsch eingestellt? Wenn ich den Code in viewDidLoad einfüge, wird das Storyboard den Code überschreiben, daher war es in viewDidAppear. Aber ich bin auch kein Experte, wirklich nur ein neuer Student und bin nur neugierig darauf. – dnaland

+0

Ihre Änderungen am Rahmen werden beim nächsten Auto-Layout-Durchlauf überschrieben, sobald eine Ansicht den Inhalt oder die Position ungültig macht. Wenn Sie das Framework wirklich bekämpfen möchten, können Sie sichtbare Änderungen an Frames in einer 'viewDidLayoutSubviews()' überschreiben oder das automatische Layout vollständig deaktivieren. –