我有一个视图转换,使任何UIView对象都跟随一个cocos2d节点。在iOS上运行良好,在本例中,UIButton遵循它的Box2D主体:

现在,对于Mac,我首先验证了覆盖NSWindow设置是否正确,以便在cocos2d OpenGL视图上绘制cocos2d对象。这是可行的,就像本例中的NSButton一样:

但后来我了解到,没有用于[NSView setTransform:..]的NSViews方法。我不确定这是否适用于Mac,但我做了以下几点:
// sometime after initializing the view
[nsView setWantsLayer:YES];
// every time I update transform:
nsView.layer.affineTransform = transform;我证实了图层是非零的。我还重新验证了NSView是在我启用setWantsLayer之后绘制的。结果令人失望,这个按钮在整个窗口都看不见,它甚至没有被稍微偏移或镜像,它只是不再存在了:

这就引出了转换代码。正如我所说的,这是与iOS相同的代码(除了在末尾分配转换)。它完全可以在iOS上工作(在任何方向上也是如此),但在Mac和NSView对象上就不行了,在那里我再也看不到NSView对象了。
我不知道这里可能有什么问题,也许CALayer的工作方式不同,也许我只是犯了一个非常愚蠢和明显的错误。我只是什么都找不到。
KKAppDelegate* ad = (KKAppDelegate*)[KTApplication sharedApplication].delegate;
float windowHeight = ad.window.frame.size.height;
float x = _position.x - _contentSize.width * _anchorPoint.x;
float y = windowHeight - (_position.y + _contentSize.height * _anchorPoint.y);
if (_ignoreAnchorPointForPosition)
{
x += _anchorPointInPoints.x;
y += _anchorPointInPoints.y;
}
float cx = 1, sx = 0, cy = 1, sy = 0;
if (_rotationX || _rotationY)
{
float radiansX = CC_DEGREES_TO_RADIANS(_rotationX);
float radiansY = CC_DEGREES_TO_RADIANS(_rotationY);
cx = cosf(radiansX);
sx = sinf(radiansX);
cy = cosf(radiansY);
sy = sinf(radiansY);
}
CGAffineTransform transform =
CGAffineTransformMake(cy * _scaleX, sy * _scaleX,
-sx * _scaleY, cx * _scaleY, x, y);
#if KK_PLATFORM_IOS
_cocoaView.transform = transform;
#elif KK_PLATFORM_MAC
_cocoaView.layer.affineTransform = transform;
#endif我验证了代码运行和x/y值是可以预期的(即没有负位置或疯狂的值)。旋转甚至没有在第一步执行,但在第一帧的转换和绘制之后,我仍然没有看到NSView。
我是一个全面的n00b到CALayer和应用转换到NSView。如果不是这个解决方案的话,我会很感激的,那么我会有一些关于如何调试这个问题的建议。谢谢!
更新:
我开始尝试用小值来改变图层的转换,看看会发生什么。
CGAffineTransform transform = _cocoaView.layer.affineTransform;
transform = CGAffineTransformTranslate(transform, 0.1, 0.1);
_cocoaView.layer.affineTransform = transform;其效果是一个缓慢移动的NSButton。它继续往上移动,向右移动,但在视图框的边界处消失了:

所以我相信我这里的问题是视图不是被转换的,而是层--当我转换层时,它将很快地将视图的内容绘制到该层的边界之外,因此不再显示任何内容。
假设我必须直接更改视图的属性,这是正确的吗?文件也强调了这一点。我只是不知道如何将转换应用到视图(我回到原点)。我尝试手动设置旋转和帧原点,但这样就不能将旋转中心与cocos2d节点的中心(anchorPoint)对齐。
发布于 2013-04-20 02:00:48
UIButton和NSButton有一个重要的区别。即使NSButton最后是NSView的子类,NSButton的呈现也是由其单元格NSButtonCell完成的。细胞是作为NSView的“更轻”版本创建的。正如苹果公司的文件所述:
NSCell类提供了一种在NSView对象中显示文本或图像的机制,而不需要一个完整的NSView子类的开销。大多数NSControl类都大量使用它来实现它们的内部工作。
虽然这在Mac早期很有用,但现在已经不再是这样了,希望苹果能够在某个阶段在AppKit上改变这一点。
发生在您身上的是单元格被旋转,但是它被视图裁剪,在您的例子中是按钮本身。
为了解决这个问题,让NSButton的superview层也成为后盾,我相信剪辑将会消失:
[nsView.superview setWantsLayer:YES];https://stackoverflow.com/questions/16003803
复制相似问题