当前位置: 首页 > 科技观察

iOS8SizeClasses初探

时间:2023-03-12 04:06:21 科技观察

iOS8的新特性SizeClasses是对老式UI思想的新抽象:抽象每个设备(iphone4,5,6,ipad,iwatch?)的屏幕及其屏幕旋转状态intoscreens的Size的变化,这些Size归纳为几类(Class)wide(normal,arbitrary,compact),high(normal,arbitrary,compact)3x3一共9个Sizes,每个Size可以设置特定的一套布局,如果不指定,默认设置为(任意宽,任意高)模式,其他8种布局继承。听人说不用学autolayout,一步学SizeClass就可以了。这种说法是错误的,因为SizeClass对屏幕进行分类后,进行布局的仍然是Autolayout。SizeClasses和InterfaceBuilder当然,正如所料,Xcode6中的InterfaceBuilder对SizeClass的支持非常强:启用SizeClass后,IB中会出现一个SizeClass切换菜单。我们可以切换到wAny、hAny模式编辑常用的控件和布局,或者切换到特定的Class,并且可以立即预览变化,所以有一个问题:如果iPad和iPhone的布局不同,老式的写法分为ipad.storyboard和iphone.storyboard分别写,这本身就是一个bug,因为大部分控件其实都是一样的,新的SizeClass解决这个问题了吗?答案是肯定的,SizeClass的解决方案比老式好几个块:IB中某个View的存在与否,约束的存在与否,约束的值都可以根据需要单独设置到SizeClass,也就是说现在故事板是9in1。例如下面有一个Label。我只希望它出现在一个长宽窄的屏幕上(我脑子里的iwatch),所以我可以检查它(如果出现或不出现,它将被命名为“已安装”,并且该选项可以从9个尺寸中选择.MultiplechoiceinClass)SizeClassesxml文件修改说到9in1,肯定会有疑惑。这样的故事板文件会不会很大?会不会源文件比较乱,造成多人开发时经常冲突?答案是否定的,因为apple在xml中对SizeClass的描述方式是为了改变配置。这是什么意思?对比一下storyboard的xml源文件就知道了:在wAny,hAny模式下,刚才只有一个Label页面:如果在wC,hC紧凑模式下没有出现label,父视图中出现如下配置leveloflabel:因此在ib中使用了一个额外的描述字段来表示哪些元素被哪个SizeClass包含或排除。也正是因为这个描述,新的xml格式可以兼容低版本(低版本不解析这个字段,而是正常解析其他字段)SizeClasses和xcassets既然storyboard变成了9-in-1,还必须表达支持的xcassets。xcode6之后,在xcassets中添加图片时,增加了选择对应SizeClasses的菜单。展开后会像下面一样:真的很好用符号来表达-对应tight,*对应Any,+对应loose(@3x是iphone6plus)总结总的来说,iOS对UI是跨代的,Autolayout的出现使得布局的复杂度降低到View和View的关系,然后由根View(也就是屏幕)指定frame,然后所有的sub-View之间是相对排列的,frame的概念归一化为根View的frame;但是有了SizeClass之后,rootview的frame概念也被去掉了,现在整个app的UI已经和wordframe分离了,这正是Apple想要达到的目的。永别了,frame和那些还在为手写UI苦苦挣扎的iOScoder...