IOS7 Просмотр перемещений по барам статуса/навигации при повторном вызове loadView
У меня есть View Controller, который создает его представление программно с помощью метода loadView
. Цель представления - отобразить содержимое моделей данных. Когда представление загружается, оно выравнивается правильно под статусом и навигационной панелью.
Но в более позднем моменте я представляю другое представление, чтобы разрешить пользователю выбирать другую модель данных для заполнения представления. Это приводит к тому, что loadView
снова вызовет вызов и заново создаст требуемый пользовательский интерфейс для новой модели данных. Проблема в том, что содержимое представления теперь отображается в статусных и навигационных барах!
Обратите внимание, что я не использую авто-макет из-за необходимости поддерживать iOS4:( Также, если я включаю исправление extendedLayout
- он исправляет проблему, но только после завершения анимации модального увольнения, оставляя эффект перехода вниз. Мой код ниже, спасибо за любую помощь.
- (void)loadView {
CGRect frame = CGRectMake(0, 0, [Constants ScreenWidth], [Constants ScreenHeight] - StatusBarHeight - ToolbarHeight);
self.view = [[UIView alloc] initWithFrame:frame];
self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight;
self.view.autoresizesSubviews = YES;
self.view.backgroundColor = [Constants categoriesScreenBackgroundColor];
CGRect scrollFrame = CGRectMake(0, 0, [Constants ScreenWidth], [Constants ScreenHeight] - StatusBarHeight - ToolbarHeight - ToolbarHeight);
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:scrollFrame];
scrollView.autoresizingMask = UIViewAutoresizingFlexibleHeight |
UIViewAutoresizingFlexibleBottomMargin |
UIViewAutoresizingFlexibleTopMargin;
[self.view addSubview:scrollView];
_toolbarViewController = [self createToolbarViewController];
[self.view addSubview:_toolbarViewController.view];
_toolbarViewController.productInfoWorkflowState = _productInfoWorkflowState;
UIView *containerView = [[UIView alloc] initWithFrame:scrollView.frame];
containerView.backgroundColor = [UIColor clearColor];
_headerViewController = [self createHeaderViewController];
[containerView addSubview:_headerViewController.view];
_menuViewController = [[ProductInfoMenuViewController alloc] initWithBatch:[self batchData]];
_menuViewController.delegate = self;
[containerView addSubview:_menuViewController.view];
CGRect categoriesFrame = _menuViewController.view.frame;
categoriesFrame.origin.y = _headerViewController.view.frame.size.height;
_menuViewController.view.frame = categoriesFrame;
CGRect viewFrame = containerView.frame;
viewFrame.size.height = _headerViewController.view.frame.size.height + _menuViewController.view.frame.size.height;
containerView.frame = viewFrame;
[scrollView addSubview:containerView];
scrollView.contentSize = containerView.frame.size;
_starViewController = [[StarViewController alloc] initForProduct:_productData With:[StarredItems new]];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:_starViewController.view];
}
Расположение экрана после первой загрузки:
![Screen layout after first load]()
Расположение экрана после второй загрузки:
![Screen layout after second load]()
Когда Лев предложил исправить, scrollView правильный, но панель внизу внизу отображается неправильно. Код, который я использовал (помещается после кода создания панели инструментов выше):
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
self.automaticallyAdjustsScrollViewInsets = NO;
scrollView.scrollIndicatorInsets = UIEdgeInsetsMake(64.0f, 0.0f, 0.0f, 0.0f);
scrollView.contentInset = UIEdgeInsetsMake(64.0f, 0.0f, 0.0f, 0.0f);
}
Результаты:
![enter image description here]()
Ответы
Ответ 1
Добавьте следующий код для своей работы для меня по той же проблеме, может быть, это поможет вам
/* ios 7 Change */
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7)
{
self.edgesForExtendedLayout = UIRectEdgeNone;
self.automaticallyAdjustsScrollViewInsets = NO;
}
Ответ 2
Случается ли это только на iOS 7?
Попробуйте:
self.navigationController.navigationBar.translucent = NO;
Ответ 3
Попробуйте следующее:
Toolbar.autoresizingMask = UIViewAutoresizingFlexibleTopMargin;
Ответ 4
попробуйте это
CGRect frame = CGRectMake(0, StatusBarHeight, [Constants ScreenWidth], [Constants ScreenHeight] - StatusBarHeight - ToolbarHeight);
self.view = [[UIView alloc] initWithFrame:frame];
self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight;
self.view.autoresizesSubviews = YES;
self.view.backgroundColor = [Constants categoriesScreenBackgroundColor];
CGRect scrollFrame = CGRectMake(0, StatusBarHeight, [Constants ScreenWidth], [Constants ScreenHeight] - StatusBarHeight - ToolbarHeight - ToolbarHeight);
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:scrollFrame];
scrollView.autoresizingMask = UIViewAutoresizingFlexibleHeight |
UIViewAutoresizingFlexibleBottomMargin |
UIViewAutoresizingFlexibleTopMargin;
[self.view addSubview:scrollView];
Ответ 5
Я думаю, проблема связана с неправильным автоматическим набором вложений содержимого прокрутки.
Попробуйте следующее. В loadView
установите self.automaticallyAdjustsScrollViewInsets
в NO
(только если NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1
). Теперь установите contentInset
и scrollIndicatorInsets
в правильные значения в зависимости от версии ОС:
scrollview.contentInset = scrollview.scrollIndicatorInsets = UIEdgeInsetMake(NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_6_1 ? 0 : 64, 0, 0, 0);
Ответ 6
Моя проблема была решена с помощью отметки проверки "Настроить прокрутки" в контроллере просмотра (с использованием раскадровки).