ios8 sizeClasses

iOS8新特性,Size Classes,是对老式UI思路的全新抽象:把各个设备屏幕(iphone4,5,6, ipad,iwatch?)以及它们的屏幕旋转状态都抽象成屏幕Size的变化,将这些Size归纳成几个类别(Class)

宽(正常,任意, 紧凑),高(正常,任意, 紧凑)

3x3共9种Size,每种Size都可以设置特定的一套布局,如果不特殊指定,默认是在(宽任意,高任意)模式下设置,且其他8种布局继承它。

听过有人说,我们不用学autolayout了,直接学Size Class就一步到位了。这个说法是不对的,因为Size Class在将屏幕分类后,执行布局的还是Autolayout。

Size Classes与Interface Builder

当然不出所料的是,Xcode6中Interface Builder对Size Class有了很强大的支持:

启用Size Class后,IB中就会出现Size Class切换的菜单

我们可以切换到wAny,hAny模式去编辑通用的控件和布局,也可以切换到某个特定Class,立刻可以预览到变化,于是有个问题:

假如iPad和iPhone的布局有差异,老式写法是分成ipad.storyboard和iphone.storyboard来分别写,这本身就是个bug,因为大部分控件其实并没差别,新Size Class解决这个问题了木?

答案是肯定的,Size Class的方案比老式的好了几条街:

IB中某个View的出现与否,约束的出现与否以及约束的值都是可以根据Size Class单独设置的,也就是说现在一个storyboard是9合1的。

比如下面有个Label,我只希望它出现在长宽紧缩的屏幕上时(脑补iwatch),这么勾选下就可以(出现或不出现被命名为”Installed”,这个选项可以从9个Size Class中多选)

Size Classes的xml文件改动

说到9合1的时候肯定会有疑问,这样的storyboard文件会不会很大?源文件会不会很乱导致多人开发经常冲突?

答案是不会的,源于apple对Size Class在xml中的描述方法是针对变化配置的,什么意思呢?对比下storyboard的xml源文件就知道了:

wAny,hAny模式下刚才只有一个Label的页面:

假如在wC,hC紧缩模式下设置不出现这个label时,在label的父view层级出现了下面的配置:

所以说ib中以附加的描述字段来表示哪些元素是被哪些Size Class包含或排除的,也正因为这样的描述方式,使得新的xml格式可以被低版本兼容(低版本不解析这个字段,但其他字段正常解析)

Size Classes与xcassets

既然storyboard变成了9合1,配套的xcassets必须也有所表示才行,xcode6后向xcassets中添加图片时增加了选择对应Size Classes的菜单,展开后会像下面一样:

通过符号表示确实不错 -对应紧缩,*对应Any,+对应宽松

(@3x是iphone6 plus)

总结

总的来说,iOS对UI这块的改动是跨时代性的,Autolayout的出现使得布局的复杂度减少到了View与View的关系上,再由根 View(也就是屏幕)指定frame,随后所有子View相对布局,把frame的概念归一化到根View的frame上;但有了Size Class后,根视图的frame概念也被移除了,这下整个app的UI和frame这个单词已然脱离关系,这也正是apple想要达到的目的。

这是下列苹果给出的尺寸

iPhone4S,iPhone5/5s,iPhone6
竖屏:(w:Compact h:Regular)
横屏:(w:Compact h:Compact)
iPhone6 Plus
竖屏:(w:Compact h:Regular)
横屏:(w:Regular h:Compact)
iPad
竖屏:(w:Regular h:Regular)
横屏:(w:Regular h:Regular)
Apple Watch(猜测)
竖屏:(w:Compact h:Compact)
横屏:(w:Compact h:Compact)

时间: 2024-08-30 10:59:11

ios8 sizeClasses的相关文章

iOS8 屏幕适配问题。

