2016-04-25 42 views
-4

在我的導航堆棧的孩子,我設置edgesForExtendedLayout = .None設置edgesForExtendedLayout影響它的父視圖控制器

當我點擊後退按鈕,在我父的UITableView被「移動」起來,彷彿導航欄不存在。 (導航欄覆蓋表格)。

爲什麼孩子的邊緣設置會影響其父項?我只希望它影響當前的viewController。

在我的父母,我這是怎麼產生的的UITableView:

self.tableView.delegate = self 
    self.tableView.dataSource = self 

    self.tableView.frame = CGRectMake(0, 0, screenWidth, CGRectGetMinY(self.tabBarController!.tabBar.frame)) 
    self.tableView.addSubview(self.refreshControl) 
    self.tableView.tableFooterView = UIView(frame: CGRectZero) 
    self.tableView.rowHeight = UITableViewAutomaticDimension 
    self.tableView.estimatedRowHeight = 100.0 
    self.tableView.clipsToBounds = true 
    self.tableView.separatorStyle = UITableViewCellSeparatorStyle.SingleLine 
    self.tableView.separatorColor = UIColor(hex: 0xededed) 
    self.tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0) 
    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) 
    self.tableView.layoutMargins = UIEdgeInsetsZero 
    self.view.addSubview(self.tableView) 

難道是因爲我錯誤地設置的tableView的框架?我想讓表格從導航欄下面開始,但是在標籤欄之前結束。

+4

你還沒有在你的問題重現您的問題提供足夠的信息。請提供重現此問題所需的代碼[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – JAL

+0

我試圖重現你的問題,像這樣:在一個'UIViewController'中設置一個'UITableView',並使用一個單元來推送一個新的'UIViewController'。在該視圖控制器的'viewDidLoad'中,我設置了'self.edgesForExtendedLayout = .None'。當我按「返回」返回到'UITableViewController'時,我看不到表視圖位置的任何變化。你是直接修改'UINavigationController'上的'edgesForExtendedLayout'嗎? – JAL

+0

@JAL我在孩子的'''viewDidLoad()'''中設置'''self.edgesForExtendedLayout = .None'''。我不確定直接在UINavigationController上修改它是什麼意思。 – TIMEX

回答

3

聽起來這可能是正確的行爲,但與你所期望的相反。

edgesForExtendedLayout = .None意味着視圖控制器的視圖將而不是擴展到頂部導航欄或底部的選項卡欄下。你說你的子視圖控制器設置爲edgesForExtendedLayout = .None,但不是父視圖控制器。而當你回到父視圖控制器時,表格視圖在導航欄下移動。如果您沒有在您的示例中將父級視圖控制器設置爲edgesForExtendedLayout = .None,那麼它仍將使用默認值edgesForExtendedLayout = .All。這將擴大頂部和底部欄下的表視圖的頂部。

對於您正在查找的行爲,請嘗試使用表視圖在父視圖控制器上設置edgesForExtendedLayout = .None。因此,父視圖控制器代碼可能看起來是這樣的:

self.edgesForExtendedLayout = .None 

self.tableView.delegate = self 
self.tableView.dataSource = self 

self.tableView.frame = CGRectMake(0, 0, screenWidth, screenHeight - self.navigationController!.navigationBar.bounds.height - self.tabBarController!.tabBar.bounds.height) 

UPDATE - 要使用自動佈局(優於手動幀)實現相同的結果,首先確保表視圖已經被添加作爲一個子視圖視圖控制器的主視圖的,那麼就可以簡單地設置的限制如下:

tableView.topAnchor.constraintEqualToAnchor(view.topAnchor).active = true 
tableView.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor).active = true 
tableView.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor).active = true 
tableView.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor).active = true 

使用這些NSLayoutAnchor便利方法假定的iOS 9或以上。當然,更簡單的方法是在Storyboard中創建視圖控制器,然後按Ctrl +拖動約束。無論哪種方式,視圖控制器的edgesForExtendedLayout屬性都將控制約束是否強制導航欄和選項卡欄下的表視圖。在故事板,你可以控制那些通過檢查檢查這些不同的盒子的視圖控制器設置:

storyboard inspector

+0

當我通過代碼創建UITableView時,應該如何將框架設置爲? – TIMEX

+0

如果我沒有設置框架,表格不會出現。 – TIMEX

+0

@TIMEX您應該將幀設置爲(0,0,screenWidth,screenHeight - self.navigationController!.navigationBar.bounds.height - self.tabBarController!.tabBar.bounds.height) –

相關問題