0

UITableViewにセクションがあり、すべてカスタムセクションヘッダービューがあるセットアップがあります。一度に1つのセクションのみが表示可能な行を持つことができます。

他のセル行を表示するエフェクトを作成するには、基本的に次の関数を使用します。

[self.tableView beginUpdates];

if ( sectionHeaderInsert >= 0 && sectionHeaderInsert <= numberOfSectionsInTableView ) {
    [ticketReastepsScreenView.tableView insertRowsAtIndexPaths:indexPathsInsert withRowAnimation:UITableViewRowAnimationFade];
}

[self updateTmpSelectedNumberToCurrent];

if ( sectionHeaderRemove >= 0 && sectionHeaderRemove <= numberOfSectionsInTableView ) {
    [ticketReastepsScreenView.tableView deleteRowsAtIndexPaths:indexPathsRemove withRowAnimation:UITableViewRowAnimationFade];
}

[self.tableView endUpdates];

これで、最終的に新しいセクションが適切に「開き」、古いセクションが適切に「閉じる」ことが起こります。ただし、画面に収まるセクションがさらにある場合、(部分的に)表示されている最後のセクションは適切に再描画されません。完全に白で覆われています。

すべてのセクションに新しい高さが求められ、新しいビューも求められると思います(これは私が配列で示しています)。次に、ビューは[viewsetNeedsDisplay]を求められます。

最後のセクションヘッダーが消えるように少しスクロールしてから元に戻すと、現在開いているセクションを再度変更するまで、再び表示されます。

UPD:このおかしな動作は、insertRowとdeleteRowを一緒に実行した場合にのみ表示されます。また、1つのセクション(deleteRow)を閉じてから、セクションのタッチアクションで新しいセクション(insertRow)を開くと、動作が異なります。

また、2つのアクションの間にendUpdatesとbeginUpdatesを入れてみましたが、良い結果は得られませんでした。

UPD2:最終位置に移行すると(位置は良好です)、最後のセクションヘッダーが正しくペイントされているのがわかりますが、その後消えます(アニメーションなし、その上に単純な真っ白)

4

1 に答える 1

0

実際の問題が何であれ、TableViewの重い部分を書き直し、学んだことは次のとおりだと思います。

UITableViewCellが必要な場合は、UITableViewCellを使用してください。セクションヘッダーにUIViewが必要な場合は、セクションヘッダーにUIViewを使用してください。

そこにあったコードを再利用するために、セクションヘッダーとTableViewCellsを混在させました。カテゴリは特定のクラスを1つしか拡張できないため、特定のコードを再利用するには、委任/プロバイダーメソッド/オブジェクトを使用する必要がありました。より多くのサブクラス化が必要になる場合がありますが、実際にははるかに安全です。

さらに、ある位置への自動スクロールが大幅に改善され、描画アーティファクトがなくなりました。

于 2011-07-29T12:56:48.043 に答える