2014-10-02 28 views
0

我需要實現在屏幕上完全集中顯示標籤的能力,其他都不可見,但這需要在UITableView中完成。該設置是UISpiltViewController,其中有一個UITableViewController用於詳細視圖控制器,並且當左側沒有選擇任何項目時,我想顯示一條消息,指出在右側,以及當用戶選擇標籤應立即消失並顯示桌子。 (就像郵件應用程序一樣)創建tableHeaderView始終填充可見表格的框架?

我已經有了這個設置,它工作正常,但由於某種原因,它並不總是保持居中在屏幕上,這不是一個很好的解決方案 - 有一些小奇怪例如,當旋轉發生時,您可以部分看到桌面的頂部。我只是創建一個UILabel,將它的frame設置爲填充可見區域,然後將表tableHeaderView設置爲該標籤,最後禁用滾動表格的功能。在旋轉時,必須更新frame以再次填充可見區域。這就是奇怪發生的地方,因爲直到旋轉完成後它纔會更新。

我的問題是,有什麼更好的方法來實現這種行爲?有什麼方法可以防止在旋轉後更新框架,是否可以使用自動佈局tableHeaderView

//Setting the tableHeaderView 
self.tableView.tableHeaderView = self.label; 

//Creating the UILabel 
- (UILabel *)label { 
    _label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, 
                     self.tableView.bounds.size.height 
                     - self.navigationController.navigationBar.frame.size.height 
                     - self.tabBarController.tabBar.frame.size.height 
                     - MIN([UIApplication sharedApplication].statusBarFrame.size.height, 
                       [UIApplication sharedApplication].statusBarFrame.size.width))]; 
    _label.text = @"Nothing Selected"; 
    _label.textAlignment = NSTextAlignmentCenter; 
    _label.backgroundColor = self.tableView.backgroundColor; 
    return _label; 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    if (_label) { 
     _label.frame = CGRectMake(0, 0, self.tableView.bounds.size.width, 
                self.tableView.bounds.size.height 
                - self.navigationController.navigationBar.frame.size.height 
                - self.tabBarController.tabBar.frame.size.height 
                - MIN([UIApplication sharedApplication].statusBarFrame.size.height, 
                  [UIApplication sharedApplication].statusBarFrame.size.width)); 

     self.tableView.tableHeaderView = nil; 
     self.tableView.tableHeaderView = _label; 
    } 
} 

回答

0

正如Cabus指出的,解決方案是將標籤的autoresizingMask設置爲UIViewAutoResizingFlexibleWidth | UIViewAutoResizingFlexibleHeight。這樣,該標籤將始終適合其父母。這可以在使用tableHeaderView的標籤時完成,並且不再需要檢測方向更改。

0

您的詳細控制器是一個UITableViewController嗎?如果是這樣,這會讓事情變得更加困難,因爲您添加的任何子視圖(您的標籤)都會成爲表格的一部分。如果您使用UIViewController會更容易,並在需要時交替隱藏標籤或表格視圖。該標籤可以是任何尺寸,並使用centerX和centerY約束來保持居中。如果你這樣做,你不需要做任何旋轉。

+0

對不起,我應該特別說明。是的,它是一個'UITableViewController',我肯定會更喜歡這樣。 :) – Joey 2014-10-02 21:51:55

+0

@Joey,爲什麼?我不明白爲什麼這麼多人堅持使用UITableViewController。使用UIViewController無法輕鬆完成這件事,這並不會讓你感到太多,它使得你想要做的更加困難。 – rdelmar 2014-10-02 22:02:53

0

您不必將標籤設置爲您的UITableView的headerView。

您可以簡單地將標籤添加到self.view。即使您在UITableViewController內運行,每個UIViewController也始終具有視圖屬性。

將標籤添加到self.view並根據需要切換標籤和tableView的可見性。
這是不是試圖去撥弄在tableview中的標籤容易得多, - 層次;)

編輯

正如@rdelmar指出的,確實的UITableViewController沒有包含在tableview中一個單獨的視圖,而是直接使用tableview作爲視圖。 -.-

對不起。我確實認爲這兩個意見是分開的。

我只能說遵循@rdelmar的建議,並停止使用UITableViewController。它迫使你做的事情的默認方式,如果你想定製它,你將有一個壞的時間:(

EDIT 2

好了,所以你有2種選擇:

1)執行以下操作:

[_label setAutoResizingMask:(UIViewAutoResizingFlexibleWidth | UIViewAutoResizingFlexibleHeight)]; 

在您的標籤getter。這樣,你就不必關心屏幕旋轉了。該標籤將永遠適合其父母的界限。

2)使用UIViewController並將標籤視爲tableView的兄弟。 < - 更好的方法,但需要從當前狀態進行更多的重構。

+0

這確實有效,但仍然存在相同的問題。在iPad上旋轉時,您可以在該視圖下方看到桌子的其餘部分(現在在右側)。再次因爲它不更新幀,直到旋轉完成。但也許有了這個解決方案,我可以使用自動佈局? – Joey 2014-10-02 22:07:54

+0

這是不正確的。 UIViewController的視圖是表視圖。沒有其他視圖添加標籤(self.view和self.tableView指向表視圖)。 – rdelmar 2014-10-02 22:13:09

+0

@rdelmar他們確實是同一個視圖,但您仍然可以將其添加到視圖(或tableView)中,並且它確實出現在表格之上。我試着給這個添加自動佈局約束,但是'tableView.frame.size.width'是0,所以它結束了內在內容的大小 - 而不是填充tableView可見區域。嗯 – Joey 2014-10-02 22:17:11