Adaptive Layout
发布日期:2022-03-18 08:27:38 浏览次数:29 分类:技术文章

本文共 3318 字,大约阅读时间需要 11 分钟。

Adaptive Layout

Size Classes

Size Classes

这里写图片描述

在Attribute Inspector下可以,添加不同的Size Class

添加Size Class

第一个表示的是any Width any Height

选中Installed表示的是,在当前Size Class下有效

为不同的Size Class设置不同的约束

在Size Inspector中的constraint中,选中某个constraint,按delete删除后,只表示这个约束在这个Size Class下是uninstalled,并不表示删除了某个约束。

uninstalled

为不同的Size Class设置不同的Fonts和Images

Fonts
对于简单的缩放,可以使用Minimum Font Scale / Minimun Font Size
缩放

还可以添加对应的Size Class下的font

font

Images

需要在Images.xcassets中设置,如下图:
Images

  • +代表regular
  • -代表compact
  • *代表any

使用代码为size class创建不同的versions

例如为compact height创建不同的scale的图片

let scale1x = UITraitCollection(displayScale: 1.0)let scale2x = UITraitCollection(displayScale: 2.0)let scale3x = UITraitCollection(displayScale: 3.0)let compactHeight = UITraitCollection(verticalSizeClass: .Compact)let image = UIImage(named: "cloud_big.png")!image.imageAsset?.registerImage(UIImage(named: "cloud_big_2x.png")!, withTraitCollection: scale2x)image.imageAsset?.registerImage(UIImage(named: "cloud_big_3x.png")!, withTraitCollection: scale3x)image.imageAsset?.registerImage(UIImage(named: "cloud_small.png")!, withTraitCollection:  UITraitCollection(traitsFromCollections: [scale1x, compactHeight]))image.imageAsset?.registerImage(UIImage(named: "cloud_small_2x.png")!, withTraitCollection:  UITraitCollection(traitsFromCollections: [scale2x, compactHeight]))image.imageAsset?.registerImage(UIImage(named: "cloud_small_3x.png")!, withTraitCollection:  UITraitCollection(traitsFromCollections: [scale3x, compactHeight]))weatherImage.image = image

具体见

UITraitCollection

请参考

为了表征 Size Classes,Apple 在 iOS 8 中引入了一个新的类,UITraitCollection。这个类封装了像水平和竖直方向的 Size Class 等信息。iOS 8 的 UIKit 中大多数 UI 的基础类 (包括 UIScreenUIWindowUIViewControllerUIView) 都实现了 UITraitEnvironment 这个接口,通过其中的 traitCollection 这个属性,我们可以拿到对应的 UITraitCollection 对象,从而得知当前的 Size Class,并进一步确定界面的布局。

UIKit 中的响应者链正好相反,traitCollection 将会在 view hierarchy 中自上而下地进行传递。对于没有指定 traitCollection 的 UI 部件,将使用其父节点的 traitCollection。这在布局包含 childViewController 的界面的时候会相当有用。在 UITraitEnvironment 这个接口中另一个非常有用的是 -traitCollectionDidChange:。在 traitCollection 发生变化时,这个方法将被调用。在实际操作时,我们往往会在 ViewController 中重写 -traitCollectionDidChange: 或者 -willTransitionToTraitCollection:withTransitionCoordinator: 方法 (对于 ViewController 来说的话,后者也许是更好的选择,因为提供了转场上下文方便进行动画;但是对于普通的 View 来说就只有前面一个方法了),然后在其中对当前的 traitCollection 进行判断,并进行重新布局以及动画。

Appearance Proxy

Appearance for Trait Collection

UIView.appearance()UIView.appearanceForTraitCollection(<#T##trait: UITraitCollection##UITraitCollection#>)

例如,调整NavigationBar在不同Size Class下的,文字的颜色、大小

let navbarAppearance = UINavigationBar.appearanceForTraitCollection(UITraitCollection(verticalSizeClass: .Unspecified))    navbarAppearance.titleTextAttributes = [NSFontAttributeName : UIFont(name:"Avenir Next", size:28)!,                                            NSForegroundColorAttributeName: UIColor.redColor()]    //compact    let navbarCompactAppearance = UINavigationBar.appearanceForTraitCollection(UITraitCollection(verticalSizeClass: .Compact))    navbarCompactAppearance.titleTextAttributes = [NSFontAttributeName : UIFont(name:"Avenir Next", size:20)!, NSForegroundColorAttributeName: UIColor.orangeColor()]

效果如下:

regular
compact

具体过程请参见

Adaptive Presentation

Presentation Controller Delegate

func adaptivePresentationStyleForPresentationController(  controller: UIPresentationController,  traitCollection: UITraitCollection) -> UIModalPresentationStyle

转载地址:https://windzen.blog.csdn.net/article/details/52160687 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:iOS9下代码创建约束
下一篇:iOS播放器常用功能

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月05日 05时22分10秒