如何让NSView不剪辑其边界区域?

Jer*_*y L 9 macos cocoa objective-c nsview appkit

我在Xcode上为OS X创建了一个空的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];
}
Run Code Online (Sandbox Code Playgroud)

但是旋转图层的背景被视图的边界区域剪切:

在此输入图像描述

我想从OS X和iOS的某个版本开始,视图不会剪切其子视图的内容并显示内部和外部的所有内容?在iOS上,我确实看到了这种行为,但我想知道它为什么会出现这种情况以及如何让一切都显示出来?(我已经在Mountain Lion上使用了最新的Xcode 4.4.1).

(注意:如果你尝试上面的代码,你需要链接到Quartz Core,并且可能导入石英核心标题,虽然我想知道为什么我没有导入标题并且它仍然完美编译)

Jer*_*y L 10

事实证明,如果该行:

((NSView *)self.window.contentView).wantsLayer = YES;
Run Code Online (Sandbox Code Playgroud)

添加到最开始,然后按预期工作:

- (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);

}
Run Code Online (Sandbox Code Playgroud)

所以看起来如果所有视图都是层支持的,那么它的工作原理与在iOS上的工作方式相同.(如果有一种快速方法可以自动备份所有视图层,那就更好了).

anchorPoint行不能在行之前移动addSubview,否则它是不正确的,虽然我想知道为什么会有任何区别.

self.view.layer = [CALayer layer];如果window.contentView是图层备份,则可以删除该行.这两个contentView self.view都不需要设置图层,我也想知道为什么.

transform行不能成为前addSubview行,否则它不会转动,我不知道为什么了.

第三件事是,我想如果我去Interface Builder并使contentView成为一个类ContentView(子类NSView),并在其init方法中做一个self.wantsLayer = YES;,那么它也会工作,但事实并非如此.

但无论如何,上面的代码是有效的,当我发现更多时,我会更新上面的原因.

在此输入图像描述