問題タブ [setneedsdisplayinrect]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
95 参照

iphone - 二次ビューをどのように更新しますか?

おそらく、これを設定するためのより良い方法があるので、提案を受け付けています。

しかし、これが私がやっていることです。メインの UIView があります。その上に、UIImageView と別の UIView があります。UIImageView が変更されたら、2 番目の UIView を変更したいと考えています。そのためのクラスがあり、IB オブジェクトのタイプはそのクラスに設定されています。そのクラスの .m には、いくつかの長方形を描画する drawRect メソッドがあります。.m には、合成された NSMutableArray プロパティもあります。メイン ビューのコントローラーでそのクラスのインスタンスを作成しました。

問題: アプリの起動時に drawRect が正常に動作するという事実にもかかわらず (デバッガーでトレースされているように)、UIImageView が変更されたときに、@synthesize の配列を更新した後、2 番目のビューのインスタンス変数で「setNeedsDisplay」を呼び出しますが、 drawRect は呼び出されません。

インスタンスと関係があると思います。ここではスレッド化が問題になるとは思いません。表示されている画像に基づいて、画面の別の領域に描画したいだけです。

0 投票する
1 に答える
283 参照

iphone - テーブルセルの contentview で drawAtPoint が重複した画像を作成するのはなぜですか?

カスタムスライダーのあるビューがあります。UITableViewCell のインスタンスを生成する TableViewController のサブクラスを使用しています。各 tableViewCell 内に、カスタム スライダー (UI ビュー) をサブビューとして追加します。ここには、スライダーのコントロール ノブとして機能するビューがあります。これは、ジェスチャー認識機能を備えた UIView の単なるサブクラスです。コントロール ノブ クラスの drawRect メソッドは、UIImage を受け取り、drawAtPoint を実行します。これはうまくいきます!要約すると、次のようになります。

UITableView -> UITableViewCell -> UITableViewCell.contentView -> SliderView -> SliderKnob -> UIImage

この問題は、テーブル ビューからテーブル セルをスクロールするときに発生します。ノブの UIImage は保持されます。セルがキューから取り出されるたびに、残りの画像の複製を取得することになります。いくつかの NSLog ステートメントをセットアップし、各サブビューで drawRect が呼び出されることを確認しました。セルのレンダリングを更新するために必要なことはありますか? UITableViewCell のサブビューで setNeedsDisplay を使用しようとしましたが、UIImage の複製を防ぐことができませんでした。

0 投票する
1 に答える
1387 参照

iphone - performSelectorOnMainThreadを使用してsetNeedsDisplayInRectを呼び出す方法は?

performSelectorOnMainThreadを使用してsetNeedsDisplayInRectを呼び出す方法は? 問題はレクトです。performSelectorOnMainThread メソッドで rect を渡す方法がわかりません。このメソッドは NSObject を要求しますが、CGRect は NSObject ではなく、単なる構造体 *.

Main Thread ではなく、Main Thread で setNeedsDisplayInRect メソッドを呼び出す必要があります。誰もそれを行う方法を知っていますか?????????? 前もって感謝します..

本当にありがとう。

0 投票する
1 に答える
355 参照

objective-c - NSOutlineViewsetNeedsDisplayInRect呼び出しは失敗します

カスタムNSCellサブクラスを使用してNSProgressIndicatorを描画するNSOutlineViewがあります。各NSCellには、次のようrefreshingにNSOutlineViewデリゲートメソッドによって設定されるプロパティがあります。willDisplayCell:forItem:

各アイテムインスタンスには、その特定のアイテムが更新されているかどうかに応じて開始および停止されるNSProgressIndicatorが含まれています。

drawInteriorWithFrame:inView:NSProgressIndicatorインスタンスの項目は、次のように、NSCellのクラス内で停止および開始されます。

私が抱えている問題は、NSProgressIndicatorsは正しく停止するように指示されていますが、stopProgressIndicatorの呼び出しは効果がないということです。問題のNSOutlineView行の更新をトリガーできないコードは次のとおりです。rectOfRowの呼び出しによって返されたNSRectを手動でチェックし、値が正しいことを確認できます。

NSOutlineViewがすべてのアイテムの更新を終了すると、reloadData:呼び出しがトリガーされます。これは、問題のすべてのセルを確実に更新し、最終的にNSProgressIndicatorsを削除するように見える唯一のものです。

私はここで何が間違っているのですか?

0 投票する
2 に答える
2275 参照

ios - drawLayer:inContext 中に呼び出される setNeedsDisplayInRect:

アプリで CATiledLayer を使用しているため、そのレイヤーの描画はバックグラウンド スレッドで行われます。つまり、デリゲートの drawLayer:inContext: メソッドはバックグラウンド スレッドから呼び出されます。CATiledLayer の一部を無効にするために使用される setNeedsDisplayInRect は、常にメイン スレッドから呼び出されます。

これらは独立したスレッドであるため、バックグラウンド スレッドが drawLayer:inContext メソッドにある間に setNeedsDisplayInRect が呼び出されることがあります。その状況では setNeedsDisplayInRect が無視されることに気付きました (drawLayer:inContext は再度呼び出されません)。

それは正しくないと思うので、Apple にバグを記録しました。しかし、私はこの状況を回避する方法を理解するのに苦労しています。良いアイデアはありますか?

