2010-11-21 7 views
8

bringSubviewToFrontの機能をiPhoneに複製する必要がありますが、私はMacでプログラミングしています。これはどうすればできますか?OS X版のbringSubviewToFront :?

答えて

6

は、実際にこれを試していない - と、それを行うには良い方法があるかもしれない - しかし、これは動作するはずです:

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

これはその兄弟の前に「ビュー」を移動します

+0

おそらく効率的ではありませんが、私が望んだことを達成します。 – Regan

+0

代わりに 'setSubviews:'メソッドを使って調査する価値があります。 – ArtOfWarfare

0

オーバーラップする兄弟ビューは、AppKitでの作業を正しく行うのが難しい場合があります。これは、長期間にわたって完全にサポートされていませんでした。代わりにそれらをCALayersにすることを検討してください。ボーナスとして、あなたのiOSバージョンでこのコードを再利用できるかもしれません。

0

も石英レンダリングのためのレイヤーを有効にしてください:

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

そうでない場合は、あなたの層が正しくレンダリングすることができません。

0

Pete Rossiの回答は機能しますが、スーパービューから削除するとビューが保持されます。

あなたはNSViewの上のカテゴリーでこれを追加することができます:私は、マウスでドラッグしたときに、フロントにビューをポップするために必要なので

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

ピート・ロッシの答えは私のために動作しませんでした。しかし、同じラインに沿って、次はマウスを殺さずに仕事をした:

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

はまた、NSViewのサブクラスまたはカテゴリに配置された以下のはかなり便利です:

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

パーフェクト!ちょうど私が必要なもの、ありがとう。 –

0

これはスウィフト3.0ソリューションです。

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