更新:向下滚动以获取更新。
我有一个UITableView,其中的单元格包含很少的UITextView。当用户开始编辑文本和键盘时,我调整TableView的框架大小,并使用UITableView方法scrollToRowAtIndexPath :::滚动编辑单元格。所有这一切都很完美,直到用户真正开始输入问题是,每次敲击键盘的键时,UITableView的contentOffset属性的y值都会自行改变。
我尝试记录每个键击
NSLog(@"%1.2f, %1.2f, %1.2f, %1.2f",
self.table.contentSize.width,
self.table.contentSize.height,
self.table.contentOffset.x,
self.table.contentOffset.y);
这是结果
2011-03-17 00:13:05.380 ...[6243:207] 320.00, 355.00, 0.00, 8.00
2011-03-17 00:13:06.138 ...[6243:207] 320.00, 355.00, 0.00, 13.00
2011-03-17 00:13:06.848 ...[6243:207] 320.00, 355.00, 0.00, 8.00
2011-03-17 00:13:07.578 ...[6243:207] 320.00, 355.00, 0.00, 13.00
2011-03-17 00:13:08.377 ...[6243:207] 320.00, 355.00, 0.00, 8.00
正如您所看到的,contentOffset.y一直在不断变化,这使得TableView在每次击键时都会上下跳动。我的代码中没有更改TableView的contentOffset值的地方,或者至少没有明确地更改。任何人都知道会发生什么?
这是我在显示/隐藏键盘时用来调整TableView大小的代码
- (void)keyboardDidShow:(NSNotification *)notification
{
if (keyboardAlreadyShow) // in case user jump from one TextView to another
return;
NSDictionary *userInfo = [notification userInfo];
NSValue* aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardRect = [aValue CGRectValue];
keyboardRect = [self.view convertRect:keyboardRect fromView:nil];
CGFloat keyboardTop = keyboardRect.origin.y;
CGRect newFrame = self.view.bounds;
newFrame.origin.x = self.table.frame.origin.x;
newFrame.size.width = self.table.frame.size.width;
newFrame.size.height = keyboardTop;
NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
NSTimeInterval animationDuration;
[animationDurationValue getValue:&animationDuration];
[UIView animateWithDuration:animationDuration
animations:^{
self.table.frame = newFrame;
}];
NSIndexPath *index = [table indexPathForCell:editingCell];
[self.table scrollToRowAtIndexPath:index atScrollPosition:UITableViewScrollPositionNone animated:YES];
keyboardAlreadyShow = YES;
}
- (void)keyboardWillHide:(NSNotification *)notification
{
CGRect newFrame;
newFrame.origin.y = self.table.frame.origin.y;
newFrame.origin.x = self.table.frame.origin.x;
newFrame.size.width = self.table.frame.size.width;
newFrame.size.height = 430;
NSDictionary* userInfo = [notification userInfo];
NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
NSTimeInterval animationDuration;
[animationDurationValue getValue:&animationDuration];
[UIView animateWithDuration:animationDuration
animations:^{
self.table.frame = newFrame;
}];
[self.table scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionNone animated:YES];
}
- (void)keyboardDidHide:(NSNotification *)notification
{
keyboardAlreadyShow = NO;
}
任何帮助都会非常感激。谢谢。
更新:现在我想我可以将问题缩小到这个特定的行
txtLatInteger.text = [NSString stringWithFormat:@"...
哪个txtLatInteger是一个UITextView驻留在TableViewCell中,并且每次另一个TableViewCell中的另一个TextView发生更改时都会更新。因此,如果我注释掉这一行,TableView将不会移动。知道发生了什么吗?
UPDATED2 :好像把UITextView放到UITableViewCell会导致这个弹跳问题。将输入字段更改为UITextField解决此问题(有点)。但是我必须从UITextView中牺牲一些我需要的特定行为。 :(
答案 0 :(得分:0)
当我的键盘出现与你的代码非常相似时,我正在处理一个弹跳问题。当我的键盘出现时,我以与代码类似的方式为我的UITableView的大小调整设置动画。我将您的代码移植到我的keyBoardDidShow通知中,我获得了与之前几乎相同的功能。
我没有看到你在输入问题时弹跳,所以我理论上你的问题不在于你的keyboardDidShow或keyboardDidHide通知。你有一个名为Cinch的程序吗?我已经看到它导致UITableViews在模拟器中表现得很奇怪。
答案 1 :(得分:0)
似乎把UITextView放到UITableViewCell会导致这个弹跳问题。将输入字段更改为UITextField解决此问题(有点)。但是我必须从UITextView中牺牲一些我需要的特定行为。 :(
答案 2 :(得分:-1)
我遇到了类似的问题。它是UITableview
中的UIViewController
。我将contentInset (UITableView)
设置为(64,0,0,0)
。
当用户键入行尾时,contentOffset
的{{1}}将更改为(0,-128)。如果我将UITableView
设置为contentInset
,那么它可以正常工作。
我在(0,0,0,0)
放了一个断点,想跟踪线程堆栈。但似乎系统改变了偏移量。
PS:setContentOffset
' s UITextView
应为NO。