表视图滚动问题与内容偏移

时间:2012-12-10 10:04:14

标签: ios xcode cocoa-touch

我正在尝试滚动表格视图以显示键盘处于活动状态时的最后一个单元格。 这就是我在tableView:cellForRowAtIndexPath: ...

中所做的
if (keyboard) {

    CGFloat calculatedPosY = 70 * ([Array count]-1);
    MyTable.contentOffset = CGPointMake(0.0, calculatedPosY);

}

它第一次正常工作,但第二次它的重装表不滚动。第三次,它再次滚动并显示表的最后一个单元格。或者,代码正在运行,日志提供相同的内容偏移量(0,280)。

请告诉我,我做错了。 提前谢谢。

3 个答案:

答案 0 :(得分:1)

您需要做两件事 - 1)确保表格视图适合未被键盘覆盖的屏幕的可见部分,2)将表格滚动到最后一行。

要调整视图大小,我会注册以检测出现的键盘:

    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector (keyBoardWillShow:)
                                             name: UIKeyboardWillShowNotification object: nil];

键盘出现时会调用keyBoardWillShow:方法,您可以调整表格视图的大小:

- (void)keyBoardWillShow:(NSNotification *)aNotification
{
    NSValue *value = [[aNotification userInfo] objectForKey: UIKeyboardFrameEndUserInfoKey];
    CGRect keyboardRect = [value CGRectValue];

    CGFrame tableFrame = self.tableView.frame;
    tableFrame.height -= keyboardRect.size.height 
    self.tableView.frame = tableFrame;
}

最后,滚动到最后一个单元格(如果您愿意,可以在keyBoardWillShow:中执行此操作):

[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:lastRowIndex inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];

答案 1 :(得分:0)

不要在tableView:cellForRowAtIndexPath:中执行此操作。此方法遍历所有数组元素并创建单元格。这意味着此计算运行数组[N]次。

而是在[self.tableView reloadData];

之后运行一次

或试试这个:

NSInteger *cells_count // You can have it from - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section.

//Run this after [tableView reloadData]
NSIndexPath* indexPath = [NSIndexPath indexPathForRow:cells_count-1 inSection:0];
[tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated: NO];

答案 2 :(得分:0)

我建议你使用 - scrollToRowAtIndexPath:atScrollPosition:animated:。它是UITableView中的一个方法。