問題タブ [nsview]

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 投票する
2 に答える
19162 参照

cocoa - NSView の自動サイズ変更動作

NSView がビューの自動サイズ変更を行う方法を理解する必要があります。IB ですべてを設定すると、サブビューのサイズが適切に変更されます (マウスでウィンドウのサイズを変更すると)。ただし、[myMainView setFrame:]新しいフレーム四角形を使用しても何も起こりません。サブビューはすべて元のサイズのままです (メイン ビューのサイズが正しい場合でも)。Child'sresizeWithOldSuperviewSize:が呼び出されますが、まだ適切なサイズではありません。

画面(画面#1)、ラベル、画像、ビデオにココア要素がいっぱいあります。これらの要素には明確に定義されたレイアウトがあります。非常にうまく機能するInterface Builderを介して自動サイズ変更動作をセットアップしました。メイン ウィンドウのサイズを変更すると、満足のいく方法で要素のサイズが変更されます。

ここで、ユーザーが「次へ」ボタンをクリックすると、2 番目の画面いっぱいの要素 (画面 #2) が描画されます。私のレイアウトは、正規の画面サイズ (800x600 など) に基づいて構築されています。しかし、画面 #1 でサイズが変更されたため、ウィンドウは大きく (または小さく) なっています。そのため、要素は、使用可能なスペースを埋めるために適切にサイズ調整されるのではなく、ウィンドウ内の小さな領域しか占めていません。これらの要素をスケーリングしたい。

自動サイズ変更の仕組みを誤解していますか? NSView の下にある自動サイズ変更機構を手動でトリガーするにはどうすればよいですか?

私ができることは2つあります。

  1. 元のサイズに対する現在の画面サイズに基づいて、要素のサイズを手動で変更します。このオプションは私のお気に入りではありません。なぜなら、NSView で既に動作しているコードを書き直す必要があるように見えるからです (自動サイズ変更の動作
  2. 私の 2 番目のオプションは、前述の NSView の自動サイズ変更マジックを呼び出すことです。ドキュメンテーションは、[NSView setFrame:] が私のためにそれを行うことを意味します。私が試したのは、コンテンツ ビューのサイズを元の画面サイズ (800x600) に変更し、要素をレンダリングしてから、現在のウィンドウ サイズにサイズ変更することでした。概念的には、手動でウィンドウのサイズを変更するのと同じではありませんか? そうではないようです。繰り返しますが、このオプションは、記述して維持する必要のあるコードの量を最小限に抑えるため、推奨されます。
0 投票する
3 に答える
304 参照

objective-c - mouseDown を開始した NSView インスタンスの特定:

NSView のサブクラスである myGameTile の 25 タイルのゲームボードがあります。mouseDown: クリックしたタイルを特定し、ivar を代表的な値に設定したいと考えています。

たとえば、タイル 12 をクリックした場合、clickedTile を「12」またはその特定のインスタンスを一意に表す値に設定します。

私は整数値 12 からある種の内省/反省まで何でも開いていますが、ハック、ランタイム ラッパー、および変更よりも組み込みの機能とエレガンスが望ましいです。それでも、それらの解決策に頼らざるを得ないことも承知していますので、そちらも併せて回答お願いします。すべてのオプションを知りたいです。ありがとう!

0 投票する
3 に答える
3936 参照

objective-c - Cocoa アプリケーションが終了したときに、NSView のサブビューに解放メッセージが送信されないのはなぜですか?

短いバージョン:

  1. releaseCocoa アプリケーションの終了時 に NSView オブジェクトのサブビューにメッセージが送信されないのはなぜですか?
  2. この動作をオーバーライドする方法はありますか?

例:
以下MyViewに示すクラスNSViewは、作成および破棄されたときにコンソールに報告するサブクラスにすぎません。私はそれをテストし、それが適切に機能することを発見しました。ただし、アプリケーション デリゲートの次のコード スニペットに示すように使用すると、予期しない結果が表示されます (サンプル出力を参照)。

このアプリケーションは、次の出力を生成します。

開始
init <MyView: 0x10013f840 >
init <MyView: 0x10261b620 >
run
quit
dealloc <MyView: 0x10013f840 >
end.

問題:
アプリケーションの終了時に最初のビュー オブジェクトが解放されていることがはっきりとわかります。また、NSViewオブジェクト自体が解放されると、オブジェクトがサブビューを自動的に解放する (テストおよび検証済み) ことを確信しています。ただし、アプリケーションの終了時に、これらのサブビューが解放されていないようです。

長いバージョン: (別名、なぜ一体誰が気にするのでしょうか? :)
まず、実行中のアプリケーションが終了したときにメモリが解放される方法に精通していると言っておきましょう。メッセージが送信されなくても、サブビューが適切に破棄されることはわかっているreleaseので、これがリークであるとは心配していません。実際、私の質問 #1 に対する答えは、「アプリケーションが終了しようとしているときにサブビューを解放する必要がないため」であると確信しています (ただし 100% 確実ではありません)。

アプリケーションがデバッグ モードで実行されている間、単純な手巻きのコードを使用してメモリ トラッキングを行います。すべてのカスタム クラスの and メソッドで and メソッドを呼び出し、この関数を使用してTrace_Init()、アプリケーションTrace_Dealloc()のCocoa部分が終了した後に未リリースのオブジェクトを報告します。これは、Apple のメモリ リーク パフォーマンス ツールを定期的に実行するよりもはるかに簡単だと思います。実行中にメモリ リークが発生した場合は、アプリケーションが終了するとすぐにわかります。initdeallocatexit()

ただし、dealloc終了時に呼び出しがないということはNSView、サブビューとして使用されているカスタム サブクラスのいずれかが、アプリケーションを終了したときにメモリ リークとして表示されることを意味します。したがって、私の質問#2の理由。終了時に Cocoa がすべてを解放して、メモリ追跡が適切に終了できるようにしたいと考えています。当然、デバッグ モードでのデフォルトの動作のみをオーバーライドします。私のリリースしたアプリでは、メモリ追跡コードが有効になっておらず、通常どおり効率的に終了できるはずです。

それでおしまい!(ふぅ) ここまで読んでくれてありがとう。

0 投票する
3 に答える
619 参照

objective-c - Cocoaでウィンドウの一部を動的にロードする

ユーザーが選択した条件に応じて、さまざまな時点でNSTable、IKImageBrowserViewなどの無関係な「ビュー」を動的に入力したいウィンドウの領域(MainMenu.xib内)があります。

  • ウィンドウのこの領域を定義して、さまざまなビューで「置き換える」ことができるようにするにはどうすればよいですか?
  • ウィンドウのこの領域にテーブルまたはその他のビューをアタッチするにはどうすればよいですか?

(そこに汎用NSViewを配置し、毎回サブビューを追加するだけで十分ですか?私はCocoaにかなり慣れていないので、どのポインターでも歓迎します)

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

cocoa - drawRect の外で NSView の CGContextRef を取得しますか?

NSView オブジェクトの CGContextRef を取得する必要があります。方法がわかれば、それほど悪くはありません。

Carbon では、このことは次のように行われました。

明らかに、NSView をサブクラス化 (またはそのサブクラス) し、drawRect でキャッチすることで実行できますが、それはあまりにも醜いです。

あなたのアイデアは?

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

cocoa - Cocoa で、円形ビューにカーソルを合わせたときにカーソルを変更する最良の方法は何ですか?

私がしたいこと

円形のカスタム NSView サブクラスがあり、マウスがビューの円形部分の上にあるときのカーソルの外観を変更したいのですが、ビューの四角形の円の外側にある部分の上ではカーソルの外観を変更したくありません。

これがイラストです。画像タグでインライン化したかったのですが、私はあまりにも新しいので、そのような素晴らしい機能に参加することはできません.

私がこれまでに知っていること

NSCursor を使用してカーソルの外観を変更する方法を知っています。長方形のビューでこれを達成する最良の方法は、カーソル長方形を使用することだと思います。私は、mouseMoved イベントを受け取ることができることを知っています (そして、マウスがこのビュー上にないときは、mouseEntered と mouseExited を使用してそれらをオフにする必要があります)。

では、何が問題なのですか?

私が知る限り、システムは最初の応答者ではないビューに mouseMoved イベントを送信しません。したがって、マウスがビューの上にあるときに mouseMoved イベントを取得したい場合は、現在持っている人から firstResponder ステータスを盗む必要があります。テキスト ビューにフォーカスがある場合、そのようなビューの上にマウスを移動するだけでそれが奪われてしまいます。これは、ユーザビリティの観点からは受け入れられません。

したがって、私の質問は次のようになります。これを行うためのより良い方法はありますか? ファーストレスポンダにならずに mouseMoved イベントを取得できますか?

ありがとう!

次のタグを追加します: custom-views mouse-events NSCursor firstResponder しかし、繰り返しますが、私は SA 初心者なので、できません。

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

objective-c - Mac の左上隅に画像を描画する正しい方法は何ですか?

ScrollView に NSView があり、その中に画像を描画しようとしています。問題は、ビューが私に望んでいることである、左下隅ではなく、画像の左上隅をフレームの左上隅にロックすることです。ズームイン、ズームアウト、回転できる必要があります。

現在、画像のサイズとウィンドウのサイズに基づいて、画像をどれだけ変換する必要があるかを計算するシステムの塊があります。これを行うには、装飾を含まないウィンドウのサイズを取得できるように、スクロールビューの外側に追加のビューを作成する必要がありました。次に、画像のサイズとウィンドウのサイズに基づいてビューのサイズを計算し、それに基づいて、画像を変換する場所を見つけます。

私の他の唯一の考えは、isFlipped: メソッドを使用することでしたが、それは私のイメージ LR を逆にしてしまい、これは悪いことです。

これを行うべき別の方法はありますか?

0 投票する
3 に答える
1153 参照

objective-c - プレーヤーで NSView 境界を移動するより良い方法は?

現在、Objective-C/Cocoa について詳しく学ぶためにローグライクを作成しています。今のところとても楽しんでおり、たくさんのことを学びました。

このコードはorigin、ビューのboundsを移動して、プレイヤーの動きに追従します。コードは完璧に機能します。4 つを使用するよりも良い方法があるかどうかを尋ねただけforです。

また、特に描画と関係がある場合、すべてを 1 つにまとめるよりも個別に行う方がよい場合もいくつか見てきましたが、それnsbezierpathはなぜですか?

編集: 人々は私が何をしているのかを正確に把握するのに苦労していたので、できる限り詳しく説明します.

view30x30 グリッド (0-29,0-29) のタイルで、それぞれ 20x20 です。マップは、必要に応じて大きくすることも小さくすることもできます。

まず、 の とともに を取得[player_ location]します。で割ったのは、タイルのサイズがであるからです。実際にはです。これを行う唯一の理由は、操作を簡単にするためです (20 単位ではなく 1 単位で数える方が簡単です)。4 人が通過し、が の中央 ( ) のタイル内にあることを確認します。プレーヤーが画面の端の 1 つに向かって移動していて、現在のマップの高さ/幅よりも小さい場合、プレーヤーがマップの中央に表示されるように移動します。originboundsview2020,(1,2)(20,40)for[player_ location]15bounds + 15viewbounds.x/y + 30origin

コードは完璧に動作し、が発生setboundsした後に に移動しましたがfor、1 つだけです。に残されているわけではありませdrawRectん。何をする必要があるかを理解しようとするためにここに持っていました。現在は独自の場所にあり、プレイヤーが実際に移動したときにのみ呼び出されます。

新しいコードは次のとおりです。

動作中の写真がこちら!

図 1: これは 1,1 のプレーヤーです。特にない。 http://sneakyness.com/stackoverflow/SRLbounds1.png

図 2: 3 つの金の部分は、ビューの境界より前にプレーヤーが移動できる距離を表します。原点は、プレーヤーの中心に留まるように移動します。無関係ではありますが、プレイヤーは実際に金を見ることができないことに注意してください。プログラミングの視野は多くの議論の場であり、使用できるアルゴリズムはいくつかありますが、いずれも欠点がなく、Objective-C に移植されていません。現在はただの正方形です。壁とすべてを通して見る。 http://sneakyness.com/stackoverflow/SRLbounds2.png

図 3: プレーヤーを中心に、bounds.origin が異なるビュー。 http://sneakyness.com/stackoverflow/SRLbounds3.png