当我将其框架设置为现有边界时,为什么我的视图会移动?

时间:2011-11-24 01:11:04

标签: cocoa nsview

我正在尝试做一个NSView的简单动画。该视图有一些奇怪的“跳跃”问题,我设法将我的代码剥离到

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

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

3 个答案:

答案 0 :(得分:2)

框架和边界不是一回事。视图的框架是它在superview的坐标系统中的位置和大小,而它的边界是它自己的坐标系统的起源和大小。

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

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

(顺便说一下:boundsframe都是NSRects,所以没有理由如果您要传递它们,请使用矩形的各个成员调用NSMakeRect一切都没改变。)

*不是像素。视图的坐标是以点为单位,是从PostScript点(1/72英寸)下降的虚构单位;你不能也不应该依赖等于像素的点。

答案 1 :(得分:1)

界限以视图的局部坐标系表示。 frame以superview的坐标空间表示。

答案 2 :(得分:0)

看起来你在术语框架和边界之间感到困惑。

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

如果您的边界原点为{0,0},则在运行代码时,您将帧原点设置为{0,0},也称为超视图的左上角。你的边界起源仍然没有改变。因此,下次运行它时,它会将帧原点设置为{0,0},这就是它已经存在的位置,因此不会发生任何移动。

如果您将所有边界调用更改为帧,您将获得所需的原始结果,即使在第一次调用时也无法移动。

我建议您更多地了解坐标系。以下是一些开始的地方:

UIView Programming Guide Previous Answer on StackOverflow