目标C语言 如何在Mac上与层支持视图交互



我正在设计一个包含几个标签和文本字段的用户界面。我想这样设置UI的样式:

  1. 为我的NSWindow的内容视图设置背景图案
  2. 在左上角的背景中添加自定义图标

我解决了第一个问题,使内容视图成为层支持视图,如Apple的NSView文档所述:

层支持视图是由核心动画层支持的视图。视图完成的任何绘图都缓存在后台层中。通过简单地用YES的值调用setWantsLayer:来配置层支持视图。视图类会自动为你创建一个后台层,你可以使用视图类的绘图机制。当使用层支持视图时,你不应该直接与层交互

一个层托管视图是一个视图,它包含一个核心动画层,你打算直接操作。通过实例化核心动画层类的实例并使用视图的setLayer:方法设置该层,可以创建一个层托管视图。这样做之后,然后用YES的值调用setWantsLayer:当使用层托管视图时,你不应该依赖于视图来绘图,也不应该在层托管视图中添加子视图。

,然后从绘制CGImageCGPattern中生成CGColorRef:

NSView *mainView = [[self window]contentView];
[mainView setWantsLayer:YES];

为了将背景图像设置为图案,我使用了如何在SO上平铺CALayer内容的答案来完成第一个任务。

对于第二个任务,我使用下面的代码添加图标:
CGImageRef iconImage = NULL;
NSString *path = [[NSBundle mainBundle] pathForResource:@"icon_128" ofType:@"png"];
if(path != nil) {
    NSURL *imageURL = [NSURL fileURLWithPath:path];
    provider = CGDataProviderCreateWithURL((CFURLRef)imageURL);
    iconImage = CGImageCreateWithPNGDataProvider(provider,NULL,FALSE,kCGRenderingIntentDefault); 
    CFRelease(provider);
}
CALayer *iconLayer = [[CALayer alloc] init];
// layer is the mainView's layer
CGRect layerFrame = layer.frame;
CGFloat iconWidth = 128.f;
iconLayer.frame = CGRectMake(0.f, CGRectGetHeight(layerFrame)-iconWidth, 128.f, 128.f);
iconLayer.contents = (id)iconImage;
CGImageRelease(iconImage);
[layer insertSublayer:iconLayer  atIndex:0];
[iconLayer release];

  1. 我不确定我是否违反了苹果关于层支持视图的限制,即你不应该直接与层交互。当设置图层的背景色时,我是直接与图层交互还是我在这里错了?
  2. 我对直接与图层支持的视图的图层层次结构进行交互并插入一个新图层有一种不好的感觉,就像我在第二个任务中所做的那样。这是可能的还是违反了苹果的指导方针?我想指出,这个内容视图当然有几个子视图,如标签,文本视图和按钮。
  3. 在我看来,只是使用一个单一的层托管 NSView似乎是最干净的解决方案。所有的文本标签都可以添加为CATextLayers等。然而,如果我正确理解苹果的文档,我就不能再向视图添加任何控件了。我是否必须在自定义CALayers中编写所有控件以使其工作?听起来像是重新发明轮子de luxe。我也不知道如何在CoreAnimation中编写NSTextField

关于如何使用CoreAnimation和标准控件分割设计用户界面的任何建议都是值得赞赏的。

请注意,我这里说的是Mac。

无需图层支持。

1。输入pattern image

NSImage *patternImage = [NSImage imageNamed:@"pattern"];
[window setBackgroungdColor:[NSColor colorWithPatternImage:patternImage]];

2。添加一个NSImageView作为contentview的子视图

NSImageView *v = ...
[[window contentView] addSubview:v]; 

在mac上一些视图不能很好地响应如果层支持::例如pdfview

创建一个父视图容器a。为你所有的NSView需求(按钮等)添加子视图B到a。为a添加子视图C以满足所有核心动画需求。

编辑:更好的是:使用父视图A满足所有NSView需求,使用子视图C满足核心动画需求,完全忽略视图B。

最新更新