9

我在 Xcode for 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];
}

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

在此处输入图像描述

我认为自从某些版本的 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.viewlayer 都不需要设置,我也想知道为什么。

transform线不能在线之前,addSubview否则它不会旋转,我也想知道为什么。

第三件事是,我想如果我去 Interface Builder 并将 contentView 设为ContentView(子类化NSView)的类,并在其init方法中执行 a self.wantsLayer = YES;,那么它也可以工作,但事实并非如此。

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

在此处输入图像描述

于 2012-09-15T05:17:00.320 回答