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;
,那么它也会工作,但事实并非如此.
但无论如何,上面的代码是有效的,当我发现更多时,我会更新上面的原因.
归档时间: |
|
查看次数: |
4833 次 |
最近记录: |