在開發(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)值
完事........