我创建了一个NSView
子类称为DAView
,合并了一系列有用的方法以供以后重用。这很有效,但是,drawRect:
从未在任何使用的类中调用DAView
,也不在班级本身。为什么?
就是这样DAView
好像:
DAView
@interface DAView : NSView
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
self.backgroundColor = [NSColor clearColor];
// Make layer-backed by default
self.wantsLayer = YES;
// Create a root layer
CALayer *_rootLayer = [CALayer layer];
_rootLayer.shouldRasterize = YES;
_rootLayer.name = DAViewRootLayerDefaultName;
self.layer = _rootLayer;
}
return self;
}
- (void)drawRect:(NSRect)dirtyRect // never called
{
NSLog(@"Draw Rect called");
}
现在,如果我想利用这个DAView's
添加/方法,我面临同样的问题。一切正常,除了drawRect:
,其中,如DAView
的情况,从未被调用过:
数据表视图
@interface DATableView : DAView
- (void)drawRect:(NSRect)dirtyRect // never called either
{
[[NSColor grayColor] set];
NSBezierPath *_cellSeparator = [NSBezierPath bezierPath];
[_cellSeparator lineToPoint:dirtyRect.origin];
[_cellSeparator closePath];
[_cellSeparator stroke];
NSLog(@"Draw rect");
}
但是如果我改变DATableView
的标头是 的子类NSView
, drawRect:
叫做。
我缺少什么?
来自文档:
“setWantsLayer: 和 setLayer: 的调用顺序很重要,它区分了图层支持视图和图层托管视图。”
“层支持的视图是由核心动画层支持的视图。该视图完成的任何绘制都缓存在支持层中。您可以通过调用 setWantsLayer: 值为 YES 来配置层支持的视图。该视图类会自动为您创建一个支持层(如果被覆盖,则使用 makeBackingLayer),并且您必须使用视图类的绘图机制。当使用支持层的视图时,您不应该直接与层交互。相反,您必须使用标准视图编程实践。 ”
“层托管视图是包含您打算直接操作的核心动画层的视图。您可以通过实例化核心动画层类并将该层提供给视图的 setLayer: 方法来创建层托管视图。这样做之后,然后调用 setWantsLayer:,值为 YES。此方法顺序至关重要。使用图层托管视图时,不应依赖该视图进行绘制,也不应向图层托管视图添加子视图。根图层(使用setLayer设置的图层:)应该被视为图层树的根图层,并且您应该只使用Core Animation绘图和动画方法。您仍然使用视图来处理鼠标和键盘事件,但必须处理任何生成的绘图由核心动画制作。”
由于您正在提供自己的层,而不是希望 Cocoa 为您创建一个层,因此请尝试这种方式。
// Create a root layer
CALayer *_rootLayer = [CALayer layer];
_rootLayer.shouldRasterize = YES;
_rootLayer.name = DAViewRootLayerDefaultName;
self.layer = _rootLayer;
// Make layer-backed by default
self.wantsLayer = YES;
或者,接受 Cocoa 给你的,而不是创建你自己的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)