iOS开发技巧ios@IT·互联网

iOS基于代码按比例约束方法进行屏幕适配

2016-06-29  本文已影响5990人  DevinZ

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

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

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

首先,我们可以以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];

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

屏幕快照 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层级很高的话,可以多进行几遍遍历。

然后在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,有兴趣的可以看一下,很简单一个小东西,也是不断学习过程中的一个小经验,不喜勿喷,谢谢啦~

上一篇下一篇

猜你喜欢

热点阅读