还记得刚刚开始学习iOS的开发的时候,简简单单的小控件练习,我总是习惯性的写死Frame,后来知道了屏幕适配,添加约束这样才能使UI更好的展示在屏幕上,Objective-C中的Masonry,Swift中的SnapKit,以及Xib和Storyboard的AutoLayout加上SizeClasses的组合,都极大程度上的帮助我们做屏幕的适配约束。

推荐一下很精彩的博客 --- 很详解并表达自己观点非常棒的博客。

今天突然间就有了个想法,那么我是否可以基于一种屏幕的尺寸,通过写死Frame然后通过某些捷径的方法进行屏幕的比例约束适配呢?

1 首先这种方法不适合ipad开发,只适用于手机(4 5 6 系列)

2 这种方法并不推荐,因为现在有很多流行合理的适配方法,但是嘛,做开发,有时候可以自己嗨一下嘛,做出来也是好样的

3 只是非常简单的按比例兼容。只要每张图都有@1x,@2x,@3x的话,该方法完全不会让图片模糊或者变形,能还原出设计师的最初稿

4 由于iphone不同系列屏幕宽高比都是相差无几的,所以按照比例约束适配的方法绝对是可行的

首先,我们可以以iphone5(320 * 568)为最初设计机型,然后以iphone5系列为模板,进行比例的放大或者缩小。

//获取device的屏幕宽高

#define MainScreenWidth [[UIScreen mainScreen]bounds].size.width

#define MainScreenHeight [[UIScreen mainScreen]bounds].size.height

//以iphone5,5s,5c为基本机型,其他型号机器按比例系数做乘法.

AppDelegate *appdelegate = [UIApplication sharedApplication].delegate;

appdelegate.autoSizeScaleX = MainScreenWidth/320.f;

appdelegate.autoSizeScaleY = MainScreenWidth/568.f;

我们获得了屏幕的宽高的比例系数之后,在创建我们一些控件的时候,就可以进行按比例适配了

AppDelegate *apd = [UIApplication sharedApplication].delegate;

UIButton *loginBtn = [[UIButton alloc]initWithFrame:CGRectMake(10*apd.autoSizeScaleX, 20*apd.autoSizeScaleY, (320-10*2)*apd.autoSizeScaleX, 44*apd.autoSizeScaleY)];

[loginBtn setTitle:@"login" forState:UIControlStateNormal];

[loginBtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];

[loginBtn.titleLabel setFont:[UIFont systemFontOfSize:14]];

[loginBtn setBackgroundColor:[UIColor cyanColor]];

[self.view addSubview:loginBtn];

这样就有个问题,那么每个View上的控件,我们都需要重新设置下frame,这样的代码量以及维护都特别艰难,我们可以考虑封装下,来进行整个项目的适配~~

首先我们创建一个工具类来进行比例约束适配方法的封装

屏幕快照 2016-06-29 下午5.40.50.png

屏幕快照 2016-06-29 下午5.41.03.png

屏幕快照 2016-06-29 下午5.41.16.png

图上很清楚的说明,首先工具类AutoFillScreenutils调用类方将需要进行按比例约束的view当做参数传递进来,通过遍历的方式来重新设置一遍Frame,如果你的view层级很高的话,可以多进行几遍遍历。

(void)autoLayoutFillScreen:(UIView *)view

(CGRect)updateViewsFrame:(CGFloat) x withY:(CGFloat) y AndWidth:(CGFloat) width AndHeight:(CGFloat) height

然后在ViewController中,将View当做参数传递过去即可。

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor = [UIColor lightGrayColor];

[self setUpViews];

[AtuoFillScreenUtils autoLayoutFillScreen:self.view];

// Do any additional setup after loading the view, typically from a nib.

}

我们通过测试就可以发现,原来在iphone5系列上布局正常的图,到iphone6及iphone6+上就变形了,通过我们的按比例约束,又重新适配了,不得不说这样还是蛮简单的。

Paste_Image.png

Paste_Image.png

Demo已经上传到Github,有兴趣的可以看一下,很简单一个小东西,也是不断学习过程中的一个小经验,不喜勿喷,谢谢啦~

