【问题标题】:Reloading UITableView resets frame after animation动画后重新加载 UITableView 重置帧
【发布时间】:2013-04-07 06:43:19
【问题描述】:

我一直被这个问题困扰,我真的很好奇为什么会这样。我使用下面显示的简单示例重新创建了我的问题。我在视图底部放置了一个带有自定义 UITableViewCell(在单元格中心包含一个 UILabel)的 UITableView,顶部是一个 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));
}

【问题讨论】:

  • 如果没有看到你的代码,很难说这件事。我的第一个猜测是你只做动画并且没有将实际帧设置为新值。
  • 刚刚用我的代码编辑了我的帖子。
  • 如果有人遇到这个问题,我只是使用了搜索显示控制器,而不是尝试使用动画。

标签: ios objective-c uitableview uisearchbar


【解决方案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));
}

【讨论】:

  • 嗯..我已经测试了你的代码,但 UITableView 没有正确设置它的框架。我得到以下信息: Keyboard Info: {0, 264} TableView Frame: {{0, 223}, {320, 21}} 这是一个非常奇怪的行为,我认为这是因为自定义 UITableViewCell。
  • 264 对于键盘来说似乎没问题。如果您的 frame.origin.y 为 223,那么高度的 21 也是正确的。奇怪的是框架的 y 值为 223,在显示键盘之前它必须已经存在。
猜你喜欢
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
相关资源
最近更新 更多