2

我围绕它的中心旋转了一个 NSView 并验证了结果:

[_cocoaView setFrameCenterRotation:-_rotationX];

在此处输入图像描述 在此处输入图像描述

我通过更改框架原点来定位 NSView,以便视图与(在这种情况下)Box2D 主体的中心对齐。结果再次符合预期:

CGRect frame = _cocoaView.frame;
frame.origin = CGPointMake(_position.x - frame.size.width * 0.5f, 
                           _position.y - frame.size.height * 0.5f);
_cocoaView.frame = frame;

在此处输入图像描述

但是,一旦我将平移和旋转结合起来,旋转中心就不再是视图的中心,而是其他点。我相信框架大小和原点会因旋转而改变,从而移动框架的中心点。结果是视图和 Box2D 主体不再对齐,除非旋转角度为 0。

在此处输入图像描述

这是为什么?以及如何将视图转换到特定位置并围绕其中心旋转视图?

PS:我之前尝试将 iOS 版本的已经工作的仿射转换应用于支持层的 NSView 失败。所以我在不使用转换的情况下尝试了它,但是唉,我又被卡住了。如果您知道如何使其与图层和变换一起使用,那也会对我有所帮助。

4

1 回答 1

2

解决方案是双重的。要修复不正确的旋转,我首先需要将旋转设置为 0,移动原点,然后应用实际旋转。

但是,这会导致在旋转和移动视图时发生大量闪烁。随机且非常频繁地,视图会跳转到不同的位置、错误地旋转或被切断——或所有这些。该问题的解决方案是将翻译和旋转代码包含在 lockFocus 和 unlockFocus 调用中。

这是对我有用的解决方案:

    [_cocoaView lockFocusIfCanDraw];
    [_cocoaView setFrameCenterRotation:0];

    CGSize frameSize = _cocoaView.frame.size;
    CGPoint origin = CGPointMake(_position.x - frameSize.width * 0.5f, _position.y - frameSize.height * 0.5f);
    [_cocoaView setFrameOrigin:origin];

    [_cocoaView setFrameCenterRotation:-_rotationX];
    [_cocoaView unlockFocus];

唯一的缺点:视图似乎仍然偶尔落后于 Box2D 主体。几乎不引人注意,所以它并不完美,但现在已经足够好了。

于 2013-04-18T05:40:21.723 回答