Cocoa 当我将视图的框架设置为其现有边界时,为什么视图会移动?
我正在尝试为NSView制作一个简单的动画。视图有一些奇怪的“跳跃”问题,我设法将代码剥离到Cocoa 当我将视图的框架设置为其现有边界时,为什么视图会移动?,cocoa,nsview,Cocoa,Nsview,我正在尝试为NSView制作一个简单的动画。视图有一些奇怪的“跳跃”问题,我设法将代码剥离到 [editView setFrame:NSMakeRect([editView bounds].origin.x, [editView bounds].origin.y, [editView bounds].size.width, [editView bounds].size.height)]; 它仍然会产生“jummping”问题。当我运行这个程序时,我希望视图不会移动,但在
[editView setFrame:NSMakeRect([editView bounds].origin.x,
[editView bounds].origin.y,
[editView bounds].size.width,
[editView bounds].size.height)];
它仍然会产生“jummping”问题。当我运行这个程序时,我希望视图不会移动,但在第一次,也只是第一次,它会跳到左边大约200px。可能出了什么问题?边界用视图的局部坐标系表示。框架以superview的坐标空间表示。边界以视图的局部坐标系表示。帧在superview的坐标空间中表示。帧和边界不是一回事。视图的框架是其在superview坐标系中的位置和大小,而其边界是其自身坐标系的原点和大小 默认情况下,视图边界的原点为0,0。这与框架的位置无关。因此,当您将位于(例如)200,0(在其父坐标中)的视图的帧更改为0,0时,将其向左移动200点* 如果将视图的边框设置为其边框,则视图将不会按预期移动 (顺便说一句:
bounds
和frame
都是NSRects,因此,如果您只想不加更改地传递它们,就没有理由对矩形的各个成员调用NSMakeRect
。)
*不是像素。视图坐标以点为单位,是从PostScript点(1/72英寸)向下延伸的假想单位;你不能也不应该依赖于等于像素的点。帧和边界不是一回事。视图的框架是其在superview坐标系中的位置和大小,而其边界是其自身坐标系的原点和大小 默认情况下,视图边界的原点为0,0。这与框架的位置无关。因此,当您将位于(例如)200,0(在其父坐标中)的视图的帧更改为0,0时,将其向左移动200点* 如果将视图的边框设置为其边框,则视图将不会按预期移动 (顺便说一句:
bounds
和frame
都是NSRects,因此,如果您只想不加更改地传递它们,就没有理由对矩形的各个成员调用NSMakeRect
。)
*不是像素。视图坐标以点为单位,是从PostScript点(1/72英寸)向下延伸的假想单位;你不能也不应该依赖于等于像素的点。看起来你正在混淆术语帧和边界 运行该代码时,边界原点的值是多少?很可能是{0,0}(在调试器中检查),因为记住,边界处理视图自己的内部坐标,而框架处理superview的坐标 如果边界原点为{0,0},则在运行代码时,将帧原点设置为{0,0},也称为superview的左上角。你的起点仍然没有改变。因此,下次运行它时,它会将帧原点设置为{0,0},这是它已经存在的位置,因此不会发生移动 如果您将所有边界调用更改为frame,您将得到您想要的原始结果,即使在第一次调用时也没有移动 我建议学习更多关于坐标系的知识。以下是一些开始的地方:
看起来您正在混淆术语框架和边界 运行该代码时,边界原点的值是多少?很可能是{0,0}(在调试器中检查),因为记住,边界处理视图自己的内部坐标,而框架处理superview的坐标 如果边界原点为{0,0},则在运行代码时,将帧原点设置为{0,0},也称为superview的左上角。你的起点仍然没有改变。因此,下次运行它时,它会将帧原点设置为{0,0},这是它已经存在的位置,因此不会发生移动 如果您将所有边界调用更改为frame,您将得到您想要的原始结果,即使在第一次调用时也没有移动 我建议学习更多关于坐标系的知识。以下是一些开始的地方:
注意:这个问题是关于Cocoa>NSView,而不是Cocoa Touch>UIView。啊,是的,对不起,错过了。同样的原则也适用。是的,但你应该用NSView替换UIView并更改坐标系。注意:这个问题是关于Cocoa>NSView,而不是Cocoa Touch>UIView。啊,是的,对不起,错过了。同样的原则也适用。是的,但您应该用NSView替换UIView并更改坐标系。谢谢,将边界更改为框架使其按预期工作。我想我应该在它返回0.00000作为X和Y坐标(我假设0.000来自其他问题)时捕捉到这一点,多亏了将边界更改为frame使其按预期工作。我想我应该在它返回0.00000作为X和Y坐标时捕捉到这一点(我假设0.000来自其他问题)