2016-04-07 2 views
0

Я застрял! Я работаю над viewController, который станет базой для других viewControllers. Другие будут распространяться на него.UIView Display Late при его создании с автоматическим макетом

Я хочу создать некоторый вид (например, пользовательский NavigationBar) с программными ограничениями для baseViewController, и я создал его.

Итак, у меня есть раскадровка, есть навигационный контроллер с rootViewController (HomeViewController), и этот homeViewController простирается от baseViewController.

Вот моя раскадровка выглядит;

Storyboard scene

Итак, мои ограничения работают! Но представление, которое создается с программными ограничениями, отображается после пары секунд, и его диск меня сходит с ума!

Вот как это выглядит при первом запуске приложения;

enter image description here

И через пару секунд появляется мое мнение;

enter image description here

Я хочу также поделиться своими кодами. Я использую язык визуального формата для создания ограничений;

- (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]; 

} 

У меня много вопросов;

  • В чем причина?
  • Могу ли я использовать раскадровку, когда хочу создавать программные ограничения?
  • Я использую viewDidLoad для вызова методов для создания вида и ограничений. Является ли viewDidLoad хорошим местом для этого?
  • Какова наилучшая практика для этого сценария?
  • Как я могу самостоятельно инициализировать мой взгляд так же, как и первый снимок?

Надеюсь, это ясно. Спасибо за ваши ответы, и я с нетерпением жду услышать от вас.

+0

попробуйте сделать это в viewDidAppear. ViewDidload - это не подходящее место для работы с представлениями и автозапуском –

+0

Я не знаю причины, по которой для отображения требуется 2 секунды. Я могу сказать, что ваш код выглядит очень сложным для того, что вы делаете. Два предложения: настройте свои ограничения в раскадровке, а не в коде, потому что это намного проще. Во-вторых, навигационный контроллер автоматически дает вам навигационную панель, вам не следует создавать навигационную панель. См. Https://developer.apple.com/library/ios/documentation/UIKit/Reference/UINavigationController_Class/index.html –

+0

P.S.Ваше приложение выглядит так, как будто это будет круто! –

ответ

0

Прежде всего, если это не обязательно, тогда установите ограничения от IB. Если это необходимо, выполните свою задачу в viewDidAppear и в главном потоке, если это необходимо.

+0

Не имеет значения, где вы даете ограничения, если у вас есть хорошая рука на автозапуске. –

0

Вызвать setNeedsLayout и layoutIfNeeded метод сразу после установки ограничений. Это сработает для вас.

+0

Нет, это не помогло Ричарду. Он все еще наступает через пару секунд. @Richard G –

+0

переместите свой код в 'viewDidLayoutSubviews'. –