最近在做关于iPhone6,6+,以及你给iOS8 的适配. 在此做一小结. iOS多屏幕中适配的实现设计到以下几个方面. 1.宏定义: 原理:通过定义宏定义获取屏幕的宽高,从而可以动态定位视图中元素的大小和位置. 适用于: 屏幕尺寸较少,内容显示单一,满足于元素放大.缩小等较单一的呈现. 缺点:随着iPhone设备种类的增多,屏幕尺寸趋于多样化,此方式的实现变的复杂. 若需求为,针对不同的平布尺寸,屏幕显示的内容多少不同, 方式不同, 这样的需求,宏定义实现起来也是相当的复杂. 2.autol

iOS8扩展插件开发配置

一.iOS8扩展插件概述 WWDC14除了发布了OS X v10.10和switf外,iOS8.0也开始变得更加开放了.说到开放,当然要数应用扩展(App Extension)了.顾名思义,应用扩展允许开发者扩展应用的自定义功能和内容,能够让用户在使用其他应用程序时使用该项功能,从而实现各个应用程序间的功能和资源共享.可以将扩展理解为一个轻量级(nimble and lightweight)的分身. 以下为常见的三类插件: Target Type Extension point identifi

iOS8.0之后没有注册通知的提醒解决办法

在iOS8.0之后如果没注册本地通知就会报出的提醒,如下图: 解决的办法是:在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 这个方法中注册通知: if ([[UIDevice currentDevice].systemVersion doubleValue]>=8.0) { UIUserNotificationSetting

iOS8.1 编译ffmpeg和集成第三方实现直播(监控类)

最近由于项目需要,接触了一下ffmpeg的编译和使用. 由于之前的版本ffmpeg编译的库比较老,对新设备,5s及5s以后的设备支持不太好,重新编译了ffmpeg静态库. 一,下载并在终端中运行脚本编译ffmpeg 脚本参考git上的:https://github.com/kewlbear/FFmpeg-iOS-build-script: 终端进入刚刚下载后的脚本文件夹下,运行sh:build-ffmpeg.sh 自动编译,有缺少yasm的按照提示操作,安装yasm 编译的是ffmpeg2.5.

iOS8 UICollectionView横向滑动demo

在iOS8中,scrollView和加载在它上面的点击事件会有冲突,所以做一个横向滑动的界面最好的选择就是UICollectionView. 这个效果可以用苹果公司提供的官方demo修改而来,下载地址https://github.com/SeniorZhai/LineLayout. 主要介绍涉及到的几个属性,在LineLayout.m文件中: //cell大小 self.itemSize = CGSizeMake(200, 250); //水平滑动 self.scrollDirection =

iOS8定位问题解决方案

原文  http://blog.csdn.net/nextstudio/article/details/40050095 主题 iOS8 1.修改info 新增Key: NSLocationAlwaysUsageDescription 和 NSLocationWhenInUseUsageDescription ,这两个Key的值将分别用于描述应用程序始终使用和使用期间使用定位的说明,这些说明将显示在用户设置中. info新增键值对如下 : 应用程序说明参见微信: 2.CLLocationMana

iOS8中添加的extensions总结(二)

分享扩展 注:此教程来源于http://www.raywenderlich.com的<iOS8 by Tutorials> 1.准备 这次例子来源于国外的图片分享网站Imgur.com 首先现在Imgur上注册你的帐号,之后按下面的步骤来,点击settings 选择applications中新建app,即下面的create your own,这里上面的App是我得Demo 之后点击register注册你的应用 输入你App的名字后选择第二项,后面输入你的邮箱与面述,点击submit 这里请记好

iOS8以后UIAlertView和UIActionSheet两种alert页面都将通过UIAlertController来创建

1. Important: UIAlertView is deprecated in iOS 8. (Note that UIAlertViewDelegate is also deprecated.) To create and manage alerts in iOS 8 and later, instead use UIAlertController with a preferredStyle of UIAlertControllerStyleAlert. //UIAlertView和UI

iOS8上放大缩小的动画

CGAffineTransformMakeScale这个方法我们以前经常使用,但是在IOS8上出现问题了 [UIView animateWithDuration:0.3 animations:^{ bgView.frame=CGRectMake(0,0-(y/2), WIDTH, HEIGHT); logoImageView.transform=CGAffineTransformMakeScale(0, 0); }]; ios8上面如果是0的话,则会产生突然消失的情况,需要修改代码为0.1才可以