Size Classes

1 引言

1.1 目的

对Size Classes有个大概的了解与学习,并作出笔记,以便以后参考。

1.2 参考资料

WWDC 2014 Session笔记 - iOS界面开发的大一统

iOS8 Size Classes初探

1.3 术语和缩写词

Any:A

Regular:R

Compact:C

2 简介

Size Classes 为 iOS 8 的新特性,其特点就是将各个设备屏幕及其旋转后状态都抽象成屏幕Size的变化,而不再关心具体的尺寸。具体就是将屏幕的宽度抽象成Compact(紧凑型)、Any(任意)、Regular(常规)三种情况,高度也是如此,因此就有9种情况。简单的说,就是在一个Storyboard或者xib上,能够管理9种类型的视图。

2.1 与自动布局的区别

  1. Size Classes只是将视图分类,AutoLayout才是对视图进行布局。

  2. Size Classes依赖于AutoLayout。关闭AutoLayout,则Size Classes无法开启。关闭Size Classes,对AutoLayout无影响。

2.2 在设备上的使用

这里写图片描述

这里写图片描述

如果没有特殊指定Size的类型,则默认是在 wAny hAny 模式下设置。其它8种类型继承于这个类型。

  • 在storyboard中添加一个imageView,将imageView的图片设置如下。对图片设置好约束后,可以在Xcode右侧的属性选项中看到 installed ,默认表示为 AA。我们可以看到下面Preview内容在所有设备类型中都是显示这张图片。

这里写图片描述

  • 现在我们来对imageView进行操作,点击 installed 左边的 ,添加 C R 类型的视图 (C R)。

这里写图片描述

  • 取消 C R 的打勾项☑️,此时我们可以从Preview中看到Size类型为C R 的都不显示imageView。

这里写图片描述

  • 只有选择installed之后,图片才会被绘制在View上,如果没有选择installed,则不会绘制在View上,左图为选择installed,右图没有选择installed:

这里写图片描述

这里写图片描述

简单的三个步骤,我们就能实现 imageView 在 ipad 竖屏上显示,在iphone竖屏不显示。

同理,如果你想让 imageView 只在 iphone 竖屏上,则将默认的installed(第一个)取消打勾,然后对 C R的 installed 打勾。

再举个简单的例子:

  • 现在我们想让 imageView 只在 iphone 6Plus(5.5寸)横屏上不显示图片。我们可以如下操作:

这里写图片描述

  • 然后在右边中添加 RC 的installed,取消打勾,此时效果如下,只有 6Plus 无法显现imageView。

这里写图片描述

2.3 在Asset上的使用

不仅视图可以用Size Classes来进行抽象分类,Image Asset也能支持Size Classes,用法类似。如下图:

这里写图片描述

通过选择Width和Height的类型可以设置不同类型对应不同的图片 (*表示A、+表示R、-表示C),例如:

这里写图片描述

不过设置assets的时候不能通过Preview来实时观察图片的变化,所以只能运行模拟器,可以发现选择的时候会默认改变图片:

这里写图片描述

我们可以打开image的content.json,查看里面的具体内容:

这里写图片描述

可以发现,image的content.json数据中,1x的图片多出了”width-class”和”height-class”两个键值。

这里写图片描述

可以看到,旋转时候如果想要改变图片,我们再也不用

2.4 在约束上的使用

前面提到,Size Classes是依赖于AutoLayout,所以设置Constraint的时候也可以设置Size Classes的类型,例子如下:

  • 回到storyboard,点击其中的一条约束,如下图:

这里写图片描述

  • 添加 R C 的约束:

这里写图片描述

  • 在Preview中可以看到,6Plus横屏下image的高度变成200。

3 适用场景

  • 同个工程,同一个视图,不同设备上(iPhone,iPad)显示或隐藏;
  • 多种屏幕类型中使用同一个imageView,但图片不同;
  • 多种屏幕类型中使用同一个视图,但视图的约束不一致。

4 代码使用

为了 Size Classes,Apple 在 iOS 8 中引入了一个新的类,UITraitCollection。这个类封装了像水平和竖直方向的 Size Class 等信息。

iOS 8 的 UIKit 中大多数 UI 的基础类 (包括 UIScreen,UIWindow,UIViewController 和 UIView) 都实现了 UITraitEnvironment 这个接口,通过其中的 traitCollection 这个属性,我们可以拿到对应的 UITraitCollection 对象,从而得知当前的 Size Class,并进一步确定界面的布局。

    if(self.view.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact){
        NSLog(@"该视图的水平方向为 compact 类型");
    }
    if (self.view.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular) {
        NSLog(@"该视图的垂直方向为 regular 类型");
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值