ios 代码设置控件宽高比_iOS基于代码按比例约束方法进行屏幕适配相关推荐

  1. ios 代码设置控件宽高比_IOS开发入门之iOS一套代码适配所有iPhone手机布局实现方案...

    本文将带你了解IOS开发入门iOS一套代码适配所有iPhone手机布局实现方案,希望本文对大家学IOS有所帮助. iOS一套代码适配所有iPhone手机布局实现方案 本文主要是讲述一套代码适配所有iP ...

  2. ios 代码设置控件宽高比_#iOS 开发实用技巧# Masonry 控件宽高(不同控件之间宽高比)比设置方法...

    Masonry 项目中我们实用 Masonry 自动布局,可能需要设置控件的宽高比,需要记录一下这个方法. 一句代码搞定: 注意这里需要设置的是控件的宽高比. make.width.equalTo(s ...

  3. ios 代码设置控件宽高比_iOS--利用比例纯代码适配屏幕大小

    首先说下让自己的程序支持iPhone6和6+,第一种使用官方提供的launch screen.xib,这个直接看官方文档即可,这里不再多述:第二种方法是和之前iPhone5的类似,比较简单,为iPho ...

  4. ios 代码设置控件宽高比_用宽高比调整UIImage的大小?

    我知道这很老了,但是感谢那篇文章-它使我从尝试使用比例尺重定向到绘制图像.万一对任何人都有利,我做了一个扩展类,我将在这里进行介绍.它允许您调整图像的大小,如下所示: UIImage imgNew = ...

  5. ios 代码设置控件宽高比_ios-自动布局以保持视图大小比例

    我正在努力实现以下目标: 我的xib中有2个视图,需要使边缘(两侧和顶部)保持20像素 需要调整大小的2个视图的大小不同 它们必须相隔20像素 它们的宽度需要相对于父视图的宽度保持不变 我阅读了有关执 ...

  6. android设置屏幕高度和宽度设置,Android手机的屏幕宽高度和代码设置控件的宽高度...

    1.Android手机的屏幕宽高度 WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); int w ...

  7. Android动态设置控件宽高和padding

    在开发过程中我们经常需要动态设置控件的宽高和padding.以TextView为例.如下: 布局代码 TextView的默认宽高为包裹文字,添加了一个背景颜色设置参数后更直观看到效果 <?xml ...

  8. 动态获取手机屏幕宽高及动态设置控件宽高

    1.获取手机屏幕宽高: DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetr ...

  9. html设置控件位置大小,下面那个代码段设置myButton控件显示在HTML页左上角100px的位置 - 问答库...

    问题: [多选] 下面那个代码段设置myButton控件显示在HTML页左上角100px的位置?() A . B . C . D . 调度例行会议形式有什么() 生产平衡会. 事故分析会. 调度专业会 ...

最新文章

  1. 计算机科学之前说,国内计算机科学十强大学是哪些?前2名没悬念,后面几所都不好说...
  2. 行号 设置vim_在VSCode里面配置Vim正确姿势(细节解析)
  3. Leetcode: Counting Bits
  4. IdHTTP1.Get(url)得到的源码怎么跟直接浏览的不一样呢?
  5. 揭秘Facebook官方底层C++函数Folly
  6. 源码安装redis-3.2.11
  7. 我不断收到“ Uncaught SyntaxError:意外令牌o”
  8. Perforce-Server迁移
  9. 多多客接入(拼多多)
  10. win10+Vs2019编译PCL中Kinfu-largescale
  11. 立体匹配(Stereo Matching)
  12. GPS同步时钟(NTP时间服务器)网口物理隔离的好处
  13. phpstyudy端口被占用怎么办
  14. HI3516DV300 GPIO操作
  15. B数和B+树、红黑树数据结构的特点
  16. spark基础知识学习
  17. UE4如何使用Left Shift+W增加移动速度
  18. 远程连接服务器(免密登录,ssh协议22号端口),web服务器:URL格式,http协议,http请求常用的方法(get和post)
  19. Spring 5 + Spring MVC 5 + MyBatis 3 的 Maven 项目集成
  20. linux中各目录的意思,linux各个目录的意思?

热门文章

  1. 01 离散时间信号的时域表示
  2. 输入 3 个正数,判断能否构成一个三角形
  3. 错误记录 MongoClient opened before fork. Create MongoClient
  4. linux 从一台服务器向另台服务器复制文件
  5. C++对象数组与对象指针的用法【C++初学面向对象编程】
  6. 模拟电子技术不挂科学习笔记1(半导体基础、二极管)
  7. Python稳基修炼的经典案例4(计算机二级、初学者必须掌握的例题)
  8. 如何用r压缩列联表_压缩袋好用吗?哪个牌子比较好?如何选择真空压缩袋?羽绒服能用真空压缩袋吗?...
  9. Python使用numpy和pandas模拟转盘抽奖游戏
  10. python比较文件每行长度_读取文件并查找所有行的长度是否相同