2013-04-15 104 views
1

我一直在困擾這個問題,我真的好奇它爲什麼會發生。我已經使用下面顯示的一個簡單示例重新創建了我的問題。我在頂部用UISearchBar在我的視圖的底部放置了一個UITableView和一個自定義的UITableViewCell(在單元的中心包含一個UILabel)。重新加載UITableView在動畫後重置幀

當鍵盤彈出時,我爲UITableView設置動畫,以更改其框架以適應UISearchBar下方和鍵盤上方的空間。現在,當我輸入任何搜索文本並重新加載UITableView時,UITableView會在動畫之前更改其框架。

開始 -

UITableView Frame: {{0, 223}, {320, 237}} - {{x, y},{width, height}} 

動畫後 -

UITableView Frame: {{0, 44}, {320, 436}} - {(x, y),(width, height)} 

當我輸入任何搜索文本 - UITableView Frame: {{0, 223}, {320, 237}} - {{x, y},{width, height}}

我注意到,這只是一個自定義的UITableViewCell發生。我搜索了一個答案,但沒有發現任何東西。我已經嘗試將UILabel作爲子視圖添加到自定義UITableViewCell中的contentView,但沒有奏效。所以我的問題是,我如何防止UITableView將其幀恢復爲其原始值?

編輯:這是我在動畫後更改UITableView幀的代碼。

- (void)keyboardDisplayed:(NSNotification*)notification 
{ 
    NSDictionary* keyboardInfo = [notification userInfo]; 
    NSValue* keyboardValue = [keyboardInfo valueForKey:UIKeyboardFrameBeginUserInfoKey]; 
    CGRect keyboardFrame = [keyboardValue CGRectValue]; 

    CGRect frame = self.testTabl.frame; 
    frame.origin.y = self.testSearchBar.frame.origin.y + self.testSearchBar.frame.size.height; 
    frame.size.height = keyboardFrame.origin.y - frame.origin.y; 

    [UIView animateWithDuration:0.3 animations:^{ 
     [self.testTabl setFrame:frame]; 
    }]; 

    NSLog(@"TableView Frame: %@", NSStringFromCGRect(self.testTabl.frame)); 
} 
+0

如果沒有看到您的代碼,很難說這些。我的第一個猜測是,你只能做動畫,並且不能將實際幀設置爲新值。 – fishinear

+0

剛剛用我的代碼編輯我的帖子。 – akamas

+0

如果有人遇到這個問題,我只是使用了搜索顯示控制器,而不是嘗試使用動畫。 – akamas

回答

0

我不知道它是否解釋了你所看到的行爲,但在你的代碼的主要問題是,你需要使用UIKeyboardFrameEndUserInfoKey代替。像下面這樣的東西應該可以工作:

- (void)keyboardDisplayed:(NSNotification*)notification 
{ 
    NSDictionary* keyboardInfo = [notification userInfo]; 
    CGPoint endPoint = [[keyboardInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].origin; 
    CGFloat duration = [[keyboardInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue]; 

    CGRect frame = self.testTabl.frame; 
    frame.size.height = [self.testTabl convertPoint:endPoint fromView:nil].y; 

    [UIView animateWithDuration:duration animations:^{ 
     [self.testTabl setFrame:frame]; 
    }]; 

    NSLog(@"TableView Frame: %@", NSStringFromCGRect(self.testTabl.frame)); 
} 
+0

嗯..我測試過你的代碼,但UITableView沒有正確設置它的框架。我得到以下: 鍵盤信息:{0,264} TableView框架:{{0,223},{320,21}} 這是一個非常奇怪的行爲,我認爲它是因爲自定義的UITableViewCell。 – akamas

+0

對於鍵盤來說似乎沒問題。隨着你的frame.origin.y在223,那麼21的高度也是正確的。奇怪的是框架的y值爲223,在顯示鍵盤之前必須已經存在。 – fishinear