├── LayoutTrait.swift └── README.md /LayoutTrait.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LayoutTrait.swift 3 | // DoudouApp 4 | // 5 | // Created by yushuyi on 15/7/23. 6 | // Copyright © 2015年 DoudouApp. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @available(iOS 8.0, *) 12 | extension UITraitCollection { 13 | 14 | //MARK: Width Compact 15 | func wCompact_hCompact() -> Bool { 16 | return self.horizontalSizeClass == .Compact && self.verticalSizeClass == .Compact 17 | } 18 | 19 | func wCompact_hRegular () -> Bool { 20 | return self.horizontalSizeClass == .Compact && self.verticalSizeClass == .Regular; 21 | } 22 | 23 | func wCompact_hAny () -> Bool { 24 | return self.horizontalSizeClass == .Compact; 25 | } 26 | 27 | //MARK: Width Regular 28 | func wRegular_hRegular () -> Bool { 29 | return self.horizontalSizeClass == .Regular && self.verticalSizeClass == .Regular; 30 | } 31 | 32 | func wRegular_hCompact () -> Bool { 33 | return self.horizontalSizeClass == .Regular && self.verticalSizeClass == .Compact; 34 | } 35 | 36 | func wRegular_hAny () -> Bool { 37 | return self.horizontalSizeClass == .Regular; 38 | } 39 | 40 | func wAny_hAny () -> Bool { 41 | return true; 42 | } 43 | } 44 | 45 | 46 | @available(iOS 8.0, *) 47 | extension UITraitCollection { 48 | class func wCompact_hCompact() -> UITraitCollection { 49 | let wSizeClass = UIUserInterfaceSizeClass.Compact 50 | let hSizeClass = UIUserInterfaceSizeClass.Compact 51 | return generateTrait([wSizeClass,hSizeClass]) 52 | } 53 | 54 | class func wCompact_hRegular() -> UITraitCollection { 55 | let wSizeClass = UIUserInterfaceSizeClass.Compact 56 | let hSizeClass = UIUserInterfaceSizeClass.Regular 57 | return generateTrait([wSizeClass,hSizeClass]) 58 | } 59 | 60 | class func wCompact_hAny() -> UITraitCollection { 61 | let wSizeClass = UIUserInterfaceSizeClass.Compact 62 | let hSizeClass = UIUserInterfaceSizeClass.Unspecified 63 | return generateTrait([wSizeClass,hSizeClass]) 64 | } 65 | 66 | class func wRegular_hRegular() -> UITraitCollection { 67 | let wSizeClass = UIUserInterfaceSizeClass.Regular 68 | let hSizeClass = UIUserInterfaceSizeClass.Regular 69 | return generateTrait([wSizeClass,hSizeClass]) 70 | } 71 | 72 | class func wRegular_hCompact() -> UITraitCollection { 73 | let wSizeClass = UIUserInterfaceSizeClass.Regular 74 | let hSizeClass = UIUserInterfaceSizeClass.Compact 75 | return generateTrait([wSizeClass,hSizeClass]) 76 | } 77 | 78 | class func wRegular_hAny() -> UITraitCollection { 79 | let wSizeClass = UIUserInterfaceSizeClass.Regular 80 | let hSizeClass = UIUserInterfaceSizeClass.Unspecified 81 | return generateTrait([wSizeClass,hSizeClass]) 82 | } 83 | 84 | class func wAny_hAny() -> UITraitCollection { 85 | let wSizeClass = UIUserInterfaceSizeClass.Unspecified 86 | let hSizeClass = UIUserInterfaceSizeClass.Unspecified 87 | return generateTrait([wSizeClass,hSizeClass]) 88 | } 89 | 90 | private class func generateTrait(whSizeClass : [UIUserInterfaceSizeClass]) -> UITraitCollection { 91 | let wCollection = UITraitCollection(horizontalSizeClass: whSizeClass[0]) 92 | let hCollection = UITraitCollection(verticalSizeClass: whSizeClass[1]) 93 | return UITraitCollection(traitsFromCollections: [wCollection,hCollection]) 94 | } 95 | 96 | 97 | } 98 | 99 | 100 | @available(iOS 9.0, *) 101 | enum LayoutTrait : Int { 102 | 103 | case FullScreen = 0 104 | case HorizontalRegular //横屏 2/3 105 | case HorizontalCenter //横屏 1/2 106 | case HorizontalCompact //横屏 1/3 107 | 108 | case VerticalRegular //竖屏 2/3 109 | case VerticalCompact //竖屏 1/3 110 | case None 111 | } 112 | 113 | @available(iOS 9.0, *) 114 | 115 | func currentLayoutTrait() -> LayoutTrait { 116 | 117 | if UIDevice.currentDevice().userInterfaceIdiom != UIUserInterfaceIdiom.Pad { 118 | return .None 119 | } 120 | 121 | let windowSize = UIApplication.sharedApplication().keyWindow?.bounds.size ?? CGSizeZero 122 | if CGSizeEqualToSize(windowSize, CGSizeZero) { 123 | //如果windowSize 等于 CGSizeZero 应该 keyWindow 初始化时 没有直接使用 init 初始化导致 124 | return .None 125 | } 126 | 127 | let screenSize = UIScreen.mainScreen().bounds.size 128 | if CGSizeEqualToSize(screenSize, CGSizeMake(1366, 1024)) || CGSizeEqualToSize(screenSize, CGSizeMake(1024, 1366)) { 129 | 130 | let sizeTuple = (windowSize.width,windowSize.height) 131 | switch sizeTuple { 132 | case (981,1024): 133 | return .HorizontalRegular 134 | case (678,1024): 135 | return .HorizontalCenter 136 | case (375,1024): 137 | return .HorizontalCompact 138 | case (375, 1366): 139 | return .VerticalCompact 140 | case (639, 1366): 141 | return .VerticalRegular 142 | case (1366, 1024): 143 | return .FullScreen 144 | case (1024, 1366): 145 | return .FullScreen 146 | default: 147 | return .None 148 | } 149 | }else { 150 | let sizeTuple = (windowSize.width,windowSize.height) 151 | switch sizeTuple { 152 | case (694,768): 153 | return .HorizontalRegular 154 | case (507,768): 155 | return .HorizontalCenter 156 | case (320,768): 157 | return .HorizontalCompact 158 | case (320,1024): 159 | return .VerticalCompact 160 | case (438,1024): 161 | return .VerticalRegular 162 | case (1024, 768): 163 | return .FullScreen 164 | case (768, 1024): 165 | return .FullScreen 166 | default: 167 | return .None 168 | } 169 | } 170 | } 171 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LayoutTrait 2 | LayoutTrait is a UITraitCollection check helper! 3 | 4 | 5 | --------------------------------------------------------------------------------