2018-10-29

又出了一款大手機,問題就是要適配了,適配自然是要根據(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了解一下

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容