iOS開發(fā)中iPhone和iPad的布局適配(工具篇)

UIAdaptiveKit

image.png
  • LayoutTool.swift : UI自動布局的便捷方法, 主要有常用的 寬度, 高度, 字體大小設(shè)置. 非常用的封裝在LayoutTool的struct里面.
  • LayoutMethod.swift : 為 LayoutTool提供實現(xiàn)的方法
  • UIDevice+Extension.swift : 為設(shè)備提供便捷方法 例如判斷機型, 系統(tǒng)類型 等等.
    相關(guān)代碼如下:

LayoutTool.swift

import UIKit

///適配手機和平板的寬度
public func autoWidth(_ width: CGFloat) -> CGFloat {
    if  UIApplication.shared.statusBarOrientation.isLandscape {
        return LayoutMethod.autoLayoutWidth(iPhoneWidth: width)
    }else {
        return  LayoutMethod.autoLayoutHeight(iPhoneHeight: width)
    }
}
///適配手機和平板的高度
public func autoHeihgt(_ height: CGFloat) -> CGFloat {
    
    if  UIApplication.shared.statusBarOrientation.isLandscape {
        return LayoutMethod.autoLayoutHeight(iPhoneHeight: height)
    }else {
        return  LayoutMethod.autoLayoutWidth(iPhoneWidth: height)
    }
}

///系統(tǒng)字號
func autoFontSize(_ font: Float) -> UIFont {

    let floatSize = UIDevice.isIpad ? font * 1.5 : font
    let font : UIFont = UIFont.systemFont(ofSize: CGFloat(floatSize))
    return font
}

struct LayoutTool{
    
    ///加粗的系統(tǒng)字號
    static func autoBoldfontSize(_ font: Float) -> UIFont {

        let floatSize = UIDevice.isIpad ? font * 1.5 : font
        let font : UIFont = UIFont.boldSystemFont(ofSize: CGFloat(floatSize))
        return font
    }

    ///安全距離的Insets
    static var safeAreaInsets: UIEdgeInsets {
        if #available(iOS 11.0, *) {
            return UIApplication.shared.delegate?.window??.safeAreaInsets ?? .zero
        }
        return .zero
    }
    ///左邊安全距離
    static let leftSafeInset = safeAreaInsets.left
    ///右邊安全距離
    static let rightSafeInset = safeAreaInsets.right
    ///上邊安全距離
    static let topSafeInset = safeAreaInsets.top
    ///下邊安全距離
    static let bottomSafeInset = safeAreaInsets.bottom
    
    ///橫屏下的屏幕寬度
    static let autoScreenWidth = max(UIScreen.main.bounds.height, UIScreen.main.bounds.width)
    
    ///橫屏下的屏幕高度
    static let autoScreenHeight = min(UIScreen.main.bounds.height, UIScreen.main.bounds.width)
}

LayoutMethod.swift

import UIKit
 
struct LayoutMethod {

    ///橫屏情況下的寬度設(shè)置
    ///
    /// - Parameters:
    ///   - iPhoneWidth: iPhone6 垂直方向@2x尺寸
    ///   - iPadWidth: 分辨率比例為768*1024的iPad
    /// - Returns: 適配后的尺寸

   static  func autoLayoutWidth(iPhoneWidth: CGFloat, iPadWidth: CGFloat? = nil) -> CGFloat {
        var autoWidth: CGFloat = 0.0
        let normalWidth:CGFloat = 667.0//以iphone6為標準  375 * 667
        let actualwidth = LayoutTool.autoScreenWidth//橫屏下的屏幕寬度
        //iphone的自動布局
        if UIDevice.isIphone {
            if UIDevice.isiPhoneXSeries() {//是否iPhone X系列
                autoWidth = (iPhoneWidth * ((actualwidth - 78.0) / normalWidth)).rounded(3)//精確到小數(shù)點后3位
            }else{
                 autoWidth = (iPhoneWidth * (actualwidth/normalWidth)).rounded(3)
            }
        //iPad的自動布局
        }else if UIDevice.isIpad{
            guard let ipadW = iPadWidth else {
                autoWidth = (iPhoneWidth * (actualwidth/normalWidth)).rounded(3)
                return autoWidth
            }
            autoWidth = (ipadW * (actualwidth/normalWidth)).rounded(3)
        }
        return autoWidth
    }
    
     ///橫屏情況下的高度設(shè)置
     ///
     /// - Parameters:
     ///   - iPhoneH: iPhone6 垂直方向
     ///   - iPadH: 分辨率比例為768*1024的iPad
     /// - Returns: 適配后的尺寸

