2018-10-29

又出了一款大手机,问题就是要适配了,适配自然是要根据屏幕尺寸来。
怎么代表尺寸,当然是用枚举了(Swift的枚举真的优秀)

public enum ScreenModel {

    public enum ClassicModel {
        case inch35
        case inch4
    }

    case classic(ClassicModel)
    case bigger
    case biggerPlus
    case x
    case xMax
}

想一下历代手机,无非就是枚举里面的这几种,比更大还更大。
然后就可以根据屏幕来获得对应的枚举了

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
    }
}()

光知道是什么屏还不够,得根据不同的屏幕来做我们想做的事情。适配无非就是在不同的分辨率下设置不同的值,或者根据分辨率做一些其它的事情,用泛型真的再好不过。
手机是个四方形,所以只要关注横和竖,哈哈哈。

public enum Ruler {
    case iPhoneHorizontal(T, T, T)
    case iPhoneVertical(T, T, T, T, T, T)
}

一个带泛型的枚举(优秀),分别是横和竖。横着有三种尺寸,normal,bigger,biggerplus。
竖着就不同了,4,5,6,6plus,x,xplus。
所以第一个枚举有三个泛型参数,第二个枚举有六个。

    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
            }
        }

在枚举里面设一个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()


泛型的好处就是不仅仅是设置个size那么简单,你甚至可以设置颜色或者函数,是不是很酷。
Ruler了解一下

你可能感兴趣的:(2018-10-29)