当弹出窗口内的文本字段触发键盘时,将表格视图滚动到弹出过度呈现文本字段

时间:2014-12-29 14:26:36

标签: ios objective-c iphone uitableview

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

示例项目can be downloaded here

如果键盘在这种情况下可见,我怎样才能偏移表视图以使弹出文件显示在屏幕上?

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

P.S。 tableViewController适用于前3或4次键盘敲击,但在以后的尝试中会丢失精确滚动。

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

任何帮助都将受到高度赞赏。

修改 这个问题不重复:Making a UITableView scroll when text field is selected 因为我需要滚动到表格视图的文本字段是一个弹出而不是键盘的文本字段,scrollToRowAtIndexPath在这种情况下不能正常工作,因为每个单元格包含4个文本字段。

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

这是我的解决方案: 变成 的 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。在我目前的过程方法中:

- (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;

}

这可能对你有帮助:)

答案 2 :(得分:0)

更改整个视图框尺寸。

例如,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);

然后再次为同一didSelectRowAtIndexPath调用indexPath方法,以便重新加载弹出框。

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

希望这会对你有所帮助。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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

希望这会有所帮助..