Я застрял! Я работаю над viewController, который станет базой для других viewControllers. Другие будут распространяться на него.UIView Display Late при его создании с автоматическим макетом
Я хочу создать некоторый вид (например, пользовательский NavigationBar) с программными ограничениями для baseViewController, и я создал его.
Итак, у меня есть раскадровка, есть навигационный контроллер с rootViewController (HomeViewController), и этот homeViewController простирается от baseViewController.
Вот моя раскадровка выглядит;
Итак, мои ограничения работают! Но представление, которое создается с программными ограничениями, отображается после пары секунд, и его диск меня сходит с ума!
Вот как это выглядит при первом запуске приложения;
И через пару секунд появляется мое мнение;
Я хочу также поделиться своими кодами. Я использую язык визуального формата для создания ограничений;
- (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 хорошим местом для этого?
- Какова наилучшая практика для этого сценария?
- Как я могу самостоятельно инициализировать мой взгляд так же, как и первый снимок?
Надеюсь, это ясно. Спасибо за ваши ответы, и я с нетерпением жду услышать от вас.
попробуйте сделать это в viewDidAppear. ViewDidload - это не подходящее место для работы с представлениями и автозапуском –
Я не знаю причины, по которой для отображения требуется 2 секунды. Я могу сказать, что ваш код выглядит очень сложным для того, что вы делаете. Два предложения: настройте свои ограничения в раскадровке, а не в коде, потому что это намного проще. Во-вторых, навигационный контроллер автоматически дает вам навигационную панель, вам не следует создавать навигационную панель. См. Https://developer.apple.com/library/ios/documentation/UIKit/Reference/UINavigationController_Class/index.html –
P.S.Ваше приложение выглядит так, как будто это будет круто! –