iOS 鏈?zhǔn)骄幊桃恍写a完成屏幕適配

在開發(fā)過程中
關(guān)于屏幕適配的方法
Masonry 著實(shí)很好用
拖 XIB 的時(shí)候
用一用系統(tǒng)的 AutoLayout 感覺也賊好
但是還是會(huì)有一些特殊情況
活久見一些很蛋疼的需求
比如只針對某個(gè)屏幕的字體大小需要改變
或者是只針對某個(gè)屏幕的約束改變
于是乎我寫了這個(gè)一個(gè)小工具

大概用法是這樣 :

    // 調(diào)整約束
    CGFloat constant = HXScreenFitUtil.ScreenFit.iphone4(10).iphone5(50).iphone6(100).iphone6p(150).iphoneX(200).iphoneXSMax(250).defaultValue(self.labelHeightCons.constant);
    self.labelHeightCons.constant = constant;
    
    // 調(diào)整字號(hào)
    CGFloat redLabelFontSize = HXScreenFitUtil.ScreenFit.iphone4(10).iphone5(20).defaultValue(35);
    self.redLabel.text = [NSString stringWithFormat:@"字號(hào) : %0.f, 高度 : %f",redLabelFontSize,self.labelHeightCons.constant];

    // 調(diào)整 frame
    CGFloat yellowLabelHeight = HXScreenFitUtil.ScreenFit.iphone4(10).iphone5(50).iphone6(99).iphoneX(200).defaultValue(60);
    self.yellowLabel.frame = CGRectMake(50, 350, 260, yellowLabelHeight);
    self.yellowLabel.text = [NSString stringWithFormat:@"我的高度是 : %0.f",yellowLabelHeight];

還可以配合 Masonry 這樣用 :

    CGFloat iconTop = HXScreenFitUtil.ScreenFit.iphone4(10).iphone5(50).iphone6(100).iphone6p(150).iphoneXSMax(250).defaultValue(200);
    [iconImageView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.mas_top).offset(iconTop);
    }];

總之是一系列的調(diào)用之后返回當(dāng)前屏幕所需要的數(shù)值
這個(gè)數(shù)值可以用于修改約束, 設(shè)置字號(hào), 設(shè)置 frame 等一切需要數(shù)值的地方
連續(xù)調(diào)用的過程中每個(gè)屏幕都是可選的
但是最后都需要調(diào)用 defaultValue
為了有些屏幕沒有設(shè)置值的時(shí)候就返回這個(gè)默認(rèn)值
比如 :
我只想在 iPhone4 的屏幕下讓 label 的字號(hào)是10
在 iPhone5 的屏幕下讓 label 的字號(hào)是20
其他屏幕下都是35
于是乎就這么調(diào)用 :

    // 調(diào)整字號(hào)
    CGFloat redLabelFontSize = HXScreenFitUtil.ScreenFit.iphone4(10).iphone5(20).defaultValue(35);
    self.redLabel.text = [NSString stringWithFormat:@"字號(hào) : %0.f, 高度 : %f",redLabelFontSize,self.labelHeightCons.constant];

下面簡述實(shí)現(xiàn)過程
工具類的頭文件是這樣的 :

#import <UIKit/UIKit.h>

@class HXScreenFitUtil;

typedef HXScreenFitUtil *(^ HXScreenFitHandler)(CGFloat value);

@interface HXScreenFitUtil : NSObject

+ (HXScreenFitUtil *)ScreenFit;
- (CGFloat (^)(CGFloat))defaultValue;
- (HXScreenFitHandler)iphone4;
- (HXScreenFitHandler)iphone5;
- (HXScreenFitHandler)iphone6;
- (HXScreenFitHandler)iphone6p;
- (HXScreenFitHandler)iphoneX;
- (HXScreenFitHandler)iphoneXSMax;

@end

ScreenFit 是一個(gè)類方法返回類的一個(gè)實(shí)例
這兩句是一個(gè)意思 :

HXScreenFitUtil.ScreenFit
[[HXScreenFitUtil alloc] init]

重點(diǎn)是 HXScreenFitHandler 這個(gè) block
他是一個(gè) 參數(shù)為一個(gè) float 值 返回值為 HXScreenFitUtil 對象 的一個(gè) block

HXScreenFitUtil.ScreenFit.iphone4

這句調(diào)用之后就返回一個(gè) HXScreenFitHandler 這個(gè) block
然后我就拿著這個(gè) block 傳入?yún)?shù)10
然后這個(gè) block 返回一個(gè) HXScreenFitUtil 對象
拿這個(gè) HXScreenFitUtil 對象繼續(xù)調(diào)用 iphone5
變成了這個(gè)樣子:

HXScreenFitUtil.ScreenFit.iphone4(10).iphone5

然后 iphone5 方法的返回值依然是這個(gè) block
繼續(xù)傳入?yún)?shù) 20

HXScreenFitUtil.ScreenFit.iphone4(10).iphone5(20)

用返回值(返回值為 HXScreenFitUtil 對象) 調(diào)用 defaultValue
defaultValue 也返回一個(gè) block
這個(gè) block 的參數(shù)是 float 類型 返回值也是 float
于是給這個(gè) block 參數(shù)傳值35 :

HXScreenFitUtil.ScreenFit.iphone4(10).iphone5(20).defaultValue(35);

等 defaultValue 返回的 block 計(jì)算完成之后
返回一個(gè) float
就是我們需要的值了.


在工具類的. m 文件中
有一個(gè)變量 TargetValue
類中的每個(gè)方法 iphone4, iphone5 等等針對每個(gè)屏幕的方法
都做一件事 :
就是判斷當(dāng)前設(shè)備屏幕是不是該方法針對的屏幕
比如 iPhone4 方法中就判斷當(dāng)前設(shè)備屏幕是不是 iPhone4
如果是 就給 TargetValue 賦值
如果不是 就不賦值
等到最后調(diào)用 defaultValue 的時(shí)候
如果 TargetValue 被賦值過
那么這個(gè)值就是當(dāng)前設(shè)備屏幕所需要的值
就返回這個(gè)值
如果 TargetValue 沒有被賦值
那么當(dāng)前設(shè)備屏幕沒有被賦值
那么就返回 defaultValue 傳入的默認(rèn)值
完事........

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

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

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