我有一个Objective-C项目,我正在重构,而且我已经找到了一条我无法翻译的行,Apple的文档网站似乎已经失效了:
[self.stepperView setFrame:self.stepperView.frame];
我试过这个:
self.stepperView.frame = stepperView.frame
但视图仍然在错误的位置绘制。有没有人知道Swift中的setFrame
等价物?
我试着查看Apple's documentation,但网站似乎已关闭了:
答案 0 :(得分:8)
setFrame
和frame
在Objective-C和Swift中是等效的。
在Objective-C中,setFrame
是生成的属性的setter方法。你也可以(在Objective-C中)view.frame = someFrame
与调用setFrame:
100%相同,这只是你喜欢哪种语法的问题。
在Swift中,所有setVariable:
方法名称都替换为等同于view.frame = ...
的点语法。
至于为什么你的观点被绘制在错误的位置,你必须发布一个具体的例子来说明你如何放置你的观点。这很可能是数学或计算错误。同样值得注意的是,与典型的笛卡尔坐标不同,iOS坐标布局的y值随着下降而增加。
我还注意到,您在屏幕截图中的一个标签中搜索到“无法在viewDidLoad之前设置框架”。 viewDidLoad
是设置任何帧值的错误位置。根据文件:
This method is called after the view controller has loaded its view hierarchy into memory. This method is called regardless of whether the view hierarchy was loaded from a nib file or created programmatically in the loadView method. You usually override this method to perform additional initialization on views that were loaded from nib files.
这意味着viewDidLoad
是初始化状态,变量的地方,不管布局的位置是什么,因为它很可能介于viewDidLoad
和viewDidAppear
之间的其他地方,你无法控制的东西是重新定位你的观点。最可能的罪魁祸首是视图边界改变和调整所有子视图。
答案 1 :(得分:0)
如果您使用具有自动布局的故事板并且将Outlet连接到视图,则设置view.frame将无效,除非您为要调整大小的对象设置translatesAutoresizingMaskIntoConstraints = true或仅取消选中文件中的自动布局Xcode检查员
如果您不使用自动布局,那么您可以在viewDidLoad()中设置view.frame大小,它将起作用
如果要以编程方式添加子视图并设置view.frame大小,则在运行时,“自动布局”不会干扰该视图的帧大小。虽然如果将新视图添加为故事板中定义的子视图且clipToBounds为true或选中了“剪辑子视图”,则会剪切新视图。
我相信Swift和Objective-C都是如此