Objective c 如何使NSView不剪裁其边界区域?

Objective c 如何使NSView不剪裁其边界区域?,objective-c,macos,cocoa,nsview,appkit,Objective C,Macos,Cocoa,Nsview,Appkit,我在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 = [CALa

我在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];
}
但旋转层的背景被视图的边界区域剪裁:

我想,由于OSX和iOS的某些版本,视图不会剪辑其子视图的内容,而是会显示内部和外部的所有内容?在iOS上,我确实看到了这种行为,但我想知道为什么会出现这种情况,以及如何让一切都显示出来?(我已经在山狮上使用了最新的Xcode 4.4.1)


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

结果是,如果行:

((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.contentView
是层备份的,则可以删除code>。contentView和self.view都不需要设置图层,我想知道为什么

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

第三件事是,我想如果我转到Interface Builder,将contentView设置为
contentView
(子类化
NSView
),并在其
init
方法中,执行
self.wantsLayer=YES,那么它也可以工作,但它不能

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


我是一名iOS开发人员,最近开始在Cocoa工作。在过去的三天里,这让我抓狂。我很惊讶我找不到更多关于它的信息。感谢您发布您的解决方案!!将NSView与层和无层混合使用时可能会出现问题。覆盖在其他内容上的内容不稳定。设置
self.wantsLayer=YES
init
中不起作用,因为1。正确的初始值设定项是
initWithFrame:
和2。即使对于从NIB加载的视图,也不需要这样做。您应该覆盖
-awakeFromNib
,并在那里执行设置。或者,可以在IB的View Effects inspector中设置核心动画层属性。