Objective c 如何使NSView不剪裁其边界区域?
我在Xcode for OS X上创建了一个空的Cocoa应用程序,并添加了: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
- (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中设置核心动画层属性。