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 文件里面咯
      • 王雷_13d5:大神好,我是初学者请问适配参数的代码写在哪里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