0

UIKit を使用してクロスプラットフォーム UI ライブラリの iOS 実装を構築しています。ライブラリの主な機能の 1 つは、ユーザーが子コントロールのサイズを自由に変更できるようにすることであり、親コントロールのサイズは自動的に適応します。

子のサイズが変更されるたびに親のサイズを更新するのは非効率的で不必要であるため、実際のデバイスの描画/レンダリングが発生する前に、すべての「ダーティ」コントロールの位置、サイズ、および多くのことを更新するように UI システムを設計しました。iOS では、CADisplayLink を使用して更新メソッドを呼び出すと、すべてが画面に表示された後にイベントが呼び出され、次の問題が発生することがわかりました。

  1. 最初に「クラッシュした」レイアウトが表示されます。(レンダリングが最初に行われます)
  2. しばらくすると (CADisplayLink のイベントがトリガーされます)、すべてが正常に戻ります。

最初は自分のCADisplayLinkの使い方が間違っていると思っていたのですが、解決策がどこにも見つからず、今かなり絶望しています(首を吊るすつもりです!!)。

または、CADisplayLink をまったく使用しない方がよいのでしょうか。

私を助けてください!


PS。私はクロスプラットフォームのものを構築しているので、実際には MonoTouch を使用していますが、基本的なコンセプトは同じだと思います。

PS2。また、C# である MonoTouch を使用しているため、上記の説明は Objective-C の世界には当てはまらない可能性があります (「イベント」という言葉のように、関連する Obj-C はセレクターか何かだと思います ^_^)

PS3。また、私の英語が下手であることをご容赦ください。私の説明が十分に明確でない場合は、お気軽に質問してください。

コードはこちら:

CADisplayLink _displayLink = CADisplayLink.Create(Update);  //Update is my refresh method
_displayLink.AddToRunLoop(NSRunLoop.Current, NSRunLoop.NSDefaultRunLoopMode);

わかりやすいはずです^_^

4

1 に答える 1

0

私が収集できるすべての情報から、基本的にそれを行う方法はないということです。そこで、レイアウトコードを変更しました。これにより、値が設定された直後にプロパティが適用されます。いくつかの最適化はまだ必要ですが、CADisplayLinkに依存する必要はありません。

とにかくありがとう!

于 2013-01-29T06:49:26.873 に答える