    static  func autoLayoutHeight(iPhoneHeight: CGFloat, iPadHeight: CGFloat? = nil) -> CGFloat {

        var autoHeight: CGFloat = 0.0
        let normalHeight:CGFloat = 375.0//以iphone6為標準  375 * 667
        let actualHeight = LayoutTool.autoScreenHeight //橫屏下的屏幕高度
         //iphone的自動布局
         if UIDevice.isIphone {
            autoHeight = (iPhoneHeight * (actualHeight/normalHeight)).rounded(3)
        //iPad的自動布局
         }else if UIDevice.isIpad{
            
            guard let ipadH = iPadHeight else {
                autoHeight = (iPhoneHeight * (actualHeight/normalHeight)).rounded(3)
                return autoHeight
            }
            autoHeight = (ipadH * (actualHeight/normalHeight)).rounded(3)
         }
         return autoHeight
     }


}

public extension CGFloat {
    ///精確到小數(shù)點后幾位
    func rounded(_ decimalPlaces: Int) -> CGFloat {
        let divisor = pow(10.0, CGFloat.maximum(0, CGFloat(decimalPlaces)))
        return CGFloat((CGFloat(self) * divisor).rounded() / divisor)
    }
}

UIDevice+Extension.swift


import UIKit

extension UIDevice {
    
    // MARK: - 判斷 機型
    static let isIphone = UIDevice.current.userInterfaceIdiom == .phone
    static let isIpad = UIDevice.current.userInterfaceIdiom == .pad
    
    /// 判斷是否為劉海屏 iphonex系列
    static func isiPhoneXSeries() -> Bool {
        
        guard #available(iOS 11.0, *) else {
            return false
        }
        return UIApplication.shared.windows[0].safeAreaInsets != UIEdgeInsets.zero
    }
    
    // MARK: - 系統(tǒng)類型
    public class func isiOS13() -> Bool {
        if #available(iOS 13.0, *) {
            return true
        } else {
            return false
        }
    }
    
    public class func isiOS12() -> Bool {
        if #available(iOS 12.0, *) {
            return true
        } else {
            return false
        }
    }
    
    public class func isiOS11() -> Bool {
        if #available(iOS 11.0, *) {
            return true
        } else {
            return false
        }
    }
    
    public class func isiOS10() -> Bool {
        if #available(iOS 10.0, *) {
            return true
        } else {
            return false
        }
    }
    
    public class func isiOS9() -> Bool {
        if #available(iOS 9.0, *) {
            return true
        } else {
            return false
        }
    }
    
    // MARK: - 屏幕類型
    @objc public class func isiPhoneX() -> Bool {
        if (UIScreen.main.currentMode?.size.equalTo(CGSize.init(width: 1125, height: 2436)))! {
            return true
        }
        return false
    }
    
    public class func isiPhone6PlusBigMode() -> Bool {
        if (UIScreen.main.currentMode?.size.equalTo(CGSize.init(width: 1125, height: 2001)))! {
            return true
        }
        return false
    }
    
    public class func isiPhone6Plus() -> Bool {
        if (UIScreen.main.currentMode?.size.equalTo(CGSize.init(width:1242, height: 2208)))! {
            return true
        }
        return false
    }
    
    public class func isiPhone6BigMode() -> Bool{
        if (UIScreen.main.currentMode?.size.equalTo(CGSize.init(width: 320, height: 568)))! {
            return true
        }
        return false
    }
    
    public class func isiPhone6() -> Bool {
        if (UIScreen.main.currentMode?.size.equalTo(CGSize.init(width:750, height: 1334)))! {
            return true
        }
        return false
    }
    
    public class func isiPhone5() -> Bool {
        if (UIScreen.main.currentMode?.size.equalTo(CGSize.init(width: 640, height: 1136)))! {
            return true
        }
        return false
    }
    

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末犯祠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仗颈,更是在濱河造成了極大的恐慌噪珊,老刑警劉巖钉迷,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡琼讽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門沥阳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跨琳,“玉大人,你說我怎么就攤上這事桐罕÷鋈茫” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵功炮,是天一觀的道長溅潜。 經(jīng)常有香客問我,道長薪伏,這世上最難降的妖魔是什么滚澜? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮嫁怀,結(jié)果婚禮上设捐,老公的妹妹穿的比我還像新娘借浊。我一直安慰自己,他們只是感情好萝招,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布蚂斤。 她就那樣靜靜地躺著,像睡著了一般槐沼。 火紅的嫁衣襯著肌膚如雪曙蒸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天岗钩,我揣著相機與錄音纽窟,去河邊找鬼。 笑死兼吓,一個胖子當著我的面吹牛臂港,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播周蹭,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼趋艘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凶朗?” 一聲冷哼從身側(cè)響起瓷胧,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棚愤,沒想到半個月后搓萧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體建芙,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡吞琐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了览濒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片次和。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡反肋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出踏施,到底是詐尸還是另有隱情石蔗,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布畅形,位于F島的核電站养距,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏日熬。R本人自食惡果不足惜棍厌,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧耘纱,春花似錦敬肚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至畸陡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虽填,已是汗流浹背丁恭。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斋日,地道東北人牲览。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像恶守,于是被迫代替她去往敵國和親第献。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345