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功能中.
要禁用自动滚动,我发现了两种方法:
UITableViewController简单地UIViewController- 自己设置数据源和委托.viewWillAppear方法,不要调用[super viewWillAppear: animated]使用这两种解决方案,您不仅可以禁用Autoscroll,还可以禁用其他一些不错但不是必需的功能,这些功能在Apple的类参考概述中有所描述:
https://developer.apple.com/documentation/uikit/uitableviewcontroller
小智 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.
您可以执行以下操作:
- (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 的所有单元格在显示键盘时都可见。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           21675 次  |  
        
|   最近记录:  |