2016-04-07 6 views
0

Ich stecke fest! Ich arbeite an einem ViewController, der eine Basis für andere ViewControllers sein wird. Andere werden davon ausgehen.UIView Anzeige spät, wenn es programmgesteuert mit Auto-Layout erstellt wird

Ich möchte eine Sicht erstellen (wie benutzerdefinierte NavigationBar) mit programmgesteuert Einschränkungen für BaseViewController und ich habe es erstellt.

Also ich habe Storyboard, es gibt eine NavigationController mit einem rootViewController (HomeViewController) und diese homeViewController von baseViewController erweitern.

Hier sieht mein Storyboard aus;

Storyboard scene

So arbeiten meine Zwänge! Aber die Ansicht, die mit programmatischen Einschränkungen erstellt wird, wird nach ein paar Sekunden angezeigt und es macht mich verrückt!

So sieht es aus, wenn App zuerst ausgeführt wird;

enter image description here

Und nach ein paar Sekunden, um meine Ansicht erscheint;

enter image description here

Ich möchte auch meine Codes teilen. Ich verwende visuelle Formatsprache, um Einschränkungen zu erstellen.

- (void)viewDidLoad { 
[super viewDidLoad]; 
[self initializeBaseView]; 
// Do any additional setup after loading the view.} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Initialize BaseView 

- (void)initializeBaseView{ 

    //Background View 
    if (self.backgroundContainerView == nil) { 
     self.backgroundContainerView = [UIView new]; 
     self.backgroundContainerView.translatesAutoresizingMaskIntoConstraints = NO; 
     [self.view addSubview:self.backgroundContainerView]; 
     [self.view sendSubviewToBack:self.backgroundContainerView]; 
    } 
    [self initConstraint_1]; 


    //Navigation Header View 
    if(self.navigationBarContainerView == nil){ 
     self.navigationBarContainerView = [UIView new]; 
     self.navigationBarContainerView.translatesAutoresizingMaskIntoConstraints = NO; 
     [self.navigationBarContainerView setBackgroundColor:[UIColor clearColor]]; 
     [self.view addSubview:self.navigationBarContainerView]; 

    } 
    [self initConstraint_2]; 

    if (self.backgroundType==BackgroundTypeWhite) { 
     //very light Gray 
     [self.backgroundContainerView setBackgroundColor:APP_GRAY_COLOR_ATHENS]; 
    } 

    [self initializeBaseStyle]; 
} 

- (void)initializeBaseStyle{ 
    [self.navigationBarContainerView setBackgroundColor:[UIColor darkGrayColor]]; 
} 



#pragma mark - Initialize Constraints 

- (void)initConstraint_1{ 
    // 1. Create a dictionary of views 
    NSDictionary *viewsDictionary = @{@"firstView":self.backgroundContainerView}; 
    NSDictionary *metrics = @{@"vSpacing":@0, @"hSpacing":@0}; 

    // 2. Define the view Position and automatically the Size 
    NSArray *constraint_POS_V = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-vSpacing-[firstView]-hSpacing-|" 
                     options:0 
                     metrics:metrics 
                      views:viewsDictionary]; 

    NSArray *constraint_POS_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-hSpacing-[firstView]-hSpacing-|" 
                     options:0 
                     metrics:metrics 
                      views:viewsDictionary]; 

    [self.view addConstraints:constraint_POS_V]; 
    [self.view addConstraints:constraint_POS_H]; 

} 


- (void)initConstraint_2{ 
    NSDictionary *viewsDictionary = @{@"firstView": self.navigationBarContainerView, @"secondView": self.logoImage}; 
    NSDictionary *metrics = @{@"vSpacing":@74, 
           @"hSpacing":@0, 
           @"BottomSpacing":@60, 
           @"firstViewHeight":@64 
           }; 


    // 2. Define the view Position and automatically the Size (for the firstView) 
    NSArray *constraint_POS_V = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[firstView(firstViewHeight)]" 
                     options:0 
                     metrics:metrics 
                      views:viewsDictionary]; 

    NSArray *constraint_POS_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-hSpacing-[firstView]-hSpacing-|" 
                     options:0 
                     metrics:metrics 
                      views:viewsDictionary]; 

    [self.view addConstraints:constraint_POS_V]; 
    [self.view addConstraints:constraint_POS_H]; 

} 

Ich habe viele Fragen;

  • Was ist der Grund könnte es sein?
  • Kann ich Storyboard verwenden, wenn ich programmgesteuert programmatische Einschränkungen erstellen möchte?
  • Ich benutze viewDidLoad, um Methoden zum Erstellen von aufrufen und Einschränkungen festlegen. Ist viewDidLoad ein guter Ort dafür?
  • Was ist die beste Vorgehensweise für dieses Szenario?
  • Wie kann ich meine Ansicht sofort so initialisieren wie als erstes Bild?

Ich hoffe, das ist klar. Vielen Dank für Ihre Antworten und ich freue mich von Ihnen zu hören.

+0

versuchen Sie es in ViewDidAppear. ViewDidload ist nicht der richtige Ort für den Umgang mit Ansichten und Auto-Layout –

+0

Ich weiß nicht, warum es 2 Sekunden dauert, bis Ihre Ansicht angezeigt wird. Was ich sagen kann, ist, dass Ihr Code für das, was Sie tun, sehr komplex aussieht. Zwei Vorschläge: Richten Sie Ihre Constraints im Storyboard statt im Code ein, denn das ist viel einfacher. Zweitens, der Navigationscontroller gibt Ihnen automatisch eine Navigationsleiste, Sie sollten keine Navigationsleistenansicht erstellen. Siehe https://developer.apple.com/library/ios/documentation/UIKit/Reference/UINavigationController_Class/index.html –

+0

P.S.Deine App sieht aus, als wäre es cool! –

Antwort

0

Zuerst, wenn nicht obligatorisch, setzen Sie die Einschränkungen von IB. Falls erforderlich, führen Sie Ihre Aufgabe in viewDidAppear und im Hauptthread aus, falls erforderlich.

+0

Es spielt keine Rolle, wo Sie Einschränkungen machen, wenn Sie eine gute Hand beim automatischen Layout haben. –

0

Rufen Sie setNeedsLayout und layoutIfNeeded Methode direkt nach Constraints Einstellung. Es wird für Sie arbeiten.

+0

Nein, es hat Richard nicht funktioniert. Es kommt immer noch nach ein paar Sekunden. @Richard G –

+0

Verschieben Sie Ihren Code zu 'viewDidLayoutSubviews'. –