重新加载UITableView会在动画后重置帧

时间:2013-04-15 07:59:21

标签: ios objective-c uitableview uisearchbar

我一直坚持这个问题,我真的很好奇为什么会这样。我使用下面显示的一个简单示例重新创建了我的问题。我在我的视图底部放置了一个UITableView,其中包含一个自定义的UITableViewCell(在单元格的中心包含一个UILabel),顶部有一个UISearchBar。

当键盘弹出时,我为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));
}

1 个答案:

答案 0 :(得分:1)

我不确定它是否能解释您所看到的行为,但代码中的主要问题是您需要使用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));
}