1. ホーム
  2. cocoa-touch

[解決済み] UIViewを強制的に再描画させる最も堅牢な方法は何ですか?

2022-09-02 09:25:27

質問

UITableViewにアイテムのリストがあります。viewDidLoadメソッドから、私のサブビュー(drawRectがオーバーライドされたUIViewサブクラス)で必要とされるデータのURLRequestを発射しました。データがクラウドから到着すると、私はビュー階層の構築を開始します。問題のサブクラスはデータを渡され、drawRect メソッドにはレンダリングに必要なものがすべて備わっています。

しかし

私は明示的にdrawRectを呼び出さないので - Cocoa-Touchがそれを処理します - 私は本当に、本当にこのUIViewサブクラスがレンダリングしたいことをCocoa-Touchに通知する方法がないのです。いつですか?今ならいい!

私は[myView setNeedsDisplay]を試しました。これは時々ちょっとだけ動作します。非常にスポット的です。

私は何時間も何時間もこれと格闘しています。誰か、UIView の再レンダリングを強制するための強固で保証されたアプローチを提供していただけないでしょうか。

ここに、ビューにデータを供給するコードのスニペットがあります。

// Create the subview
self.chromosomeBlockView = [[[ChromosomeBlockView alloc] initWithFrame:frame] autorelease];

// Set some properties
self.chromosomeBlockView.sequenceString     = self.sequenceString;
self.chromosomeBlockView.nucleotideBases    = self.nucleotideLettersDictionary;

// Insert the view in the view hierarchy
[self.containerView          addSubview:self.chromosomeBlockView];
[self.containerView bringSubviewToFront:self.chromosomeBlockView];

// A vain attempt to convince Cocoa-Touch that this view is worthy of being displayed ;-)
[self.chromosomeBlockView setNeedsDisplay];

乾杯 ダグ

どのように解決するのですか?

を強制する保証された、揺るぎない方法です。 UIView を再レンダリングさせる方法は [myView setNeedsDisplay] . これで問題が発生した場合、おそらくこれらの問題のいずれかに遭遇していることでしょう。

  • 実際にデータを取得する前にそれを呼び出している、あるいはあなたの -drawRect: が何かを過剰にキャッシュしている。

  • あなたは、このメソッドを呼び出した瞬間にビューが描画されることを期待しています。Cocoa の描画システムを使用して、"draw right now this very second" を要求する方法は意図的に存在しないのです。これは、ビューの合成システム全体を混乱させ、パフォーマンスを低下させ、あらゆる種類のアーティファクトを作成する可能性があります。次の描画サイクルで描画する必要があります」と言う方法しかありません。

もし必要なものが「ロジック、描画、その他のロジック」であれば、「その他のロジック」を別のメソッドに置き、それを -performSelector:withObject:afterDelay: これにより、次の描画サイクルの後に "some more logic" が配置されます。参照 この質問 を参照してください。この種のコードの例と、それが必要な場合があります(ただし、コードが複雑になるので、通常は可能であれば他の解決策を探すのが最善です)。

描画がうまくいっていないと思うのであれば、ブレークポイントを -drawRect: にブレークポイントを置いて、いつ呼び出されるかを見てください。もし、あなたが -setNeedsDisplay が、しかし -drawRect: が次のイベントループで呼び出されない場合は、ビュー階層を調べて、どこかで裏をかいていないかどうか確認してください。私の経験では、過剰な賢さは、悪い描画の1番の原因です。システムを騙して自分の望むことをさせる最善の方法を知っていると思うとき、通常はまさに自分の望まないことをさせるのです。