【问题标题】:Scroll the table view to the pop over-presenting text field when keyboard fires up by a text field inside the pop over当键盘通过弹出窗口内的文本字段启动时,将表格视图滚动到弹出窗口显示文本字段
【发布时间】:2015-02-25 17:56:03
【问题描述】:

我有一个带有许多单元格的UITableViewController,每个单元格包含四个相互垂直的文本字段,通过点击任何文本字段会显示一个弹出窗口,但是,当点击键盘时,此弹出窗口包含一个文本字段触发并且很可能弹出窗口将向上移动以防止键盘隐藏其文本字段(这是弹出窗口的默认行为),但在背景中(灰色视图),tableViewController 失去其正确滚动在键盘可见时将 pop over presenting-textField 保持在轨道上的行为..

一个示例项目can be downloaded here

在这种情况下,当键盘可见时,如何偏移表格视图以在屏幕上保持弹出的presenting-textField?

我尝试了著名的TPKeyboardAvoiding 库,但没有解决问题。

附言tableViewController 适用于前 3 或 4 次键盘触发,但在以后的尝试中会失去精确滚动。

屏幕截图(绿色文本字段是显示弹出窗口的文本字段,但tableViewController 滚动到错误的红色文本字段):

任何帮助将不胜感激。

编辑: 这个问题不是重复的:Making a UITableView scroll when text field is selected 因为我需要表格视图滚动到的文本字段是触发弹出而不是键盘的文本字段,并且scrollToRowAtIndexPath 在这种情况下无法精确工作,因为每个单元格包含 4 个文本字段。

【问题讨论】:

  • @Astoria TPKeyboardAvoiding 没有解决问题,我也在他们的 github 问题页面上发布了这个问题。
  • 可以手动调整
  • 我认为你需要在键盘出现时减少tableview的框架,并在键盘消失后重置为完整。

标签: ios objective-c iphone uitableview


【解决方案1】:

使用 (CGRect)convertRect:(CGRect)rect toView:(UIView *)view 获取 tableviews superview 上的单元格位置并相应地处理 tableview 偏移

【讨论】:

    【解决方案2】:

    注册 UIKeyboardWillShowNotification,当该选择器被触发时,调用您的弹出代码:

    [self presentPopoverControllerWithSize:textField.frame.size fromView:_activeText];
    

    这样做的原因是 iOS 自己处理呈现弹出框并处理它的框架。因此,在显示键盘后呈现弹出框通常是一种很好的做法。

    希望这会有所帮助..

    【讨论】:

      【解决方案3】:

      如何为单元格中的每个 UITextfield 添加标签(00 01 02 03、10 11 12 13...等),从十位数可以知道哪个单元格,从个位数可以知道哪个文本字段。

      【讨论】:

      • 我尝试了类似的方法,但问题不是如何接触到文本字段,而是如何偏移表格视图以匹配文本字段
      【解决方案4】:

      这是我的解决方案: 变成 TableViewController.m

      1. 注册键盘通知 (UIKeyboardWillShowNotification, UIKeyboardWillHideNotification)

      2.创建局部变量:

      CGSize _currentPopoverContentSize; //if you want to have custom size for popover
      
      UIView *_currentPopoverSender; //to remember from wich view you will present popover
      
      BOOL _keyboardIsShown; //enable in keyboardWillShow, and disable in keyboardWillHide
      

      3. 在我的 presentPopover 方法中:

      - (void)presentPopoverControllerWithSize:(CGSize)size fromView:(UIView *)sender{
      
      MyController *controller = [[[MyController alloc] init] autorelease];
      
      if (self.popover)
      {
          [_popover release];
          _popover = nil;
      }
      
      _popover = [[UIPopoverController alloc] initWithContentViewController:controller];
      _popover.popoverContentSize = size;
      _popover.delegate = self;
      
      //checking if keyboard is shown - if NO, than present popover, if YES - just `resignFirstResponder` for your _`activeTextField`(you can set it in -textFieldDidBeginEditing: and nullify in -textFieldDidEndEditing:)
      if (!_keyboardIsShown)
      {
          [_popover presentPopoverFromRect:[sender bounds]
                                    inView:sender
                  permittedArrowDirections:UIPopoverArrowDirectionUp
                                  animated:YES];
          _popOver.popoverContentSize = CGSizeMake(320, 700);
      
      }
      else
      {
          [_activeTextField resignFirstResponder];
      }
      
      _currentPopoverContentSize = size;
      _currentPopoverSender = sender;
      }
      

      4. 比:

      - (void)keyboardWillBeHidden:(NSNotification*)aNotification{
      
      [UIView animateWithDuration:0.3
                       animations:^{
                           //do some stuff
                        _popOver.popoverContentSize = CGSizeMake(320, 700);
      
                       } completion:^(BOOL finished) {
      
                           if (_popover && _currentPopoverSender)
                           {
                               [_popover presentPopoverFromRect:[_currentPopoverSender bounds]
                                                         inView:_currentPopoverSender
                                       permittedArrowDirections:UIPopoverArrowDirectionUp
                                                       animated:YES];
                           }
      
                       }];
      
      _keyboardIsShown = NO;
      }
      

      5.

      -(void)textFieldDidBeginEditing:(UITextField *)textField{
      
          [textField resignFirstResponder];
          [self presentPopoverControllerWithSize:textField.frame.size fromView:_activeText];
      
      //     self.vc = [[self storyboard] instantiateViewControllerWithIdentifier:@"ProductSourcePopOver"];
      //
      //    if(_popOver == nil){   //make sure popover isn't displayed more than once in the view
      //        _popOver = [[UIPopoverController alloc]initWithContentViewController:self.vc];
      //    }
      //    _popOver.popoverContentSize = CGSizeMake(320, 700);
      //
      //    [_popOver presentPopoverFromRect:_activeText.frame inView:_activeText permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
      //    _popOver.delegate = self;
      
      }
      

      这可能对你有帮助:)

      【讨论】:

      • 这个已经在我的项目中实现了,仔细阅读问题
      • 嗨@JAHelia,我仔细阅读了这个问题,尝试使用这个解决方案它可以解决你的问题:) 谢谢。
      • 给我一个工作示例项目或反映在附加项目中
      • 下载您的示例项目test57 更改为 TableViewController.m 文件
      【解决方案5】:

      更改整个视图框架的大小。

      例如keyboard height is 100 那么,

      CGRect frame = self.view.frame;
      self.view.frame = CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height - keyboardHeight);
      

      然后再次为相同的indexPath 调用didSelectRowAtIndexPath 方法,因此它将重新加载弹出框。

      这只是一个基本想法,可能需要进行一些修改才能实现准确的行为。

      希望这会对你有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多