IOS 適配方案

在公司項(xiàng)目中,我用到了xib設(shè)置約束衙耕,Masonry,比例適配,三種適配方案的結(jié)合來達(dá)到項(xiàng)目中的頁(yè)面適配勺远,字體適配等臭杰。當(dāng)然項(xiàng)目中對(duì)iPhone X的適配,我也有封裝一個(gè)分類谚中。

  • 我相信xib設(shè)置約束和Masonry,我就不用詳細(xì)介紹了,我主要介紹一下比例適配和iPhone X的適配。

一宪塔、比例適配

  • 比例適配的原理在于:iphone 機(jī)型中除了iPhone X磁奖,其他機(jī)型都是寬高比都是基本相同,那么既然寬高比相同某筐,我們就可以認(rèn)為比搭,當(dāng)我們UI設(shè)計(jì)師給的圖是任意一款蘋果機(jī)的屏幕尺寸,咱們都能根據(jù)比例去適配其他手機(jī)屏幕南誊。
第一步:創(chuàng)建一個(gè).h頭文件
20180716095949.png
第二步:在該文件里寫下如下代碼:
#ifndef Adaption_h
#define Adaption_h

#import <UIKit/UIKit.h>

#pragma 屏幕尺寸

#define kwidth [UIScreen mainScreen].bounds.size.width
#define kheight [UIScreen mainScreen].bounds.size.height

#pragma UI設(shè)計(jì)圖尺寸

#define kBaseWidth 750
#define kBaseHeight 1334
//宏定義內(nèi)聯(lián)函數(shù)
#define Inline static inline
#pragma mark --設(shè)置比例
//實(shí)際屏幕寬度和設(shè)計(jì)圖寬度的比例
Inline CGFloat AAdaptionWidth() {
    return kwidth/kBaseWidth;
}

//傳入設(shè)計(jì)圖尺寸標(biāo)注身诺,轉(zhuǎn)化為實(shí)際屏幕尺寸標(biāo)注
Inline CGFloat AAdaption(CGFloat x) {
    return x * AAdaptionWidth();
}
//傳入設(shè)計(jì)圖size,轉(zhuǎn)化為實(shí)際屏幕的CGsize返回
Inline CGSize AAdaptionSize(CGFloat width, CGFloat height) {
    CGFloat newWidth = width * AAdaptionWidth();
    CGFloat newHeight = height * AAdaptionWidth();
    return CGSizeMake(newWidth, newHeight);
}
//傳入設(shè)計(jì)圖Point抄囚,轉(zhuǎn)化成CGpoint返回
Inline CGPoint AAadaptionPoint(CGFloat x, CGFloat y) {
    CGFloat newX = x * AAdaptionWidth();
    CGFloat newY = y * AAdaptionWidth();
    return  CGPointMake(newX, newY);
}
//傳入設(shè)計(jì)圖Rect霉赡,返回已適配真實(shí)屏幕的CGrect
Inline CGRect AAdaptionRect(CGFloat x, CGFloat y, CGFloat width, CGFloat height){
    CGFloat newX = x*AAdaptionWidth();
    CGFloat newY = y*AAdaptionWidth();
    CGFloat newW = width*AAdaptionWidth();
    CGFloat newH = height*AAdaptionWidth();
    return CGRectMake(newX, newY, newW, newH);
}

Inline CGRect AAdaptionRectFromFrame(CGRect frame){
    CGFloat newX = frame.origin.x*AAdaptionWidth();
    CGFloat newY = frame.origin.y*AAdaptionWidth();
    CGFloat newW = frame.size.width*AAdaptionWidth();
    CGFloat newH = frame.size.height*AAdaptionWidth();
    return CGRectMake(newX, newY, newW, newH);
}



//字體適配:傳出設(shè)計(jì)圖字體大小
Inline UIFont * AAFont(CGFloat font){
    return [UIFont systemFontOfSize:font*AAdaptionWidth()];
}
//加粗字體適配
Inline UIFont * BoldFont(CGFloat font){
    return [UIFont boldSystemFontOfSize:font*AAdaptionWidth()];
}

