首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将适用于UIView的视图转换应用到NSView?

如何将适用于UIView的视图转换应用到NSView?
EN

Stack Overflow用户
提问于 2013-04-14 20:09:17
回答 1查看 3.2K关注 0票数 2

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

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

但后来我了解到,没有用于[NSView setTransform:..]的NSViews方法。我不确定这是否适用于Mac,但我做了以下几点:

代码语言:javascript
复制
// 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的工作方式不同,也许我只是犯了一个非常愚蠢和明显的错误。我只是什么都找不到。

代码语言:javascript
复制
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。如果不是这个解决方案的话,我会很感激的,那么我会有一些关于如何调试这个问题的建议。谢谢!

更新:

我开始尝试用小值来改变图层的转换,看看会发生什么。

代码语言:javascript
复制
CGAffineTransform transform = _cocoaView.layer.affineTransform;
transform = CGAffineTransformTranslate(transform, 0.1, 0.1);
_cocoaView.layer.affineTransform = transform;

其效果是一个缓慢移动的NSButton。它继续往上移动,向右移动,但在视图框的边界处消失了:

所以我相信我这里的问题是视图不是被转换的,而是层--当我转换层时,它将很快地将视图的内容绘制到该层的边界之外,因此不再显示任何内容。

假设我必须直接更改视图的属性,这是正确的吗?文件也强调了这一点。我只是不知道如何将转换应用到视图(我回到原点)。我尝试手动设置旋转和帧原点,但这样就不能将旋转中心与cocos2d节点的中心(anchorPoint)对齐。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-20 02:00:48

UIButtonNSButton有一个重要的区别。即使NSButton最后是NSView的子类,NSButton的呈现也是由其单元格NSButtonCell完成的。细胞是作为NSView的“更轻”版本创建的。正如苹果公司的文件所述:

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

虽然这在Mac早期很有用,但现在已经不再是这样了,希望苹果能够在某个阶段在AppKit上改变这一点。

发生在您身上的是单元格被旋转,但是它被视图裁剪,在您的例子中是按钮本身。

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

代码语言:javascript
复制
[nsView.superview setWantsLayer:YES];
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16003803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档