我知道如何使用此处显示的方法为UITableViewCell的高度变化设置动画:Can you animate a height change on a UITableViewCell when selected?
但是,使用该方法,UITableView将同时滚动,我不希望它这样做。
我有一个UITableView,只有很少的细胞;它占用的屏幕高度低于屏幕高度。底部单元格有一个UITextField,当它开始编辑时,我手动设置UITableView的内容偏移量,以便具有UITextField的单元格滚动到顶部。然后,基于UITextField中的输入,我可能想要增加UITableViewCell的大小以显示额外的选项,或多或少。
问题在于,在动画化此更改时,它将重新定位UITableView,以便我的UITextField不再位于顶部。
这就是我正在做的,或多或少:
self.customAmountCellSize = height;
[self.tableView beginUpdates];
[self.tableView endUpdates];
我也试过
self.customAmountCellSize = height;
CGPoint originalOffset = self.tableView.contentOffset;
[self.tableView beginUpdates];
[self.tableView endUpdates];
[self.tableView setContentOffset:originalOffset animated:NO];
我想要行高动画,我不希望UITableView作为结果滚动。
有什么想法吗?
答案 0 :(得分:3)
您遇到的问题似乎是您的表格视图滚动到底部,所以当您更新其内容时,它会尝试修复它。
您可以采取两种方法来阻止滚动:
将表格视图的内容插入设置为初始空白的高度:
self.tableView.contentInset = UIEdgeInsetsMake(0, 0, verticalGap, 0);
添加一个空页脚视图,其高度与垂直间隙相同:
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, verticalGap)];
在这两种情况下,您都需要计算您想要达到的垂直空间。然后,您需要在完成后将contentInset
或tableFooterView
恢复为原始状态。
答案 1 :(得分:1)
我认为表格视图是滚动的,因为您的文本字段正在成为第一个响应者,而不是因为单元格高度的变化。尝试保持单元格高度相同,只需调整偏移量即可。
如果我是正确的,那么解决方案就是:当键盘出现时,UITableView会自动尝试滚动。要解决此问题,请将内容偏移量设置为主队列的调度中所需的偏移量,该队列将在下一个runloop的开头触发。将以下代码放在对UIKeyboardWillShowNotification或UITextFieldDelegate shouldBeginEditing方法的响应中:
// Get the current offset prior to the keyboard animation
CGPoint currentOffset = self.tableView.contentOffset;
UIEdgeInsets currentInsets = self.tableView.contentInset;
__weak SomeTableViewControllerClass *weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[UIView animationWithDuration:0 animations:{
// set the content offset back to what it was
weakSelf.tableView.contentOffset = currentOffset;
weakSelf.tableView.contentInset = currentInsets;
} completion:nil];
});
表视图的contentInset.bottom有时需要类似的修复,具体取决于UITableView的框架和其他因素。