我正在尝试做一个NSView的简单动画。该视图有一些奇怪的“跳跃”问题,我设法将我的代码剥离到
[editView setFrame:NSMakeRect([editView bounds].origin.x,
[editView bounds].origin.y,
[editView bounds].size.width,
[editView bounds].size.height)];
它仍然会产生“jummping”问题。当我运行它时,我希望视图根本不移动,但在第一次也是第一次,它向左跳跃大约200px。什么可能出错?
答案 0 :(得分:2)
框架和边界不是一回事。视图的框架是它在superview的坐标系统中的位置和大小,而它的边界是它自己的坐标系统的起源和大小。
默认情况下,视图边界的原点为0,0。这与其框架的位置无关。因此,当您将视图的帧(例如,200,0(在其父级的坐标中)更改为0,0时,将其向左移动200点*。
如果将视图的框架设置为其框架,则视图将不会像您预期的那样移动。
(顺便说一下:bounds
和frame
都是NSRects,所以没有理由如果您要传递它们,请使用矩形的各个成员调用NSMakeRect
一切都没改变。)
*不是像素。视图的坐标是以点为单位,是从PostScript点(1/72英寸)下降的虚构单位;你不能也不应该依赖等于像素的点。
答案 1 :(得分:1)
界限以视图的局部坐标系表示。 frame以superview的坐标空间表示。
答案 2 :(得分:0)
看起来你在术语框架和边界之间感到困惑。
运行该代码时,您的边界源的值是多少?它很可能是{0,0}(在调试器中检查),因为记住,边界处理视图自己的内部坐标,而框架处理超视图的坐标。
如果您的边界原点为{0,0},则在运行代码时,您将帧原点设置为{0,0},也称为超视图的左上角。你的边界起源仍然没有改变。因此,下次运行它时,它会将帧原点设置为{0,0},这就是它已经存在的位置,因此不会发生任何移动。
如果您将所有边界调用更改为帧,您将获得所需的原始结果,即使在第一次调用时也无法移动。
我建议您更多地了解坐标系。以下是一些开始的地方: