iOS XIB的屏幕尺寸适配

作者: Mikebanana | 来源:发表于2017-08-28 11:06 被阅读4757次

开发中,都会有适应各种屏幕尺寸的需要,因为4s年代久远,本文中就没有针对4s的适配(其实屏幕宽度和5s一样,开发中按5s的适配参数来就行了,高度适配的话就把页面调成滑动的就好了),话不多说,先上适配参数,

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 suitParm:CGFloat = (iphone6p ? 1.12 : (iphone6 ? 1.0 : (iphone6pBigMode ? 1.01 : (iphoneX ? 1.0 : 0.85))))

接下来只需要在NSLayoutConstraint的extension中添加以下代码,就能在XIB中动态的控制约束的屏幕尺寸适配

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

因为get是用不到的,所以随便返回了个true
好了,现在我们就可以在XIB上找到我们设置的属性了
选中一个约束后

image.png

然后再到最右边就可以看到这样的一个属性:

image.png

我们只需要选中on:

image.png

就可以打开我们针对屏幕尺寸的约束,比较方便快捷,下面再给一下大家OC的版本,

/* iOS设备 */
#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)
//适配参数
#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

一些小东西,希望对大家有帮助

相关文章

网友评论

  • 梁森的简书:不明所以😂
  • 86dd336b7a56:为什么我的设置无效呢,把label的约束都开启了on
  • Mario_ZJ:你好,请问现在xcode9.3在哪找AdapterScreen的选项?一直没找见!
  • yunxiu:iphone6pBigMode 这个是设置->显示与亮度->视图->放大模式吗?应为,6p的手机,放大之后,分辨率就变成了375*667了
    Mikebanana:对 就是放大模式
  • 9f89fd31e0fb:/* iOS设备 */
    #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)
    //适配参数
    #define KsuitParam (kDevice_Is_iPhone6Plus ?1.12:(kDevice_Is_iPhone6?1.0:(iPhone6PlusBigMode ?1.01:0.85))) //以6为基准图

    请问这一段代码应该写在哪里
    9f89fd31e0fb:@Mikebanana 嗯,写完了。
    Mikebanana:宏定义文件 当然写 PCH 文件里面咯
  • 6d094483de21:大神好,我是初学者请问适配参数的代码写在哪里swift的谢谢
    Mikebanana:随便建个Swift文件 往里面复制就行了
  • 昵称_7baf:请问一下 可不可以把默认默认状态设为On,不然感觉每次建一个约束 就要选一次 还是有点麻烦
    wahkim:我也在想这个问题,你们解决了没:joy:
    昵称_7baf:@Junheng 没有
    Junheng:我也是这么想的,同行你解决了吗?
  • 鱼疯疯:这个是有问题的 This NSLayoutConstraint is being configured with a constant that exceeds internal limits. A smaller value will be substituted, but this problem should be fixed. Break on BOOL _NSLayoutConstraintNumberExceedsLimit(void) to debug. This will be logged only once. This may break in the future.
    Mikebanana:这是报错信息么 我自己貌似没有报错
  • Tang杰:你好 请问你的适配参数是怎么换算出来的
    Tang杰:我说呀 我怎么算得不一样呢 感谢
    Mikebanana:我这样写 不严谨 其实就是按比例来的 5的宽320 6的宽375 320/375 或者 高 568/667 差不多都等于0.85 6p之类的大屏 也是按比例来的

本文标题:iOS XIB的屏幕尺寸适配

本文链接:https://www.haomeiwen.com/subject/qmmwdxtx.html