selector

Xcode AutoLayout布局(三) 自动适配机型准备配置

2018-11-05  本文已影响0人  查理布朗Bio

适配原则
  由于不同机型宽高比不同,我们以不同机型屏幕宽度为基准进行等比例缩放,经过数据分析,决定以iPhone 6/6s/7/8 系列机型的宽高比作为基准进行适配。根据下表可以看出,当以该比例进行适配时,当前宽高比较低的机型溢出的高度完全可以接受,当然为了更好的适配,我们也可以对垂直间距按照一定比例进行变更。



实现方法
  为了能够在sb上直接进行设置,我们借助@IBInspectable方法,让自定义属性出现在IB的Attributes inspector中

/// 设置基准宽度
private let default_Width:CGFloat = 375
/// 换算对应机型尺寸(以default_Width为基准)
private func calculateScale(_ length: CGFloat) -> CGFloat {
    return length * (UIScreen.main.bounds.width/default_Width)
}

/// 由于无法在IB内添加自定义参数,故使用CGSize来替代自定义多元参数


/// 视图扩展
extension UIView {
    /// 基准倒角
    /// - width-最小值(无最小值填0) height-基准值 返回值-(width:0, height:真实倒角)@IBInspectable,需要在user Defined Runtime Attributes进行设置
    @IBInspectable var fitCornerRadius:CGSize {
        set {
            let scaleSize = calculateScale(newValue.height)
            if scaleSize < newValue.width && newValue.width != 0{
                layer.cornerRadius = newValue.width
            }else{
                layer.cornerRadius = scaleSize
            }
        }
        get {
            return self.fitCornerRadius
        }
    }
}
自适应倒角
/// 约束扩展
extension NSLayoutConstraint {
    /// 基准长度
    /// - width-最小值(无最小值填0) height-基准值 返回值-(width:0, height:真实长度)
    @IBInspectable var fitConstant:CGSize {
        set{
            let scaleSize = calculateScale(newValue.height)
            if scaleSize < newValue.width && newValue.width != 0{
                constant = scaleSize
            }else{
                constant = scaleSize
            }
        }
        get{
            return self.fitConstant
        }
    }
}

/// 字体扩展
extension UILabel{
    /// - width-最小值(无最小值填0) height-基准值 返回值-(width:0, height:真实字号)
    @IBInspectable var fitFontSize: CGSize {
        set{
            let scaleSize = calculateScale(newValue.height)
            if scaleSize < newValue.width && newValue.width != 0 {
                font = UIFont(name: font.fontName, size: newValue.width)
            }else{
                font = UIFont(name: font.fontName, size: scaleSize)
            }
        }
        get {
            return self.fitFontSize
        }
    }
}
自适应字体字号
/// 按钮扩展
extension UIButton {
    /// 基准字号
    /// - width-最小值(无最小值填0) height-基准值 返回值-(width:0, height:真实字号)
    @IBInspectable var fitFontSize: CGSize {
        set{
            let scaleSize = calculateScale(newValue.height)
            if scaleSize < newValue.width && newValue.width != 0 {
                if titleLabel != nil {
                    titleLabel!.font = UIFont(name: titleLabel!.font.fontName, size: calculateScale(newValue.width))
                }
            }else{
                if titleLabel != nil {
                    titleLabel!.font = UIFont(name: titleLabel!.font.fontName, size: calculateScale(scaleSize))
                }
            }
        }
        get{
            return self.fitFontSize
        }
    }
}
自适应按钮字号
/// 输入文本扩展
extension UITextField {
    /// 基准字号
    /// - width-最小值(无最小值填0) height-基准值 返回值-(width:0, height:真实字号)
    @IBInspectable var fitFontSize: CGSize {
        set{
            let scaleSize = calculateScale(newValue.height)
            if scaleSize < newValue.width && newValue.width != 0 {
                if font != nil {
                    font = UIFont(name: font!.fontName, size: newValue.width)
                }
            }else{
                if font != nil {
                    font = UIFont(name: font!.fontName, size: scaleSize)
                }
            }
        }
        get{
            return self.fitFontSize
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读