編集:

次のコードを使用して、Stanislaw の回答をテストしました。

与えられたように、コードによって描画が無期限に繰り返されますが、setNeedsDisplayInRect: と対応する drawLayer:inContext: の間に最大 5 秒の遅延が発生し、他に何も起こっていない場合があります。例として以下のログを参照してください。不規則な動作に注意してください。最初の 1 秒間に、複数回再描画されるタイルもあれば、1 回だけ再描画されるタイルもあります。その後、5 秒間の一時停止があり、サイクルが最初からやり直されます。

これは、IOS6.0 のシミュレーターでテストされました (以前のバージョンには 6.0 で修正された別のバグがあるため、このバージョンを選択しました。同じタイルが 2 回描画されることがあります)。

0 投票する
1 に答える
487 参照

ios - アニメーションの setNeedsDisplayInRect: メソッドの正しい使い方

独自のビュー クラスと XIB インターフェイスを使用するビュー コントローラーがあるため、ビューはコーダーから初期化されます。そのView Controllerでは、スライダーを動かすと四角形が再描画され、初期状態では四角形がフルスクリーンになり、スライダーを左に動かすと四角形のサイズが比例して小さくなります(フルスクリーンから4ピクセルで連続的に10x14まで)間隔)。「スライダーは値を変更しました」は、新しい長方形のサイズを設定するメソッドを呼び出し、「setNeedsDisplay」メソッドを送信します。また、「setNeedsDisplayInRect:」メソッドに変更すると、画面上で必要なものがすべて更新されるわけではなく、いくつかのアーティファクトがあります。しかし、デバッグすると、私が望むようにすべて更新されます。次のように、異なる長方形を更新するために送信しようとしました:

他のいくつか、同じ話。私の質問は、「setNeedsDisplayInRect:」で送信する必要がある四角形はどれですか?

2 番目の質問は、アニメーションをよりスムーズにし、コストを削減するために、ストーリー全体を高速化/最適化するにはどうすればよいでしょうか?

0 投票する
1 に答える
861 参照

objective-c - IOS 5 SetNeedsDisplayInRect により、FullScreen-Invalidity が発生する

初めて SetNeedsDisplayInRect を呼び出したときに IOS5 で気付きました。これにより、デバイスが全画面表示を更新します。これは以前の IOS バージョンとは異なります。

私が取り組んでいるアプリには、描画する必要があるオブジェクトの配列があります (ほとんどの場合、線のサイズが異なる四角形)。いくつかの四角形だけを再描画したい場合は、オブジェクトを "Update"-Array に追加し、SetNeedsDisplayInRect を呼び出して四角形の領域を無効にします。

drawRect-Method 内で、オブジェクトの完全な配列を描画するか、「Update-Array」のみを描画するかを次のように決定します。

IOS5でテストするまで、これは完全に機能しました。実際にはまだ機能しますが、SetNeedsDisplayInRect を呼び出すのは初めてではありません:--> CGRectEqualToRect は常に yes を返します。

何故ですか??私は何を間違っていますか?

どんな提案でも大歓迎です!! ありがとう

トム

0 投票する
1 に答える
731 参照

ios5 - iOS5 の setNeedsDisplayInRect バグ?

setNeedsDisplayInRect:いくつかの描画コードを最適化するために iOS5 で使用しようとしています。セットアップは簡単です。ボタンとして機能する CGRect 'ホットスポット' の配列があります。タッチが検出されると、それが発生した CGRect を見つけ、setNeedsDisplayInRect:その rect をパラメーターとしてビューを呼び出します。すべての CGRects はビューに対して有効です。それらを使用して最初の描画を行い、正しく表示されます。

私が見ているのは (以下のコンソール ダンプが示すように) への最初の呼び出しsetNeedsDisplayInRect:が、指定した rect ではなく、ビュー フレームを rect として渡すことです。後続の呼び出しは正しいです。

誰かがこれをバグとして確認したり、ここで何か間違ったことをしていることを確認したりできますか? すべてのコードは以下です。 - ありがとう!

0 投票する
2 に答える
348 参照

cocoa-touch - Cocoa - iOS - UILabel のテキスト プロパティを更新するには、setNeedsDisplay が必要ですか?

私は初心者で、UILabel フィールドのテキスト プロパティを設定する iOS プロジェクトを持っています。

質問

  • 新しいテキスト値を表示するには、ラベルの setNeedsDisplayInRect を呼び出す必要がありますか?

いくつかのテストに基づく私の理解:

  • setNeedsDisplayInRect を呼び出さずに、ラベルのテキストが更新されました。
  • しかし、それが偶然だったのか、明示的にsetNeedsDisplayを呼び出さずにラベルが新しい値を表示することが保証されているのかを知りたい

ありがとう

0 投票する
2 に答える
399 参照

ios - 複雑な CGRect を作成する

メソッドに 10 ピクセルの境界線が描画されたビューがあります。境界線の色を更新する必要があり、それを使用[self setNeedsDisplay]してビューを再描画します。使用したい境界線のみを更新する必要があるため、[self setNeedsDisplayInRect:rect]境界線のみを描画します。

ビューの他の領域なしで境界線のみの四角形を取得するにはどうすればよいですか?

ありがとうシャニ