簡體   English   中英

當loadView再次調用時,iOS7 View會在狀態/導航欄下移動

[英]iOS7 View moves under status/nav bars when loadView called again

我有一個View Controller,它通過loadView方法以編程方式創建視圖。 視圖的目的是顯示數據模型內容。 加載視圖時,它在狀態和導航欄下正確對齊。

但是稍后我會以模態方式呈現另一個視圖,以允許用戶選擇不同的數據模型來填充視圖。 這會導致再次調用loadView並為新數據模型重新創建所需的UI。 問題是視圖的內容現在出現在狀態和導航欄下面!

請注意,由於必須支持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];
}

首次加載后的屏幕布局:

首次加載后的屏幕布局

第二次加載后的屏幕布局:

第二次加載后的屏幕布局

使用Leo的建議修復,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);
}

結果:

在此輸入圖像描述

添加以下代碼為我的工作同樣的問題,可能是它的幫助

/* ios 7 Change */
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7)
    {
        self.edgesForExtendedLayout = UIRectEdgeNone;
        self.automaticallyAdjustsScrollViewInsets = NO;
    }

這只發生在iOS 7上嗎?

嘗試一下:

self.navigationController.navigationBar.translucent = NO;

試試以下:

 Toolbar.autoresizingMask = UIViewAutoresizingFlexibleTopMargin;

試試這個

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

我認為問題是由於scrollview的內容插件的自動設置不正確。

請嘗試以下方法。 loadView ,將self.automaticallyAdjustsScrollViewInsets設置為NO (僅當NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1 )。 現在,根據操作系統版本將contentInsetscrollIndicatorInsets設置為正確的值:

scrollview.contentInset = scrollview.scrollIndicatorInsets = UIEdgeInsetMake(NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_6_1 ? 0 : 64, 0, 0, 0);

我的問題解決了取消標記視圖控制器中的“調整滾動視圖插入”選項(使用故事板)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM