美文网首页
2018-10-29

2018-10-29

作者: 麻虾尔 | 来源:发表于2018-10-29 20:56 被阅读0次

    又出了一款大手机,问题就是要适配了,适配自然是要根据屏幕尺寸来。
    怎么代表尺寸,当然是用枚举了(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<T> {
        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

          本文链接:https://www.haomeiwen.com/subject/igeitqtx.html