iOS 一种优雅的屏幕适配的方案

最近在折腾iPhone 端的界面。屏幕适配是一个痛点,我是xib党,一般设计给的稿子都是iPhone6的设计稿。所以适配 iPhonese iPhone6s是个麻烦的事情,要不就是拖出很多个 IBOutlet 在界面加载出来的时候一个个设置值。
比如:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *beginButtonBottomConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *selectCalssfyButtonBottomConstraint;
@property (weak, nonatomic) IBOutlet UIButton *beginButton;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *textFieldTopConstraint;

在页面加载出来的时候:

///调整布局
    _textFieldTopConstraint.constant = 149 * kViewWidthRate;
    _beginButtonBottomConstraint.constant = 40 * kViewWidthRate;
    _selectCalssfyButtonBottomConstraint.constant = 149 * kViewWidthRate;

这里 kViewWidthRate 是 屏幕相对iPhone6 的比例。太麻烦了,想想,如果一个个界面有很多约束,累死人不偿命的!

本文给出一个优雅的方案

#import <UIKit/UIKit.h>

IB_DESIGNABLE
@interface PBTLayoutConstraint : NSLayoutConstraint


@property (nonatomic, assign) IBInspectable BOOL widthAdaptive;

@property (nonatomic, assign) IBInspectable BOOL heightAdaptive;

@end

实现文件

#import "PBTLayoutConstraint.h"

//获取屏幕宽度
#define SCREEN_WIDTH MIN([UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)
//获取屏幕高度
#define SCREEN_HEIGHT MAX([UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width)
#define k1px (1 / [UIScreen mainScreen].scale)


//判断当前设备是不是iphone5
#define IPHONE6_WIDTH 375
#define IPHONE6_HEIGHT 667
#define kViewWidthRate      SCREEN_WIDTH/IPHONE6_WIDTH
#define kViewHEIGHTRate      SCREEN_HEIGHT/IPHONE6_HEIGHT

@implementation PBTLayoutConstraint

- (void)setWidthAdaptive:(BOOL)widthAdaptive {
    _widthAdaptive = widthAdaptive;
if(widthAdaptive) {
    CGFloat _cons = self.constant;
    _cons = _cons * kViewWidthRate;
    self.constant = _cons;

}
}

- (void)setHeightAdaptive:(BOOL)heightAdaptive {
    _heightAdaptive = heightAdaptive;
if(heightAdaptive){
CGFloat _cons = self.constant;
    _cons = _cons * kViewHEIGHTRate;
    self.constant = _cons;
}
    
}

@end

此处widthAdaptive 和 heightAdaptive 的意思是,根据本机型屏幕的 宽或者高相对于iPhone6的屏幕宽高比例设置 constant 的值。使用 IBInspectable 直接可以在 xib上操作

使用如下:

用法

在界面上,根据需求,设置 widthAdaptive 或者 heightAdaptive 为 on 或者 off 即可!!

屏幕快照 2017-08-07 下午11.36.53.png

当然 xib中,约束的class要设置成 PBTLayoutConstraint

方案二

直接使用分类,好处是不用再xib处,修改class为PBTLayoutConstraint

干净的终极方案

代码如下:

IB_DESIGNABLE
@interface NSLayoutConstraint(AllSize)


@property (nonatomic, assign) IBInspectable BOOL adaptive;

@end

实现文件如下:

#import "PBTLayoutConstraint.h"
#import <objc/runtime.h>

NS_INLINE  CGFloat _sizeRate(){
    static CGFloat _rate = 0.0;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _rate = [UIScreen mainScreen].bounds.size.width / 375.0;
    });
    return _rate;
}

@implementation NSLayoutConstraint(AllSize)

- (void)setAdaptive:(BOOL)widthAdaptive {
    if (widthAdaptive) {
        CGFloat _cons = self.constant;
        _cons = _cons * _sizeRate();
        self.constant = _cons;
    }
    objc_setAssociatedObject(self, @selector(adaptive), @(widthAdaptive), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
}

- (BOOL)adaptive {
    NSNumber *value = objc_getAssociatedObject(self, @selector(adaptive));
    return [value boolValue];
}

@end

此时只要在xib中修改 adaptive 就可以了

因为其他屏幕相对iPhone6的宽高比例是固定的,所以值放出一个适配就好了。

屏幕快照 2017-08-08 上午7.09.26.png

各位看官,有其他适配方案的,欢迎交流

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容