1

私の状況:

コンテンツ ビュー (NSView) を含む単一のウィンドウがあり、そのウィンドウには複数のサブビュー (単純な NSControl サブクラス。重要ではありませんが、テストのためだけです) が散らばっています。私が達成しようとしている最終効果の一部として、ウィンドウ全体のコンテンツビューを覆う半透明の黒い CALayer を配置し、非表示にできるようにしたい (非表示にするか削除するかは関係ありません)。特定のイベントがトリガーされると、NSViews が完全に明確になります。

テスト目的で、メイン コンテンツ ビューのサブビュー (コントロール) の一部/部分のみをカバーする小さな半透明の黒い CALayer を次のように配置します。

(まあ、スクリーンショットはありましたが、新しいユーザーとして画像を投稿することはできません。想像力を働かせる必要があります。)

十分に単純です。それで、私がやろうとしたのは、それ自体が適切に非表示/削除されることを確認することだけでした. 次に、問題が発生しました。黒いレイヤーを非表示にしたり、削除または削減したり、透明度を 0 に減らしたりしようとすると、ウィンドウのすべてのサブビューが消去され、結果は次のようになります。

(完全に空白のグレー [デフォルトのウィンドウ背景色] コンテンツ ビューのウィンドウ)

メインウィンドウへの参照を持つメインアプリケーション呼び出しのコードの要点は次のとおりです。

    // I set up my main view in a nib, which I load and will add
    // to the app window as the main content view
    NSViewController * controller = [[NSViewController alloc]
    initWithNibName:@"InterfaceTesting" bundle:nil];

    NSView * view = [controller view];

    // enable layers, grab root
    [view setWantsLayer:YES];       
    CALayer * rootLayer = [view layer];

    // set up black square
    CALayer * blackLayer = [CALayer layer];
    [blackLayer setFrame:NSMakeRect(150, 150, 100, 100)];
    [blackLayer setBackgroundColor:CGColorCreateGenericRGB(0,0,0,0.5)];
    [rootLayer addSublayer:blackLayer];

    // hide all sublayers of root (ie the black square)     
    for (CALayer * layer in [[view layer] sublayers])
        [layer setHidden:YES];

    // add to main window
    [self.window setContentView:view];

前に述べたように、[layer setHidden:YES] を [layer setOpacity:0] に置き換えると、コンテンツ ビューを消去するのと同じ効果があり、blackLayer を完全に削除するのと同じ効果があります (removeFromSuperlayer を呼び出し、そのスーパーレイヤーを nil に設定しようとします)。 . さらに興味深いことに、黒いサブレイヤーの四角形の不透明度を 0 から 1 - 0.5 の間の値に設定すると、それに応じてすべてのコンテンツ ビューのサブビューの不透明度が減少します。

小さな黒いCALayerの不透明度を非表示/削除または削減すると、それが含まれていないビューであっても、その一部であるビュー内のすべてのサブビューに影響を与える理由がわからないため、ここではかなり困惑しています。どんな助けでも大歓迎です。

編集: 実際、contentView の最上位レイヤーには、手動で追加した黒い四角形だけでなく、すべてのサブビューにもサブレイヤーがあることがわかりました (ペン先から作成されたものか、 nib)、それで、ブラック ボックスを操作しているだけだと思っていたのに、なぜそれらがすべて消えてしまったのか. しかし、私がまだ知らないのは、すべてのサブビューのレイヤーが存在する理由、それらがどこから来たのか、それらを取り除く方法です(繰り返しますが、removeFromSuperlayer、nil への設定などを介してそれらを削除しようとするすべての試みは失敗します。

4

1 に答える 1

1

サブビュー(コントロール)には、親ビューレイヤーのサブレイヤーとして設定されるレイヤーがあります。したがって、すべてのサブレイヤーをループすることは、これらのサブビューレイヤーにも作用します。

于 2010-10-10T00:56:36.553 に答える