iOS XIB的屏幕尺寸適配

開發(fā)中,都會有適應各種屏幕尺寸的需要,因為4s年代久遠,本文中就沒有針對4s的適配(其實屏幕寬度和5s一樣,開發(fā)中按5s的適配參數(shù)來就行了,高度適配的話就把頁面調(diào)成滑動的就好了),話不多說,先上適配參數(shù),

let iphone5  = UIScreen.instancesRespond(to:#selector(getter: UIScreen.main.currentMode)) ? __CGSizeEqualToSize(CGSize(width:960,height:1336), (UIScreen.main.currentMode?.size)!) : false
let iphone6  = UIScreen.instancesRespond(to:#selector(getter: UIScreen.main.currentMode)) ? __CGSizeEqualToSize(CGSize(width:750,height:1334), (UIScreen.main.currentMode?.size)!) : false
let iphone6p  = UIScreen.instancesRespond(to:#selector(getter: UIScreen.main.currentMode)) ? __CGSizeEqualToSize(CGSize(width:1242,height:2208), (UIScreen.main.currentMode?.size)!) : false
let iphone6pBigMode = UIScreen.instancesRespond(to:#selector(getter: UIScreen.main.currentMode)) ? __CGSizeEqualToSize(CGSize(width:1125,height:2001), (UIScreen.main.currentMode?.size)!) : false
let iphoneX = UIScreen.instancesRespond(to:#selector(getter: UIScreen.main.currentMode)) ? __CGSizeEqualToSize(CGSize(width:1125,height:2436), (UIScreen.main.currentMode?.size)!) : false
let iphoneXR = UIScreen.instancesRespond(to:#selector(getter: UIScreen.main.currentMode)) ? __CGSizeEqualToSize(CGSize(width:828,height:1792), (UIScreen.main.currentMode?.size)!) : false
let iphoneXSM  = UIScreen.instancesRespond(to:#selector(getter: UIScreen.main.currentMode)) ? __CGSizeEqualToSize(CGSize(width:1242,height:2688), (UIScreen.main.currentMode?.size)!) : false
let iphoneXXL = (iphoneX||iphoneXR||iphoneXSM)


//適配參數(shù)
let suitParm:CGFloat = ((iphone6p||iphoneXR||iphoneXSM) ? 1.12 : (iphone6 ? 1.0 : (iphone6pBigMode ? 1.01 : (iphoneX ? 1.0 : 0.85))))

接下來只需要在NSLayoutConstraint的extension中添加以下代碼,就能在XIB中動態(tài)的控制約束的屏幕尺寸適配

import Foundation
import UIKit
extension NSLayoutConstraint {
    @IBInspectable var adapterScreen: Bool {
        get {
            return true
        }
        
        set {
            if newValue {
               self.constant = self.constant * suitParm
            }
          
        }
    }
 
}

因為get是用不到的,所以隨便返回了個true
好了,現(xiàn)在我們就可以在XIB上找到我們設(shè)置的屬性了
選中一個約束后

image.png

然后再到最右邊就可以看到這樣的一個屬性:

image.png

我們只需要選中on:

image.png

就可以打開我們針對屏幕尺寸的約束,比較方便快捷,下面再給一下大家OC的版本,

/* iOS設(shè)備 */
#define kDevice_Is_iPhone4s ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 960), [[UIScreen mainScreen] currentMode].size) : NO)
#define kDevice_Is_iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
#define kDevice_Is_iPhone6 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(750, 1334), [[UIScreen mainScreen] currentMode].size) : NO)
#define kDevice_Is_iPhone6Plus ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2208), [[UIScreen mainScreen] currentMode].size) : NO)
#define iPhone6PlusBigMode ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2001), [[UIScreen mainScreen]currentMode].size) : NO)
//適配參數(shù)
#define KsuitParam (kDevice_Is_iPhone6Plus ?1.12:(kDevice_Is_iPhone6?1.0:(iPhone6PlusBigMode ?1.01:0.85))) //以6為基準圖

新建OC文件 NSLayoutConstraint+IBDesignable
在NSLayoutConstraint+IBDesignable.h里

#import <UIKit/UIKit.h>

@interface NSLayoutConstraint (IBDesignable)

@property(nonatomic, assign) IBInspectable BOOL adapterScreen;

@end

在NSLayoutConstraint+IBDesignable.m文件里

#import "NSLayoutConstraint+IBDesignable.h"

@implementation NSLayoutConstraint (IBDesignable)

- (void)setAdapterScreen:(BOOL)adapterScreen{

if adapterScreen{
    self.constant = self.constant * KsuitParam;
}
}

- (BOOL)adapterScreen{
    return YES;
}

@end

讓大家看看效果
5、5s或者SE:

image.png

6、7或者6s:

image.png

6p、6sp或者7p:

image.png

最后 需要注意的是 啟動圖每個尺寸都要到位 iphoneXR iphoneXM 不到位的話 獲取的UIScreen.main.currentMode?.size是不對的

一些小東西,希望對大家有幫助

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

相關(guān)閱讀更多精彩內(nèi)容

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