我试图用动画调整tableview的高度,通过动画tableview的frame.size.height来正常工作。
问题是,我有一个200px高度的桌面视图并滚动到底部,我想将其设置为100px的动画,我运行一个简单的
[UIView animateWithDuration:0.245f animations:^{
CGRect frame = tableview.frame;
frame.size.height = 100.f;
tableview.frame = frame;
}];
这个工作正常,但在我调整大小后,它不再滚动到tableview的底部。我希望tableview在动画时始终在底部滚动。我尝试了许多不同的东西,比如打电话
[tablview scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
在我开始调整大小动画之前/之后,但我还没有设法让它们100%同步。有没有办法调整tableview的大小,同时tableview的底部显示scrollview的最后一个元素。
答案 0 :(得分:2)
我为我的问题找到了一个解决方案,很可能是一个更好的解决方案,但这实际上效果很好:)
在我开始制作动画之前,我看看contentSize.height是否大于目标高度,如果是,我会这样做:
if (mMessages.contentSize.height > 150.f)
{
CGFloat expandedOffsetY = 52.f;
CGFloat collapsedBottomOffset = (150.f + 18.f);
CGFloat expandedBottomOffset = (MIN(320.f, mMessages.contentSize.height) + expandedOffsetY);
tableFrame.origin.y = (collapsedBottomOffset - expandedBottomOffset) + expandedOffsetY;
}
else
{
tableFrame.origin.y = 18.f;
tableFrame.size.height = 150.f;
}
这会将tableview放在minus origin.y中,然后我将tableview包含在一个“parent”uiview中,其中clip子视图= YES。
然后我有一个“完成”的动画块,它“重置”到目标值。
CGRect tableFrame = mMessages.frame;
tableFrame.origin.y = 18.f;
tableFrame.size.height = 150.f;
mMessages.frame = tableFrame;
if (mMessages.contentSize.height > tableFrame.size.height)
{
float contentOffsetY = mMessages.contentSize.height - tableFrame.size.height;
mMessages.contentOffset = CGPointMake(0.0f, contentOffsetY);
}
答案 1 :(得分:0)
在为框架设置动画时尝试更新表格视图的contentOffset。
[UIView animateWithDuration:0.245f animations:^{
CGRect frame = tableview.frame;
frame.size.height = 100.f;
tableview.frame = frame;
float contentOffsetY = tableview.contentSize - tableview.frame.size.height;
tableview.contentOffset = CGPointMake(0, contentOffsetY);
}];
答案 2 :(得分:0)
[UIView animateWithDuration:0.245f animations:^{
CGRect frame = tableview.frame;
frame.size.height = 100.f;
tableview.frame = frame;
} completion:^(BOOL finished) {
// Find your last indexpath
[tablview scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
} ];
答案 3 :(得分:0)
将tableview滚动到动画块的底部对我有用,只有一点点扭曲:当我减少tableView的高度时我调用了scrollToIndexPath而没有动画,当我展开tableView时,我调用了带动画的scrollToIndexPath。
UIView.animate(withDuration: 0.25) { [weak self] in
guard let strongSelf = self
else { return }
// ...
// updateConstraints
// ...
strongSelf.view.layoutIfNeeded()
if reduceSize {
tableView.scrollToLastRow(animated: false)
} else {
tableView.scrollToLastRow(animated: true)
}
}
UITableView的扩展
extension UITableView {
func scrollToLastRow(animated: Bool) {
let lastSection = numberOfSections-1
let lastRow = numberOfRows(inSection: lastSection)-1
let lastIndexPath = IndexPath(row: lastRow, section: lastSection)
scrollToRow(at: lastIndexPath, at: .bottom, animated: animated)
}
}