2011-11-24 30 views
0

我想做一个NSView的简单动画。该视图有一些怪异的“跳跃”的问题,我设法把衣服脱我的代码为什么当我将其框架设置为其现有边界时,我的视图会移动?

[editView setFrame:NSMakeRect([editView bounds].origin.x, 
    [editView bounds].origin.y, 
    [editView bounds].size.width, 
    [editView bounds].size.height)]; 

,它仍然生产的“jummping”的问题。当我运行它时,我希望视图根本不会移动,但是在第一次也是仅第一次时,它会跳到左边约200px。什么可能会出错?

回答

2

框架和边界不是一回事。一个观点的框架是它的超级观点坐标系统中的位置和大小,而它的界限是它自己的坐标系统的起源和大小。

默认情况下,视图边界的原点为0,0。这与其帧的位置无关。因此,当您将视图的框架(例如200,0(在其父坐标系中)更改为0,0时,将其向左移动200点*。

如果您将视图的框架设置为其框架,则视图将不会像您期望的那样移动。

(顺便说一句:boundsframe都是NSRects,所以没有理由说NSMakeRect用矩形的个人会员,如果你只是要通过他们都通过不变)

*不像素。观点坐标以点为单位,一个虚构的单位来自PostScript点(1/72英寸);你不能也不应该依赖于等于像素的点。

+0

谢谢,改变边界,以帧使其正常工作。我想我应该早些时候捕获这个,当它返回0.00000作为X和Y坐标(我认为0.000是来自其他问题) – nosedive25

1

边界用视图的局部坐标系表示。框架在超视图的坐标空间中表示。

0

它看起来像你越来越混淆术语框架和界限。

当你运行该代码时,你的边界源的值是什么?很可能{0,0}(在调试器中检查它),因为请记住,边界处理视图自己的内部坐标,而帧处理超视图的坐标。

如果您的边界原点是{0,0},那么当您运行代码时,将帧原点设置为{0,0},也称为超视图的左上角。你的界限来源仍然没有改变。因此,下次运行它时,它会将帧起始位置设置为{0,0},这就是原来的位置,所以不会发生移动。

如果您将所有边界呼叫更改为帧,则会得到您想要的原始结果,即使在第一次呼叫时也不会移动。

我建议学习更多关于坐标系的知识。这里有一些地方开始:

UIView Programming Guide Previous Answer on StackOverflow

+1

一个注意:这个问题是关于Cocoa> NSView,而不是Cocoa Touch> UIView。 – 2011-11-24 02:15:02

+0

啊,是的,对不起,错过了。尽管同样的原则适用。 – sosborn

+0

是的,但你应该用NSView替换UIView并改变坐标系。 – 2011-11-24 02:18:34

相关问题