#endif /* Adaption_h */
第三步:在項(xiàng)目中使用
  • 導(dǎo)入頭文件
    #import "Adaption.h"

  • 代碼調(diào)用與普通初始化類似

    UIView *redView = [[UIView alloc]initWithFrame:AAdaptionRect(100, 100, 100, 100)];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];
    

你現(xiàn)在可以試一下各個(gè)屏幕上顯示的效果,肯定是能適配的幔托,除了iPhone X

  • 這個(gè)適配文件有一個(gè)缺點(diǎn)穴亏,只適配豎屏,橫屏事得重新設(shè)置設(shè)計(jì)圖設(shè)計(jì)圖尺寸重挑,或者用masonry適配嗓化。

iPhone X的適配:

  • 首先在配置文件里定義幾個(gè)宏
//宏定義常用的導(dǎo)航欄,tabbar谬哀,狀態(tài)欄高度
#define TabBarH ((kheight == 812) ? 83 : 49)
#define NavH ((kheight == 812) ? 88 : 64)//這個(gè)包含狀態(tài)欄在內(nèi)
#define StuBarH ((kheight == 812) ? 44 : 20)
  • 然后給UIViewController創(chuàng)建一個(gè)分類
  • UIViewController+ContentView.h內(nèi)容
#import <UIKit/UIKit.h>
@interface UIViewController (ContentView)
@property (nonatomic, strong) UIView *contentView;
@end
  • UIViewController+ContentView.m內(nèi)容

#import "UIViewController+ContentView.h"

#import <objc/runtime.h>

static const void *ContentView = &ContentView;

