2010-04-21 32 views
12

我有一個標準的UITableView + UISearchDisplayController + UITableViewIndex設置。一切都像一個冠軍。UITableViewIndex意外增長到不正確的界限

除非在特定的條件下,索引增長太長而無法顯示在屏幕上。具體來說,在結束搜索並重新顯示未過濾的索引表之後,索引有時增長太長。

更具體地說,如果我搜索然後取消,這不會發生。它只發生在我搜索時,然後從搜索表中按下視圖控制器,然後將該視圖控制器返回到靜止搜索表,然後取消搜索,然後重新搜索,然後取消最終搜索。在最終搜索結束後,索引太長。

在肖像中,表格視圖在正常情況下報告416的高度和404的高度。如果我從searchDisplayControllerDidEndSearch登錄時索引大小不正確,它報告620的高度。

我已經嘗試了所有從表和索引setLayout手動重新調整框架大小。沒有任何作用(手動重新調整大小會記錄正確的高度,但不會更改屏幕上的顯示)。

我正要嘗試的情況下,取消動畫是干擾延遲一段時間後重新調整大小,但後來我意識到我是多麼荒謬的情況,並認爲尋求幫助可能是明智...

+0

你是如何構建你的索引?它是在viewWillAppear中構建的嗎? – gnasher 2010-05-06 20:57:28

+0

您是否正在運行某種背景任務(同步),它可能會在極少數情況下阻止正確的用戶界面行爲。 – elslooo 2011-03-07 17:04:42

+0

可能要檢查並查看是否在視圖中設置了自動調整大小。 – fjlksahfob 2011-03-08 21:07:58

回答

1

如果你仍然遇到麻煩,你可以嘗試在 - [UITableView setFrame:]上設置一個符號斷點,並跟蹤設置幀調用的來源。 HTH

+0

(或可能 - [UITableView setBounds:]) – nielsbot 2011-04-26 11:58:29

0

我的場景與發佈的場景有點不同,但我發現了一個適用於我的案例的解決方案,所以希望在此處也發佈一個解決方案。

我有一個UITableView,它使用fetchedResultsController並在到達tableView結尾時從服務器加載更多元素。搜索時,fetchedResultsController將被過濾掉,並在沒有足夠的顯示時從服務器加載更多條目。

當連接返回結果(點擊「搜索」後),我重新加載tableViews(原始的和searchResultsTableView)。現在,當您取消搜索並且所有設置恢復正​​常時,我都會遇到問題。 UITableViewIndex增長到其意想不到的邊界。

因爲我還經歷過UITableView的調整比想象的大得多,所以我玩了一個預感,它對我很有幫助。在你的UITableView子類中(這是ARC/6.1):

- (void)loadView 
{ 
    [super loadView]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; 
} 

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; 
} 

- (void)keyboardWillShow:(NSNotification *)notification 
{ 
    if (self.isSearching) 
    { 
     // Ensure the correct height of the original tableview while displaying the searchresults-tableview 
     // only this will make sure, the height of the UITableViewIndex is set correctly ... 
     [UIView animateWithDuration:[[[notification userInfo] valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^(){ 
      CGRect rect = self.tableView.frame; 
      rect.size.height -= [self.tableView convertRect:[[[notification userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil].size.height; 
      self.tableView.frame = rect; 
     }]; 
    } 
} 

- (void)keyboardWillHide:(NSNotification *)notification 
{ 
    if (self.isSearching) 
    { 
     // Ensure the correct height of the original tableview while displaying the searchresults-tableview 
     // only this will make sure, the height of the UITableViewIndex is set correctly ... 
     [UIView animateWithDuration:[[[notification userInfo] valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^(){ 
      CGRect rect = self.tableView.frame; 
      rect.size.height += [self.tableView convertRect:[[[notification userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil].size.height; 
      self.tableView.frame = rect; 
     }]; 
    } 
} 

你可能需要調整它。