调整UITableView高度,并保持在底部滚动

时间:2012-04-25 19:17:57

标签: ios

我试图用动画调整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的最后一个元素。

4 个答案:

答案 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)
    }
}