对于那些了解这一点的人来说听起来可能非常愚蠢,但我对iOS很陌生 . 我想知道,为什么我们不能修改原点或大小,或者可能是UIView框架的这些属性的x,y或高度宽度?
frame是一个CGRect结构,原点和大小又是CGPoint和CGSize结构 . 当我们可以访问它们时,为什么我们无法修改它们?
在CGRect中没有这样的东西,我们可以修改它的属性,所以为什么我们不能用于框架或边界 .
我猜你的意思是为什么你不能做这样的事情:
myView.frame.origin.x = 23.0;
这是一个很好的问题,对此毫无愚蠢 . 问题是框架被保持为视图的属性,而不是框架的各个组件(尺寸和原点,甚至更深,宽度,长度,x和y) .
框架是视图的基础,因此如果视图的框架被修改,视图需要执行许多操作 . 如果您要直接进入并修改origin.x,那么您将绕过所有这种魔法可能发生的 setFrame 方法 .
setFrame
当您访问view.frame时,您将获得一个与view.frame具有相同值的CGRect,但实际上不是框架,因此对它的任何修改都不会影响视图 .
你可以分步完成:
CGRect frame = view.frame; frame.origin.x = 23.0; view.frame = frame;
答案在于(略微混淆)语言语法:
myView 是一个Objective-C对象 .
myView
所以 myView.frame 是要发送的属性访问器方法 .
myView.frame
它返回CGRect类型的C结构 .
frame.origin.x = 1 修改返回的代码本地临时结构 .
frame.origin.x = 1
您的意图是通过向对象发送消息来告诉对象 . 但相反,您向对象询问数据,然后修改此数据 . 对象现在永远不会 .
编译器应警告您此错误 .
2 回答
我猜你的意思是为什么你不能做这样的事情:
这是一个很好的问题,对此毫无愚蠢 . 问题是框架被保持为视图的属性,而不是框架的各个组件(尺寸和原点,甚至更深,宽度,长度,x和y) .
框架是视图的基础,因此如果视图的框架被修改,视图需要执行许多操作 . 如果您要直接进入并修改origin.x,那么您将绕过所有这种魔法可能发生的
setFrame
方法 .当您访问view.frame时,您将获得一个与view.frame具有相同值的CGRect,但实际上不是框架,因此对它的任何修改都不会影响视图 .
你可以分步完成:
答案在于(略微混淆)语言语法:
myView
是一个Objective-C对象 .所以
myView.frame
是要发送的属性访问器方法 .它返回CGRect类型的C结构 .
frame.origin.x = 1
修改返回的代码本地临时结构 .您的意图是通过向对象发送消息来告诉对象 . 但相反,您向对象询问数据,然后修改此数据 . 对象现在永远不会 .
编译器应警告您此错误 .