2012-07-03 51 views
5

私は別のハンドルを提示するカスタムコントロールで作業しています。私は、選択されたハンドルがZ-インデックスを持っていて、他のハンドルがハンドルしていることを確認したい。NSViewサブビューの順序を変更する

ビューの順序を入れ替える方法はありますか? この機能はsortSubviewsUsingFunction:context:ですが、これが正しい解決策であるかどうかはわかりません。

+0

あなたはすべてのサブビューをループして取得することができ、それらを取得すると、ビューにすべてのインデックスを挿入することができます... –

答えて

-5

私はあなたがあなたが見るすべてをループして配列に追加することができますが、あなたはそれらをインデックスに追加するオプションがあることを理解しています。あなたは以下の機能を持っています。

[self.view insertSubview:view1 atIndex:2] 
[self.view insertSubview:view1 aboveSubview:0] 
[self.view insertSubview:view1 belowSubview:1] 

あなたがはい、sortSubviewsUsingFunction:context:があなたの探しているものを行うことができます..それはあなたが必要と順序だ

+4

OPのように見える 'NSView'sこれは' UIView'sのためだけです –

-3

を入れ替えることができますがしたいすべてが特定の一つのためであれば、しかし、それはやり過ぎかもしれません(順序のない)他人の上に座るように見える。その場合はUIViewbringSubviewToFront:メソッドを調べる必要があります。そうすれば、あなたはハンドルを育てるためにあなたのIBActionでこのような何かを行うことができます:そのハンドルを想定し

[self.view bringSubviewToFront: handle]; 

は/ UIViewのを継承しているオブジェクトです。これがあなたが探しているものでない場合は、是非、sortSubviewsUsingFunction:context:に行ってください。その場合は、各サブビューの個々のタグプロパティを変更し、それに応じてソートする必要があります。

+0

私は働いていますiOS以外のOSXでも同様の機能を検索できるので+1します。 – MatterGoal

+0

ああ、その場合、これはちょっとハッキリしているようですが、あなたはいつも以下のカテゴリを追加することができます:http://stackoverflow.com/questions/4236304/os-x-version-of-bringsubviewtofront –

+0

ありがとう、私は、パフォーマンスの面でこのソリューションが優れているかどうかを理解する必要があります。sortSubviewsUsingFunction – MatterGoal

5

かなりシンプルですが、2つのサブビューを比較して並べ替える機能を使用することができます。ここでは、ビューのタグに基づいた簡単な解決策があります。

[mainView sortSubviewsUsingFunction:(NSComparisonResult (*)(id, id, void*))compareViews context:nil]; 

... 

NSComparisonResult compareViews(id firstView, id secondView, void *context) { 
    int firstTag = [firstView tag]; 
    int secondTag = [secondView tag]; 

    if (firstTag == secondTag) { 
     return NSOrderedSame; 
    } else { 
     if (firstTag < secondTag) { 
      return NSOrderedAscending; 
     } else { 
      return NSOrderedDescending; 
     } 
    } 
} 
+0

申し訳ありませんが、compareViews関数のプロトタイプを理解できません。 Objective-cとCの組み合わせを使用していますか? – MatterGoal

4

OSX 10.10以降、Cocoaは新しいAPIを導入しました。
これはiOSに似ていますので、下または上に表示する別のビューを渡すことができます。

[self.view addSubview:myView positioned:NSWindowBelow relativeTo:myViewInBackground]; 

チェックアウトdocumentation;私の経験ではNSWindowBelowNSWindowAboveが逆に見えました。

+1

親の前にchild.removeFromSuperview()を使用する必要はありませんか?addSubview(子、インデックス)をスワップする? NSViewクラスのsortSubviewsUsingFunctionを使用する方が適切でしょうか? – eonist

+0

テストの後に。もう一度ビューを追加するだけでうまくいきます。削除する必要はありません。 – eonist

+0

Docsは、10.0以降で10.10であったと言います。 10.10以下のターゲットでも使用できます。 – Daniel

関連する問題