UITableView中多个UITextField时滚动问题

参考:http://stackinterchange.com/question/267/

http://www.cocoachina.com/bbs/read.php?tid-13599-page-1.html

http://stackoverflow.com/questions/594181/uitableview-and-keyboard-scrolling-problem


1、 采用 NSNotificationCenter 方式 

在 .h 文件中 添加两个变量后面会用到

    int keyboardHeight;

    BOOL keyboardIsShowing;


@property (nonatomicretainUITextField *currentTextField;


在.m 文件里

@synthesize currentTextField = _currentTextField;


首先,在你的viewWillAppear:订阅到键盘上的通知,让你知道什么时候键盘会显示和隐藏,系统会告诉你的键盘大小,但是不要忘记注销您的viewWillDisappear:

- (void)viewWillAppear:(BOOL)animated

{

    [super viewWillAppear:animated];

    

    [[NSNotificationCenter defaultCenteraddObserver:selfselector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 

    

    [[NSNotificationCenter defaultCenteraddObserver:selfselector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

}


- (void)viewWillDisappear:(BOOL)animated

{

[super viewWillDisappear:animated];

    [[NSNotificationCenter defaultCenterremoveObserver:self];

}


实现方法类似下面这样你调整你曾经为tableView匹配的键盘显示可视面积的大小。不要忘了执行keyboardWillHide:

-(void) keyboardWillShow:(NSNotification *)note {

    

    CGRect keyboardBounds;

    

    [[note.userInfo valueForKey:UIKeyboardWillShowNotificationgetValue: &keyboardBounds]; 

    

    keyboardHeight = keyboardBounds.size.height

    

    if (keyboardIsShowing == NO) {

        

        keyboardIsShowing = YES

        CGRect frame = self.view.frame

        frame.size.height -= keyboardHeight

        [UIView beginAnimations:nil context:NULL];

        [UIView setAnimationBeginsFromCurrentState:YES]; 

        [UIView setAnimationDuration:0.3f]; 

        self.view.frame = frame;

        [UIView commitAnimations]; 

    }

}



- (void)keyboardWillHide:(NSNotification*)notification {

    if (!keyboardIsShowing) {

        return;

    }

    

    NSDictionary* userInfo = [notification userInfo];

        [UIView beginAnimations:nil context:NULL];

        [UIView setAnimationDuration:[[userInfoobjectForKey:UIKeyboardAnimationDurationUserInfoKeydoubleValue]];

        [UIView setAnimationCurve:[[userInfoobjectForKey:UIKeyboardAnimationCurveUserInfoKeyintValue]];

       

    //CGRect rect = self.view.bounds;

    //self.tableView.frame = CGRectMake(0, 0, 320, 416);

    NSValue *value = [userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey];

    CGSize keyboardSize = [value CGRectValue].size;

    CGRect viewFrame = self.view.frame;

    viewFrame.size.height +=keyboardSize.height;

   keyboardIsShowing = NO;

    [UIView commitAnimations];

}   


- (void)textFieldDidBeginEditing:(UITextField *)textField

{

    self.currentTextField = textField;

    NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *) [self.tableView viewWithTag:self.currentTextField.tag]];

    

    UITableViewCell *cell = (UITableViewCell *) [textField superview];

    indexPath = [self.tableView indexPathForCell:cell];

    //[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

    //int currentIndex = textField.tag;

    CGRect frame = textField.frame

    CGFloat rowHeight = self.tableView.rowHeight;

    //下面的代码只是为了判断是哪一个textField,可以根据自己的情况进行修改,我为了测试加了7个

    if (indexPath.row == 0) {

        frame.origin.y += rowHeight * 0;

    } else if (indexPath.row==1) { 

        frame.origin.y += rowHeight * 1

    } else if (indexPath.row == 2) {

        frame.origin.y += rowHeight * 2;

    } else if (indexPath.row ==3){

        frame.origin.y += rowHeight * 3;

    }else if(indexPath.row==4)

    {

        frame.origin.y +=rowHeight *4;

    } else if(indexPath.row==5)

    {

        frame.origin.y +=rowHeight *5;

    } else if(indexPath.row==6)

    {

        frame.origin.y +=rowHeight *6;

    } 

    CGFloat viewHeight = self.tableView.frame.size.height;

    CGFloat halfHeight = viewHeight / 2;

    CGFloat halfh= frame.origin.y +(textField.frame.size.height / 2);

    

    if(halfh<halfHeight){

        frame.origin.y = 0

        frame.size.height =halfh;

    }else{

        frame.origin.y =halfh; 

        frame.size.height =halfh;

    } 

    [self.tableView scrollRectToVisible:frame animated:YES ];

}   


点击done(完成)按钮关闭键盘,可以在UIControlEventEditingDidEndOnExit 响应事件

 [textField addTarget:self action:@selector(textFieldDoneEditing:)forControlEvents:UIControlEventEditingDidEndOnExit];


-(IBAction)textFieldDoneEditing:(id)sender

{

    self.currentTextField = (UITextField *)sender;

    [self.currentTextField resignFirstResponder];

    [sender resignFirstResponder];

    //[self.tableView scrollRectToVisible:self.currentTextField.frame animated:YES];

}


2、采用 scrollToRowAtIndexPath

点击done(完成)按钮关闭键盘,可以在UIControlEventEditingDidEndOnExit 响应事件

 [textField addTarget:self action:@selector(textFieldDoneEditing:)forControlEvents:UIControlEventEditingDidEndOnExit];

-(IBAction)textFieldDoneEditing:(id)sender

{

    self.currentTextField = (UITextField *)sender;

    [self.currentTextField resignFirstResponder];

    [sender resignFirstResponder];

    [self.tableView scrollRectToVisible:self.currentTextField.frame animated:YES];

}


- (void)textFieldDidBeginEditing:(UITextField *)textField

{

    self.currentTextField = textField;

    NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *) [self.tableView viewWithTag:self.currentTextField.tag]];

    

    //直接加到cell 上

  //这里要看textField 是直接加到cell 上的还是加的   cell.contentView上的

    UITableViewCell *cell = (UITableViewCell *) [textField superview];

    indexPath = [self.tableView indexPathForCell:cell];

    

        [self.tableView scrollToRowAtIndexPath:indexPathatScrollPosition:UITableViewScrollPositionTop animated:YES];

}         



文章转自:http://linglong117.blog.163.com/blog/static/27714547201162810618237/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在iOS,一个视图只能有一个UITableView。但是可以通过创建多个UITableView来实现一个视图显示多个表格的效果。以下是一个示例代码: 首先,你需要在视图控制器添加多个UITableView的实例变量: ```swift class YourViewController: UIViewController { var tableView1: UITableView! var tableView2: UITableView! // ... } ``` 然后,在视图加载完成后,你可以创建和配置这些UITableView的实例: ```swift override func viewDidLoad() { super.viewDidLoad() // 创建第一个UITableView tableView1 = UITableView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height/2)) tableView1.dataSource = self tableView1.delegate = self view.addSubview(tableView1) // 创建第二个UITableView tableView2 = UITableView(frame: CGRect(x: 0, y: view.frame.height/2, width: view.frame.width, height: view.frame.height/2)) tableView2.dataSource = self tableView2.delegate = self view.addSubview(tableView2) // ... } ``` 接下来,你需要实现UITableViewDataSource和UITableViewDelegate协议的相关方法来提供表格的数据和处理交互事件。例如: ```swift extension YourViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if tableView == tableView1 { // 返回第一个UITableView的行数 return 10 } else if tableView == tableView2 { // 返回第二个UITableView的行数 return 5 } return 0 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) if tableView == tableView1 { // 配置第一个UITableView的单元格 cell.textLabel?.text = "Table View 1 - Row \(indexPath.row)" } else if tableView == tableView2 { // 配置第二个UITableView的单元格 cell.textLabel?.text = "Table View 2 - Row \(indexPath.row)" } return cell } } extension YourViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if tableView == tableView1 { // 处理第一个UITableView的行选事件 print("Table View 1 - Row \(indexPath.row) selected") } else if tableView == tableView2 { // 处理第二个UITableView的行选事件 print("Table View 2 - Row \(indexPath.row) selected") } } } ``` 这样,你就可以在同一个视图使用多个UITableView了。记得在视图控制器遵循UITableViewDataSource和UITableViewDelegate协议,并在视图加载完成后设置数据源和代理。 希望这能帮到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值