gpt4 book ai didi

objective-c - 如何在 Mac 上与 layer-backed views 交互

转载 作者:搜寻专家 更新时间:2023-10-30 19:48:31 24 4
gpt4 key购买 nike

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

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

我通过使内容 View 成为一个 layer-backed view 解决了第一个问题,如 Apple's documentation of NSView 中所述:

A layer-backed view is a view that is backed by a Core Animation layer. Any drawing done by the view is the cached in the backing layer. You configured a layer-backed view by simply invoking setWantsLayer: with a value of YES. The view class will automatically create the a backing layer for you, and you use the view class’s drawing mechanisms. When using layer-backed views you should never interact directly with the layer.

A layer-hosting view is a view that contains a Core Animation layer that you intend to manipulate directly. You create a layer-hosting view by instantiating an instance of a Core Animation layer class and setting that layer using the view’s setLayer: method. After doing so, you then invoke setWantsLayer: with a value of YES. When using a layer-hosting view you should not rely on the view for drawing, nor should you add subviews to the layer-hosting view.

然后从绘制我的 CGImageCGPattern 中生成一个 CGColorRef:

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

为了将背景图像设置为图案,我使用了 How to tile the contents of a CALayer 中的答案在 SO 上完成第一项任务。

但是对于第二个任务,添加图标我使用了下面的代码:

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. 我不确定我是否违反了 Apple 关于 layer-backed View 的限制,即您永远不应与层直接交互。设置图层的背景颜色时,我是直接与图层交互还是我弄错了?
  2. 我对直接与 layer-backed View 的层层次结构交互并插入一个新层有一种不好的感觉,就像我在第二个任务中所做的那样。这可能还是违反了苹果的指导方针?我想指出的是,这个内容 View 当然有几个 subview ,例如标签、 TextView 和按钮。
  3. 在我看来,仅使用一个 layer-hosting NSView 似乎是最干净的解决方案。然后可以将所有文本标签添加为 CATextLayers 等。但是,如果我正确理解 Apple 的文档,我将无法再向 View 添加任何控件。我是否必须自己在自定义 CALayers 中编写所有控件的代码才能使其正常工作?听起来像是在重新发明轮子de luxe。我也不知道如何单独在 CoreAnimation 中编写 NSTextField

如有任何关于如何使用 CoreAnimation 和标准控件拆分设计用户界面的建议,我们将不胜感激。

请注意,我在这里谈论的是 Mac。

最佳答案

恕我直言,不需要层支持:

对于1.我做了一个图案图片

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

对于 2. 添加一个 NSImageView 作为 contentview 的 subview

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

在 mac 上,如果有层支持,一些 View 不会很好地响应::例如pdf View

关于objective-c - 如何在 Mac 上与 layer-backed views 交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5896224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com