我有一个包含许多单元格的UITableViewController
,每个单元格包含四个相互垂直的文本字段,通过点击任何文本字段显示弹出窗口,但是,此弹出窗口包含一个文本字段键盘被触发,很可能弹出窗口将向上移动以防止键盘隐藏其文本字段(这是弹出窗口的默认行为),但在后台(灰色视图),tableViewController
丢失正确的滚动行为,以便在键盘可见时保持弹出文件在轨道上呈现 - textField ..
如果键盘在这种情况下可见,我怎样才能偏移表视图以使弹出文件显示在屏幕上?
我尝试了着名的TPKeyboardAvoiding
库,但它没有解决问题。
P.S。 tableViewController
适用于前3或4次键盘敲击,但在以后的尝试中会丢失精确滚动。
屏幕截图(绿色文字字段是显示弹出窗口的文本字段,但是tableViewController
滚动到红色表示的错误文本字段):
任何帮助都将受到高度赞赏。
修改
这个问题不重复:Making a UITableView scroll when text field is selected
因为我需要滚动到表格视图的文本字段是一个弹出而不是键盘的文本字段,scrollToRowAtIndexPath
在这种情况下不能正常工作,因为每个单元格包含4个文本字段。
答案 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处理自身呈现弹出框并处理它的框架。因此,在显示键盘后显示弹出窗口通常是一种很好的做法。
希望这会有所帮助..