又出了一款大手機,問題就是要適配了,適配自然是要根據(jù)屏幕尺寸來。
怎么代表尺寸,當然是用枚舉了(Swift的枚舉真的優(yōu)秀)
public enum ScreenModel {
public enum ClassicModel {
case inch35
case inch4
}
case classic(ClassicModel)
case bigger
case biggerPlus
case x
case xMax
}
想一下歷代手機,無非就是枚舉里面的這幾種,比更大還更大。
然后就可以根據(jù)屏幕來獲得對應(yīng)的枚舉了
private let screenModel: ScreenModel = {
let screen = UIScreen.main
let height = max(screen.bounds.width, screen.bounds.height)
switch height {
case 480:
return .classic(.inch35)
case 568:
return .classic(.inch4)
case 667:
return .bigger
case 736, 1920:
return .biggerPlus
case 812:
return .x
case 896:
return .xMax
default:
print("Warning: Can NOT detect screenModel! bounds: \(screen.bounds) nativeScale: \(screen.nativeScale)")
return .bigger // Default
}
}()
光知道是什么屏還不夠,得根據(jù)不同的屏幕來做我們想做的事情。適配無非就是在不同的分辨率下設(shè)置不同的值,或者根據(jù)分辨率做一些其它的事情,用泛型真的再好不過。
手機是個四方形,所以只要關(guān)注橫和豎,哈哈哈。
public enum Ruler<T> {
case iPhoneHorizontal(T, T, T)
case iPhoneVertical(T, T, T, T, T, T)
}
一個帶泛型的枚舉(優(yōu)秀),分別是橫和豎。橫著有三種尺寸,normal,bigger,biggerplus。
豎著就不同了,4,5,6,6plus,x,xplus。
所以第一個枚舉有三個泛型參數(shù),第二個枚舉有六個。
public var value: T {
switch self {
case let .iPhoneHorizontal(classic, bigger, biggerPlus):
switch screenModel {
case .classic:
return classic
case .bigger:
return bigger
case .biggerPlus:
return biggerPlus
case .x:
return bigger
case .xMax:
return biggerPlus
default:
return biggerPlus
}
case let .iPhoneVertical(inch35, inch4, bigger, biggerPlus, x, xMax):
switch screenModel {
case .classic(let model):
switch model {
case .inch35:
return inch35
case .inch4:
return inch4
}
case .bigger:
return bigger
case .biggerPlus:
return biggerPlus
case .x:
return x
case .xMax:
return xMax
default:
return biggerPlus
}
}
在枚舉里面設(shè)一個value的屬性,就可以得到不同尺寸下的值。
let width = Ruler.iPhoneHorizontal(10, 20, 30).value
let height = Ruler.iPhoneVertical(5, 10, 20, 30, 40).value
colorView.backgroundColor = Ruler.iPhoneVertical(UIColor.black, UIColor.red, UIColor.blue, UIColor.green, UIColor.yellow).value
typealias Greeting = () -> Void
let greeting: Greeting = Ruler.iPhoneVertical(
{ print("Hello!") },
{ print("Hi!") },
{ print("How are you!") },
{ print("How do you do!") },
{ print("好久不見!") },
greeting()
泛型的好處就是不僅僅是設(shè)置個size那么簡單,你甚至可以設(shè)置顏色或者函數(shù),是不是很酷。
Ruler了解一下