@implementation UIViewController (ContentView)
//用runtime重寫setter刺覆,getter方法,來給分類添加屬性
- (void)setContentView:(UIView *)contentView {
    /*
     OBJC_ASSOCIATION_ASSIGN;            //assign策略
     OBJC_ASSOCIATION_COPY_NONATOMIC;    //copy策略
     OBJC_ASSOCIATION_RETAIN_NONATOMIC;  // retain策略
     
     OBJC_ASSOCIATION_RETAIN;
     OBJC_ASSOCIATION_COPY;
     */
    /*
     * id object 給哪個(gè)對(duì)象的屬性賦值
     const void *key 屬性對(duì)應(yīng)的key
     id value  設(shè)置屬性值為value
     objc_AssociationPolicy policy  使用的策略史煎,是一個(gè)枚舉值谦屑,和copy,retain劲室,assign是一樣的伦仍,手機(jī)開發(fā)一般都選擇NONATOMIC
     objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
     */
    objc_setAssociatedObject(self, ContentView, contentView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

/**
 contentView用來作為根視圖代替self.view
 注意:本項(xiàng)目是用的系統(tǒng)的導(dǎo)航欄,假如用的自定義的導(dǎo)航欄很洋,
 請(qǐng)?jiān)诤甓x里改掉相應(yīng)的導(dǎo)航欄高度和tabbar高度充蓝。
 有一個(gè)缺點(diǎn):當(dāng)你由于需要,隱藏了導(dǎo)航欄喉磁,這兒檢測(cè)不到谓苟,因?yàn)槌跏蓟疺c的時(shí)候先走這個(gè)方法
 這個(gè)時(shí)候建議在相應(yīng)vc中做坐標(biāo)處理
 */
- (UIView *)contentView {
    //利用runtime實(shí)現(xiàn)動(dòng)態(tài)添加屬性
    UIView *view = objc_getAssociatedObject(self, ContentView);
    //因?yàn)楫?dāng)界面上只有tableview控件時(shí),在iOS7以上协怒,iOS11以下系統(tǒng)涝焙,坐標(biāo)零點(diǎn)都是從導(dǎo)航欄開始
    //設(shè)置這個(gè)屬性能夠避免系統(tǒng)bug
    self.automaticallyAdjustsScrollViewInsets = NO;
    //判斷vc是否為棧內(nèi)第一個(gè)頁(yè)面,來設(shè)置contenview的高度
    //這兒默認(rèn)每個(gè)頁(yè)面都有導(dǎo)航欄孕暇,如果是自定義導(dǎo)航欄仑撞,只需要在self.view上添加即可赤兴,不會(huì)與contentView沖突
    if (!view) {
            if (self.navigationController.viewControllers.count > 1 ||self.navigationController.viewControllers.count == 0) {
                view = [[UIView alloc]initWithFrame:CGRectMake(0, NavH, kwidth, kheight-NavH)];
            }else{
                view = [[UIView alloc]initWithFrame:CGRectMake(0, NavH, kwidth, kheight-NavH-TabBarH)];
            }
        view.backgroundColor = [UIColor clearColor];
        self.contentView = view;
        //讓應(yīng)用在ipad以滾動(dòng)視圖的方式正常顯示,顯示內(nèi)容寬高和iphone5一樣隧哮,這是為了蘋果審核桶良,要求iPad正常顯示
        if (kheight == 480) {
            UIScrollView *scorollView = [[UIScrollView alloc]initWithFrame:self.view.bounds];
            scorollView.contentSize = CGSizeMake(kwidth, 568);
            view.frame = CGRectMake(0, 0, kwidth, 568);
            [self.view addSubview:scorollView];
            [scorollView addSubview:view];
        }else{
            [self.view addSubview:view];
        }
    }
    return view;
}
  • 外部調(diào)用:
UIView *redView = [[UIView alloc]initWithFrame:AAdaptionRect(100, 100, 100, 100)];
redView.backgroundColor = [UIColor redColor];
[self.contentView addSubview:redView];
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市沮翔,隨后出現(xiàn)的幾起案子陨帆,更是在濱河造成了極大的恐慌,老刑警劉巖采蚀,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疲牵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡榆鼠,警方通過查閱死者的電腦和手機(jī)纲爸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來璧眠,“玉大人缩焦,你說我怎么就攤上這事≡鹁玻” “怎么了袁滥?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)灾螃。 經(jīng)常有香客問我题翻,道長(zhǎng),這世上最難降的妖魔是什么腰鬼? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任嵌赠,我火速辦了婚禮,結(jié)果婚禮上熄赡,老公的妹妹穿的比我還像新娘姜挺。我一直安慰自己,他們只是感情好彼硫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布炊豪。 她就那樣靜靜地躺著,像睡著了一般拧篮。 火紅的嫁衣襯著肌膚如雪词渤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天串绩,我揣著相機(jī)與錄音缺虐,去河邊找鬼。 笑死礁凡,一個(gè)胖子當(dāng)著我的面吹牛高氮,可吹牛的內(nèi)容都是我干的慧妄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼纫溃,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼腰涧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起紊浩,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疗锐,沒想到半個(gè)月后坊谁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滑臊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年口芍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雇卷。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鬓椭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出关划,到底是詐尸還是另有隱情小染,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布贮折,位于F島的核電站裤翩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏调榄。R本人自食惡果不足惜踊赠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望每庆。 院中可真熱鬧筐带,春花似錦、人聲如沸缤灵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凤价。三九已至鸽斟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間利诺,已是汗流浹背富蓄。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慢逾,地道東北人立倍。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓灭红,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親口注。 傳聞我的和親對(duì)象是個(gè)殘疾皇子变擒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 目前iOS開發(fā)中大多數(shù)頁(yè)面都已經(jīng)開始使用Interface Builder的方式進(jìn)行UI開發(fā)了,但是在一些變化比較...
    大雪山大輪寺大輪明王閱讀 1,512評(píng)論 1 2
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,097評(píng)論 1 32
  • 兒子把兩盤圍棋端到我的面前寝志,美其名曰“讓我教你新的玩法”娇斑。 硬著頭皮和兒子玩了會(huì)兒,不愿打斷他材部,哪怕我沒學(xué)過毫缆,哪怕...
    趙老怪閱讀 66評(píng)論 0 1
  • 2019年1月5日,周六乐导,晴苦丁!353 今天早上我先匆匆出門上班,晨文留在家里等她爸接她去上英語校外課物臂。剛到店里不久...
    忻謐閱讀 407評(píng)論 0 0
  • 巴蛇食象旺拉,三歲而出其骨,君子服之棵磷,無心腹之疾蛾狗。 ...
    笑徒閱讀 515評(píng)論 0 3