美文网首页iOS 知识点iosiOS学习交流
几句代码搞定iOS屏幕适配

几句代码搞定iOS屏幕适配

作者: iOS阿能 | 来源:发表于2017-01-16 19:00 被阅读9000次

文章由于iPhone X,导致高度比例问题,取消高度作为比例,直接用宽度比例. 近期我会抽空录制适配教学适配,希望能帮助到大家,要相信一句话,用起来越简单,可定制性就越差(不可横屏适配,不可适配iPad,当苹果不按常规屏幕比例出牌,都会出问题.)

隨著iPhoneX即將上市,本文的捷徑適配或許不再適用了,要記住,用起來最簡單的,往往局限性最大的,這種並不能做橫屏適配,屏幕适配并非真正的放大缩小,我会录制一个视频,重新说一下适配(基于storyboard,xib开发)

老规矩,上图


9F61CEBF-4709-4FE0-AD15-F664874DCFAE.jpg image.png

首先,除了iPhone4, iPhone5,6,6plus机型,都是成比例的,也就是每个屏幕的宽度/高度都是相等的,所以我们可以利用这个成比例,写以下代码
/*
屏幕适配
*/

//判断设备类型
#define iPhone4 ([UIScreen mainScreen].bounds.size.height == 480)
#define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
#define iPhone6 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? (CGSizeEqualToSize(CGSizeMake(750, 1334), [[UIScreen mainScreen] currentMode].size)) : NO)
#define iPhone6plus ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? (CGSizeEqualToSize(CGSizeMake(1125, 2001), [[UIScreen mainScreen] currentMode].size) || CGSizeEqualToSize(CGSizeMake(1242, 2208), [[UIScreen mainScreen] currentMode].size)) : NO)
// 判断是否是iPhone X
#define iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)
// 状态栏高度
#define STATUS_BAR_HEIGHT (iPhoneX ? 44.f : 20.f)
// 导航栏高度
#define NAVIGATION_BAR_HEIGHT (iPhoneX ? 88.f : 64.f)
/// 导航栏高度(不包括状态栏)
#define NAVI_BAR_HEIGHT 44.0f

/// Tab Bar高度
#define TABBAR_HEIGHT (iPhoneX ? (49.f+34.f) : 49.f)
#define kScreenHeight [UIScreen mainScreen].bounds.size.height
#define kScreenWidth [UIScreen mainScreen].bounds.size.width
#define kWidth(R) (R)*(kScreenWidth)/320 这里的320我是针对5s为标准适配的,如果需要其他标准可以修改
#define kHeight(R) kWidth(R)  这里的568我是针对5s为标准适配的,如果需要其他标准可以修改

代码简单我就不介绍了,
以此思想,我们可以对字体下手
#define font(R) (R)*(kScreenWidth)/320.0  这里是5s屏幕字体
#define kFONT16                  [UIFont systemFontOfSize:font(16.0f)]
效果图如下
Paste_Image.png IMG_1642.PNG

可以看到屏幕label的地方,我这里只写iPhone5s的代码,在iPhone7跑起来以后,界面是成比例的,连同字体也是.

不用百度的那么多屏幕适配,简单几句搞定.
唉,又技术泄露了.
转载记得加上俺名字,谢谢.

