2012-07-03 16 views
5

Ich arbeite an einem benutzerdefinierten Steuerelement, das verschiedene Handles präsentiert. Ich möchte sicher sein, dass der ausgewählte Griff einen Z-Index-Reibe hat, dann die anderen Griffe.NSView Subviews Reihenfolge ändern

Gibt es eine Möglichkeit, die Reihenfolge der Ansichten zu vertauschen? Ich fand diese Funktion sortSubviewsUsingFunction:context:, aber ich kann nicht verstehen, ob dies die richtige Lösung ist.

+0

können Sie alle Subviews durchlaufen und sie bekommen und Sie können jeden einen Index in der Ansicht einfügen ... –

Antwort

-5

Wie ich von Ihnen Frage verstehe, können Sie alle Sie Schleife und fügen Sie sie zu Array, dann haben Sie die Möglichkeit, sie zu Ihrer Ansicht mit Index hinzuzufügen .. und Sie haben die folgenden Funktionen.

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

dann können Sie es tauschen, um wie Sie benötigen ..

+4

Sieht aus wie das OP nach 'NSView's fragte das ist nur für' UIView's –

-3

Ja, sortSubviewsUsingFunction:context: tun, was Sie suchen jedoch zu tun, könnte es zu viel des Guten, wenn alles, was Sie möchten für eine bestimmte ist Blick auf die (ungeordneten) anderen sitzen. In diesem Fall sollten Sie in die bringSubviewToFront: Methode von UIView schauen. Auf diese Weise könnte man so etwas in Ihrem IBAction tun den Griff für die Erziehung:

[self.view bringSubviewToFront: handle]; 

dass Griff Unter der Annahme, ist ein Objekt, das/ist erbt von UIView. Wenn dies nicht das ist, was Sie suchen, gehen Sie auf jeden Fall mit sortSubviewsUsingFunction:context:, in diesem Fall müssen Sie die einzelnen Tag-Eigenschaften für jede Unteransicht ändern und entsprechend sortieren.

+0

Ich arbeite auf OSX nicht iOS ... aber +1, weil ich nach ähnlichen Funktionen suchen kann. – MatterGoal

+0

Ah, in diesem Fall sieht das ein wenig hackish aus, aber Sie könnten immer eine Kategorie hinzufügen, um Folgendes zu tun: http://stackoverflow.com/questions/4236304/os-x-version-of-bringsubviewtofront –

+0

Danke, Ich muss verstehen, wenn diese Lösung in Bezug auf die Leistung besser ist als die sortSubviewsUsingFunction – MatterGoal

5

Es ist ziemlich einfach, Sie können eine Funktion verwenden, die 2 Unteransichten vergleichen, um sie neu zu ordnen. Hier eine einfache Lösung basierend auf dem Tag der Ansicht:

[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

Es tut mir leid, aber ich kann den Prototyp der Funktion compareViews nicht verstehen. Verwendet es eine Mischung aus Objective-C und C? – MatterGoal

4

Cocoa eingeführt eine neue API seit OSX 10.10.
Es ist vergleichbar mit iOS, Sie können eine andere Ansicht übergeben, um darunter oder darüber angezeigt zu werden.

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

Auschecken die documentation; meiner Erfahrung nach NSWindowBelow und NSWindowAbove schien jedoch umgekehrt.

+1

Müssten Sie nicht das child.removeFromSuperview() vor dem Eltern verwenden.addSubview (Kind, Index) zu tauschen? Und wäre es dann nicht angemessener, die sortSubviewsUsingFunction zu verwenden, die sich in der NSView-Klasse befindet? – eonist

+0

Nach einigen Tests. Das Hinzufügen der Ansicht funktioniert wieder gut. Keine Notwendigkeit zu entfernen. – eonist

+0

Die Docs sagen, es war dort seit 10.0 nicht 10.10. Also auch mit Zielen unter 10.10 verwendbar. – Daniel