6

アニメーションを使用してテーブルビューの高さのサイズを変更しようとしていますが、テーブルビューのframe.size.heightをアニメーション化することで正常に機能します。

問題は、高さが200ピクセルで下にスクロールされたテーブルビューがあり、これを100ピクセルにアニメーション化したいのですが、単純な

[UIView animateWithDuration:0.245f animations:^{
 CGRect frame = tableview.frame;
 frame.size.height = 100.f;
 tableview.frame = frame;
}];

これは正常に機能しますが、サイズを変更すると、テーブルビューの一番下までスクロールされなくなります。アニメーションを作成している間、テーブルビューを常に一番下にスクロールさせたいです。私は電話のようなさまざまなことをたくさん試しました

[tablview scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

サイズ変更アニメーションを開始する直前/直後ですが、100%同期させることができませんでした。テーブルビューの下部にスクロールビューの最後の要素が表示されているときに、テーブルビューのサイズを変更する方法はありますか。

4

4 に答える 4

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;
}

これにより、テーブルビューがマイナスのorigin.yになり、クリップサブビュー=YESの「親」uiview内にテーブルビューがラップされます。

次に、ターゲット値に「リセット」する「完成した」アニメーションブロックがあります。

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);
}
于 2012-04-27T07:26:18.037 に答える
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];
 } ];
于 2012-04-25T20:17:13.443 に答える
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);

}];
于 2012-04-25T19:58:58.403 に答える
0

テーブルビューをアニメーションブロックの一番下までスクロールすると、少しひねりを加えて機能しました。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)
    }
}
于 2017-11-06T09:48:59.087 に答える