Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 当我将视图的框架设置为其现有边界时,为什么视图会移动?_Cocoa_Nsview - Fatal编程技术网

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

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”问题。当我运行这个程序时,我希望视图不会移动,但在

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

[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来自其他问题)