自动布局什么时候才能获取到frame大小 ios

 我来答
杜爷1号
2018-07-06 · 知道合伙人软件行家
杜爷1号
知道合伙人软件行家
采纳数:4973 获赞数:9186
毕业于福建农林大学,本科学士学位。从事IT行业3年,曾参与过多个大型项目的需求调研、软件研发。

向TA提问 私信TA
展开全部
打开Xcode5,创建一个基于Single View Application模板的iPhone项目。叫做"StrutsProblem":

点击Main.storyboard。在你做别的之前,首先将这个storyboard的自动布局关了。你需要在File inspector,第一个选项的第六个tabs里:

将Use Autolayout的box勾选去掉。现在storyboard使用旧的struts-and-springs模型。

注意:任何你使用Xcode4.5或更高版本中,nib或者storyboard文件都默认激活了自动布局。因为自动布局是iOS6以及以上系统的一个新特性,如果你想使用最新的Xcode开发兼容iOS5的程序,你需要将这个选项去掉。

拖拽三个新的视图到主视图上,并且像这样排列起来:

为了表述更清楚,这里给出每个视图的颜色,这样你就能分清哪个是驴子哪个是马了。
每个视图的inset到窗口的距离都是20点;视图之间的距离也是20点。底部的视图的宽是280点,上面两个视图的宽都是130点。所有的视图的高都是254。

在iPhone Retina 4-inch simulator上运行这个程序,并且将模拟器旋转到landscape。程序看起来便变成这副鬼样,这不是我想象的那样:

注意:你可以使用Hardware\Rotate Left和Rotate Right菜单选项旋转模拟器,或者通过按下键盘上的? 键,同时按下←或→。

而你想象的程序在landscape应该像这样:

很明显,三个视图的autosizing masks留下了一些需要改进的地方。将左上方视图的autosizing设置改成这样:

这将会让视图贴附左上边缘(不是右下边缘),并且当父视图大小改变时,重新调整自身水平和垂直方向的大小。

同样的,右上方视图的autosizing设置改成这样:

底部视图:

再次运行程序,并且旋转到landscape。现在看起来像这样:

已经很接近了,但又不完全一样。视图之间的padding不正确。换个说法就是视图的大小不完全正确。问题出在当父视图改变大小时,autosizing masks告诉子视图调整大小,但又没告诉子视图该调整多少(坑儿?)。

你可以调戏autosizing masks-比如,改变灵活宽度和高度设置(springs)-你不会得到完全正确的三个间距20点的视图。

为了解决这个springs和struts方法的布局问题,非常不幸,你需要额外写一些代码。

在旋转用户界面之前、之间、之后,UIKit会发送一些消息到你的视图控制器,你可以截获这些消息,从而对你UI做出改变。代表性的像viewWillLayoutSubviews,你会重写这个方法从而改变任何需要重新排列的视图的frame。

在这之前,你需要先做出一个outlet属性来引用这个视图。
匿名用户
2017-07-01
展开全部
打开Xcode5,创建一个基于SingleViewApplication模板的iPhone项目。叫做"StrutsProblem":点击Main.storyboard。在你做别的之前,首先将这个storyboard的自动布局关了。你需要在Fileinspector,第一个选项的第六个tabs里:将UseAutolayout的box勾选去掉。现在storyboard使用旧的struts-and-springs模型。注意:任何你使用Xcode4.5或更高版本中,nib或者storyboard文件都默认激活了自动布局。因为自动布局是iOS6以及以上系统的一个新特性,如果你想使用最新的Xcode开发兼容iOS5的程序,你需要将这个选项去掉。拖拽三个新的视图到主视图上,并且像这样排列起来:为了表述更清楚,这里给出每个视图的颜色,这样你就能分清哪个是驴子哪个是马了。每个视图的inset到窗口的距离都是20点;视图之间的距离也是20点。底部的视图的宽是280点,上面两个视图的宽都是130点。所有的视图的高都是254。在iPhoneRetina4-inchsimulator上运行这个程序,并且将模拟器旋转到landscape。程序看起来便变成这副鬼样,这不是我想象的那样:注意:你可以使用Hardware\RotateLeft和RotateRight菜单选项旋转模拟器,或者通过按下键盘上的?键,同时按下←或→。而你想象的程序在landscape应该像这样:很明显,三个视图的autosizingmasks留下了一些需要改进的地方。将左上方视图的autosizing设置改成这样:这将会让视图贴附左上边缘(不是右下边缘),并且当父视图大小改变时,重新调整自身水平和垂直方向的大小。同样的,右上方视图的autosizing设置改成这样:底部视图:再次运行程序,并且旋转到landscape。现在看起来像这样:已经很接近了,但又不完全一样。视图之间的padding不正确。换个说法就是视图的大小不完全正确。问题出在当父视图改变大小时,autosizingmasks告诉子视图调整大小,但又没告诉子视图该调整多少(坑儿?)。你可以调戏autosizingmasks-比如,改变灵活宽度和高度设置(springs)-你不会得到完全正确的三个间距20点的视图。为了解决这个springs和struts方法的布局问题,非常不幸,你需要额外写一些代码。在旋转用户界面之前、之间、之后,UIKit会发送一些消息到你的视图控制器,你可以截获这些消息,从而对你UI做出改变。代表性的像viewWillLayoutSubviews,你会重写这个方法从而改变任何需要重新排列的视图的frame。在这之前,你需要先做出一个outlet属性来引用这个视图。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式