2010-11-21 20 views

risposta

6

Non hanno effettivamente provato questo fuori - e ci possono essere modi migliori per farlo - ma questo dovrebbe funzionare:

NSView* superview = [view superview]; 
[view removeFromSuperview]; 
[superview addSubview:view]; 

Questo sposterà 'view' verso la parte anteriore dei suoi fratelli

+0

Probabilmente inefficiente, ma realizza ciò che volevo, quindi grazie. – Regan

+0

Potrebbe valere la pena di investigare usando il metodo 'setSubviews:'. – ArtOfWarfare

0

Le visualizzazioni di pari livello che si sovrappongono possono essere difficili da eseguire correttamente in AppKit: non sono state supportate completamente per molto tempo. Considera invece di renderli calandrini. Come bonus, potresti essere in grado di riutilizzare questo codice nella tua versione iOS.

0

anche essere sicuri di abilitare il livello per il rendering di quarzo:

... 
NSImageView *anImage = [[NSImageView alloc] initWithFrame:NSRectMake(0,0,512,512)]; 
[anImageView setWantsLayer:YES]; 
... 

in caso contrario, il tuo livello non può essere reso in modo corretto.

0

La risposta di Pete Rossi funziona, ma ricorda di mantenere il punto di vista quando lo rimuovi dalla superview.

È possibile aggiungere questo in una categoria sulla NSView:

-(void)bringSubviewToFront:(NSView*)view 
{ 
    [view retain]; 
    [view removeFromSuperview]; 
    [self addSubview:view]; 
    [view release]; 
} 
5

risposta di Pete Rossi non ha funzionato per me perché avevo bisogno di pop la vista in avanti durante il trascinamento con il mouse. Tuttavia, lungo le stesse linee di seguito ha funzionato senza uccidere il mouse:

CALayer* superlayer = [[view layer] superlayer]; 
[[view layer] removeFromSuperlayer]; 
[superlayer addSublayer:[view layer]]; 

Inoltre, i seguenti posti in una sottoclasse NSView o categoria è piuttosto comodo:

- (void) bringToFront { 
    CALayer* superlayer = [[self layer] superlayer]; 
    [[self layer] removeFromSuperlayer]; 
    [superlayer addSublayer:[self layer]]; 
} 
+0

Perfetto! Proprio quello di cui avevo bisogno, grazie. –

0

Questo è Swift soluzione 3.0:

extension NSView { 
    public func bringToFront() { 
     let superlayer = self.layer?.superlayer 
     self.layer?.removeFromSuperlayer() 
     superlayer?.addSublayer(self.layer!) 
    } 
}