2

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

在此处输入图像描述

现在对于 Mac,我首先验证了我是否正确设置了覆盖 NSWindow,以便在 cocos2d OpenGL 视图之上绘制 NSView 对象。这行得通,就像在这种情况下使用 NSButton 一样:

在此处输入图像描述

但后来我了解到[NSView setTransform:..]NSViews 没有方法。我不确定这是否是它在 Mac 上的工作方式,但这是我所做的:

// sometime after initializing the view
[nsView setWantsLayer:YES];

// every time I update transform:
nsView.layer.affineTransform = transform;

我验证了该层是非零的。我还重新验证了在启用 setWantsLayer 后绘制了 NSView。结果令人失望,按钮在整个窗口上无处可见,甚至似乎没有轻微偏移或镜像,它不再存在:

在此处输入图像描述

这让我想到了转换代码。正如我所说,这与 iOS 的代码相同(除了在最后分配转换)。它在 iOS 上完美运行(也可以在任何方向上),但在带有 NSView 对象的 Mac OS X 上却不行,我根本看不到 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。

我是 CALayer 的总 n00b 并将转换应用于 NSView。如果不是解决方案,我将不胜感激,然后提供一些有关如何调试的提示。谢谢!

更新:

我开始尝试通过小值更改图层的变换,看看会发生什么。

CGAffineTransform transform = _cocoaView.layer.affineTransform;
transform = CGAffineTransformTranslate(transform, 0.1, 0.1);
_cocoaView.layer.affineTransform = transform;

这样做的效果是一个缓慢移动的 NSButton。它一直向上和向右移动,但在视图框架的边界矩形处消失了:

在此处输入图像描述

所以我相信我的问题是视图没有被转换,只是图层 - 当我转换图层时,它会快速将视图的内容绘制到图层边界之外,因此不再显示任何内容。

我是否正确地假设我必须直接更改视图的属性?文档也强调了这一点。在这一点上,我只是不知道如何将转换应用到视图(即我回到第一方)。我尝试手动设置旋转和框架原点,但这样我无法将旋转中心与 cocos2d 节点的中心(anchorPoint)对齐。

4

1 回答 1

3

UIButton和之间有一个重要的区别NSButton。即使 NSButton 最后是 的子类NSView,NSButton 的渲染也是由它的单元格来完成的NSButtonCell。单元被创建为 NSView 的“更轻”版本。正如 Apple 的文档所述:

NSCell 类提供了一种在 NSView 对象中显示文本或图像的机制,而无需完整的 NSView 子类的开销。大多数 NSControl 类都大量使用它来实现它们的内部工作。

虽然这在早期的 Mac OS X 时代很有用,但现在不再是这种情况了,希望 Apple 会在某个阶段在 AppKit 中改变这一点。

发生在您身上的是单元格被旋转,但随后它被视图剪辑,在您的情况下是按钮本身。

为了解决这个问题,也让 NSButton 的 superview 层支持,我相信剪辑会消失:

[nsView.superview setWantsLayer:YES];
于 2013-04-20T02:00:48.647 回答