在UITableViewCell中编辑UITextField时禁用UITableView的自动滚动

ani*_*hin 51 uitableview uiscrollview uitextfield ios

UITableViewCell在我的内部使用自定义UITableView.这些中UITableViewCell的每一个都很高,UITextField顶部包含一个.

当用户点击UITextField以编辑它时,会出现一个键盘并UITableView自动滚动,以便单元格位于屏幕顶部.

问题是,它滚动UITableView到底部UITableViewCell,而不是顶部.当UITableViewCell高和编辑时,UITextField它位于顶部,所以你看不到UITextField.我知道如何以UITableView编程方式滚动,但我只是不知道如何禁用这种自动滚动,以便我可以UITableView自己滚动.我怎样才能做到这一点?

Dom*_*der 66

autoscroll-behavior位于UITableViewController功能中.

要禁用自动滚动,我发现了两种方法:

  1. 使用而不是UITableViewController简单地UIViewController- 自己设置数据源和委托.
  2. 覆盖viewWillAppear方法,不要调用[super viewWillAppear: animated]

使用这两种解决方案,您不仅可以禁用Autoscroll,还可以禁用其他一些不错但不是必需的功能,这些功能在Apple的类参考概述中有所描述:

https://developer.apple.com/documentation/uikit/uitableviewcontroller

  • 我不会覆盖viewWillAppear:不调用super.UITableViewController子类UIViewController,Apple"要求"所有UIViewController子类调用super.从[UIViewController文档](https://developer.apple.com/reference/uikit/uiviewcontroller/1621510-viewwillappear):"如果重写此方法,则必须在实现中的某个时刻调用super." (8认同)
  • 我有同样的问题,解决方案2工作.我已经在iOS 5.0.0及更高版本中对此进行了测试,并且到目前为止(当前版本为6.1.2).我不能在4中担保,但是,嘿,这是2013年,所以我们可以说5.0是目前支持最低的操作系统. (3认同)

小智 8

为您定义属性UITableViewController:

@property (nonatomic) BOOL scrollDisabled;
@property (nonatomic) CGFloat lastContentOffsetY;
Run Code Online (Sandbox Code Playgroud)

致电之前becomeFirstResponder:

// Save the table view's y content offset 
lastContentOffsetY = tableViewController.tableView.contentOffset.y;
// Enable scrollDisabled
scrollDisabled = YES;
Run Code Online (Sandbox Code Playgroud)

将以下代码添加到表视图控制器:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (self.scrollDisabled) {
        [self.tableView setContentOffset:CGPointMake(0, lastContentOffsetY)];
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

打电话后resignFirstResponder,设置scrollDisabled = NO.


art*_*gor 5

您可以执行以下操作:

- (void)registerForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillShow:)
                                                 name:UIKeyboardWillShowNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardDidShow:)
                                                 name:UIKeyboardDidShowNotification object:nil];
}

- (void)unregisterForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil];
}

- (void)keyboardWillShow:(NSNotification *)notification
{
    self.tableView.scrollEnabled = NO;
}

- (void)keyboardDidShow:(NSNotification *)notification
{
    double delayInSeconds = 0.3;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            self.tableView.scrollEnabled = YES;
    });
}
Run Code Online (Sandbox Code Playgroud)

然后实现这个 UIScrollViewDelegate 方法

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (! self.tableView.scrollEnabled)
        [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
}
Run Code Online (Sandbox Code Playgroud)

!!!但请注意,如果用户点击 UITextField 中将被键盘覆盖的位置,则它不会滚动。

从我的角度来看,最好的办法是确保从顶部到另一个包含 UITextField 的所有单元格在显示键盘时都可见。