我围绕其中心旋转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:my previous attempt at applying the already working affine transformation of the iOS version to the layer-backed NSView failed。所以我在不使用变换的情况下尝试了它,但是唉,我又被卡住了。如果你知道如何让它与图层和变换一起使用,也可以帮助我。
答案 0 :(得分: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机身。几乎没有人注意到,所以现在还不够完美,但已经足够好了。