9

OS X 用の Xcode で空の Cocoa アプリを作成し、以下を追加しました。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.view = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 200, 200)];
    self.view.wantsLayer = YES;
    self.view.layer = [CALayer layer];
    self.view.layer.backgroundColor = [[NSColor yellowColor] CGColor];
    self.view.layer.anchorPoint = CGPointMake(0.5, 0.5);
    self.view.layer.transform = CATransform3DMakeRotation(30 * M_PI / 180, 1, 1, 1);

    [self.window.contentView addSubview:self.view];
}

ただし、回転したレイヤーの背景は、ビューの境界領域によってクリップされます。

ここに画像の説明を入力

OS X と iOS のいくつかのバージョン以降、ビューはそのサブビューのコンテンツをクリップせず、内部と外部のすべてを表示すると思いましたか? iOS ではその動作が見られますが、なぜそのように表示されるのか、すべてを表示するにはどうすればよいのでしょうか? (私はすでに Mountain Lion で最新の Xcode 4.4.1 を使用しています)。

(注: 上記のコードを試す場合は、Quartz Core にリンクする必要があり、場合によっては Quartz Core ヘッダーをインポートする必要がありますが、ヘッダーをインポートしなかったのに、まだ完全にコンパイルされているのは不思議です)

4

1 に答える 1

10

次の行の場合、次のようになります。

((NSView *)self.window.contentView).wantsLayer = YES;

が最初に追加され、期待どおりに機能します。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{  
    ((NSView *)self.window.contentView).wantsLayer = YES;

    self.view = [[NSView alloc] initWithFrame:NSMakeRect(200, 200, 200, 200)];

    self.view.wantsLayer = YES;

    self.view.layer.backgroundColor = [[NSColor yellowColor] CGColor];

    [self.window.contentView addSubview:self.view];
    self.view.layer.anchorPoint = CGPointMake(0.5, 0.5);

    self.view.layer.transform = CATransform3DMakeRotation(30 * M_PI / 180, 0, 0, 1);

}

したがって、すべてのビューがレイヤーバックされるように作成されている場合は、iOSの場合と同じように機能します。(すべてのビューレイヤーを自動的にバックアップする簡単な方法がある場合は、それが良いでしょう)。

行を行のanchorPoint前に移動することはできませんaddSubview。そうしないと、それが正しくないのですが、なぜそれが違いを生むのだろうかと思います。

レイヤーバックの場合、ラインself.view.layer = [CALayer layer];を削除できます。window.contentViewcontentViewとself.viewレイヤーを設定する必要はありません。なぜだろうと思います。

線を線のtransform前にすることはできません。そうしないと、addSubview線が回転しません。なぜかと思います。

3つ目は、Interface Builderに移動してcontentViewをContentView(サブクラス化NSView)のクラスにし、そのinitメソッドで、を実行するself.wantsLayer = YES;と、それも機能すると思いましたが、機能しません。

しかしとにかく、上記のコードは機能します。詳細がわかったら、上記の理由を更新します。

ここに画像の説明を入力してください

于 2012-09-15T05:17:00.320 に答える