在UITableViewController上编辑UITextField时滚动区域不正确

时间:2014-02-26 19:31:33

标签: ios ios7 uitextfield uitableview

我在iPhone上有UITableViewController分组样式。我现在在iOS 7.0.6上。我的一些单元格是UITextField。编辑文本字段时,会自动调整滚动区域;我没有添加代码来执行此操作。我唯一与滚动相关的事情是:

[self.tableView scrollToRowAtIndexPath:nameIndexPath
                      atScrollPosition:UITableViewScrollPositionNone
                              animated:YES];

但是我只在textField:shouldChangeCharactersInRange:replacementString:中调用它,所以在点击文本字段时甚至都不会调用它。

我的问题是,键盘可见,我可以将表内容向上滚动太远。它似乎正好是一个标签栏高度太远;我的应用程序是基于标签栏。在下图中,您可以看到滚动条停止键盘上方的一个标签栏高度。 (不重要的注意:文本字段一直向上滚动,所以你看不到它。)

看起来又是另一个iOS 7错误。任何想法如何解决这个问题,因为它看起来相当草率。

enter image description here

注意:在其他情况下,我看到过与iOS类似的插入问题。我想很快就会修好(至少我希望如此;因为这是一个非常简单的iOS漏洞)。

1 个答案:

答案 0 :(得分:1)

原来contentInsetscrollIndicatorInsets都不正确:(64, 0, **265**, 0)。底部插入值为55点(即标签栏高度)关闭。

正确的底部插图当然必须只是键盘高度216

要解决这个问题,直到Apple一起采取行动:

- (BOOL)textFieldShouldBeginEditing:(UITextField*)textField
{
    dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.6 * NSEC_PER_SEC));
    dispatch_after(when, dispatch_get_main_queue(), ^(void)
    {
        // Must be delayed until after iOS has adjusted the insets,
        // which turns out to be 'way before' the keyboard animation has finished.
        [self.tableView setContentInset:UIEdgeInsetsMake(64, 0, 216, 0)];
        [self.tableView setScrollIndicatorInsets:UIEdgeInsetsMake(64, 0, 216, 0)];
    });

    return YES;
}

- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
    [textField resignFirstResponder];

    // iOS seems to set the insets differential: So we must set them back
    // to the incorrect values for iOS to subtract the bottom inset back
    // to 55 again.
    // No delay needed here of course because we must do this before the
    // keyboard animation starts.
    [self.tableView setContentInset:UIEdgeInsetsMake(64, 0, 265, 0)];
    [self.tableView setScrollIndicatorInsets:UIEdgeInsetsMake(64, 0, 265, 0)];

    return YES;
}

编辑:为了确保这个解决方法是Apple修复抗性,让我们做:

dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.6 * NSEC_PER_SEC));
dispatch_after(when, dispatch_get_main_queue(), ^(void)
{
    if (self.tableView.contentInset.bottom == 265)
    {
        [self.tableView setContentInset:UIEdgeInsetsMake(64, 0, 216, 0)];
        [self.tableView setScrollIndicatorInsets:UIEdgeInsetsMake(64, 0, 216, 0)];
    }
});