相关文章

  • 几句代码搞定iOS屏幕适配

    文章由于iPhone X,导致高度比例问题,取消高度作为比例,直接用宽度比例. 近期我会抽空录制适配教学适配,希望...

  • 怎么样适配ios系统和ios屏幕 ios适配系统代码写法[[UIDevice currentDevice] sys...

  • iOS学习笔记24-不断进化的屏幕适配

    一、屏幕适配 iOS的屏幕适配可以分为3大块,代表着不同时期的屏幕适配主流: AutoResizing:在iOS6...

  • iOS屏幕适配(纯代码)

    很明显能看出这三种屏幕的尺寸宽高比是差不多的,因此可以在5的基础上,按比例放大来适配6和6Plus的屏幕. 如果是...

  • IOS 屏幕适配(一)理论篇

    @[TOC](IOS 屏幕适配(一)理论篇) 1. IOS 屏幕适配基本概念 1.1 IOS 设备的尺寸和分辨率 ...

  • Swift学习:约束的基本使用

    初次尝试了纯代码编写UI,了解到ios的屏幕适配比较麻烦 , 于是乎稍微学习了一下关于屏幕适配的知识,了解了NSL...

  • Masonry学习理解

    iOS中进行屏幕适配,使用的是AutoLayout。在纯代码中可以使用第三方Masonry添加约束进行适配,而使用...

  • 版本适配

    屏幕适配 代码适配 Masonry UIView+AutoLayout 可视化适配 autoLayout 系统适配...

  • iOS判断刘海屏幕机型

    原文iOS刘海手机屏幕的适配判断是不是iphone x齐刘海屏幕iOS开发 iPhoneX以上机型适配判断判断iP...

  • iOS各种屏幕自动适配及颜色转换为十六进制

    iOS各种屏幕自动适配及颜色转换为十六进制 ★★★XLJMatchScreen自动适配屏幕★★★ 支持pod导入 ...

网友评论

  • 瓶子君:您好,我把代码放进pch为什么不生效啊,您有没有联系方式可否给一个,请教一下您,谢谢
    iOS阿能:@瓶子君 检查项目target -> build setting -> prefix header 是否正确设置pch路径
  • 9f89fd31e0fb:请问这段代码应该写在哪里,我还是个渣渣:smile:
    iOS阿能:建个PCH文件,放在里面咯.
  • 木子阳iu:我会录制一个视频,重新说一下适配(基于storyboard,xib开发) 你好,文中说的视频是在哪儿能看呢?
    iOS阿能:发了新文章了...
  • 葱花思鸡蛋: 你好,我试了一下你的适配,挺好用的,但我想问的是你前面判断手机型号有什么作用呢?下面采用比例的时候完全没有用到啊?
    iOS阿能:@葱花思鸡蛋 哈哈,没有用你就把它干掉咯. 虽然iPhone4 已经被淘汰,但是如果用xib或者SB开发,记得适配,因为苹果爸爸还是会去测试的,
    葱花思鸡蛋:除了iPhone4,主要是iPhone4已经淘汰掉了
  • LiHaoj:你好,是我不会用你的宏还是怎么回事,为什么我写"btn.frame.size.width = kWidth(20)"会报错啊。我是新手,勿喷
    iOS阿能:@我不会ios 加我QQ,截图我看看咯 821898131
    LiHaoj:@iOS_阿能 我把宏声明到了.m文件中,用这个还是报错。 放到PCH也不行
    iOS阿能:@我不会ios 你在该.m文件,导入了包含宏的.h文件没,或者是将宏声明在该.m文件没.新手不紧要,基础要打好
  • 一个不太努力的代码搬运工:楼主你好,我感觉屏幕适配不是缩放那么简单,例如微信和qq,行高和头像大小在5s和6p中都是固定的,大屏本应该是显示更多内容的.还有就是在固定页面中设置对控件进行约束,要先看设计给的图,控件是固定大小还是固定间距,最主要是看设计是怎么定的,虽然我们也是只给一张设计图
    iOS阿能:@losedMemory 是的是的,我文章前面第一段话就已经说了.....
  • qbk1989:#define kHeight(R) (iPhone4?(R:((R)*(kScreenHeight)/736)) 这样怎么适配iPhone4了 比如一个button高度为100 在6p为100 iPhone5 iPhone6 能按比例缩小 但是到iPhone4 因为这个红 高度也为100 这就是同一个控件在iPhone4 和6p 上面高度一样 这就没有适配iPhone4。能给解释怎么适配了iPhone4么???
    iOS阿能:@qbk1989 不给,iPhone4已经放弃哈哈
  • 9af1c3aadca4:有关屏幕适配,也是一头雾水,手淘之前的文字流式、控件等比缩放,现在也改成根据屏幕全部缩放了,缩放比例由750稿决定。确实在实际书写上感觉对代码侵入性极高,而且也不是完全可以用屏幕比搞定。很麻烦,希望后来人能提供更好的解决方案。
    iOS阿能:@VierGhost 哈哈,最近一直在忙...我謀劃的屏幕適配一直在路上...
  • 85732d8c0045:楼主,你好,请问您写的iphone4、5、6、6p宏定义又什么用?我这样写#define ScreenWidth [UIScreen mainScreen].bounds.size.width
    #define ScreenHeight [UIScreen mainScreen].bounds.size.height
    #define Width(R) (R*ScreenWidth)/375
    #define Height(R) (ScreenHeight == 480 ? R : R*ScreenHeight/667 )
    #define Font(R) (R*ScreenWidth)/375.0
    可以吗?
    iOS阿能:@风中的诺言_65c1 不好意思,没看清楚你上面那段代码.这样写是适配iPhone4的,抱歉
    :smile:
    85732d8c0045:@iOS_阿能 #define Height(R) (ScreenHeight == 480 ? R : R*ScreenHeight/667 )这样写不是适配iphone4吗?请问,谢谢
    iOS阿能:@风中的诺言_65c1 可以啊,放弃适配iPhone4
  • f7ecca1c6a03:楼主我问一下,这样的话每一个需要适配的数值都要用到这个宏,那样的话是不是很麻烦
    iOS阿能:@zllzmq 是啊,我都是CGMakeFrame(kwidth(100),....)这样子,但是我还是建议用masonry,或者是storyboard+autulayout (我以前是坚持用纯代码的,现在在新的公司学习以后,我觉得用storyboard开发更快更好,别人说的蜘蛛网storyboard其实是对storyboard理解不当,一个storyboard放四五个viewcontroller就行了.一个项目多个storyboard,这是我目前欠的文章),masonry其实就是对autulayout封装成代码使用而已,
  • 米修斯_:我感觉适配不是简单的放大缩小,大屏是用来显示更多内容的。设计的时候就应该考虑大屏可不可以多显示内容。但是我们公司只出一张设计图。哈哈
    iOS阿能:@米修斯_ 互相坑咯哈哈
  • f4a7a7b0006c:这方法用代码布局很有效,xib适配有好的方法吗
    iOS阿能:@Lau09 小哥讲真,不做横屏图方便用这个确实很不错,xib+storyboard就老老实实用autolayout
  • a1634a52a033:意思是不是一直用这2个宏定义
    #define kWidth(R) (R)*(kScreenWidth)/320 这里的320我是针对5s为标准适配的,如果需要其他标准可以修改
    #define kHeight(R) (iPhone4?(R:((R)*(kScreenHeight)/568)) 这里的568我是针对5s为标准适配的,如果需要其他标准可以修改
    然后模拟器用5S , 5S上长什么样子 4 5 6都是这样?这个理解对吗
    iOS阿能:是的,理解正确.但是我这个不适合横屏.所以我有空要写多一个横屏适配
  • dfe467fe5549:你这是等比放大不是适配啊,你看你那俩个圆图片都放大虚了
    dfe467fe5549:适配就是等比放大这么简单吗?
    iOS阿能:那个时候公司图片只给2x,有3x就没问题
  • unhangcorn:悄悄地记在小本本里
  • 君莫叹人生如若初见:作者你好,以前我也是你这么适配的,我有两个问题想请教一下:
    1:这段 kHeight(R) (iPhone4?((R)*(kScreenHeight)/480):((R)*(kScreenHeight)/568)) 代码中,如果是iphone4的话,kScreenHeight 为当前iphone4的高度即为480,那么(kScreenHeight)/480)=1了,所以何不直接写成R.
    2:你这个是不是UI那边基于iPhone5s 的屏幕为标准,如果针对iphone6s的话,是不是应该将568改为667呢?
    iOS阿能:@unhangcorn 我现在还是这么适配啊,不过这个方法只能适配iPhone,ipad不行哦,我关注了iPhone8的5.3 5.8寸,到时候屏幕比例不会变,所以不用担心啦
    unhangcorn:你现在不用这样适配了吗?不然你现在怎么样适配的?
    iOS阿能:第一个问题
    你说的对,谢谢你的建议
    第二个问题
    我确实是以5S作为标准,你要基于6的话,把 #define kWidth(R) (R)*(kScreenWidth)/320
    这里的320改成375
    把#define kHeight(R) (iPhone4?((R)*(kScreenHeight)/480):((R)*(kScreenHeight)/568))
    568改成667

本文标题:几句代码搞定iOS屏幕适配

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