热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:iOS屏幕适配的几种方式

篇首语:本文由编程笔记#小编为大家整理,主要介绍了iOS屏幕适配的几种方式相关的知识,希望对你有一定的参考价值。屏幕适配问题共有四种解决方案:(

篇首语:本文由编程笔记#小编为大家整理,主要介绍了iOS屏幕适配的几种方式相关的知识,希望对你有一定的参考价值。


屏幕适配问题共有四种解决方案:(1)根据屏幕宽高写控件frame(下策);(2)Autoresizing的使用(中策);(3)AutoLayout的使用(上策);(4)sizeClasses+AutoLayout的使用(上上策)。下面将会分别来进行叙述。

(1)根据屏幕宽高写控件frame

利用宽高比,在不同的屏幕中来进行对控件的位置与控件的宽高进行等比例缩放.选定一个型号的屏幕的宽高为基准,进行等比例缩放.例如以iPhone6或者iPhone6s为基准.

其宽高分别是375与667.Iphone6ScaleWidth =  [UIScreen mainScreen].bounds.size.width/375; Iphone6ScaleHeight = [UIScreen mainScreen].bounds.size.height/667;

如果是iPhone6或者iPhone6s则Iphone6ScaleWidthIphone6ScaleHeight的值都为1.但是此方法对于iPhone5之后的型号可以适用.因为我们知道iPhone4或者iPhone4s尺寸是320x480.iPhone5是320x568.所以对于4或者4s来说计算得到的宽高比不相同.可能会造成一个方形控件,在iPhone5之后的机型上显示的都是正方形.但是在4或者4s上显示的是长方形.需要进行自己的判断(目前来说4或者4s市场上已经不多见了).

同时也可以在代理增加两个属性,宽高比例属性,例如:


1 @interface AppDelegate : UIResponder
2 @property float autoSizeScaleX;
3 @property float autoSizeScaleY;
4
5 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
6 if(CurrentScreenHeight > 480){
7 nowAppDelegate().autoSizeScaleX = CurrentScreenWidth/320.0;
8 nowAppDelegate().autoSizeScaleY = CurrentScreenHeight/568.0;
9 }else{
10 nowAppDelegate().autoSizeScaleX = 1.0;其中nowAppDelegate() = (AppDelegate *)[[UIApplication sharedApplication] delegate];
11 nowAppDelegate().autoSizeScaleY = 1.0;
12 }
13
14 }

在项目对于控件的位置和尺寸乘以这两个缩放比例.

(2)Autoresizing的使用

Autolayout以前,有Autoresizing可以做屏幕适配,但局限性较大,只能针对父子关系进行有限调整,如边距固定,尺寸可变,对于兄弟关系的调整无法实现。对于UI比较固定的app,这种方式基本满足。相比之下,Autolayout比Autoresizing强大很多。

(3)AutoLayout的使用

  在以前的ios程序是怎样布局UI的?

  经常编写大量的坐标计算代码;

  为了保证在各种屏幕上都能有完美的UI界面效果,有时还需要分别为几种屏幕编写不同的坐标计算代码(即传说中的“屏幕适配”)

  什么是Autolayout?

  Autolayout是一种“自动布局”技术,专门用来布局UI界面的。

  Autolayout自iOS6开始引入,由于Xcode4的不给力,当时并没有得到很大的推广。

  自iOS7(Xcode5)开始,Autolayout的开发效率得到很大的提升。

  苹果官方也推荐开发者使用Autolayout来布局UI界面

  Autolayout能够很轻松的解决屏幕适配的问题。

  代码如下:


1 UIView *headView = [[UIView alloc] init];
2 headView.translatesAutoresizingMaskIntoCOnstraints= NO;
3 [self.view addSubview:headView];
4 headView.backgroundColor = [UIColor redColor];
5 NSLayoutConstraint *headViewLeft = [NSLayoutConstraint constraintWithItem:headView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0];
6 NSLayoutConstraint *headViewTop = [NSLayoutConstraint constraintWithItem:headView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:0];
7 NSLayoutConstraint *headViewRight = [NSLayoutConstraint constraintWithItem:headView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1.0 constant:0];
8 NSLayoutConstraint *headViewHeight = [NSLayoutConstraint constraintWithItem:headView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:0 constant:200];
9 self.headHeightCOns= headViewHeight;
10 [self.view addConstraints:@[headViewTop,headViewLeft,headViewRight]];
11 [headView addConstraint:headViewHeight];
12
13
14 UIImage *imageLol = [UIImage imageNamed:@"lol"];
15 UIImageView *imageViewLol = [[UIImageView alloc] initWithImage:imageLol];
16 [headView addSubview:imageViewLol];
17 imageViewLol.translatesAutoresizingMaskIntoCOnstraints= NO;
18 [imageViewLol setContentMode:UIViewContentModeScaleAspectFill];
19
20
21 NSLayoutConstraint *imageLolViewLeft = [NSLayoutConstraint constraintWithItem:imageViewLol attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:headView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0];
22 NSLayoutConstraint *imageViewLolViewTop = [NSLayoutConstraint constraintWithItem:imageViewLol attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:headView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0];
23 NSLayoutConstraint *imageViewLolViewRight = [NSLayoutConstraint constraintWithItem:imageViewLol attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:headView attribute:NSLayoutAttributeRight multiplier:1.0 constant:0];
24 NSLayoutConstraint *imageViewLolViewBottom = [NSLayoutConstraint constraintWithItem:imageViewLol attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:headView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0];
25 [headView addConstraints:@[imageLolViewLeft,imageViewLolViewTop,imageViewLolViewRight,imageViewLolViewBottom]];

(4)sizeClasses+AutoLayout的使用

iOS8中新增了Size Classes特性,他是对当前所有iOS设备尺寸的一个抽象。

  用法:

  屏幕的宽和高分别分成三种情况:(Compact,Regular,Any).也就是紧凑,正常和任意。这样宽和高三三整合,一共九种情况。针对每一种情况,如果需要的话,我们可以单独在storyboard或xib中设置UIView的自动布局约束,甚至某一个button是否显示都是能轻松实现的。

当然,还有一种就是使用Masonry框架进行屏幕适配

Masonry是一个轻量级的布局框架,拥有自己的描述语法,采用更优雅的链式语法封装自动布局,简洁明了并具有高可读性,而且同时支持 iOS 和 Max OS X。Masonry是一个用代码写iOS或OS界面的库,可以代替Auto layout。Masonry的github地址:https://github.com/SnapKit/Masonry

Masonry配置

- 推荐使用pods方式引入类库,pod \'Masonry\',若不知道pod如何使用,情况我的另一篇文章: 提高ios开发效率的工具

- 引入头文件 #import "Masonry.h"

Masonry使用讲解

mas_makeConstraints 是给view添加约束,约束有几种,分别是边距,宽,高,左上右下距离,基准线。添加过约束后可以有修正,修正有offset(位移)修正和multipliedBy(倍率)修正。

语法一般是 make.equalTo or make.greaterThanOrEqualTo or make.lessThanOrEqualTo + 倍数和位移修正。

注意点1: 使用 mas_makeConstraints方法的元素必须事先添加到父元素的中,例如[self.view addSubview:view];

注意点2: masequalTo 和 equalTo 区别:masequalTo 比equalTo多了类型转换操作,一般来说,大多数时候两个方法都是 通用的,但是对于数值元素使用mas_equalTo。对于对象或是多个属性的处理,使用equalTo。特别是多个属性时,必须使用equalTo,例如 make.left.and.right.equalTo(self.view);

注意点3: 注意到方法with和and,这连个方法其实没有做任何操作,方法只是返回对象本身,这这个方法的左右完全是为了方法写的时候的可读性 。make.left.and.right.equalTo(self.view);和make.left.right.equalTo(self.view);是完全一样的,但是明显的加了and方法的语句可读性 更好点。

Masonry初级使用例子


1 // exp1: 中心点与self.view相同,宽度为400*400
2 -(void)exp1{
3 UIView *view = [UIView new];
4 [view setBackgroundColor:[UIColor redColor]];
5 [self.view addSubview:view];
6 [view mas_makeConstraints:^(MASConstraintMaker *make) {
7 make.center.equalTo(self.view);
8 make.size.mas_equalTo(CGSizeMake(400,400));
9 }];
10 }
11 //exp2: 上下左右边距都为10
12 -(void)exp2{
13 UIView *view = [UIView new];
14 [view setBackgroundColor:[UIColor redColor]];
15 [self.view addSubview:view];
16 [view mas_makeConstraints:^(MASConstraintMaker *make) {
17 make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(10, 10, 10, 10));
18 // make.left.equalTo(self.view).with.offset(10);
19 // make.right.equalTo(self.view).with.offset(-10);
20 // make.top.equalTo(self.view).with.offset(10);
21 // make.bottom.equalTo(self.view).with.offset(-10);
22 }];
23 }
24 //exp3 让两个高度为150的view垂直居中且等宽且等间隔排列 间隔为10
25 -(void)exp3{
26 UIView *view1 = [UIView new];
27 [view1 setBackgroundColor:[UIColor redColor]];
28 [self.view addSubview:view1];
29 UIView *view2 = [UIView new];
30 [view2 setBackgroundColor:[UIColor redColor]];
31 [self.view addSubview:view2];
32 [view1 mas_makeConstraints:^(MASConstraintMaker *make) {
33 make.centerY.mas_equalTo(self.view.mas_centerY);
34 make.height.mas_equalTo(150);
35 make.width.mas_equalTo(view2.mas_width);
36 make.left.mas_equalTo(self.view.mas_left).with.offset(10);
37 make.right.mas_equalTo(view2.mas_left).offset(-10);
38 }];
39 [view2 mas_makeConstraints:^(MASConstraintMaker *make) {
40 make.centerY.mas_equalTo(self.view.mas_centerY);
41 make.height.mas_equalTo(150);
42 make.width.mas_equalTo(view1.mas_width);
43 make.left.mas_equalTo(view1.mas_right).with.offset(10);
44 make.right.equalTo(self.view.mas_right).offset(-10);
45 }];
46 }

Masonry高级使用例子1

iOS计算器使用Masorny布局:


1 //高级布局练习 ios自带计算器布局
2 -(void)exp4{
3 //申明区域,displayView是显示区域,keyboardView是键盘区域
4 UIView *displayView = [UIView new];
5 [displayView setBackgroundColor:[UIColor blackColor]];
6 [self.view addSubview:displayView];
7 UIView *keyboardView = [UIView new];
8 [self.view addSubview:keyboardView];
9 //先按1:3分割 displView(显示结果区域)和 keyboardView(键盘区域)
10 [displayView mas_makeConstraints:^(MASConstraintMaker *make) {
11 make.top.equalTo(self.view.mas_top);
12 make.left.and.right.equalTo(self.view);
13 make.height.equalTo(keyboardView).multipliedBy(0.3f);
14 }];
15 [keyboardView mas_makeConstraints:^(MASConstraintMaker *make) {
16 make.top.equalTo(displayView.mas_bottom);
17 make.bottom.equalTo(self.view.mas_bottom);
18 make.left.and.right.equalTo(self.view);
19 }];
20 //设置显示位置的数字为0
21 UILabel *displayNum = [[UILabel alloc]init];
22 [displayView addSubview:displayNum];
23 displayNum.text = @"0";
24 displayNum.fOnt= [UIFont fontWithName:@"HeiTi SC" size:70];
25 displayNum.textColor = [UIColor whiteColor];
26 displayNum.textAlignment = NSTextAlignmentRight;
27 [displayNum mas_makeConstraints:^(MASConstraintMaker *make) {
28 make.left.and.right.equalTo(displayView).with.offset(-10);
29 make.bottom.equalTo(displayView).with.offset(-10);
30 }];
31 //定义键盘键名称,?号代表合并的单元格
32 NSArray *keys = @[@"AC",@"+/-",@"%",@"÷"
33 ,@"7",@"8",@"9",@"x"
34 ,@"4",@"5",@"6",@"-"
35 ,@"1",@"2",@"3",@"+"
36 ,@"0",@"?",@".",@"="];
37 int indexOfKeys = 0;
38 for (NSString *key in keys){
39 //循环所有键
40 indexOfKeys++;
41 int rowNum = indexOfKeys %4 ==0? indexOfKeys/4:indexOfKeys/4 +1;
42 int colNum = indexOfKeys %4 ==0? 4 :indexOfKeys %4;
43 NSLog(@"index is:%d and row:%d,col:%d",indexOfKeys,rowNum,colNum);
44 //键样式
45 UIButton *keyView = [UIButton buttonWithType:UIButtonTypeCustom];
46 [keyboardView addSubview:keyView];
47 [keyView setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
48 [keyView setTitle:key forState:UIControlStateNormal];
49 [keyView.layer setBorderWidth:1];
50 [keyView.layer setBorderColor:[[UIColor blackColor]CGColor]];
51 [keyView.titleLabel setFont:[UIFont fontWithName:@"Arial-BoldItalicMT" size:30]];
52 //键约束
53 [keyView mas_makeConstraints:^(MASConstraintMaker *make) {
54 //处理 0 合并单元格
55 if([key isEqualToString:@"0"] || [key isEqualToString:@"?"] ){
56 if([key isEqualToString:@"0"]){
57 [keyView mas_makeConstraints:^(MASConstraintMaker *make) {
58 make.height.equalTo(keyboardView.mas_height).with.multipliedBy(.2f);
59 make.width.equalTo(keyboardView.mas_width).multipliedBy(.5);
60 make.left.equalTo(keyboardView.mas_left);
61 make.baseline.equalTo(keyboardView.mas_baseline).with.multipliedBy(.9f);
62 }];
63 }if([key isEqualToString:@"?"]){
64 [keyView removeFromSuperview];
65 }
66 }
67 //正常的单元格
68 else{
69 make.width.equalTo(keyboardView.mas_width).with.multipliedBy(.25f);
70 make.height.equalTo(keyboardView.mas_height).with.multipliedBy(.2f);
71 //按照行和列添加约束,这里添加行约束
72 switch (rowNum) {
73 case 1:
74 {
75 make.baseline.equalTo(keyboardView.mas_baseline).with.multipliedBy(.1f);
76 keyView.backgroundColor = [UIColor colorWithRed:205 green:205 blue:205 alpha:1];
77 }
78 break;
79 case 2:
80 {
81 make.baseline.equalTo(keyboardView.mas_baseline).with.multipliedBy(.3f);
82 }
83 break;
84 case 3:
85 {
86 make.baseline.equalTo(keyboardView.mas_baseline).with.multipliedBy(.5f);
87 }
88 break;
89 case 4:
90 {
91 make.baseline.equalTo(keyboardView.mas_baseline).with.multipliedBy(.7f);
92 }
93 break;
94 case 5:
95 {
96 make.baseline.equalTo(keyboardView.mas_baseline).with.multipliedBy(.9f);
97 }
98 break;
99 default:
100 break;
101 }
102 //按照行和列添加约束,这里添加列约束
103 switch (colNum) {
104 case 1:
105 {
106 make.left.equalTo(keyboardView.mas_left);
107 }
108 break;
109 case 2:
110 {
111 make.right.equalTo(keyboardView.mas_centerX);
112 }
113 break;
114 case 3:
115 {
116 make.left.equalTo(keyboardView.mas_centerX);
117 }
118 break;
119 case 4:
120 {
121 make.right.equalTo(keyboardView.mas_right);
122 [keyView setBackgroundColor:[UIColor colorWithRed:243 green:127 blue:38 alpha:1]];
123 }
124 break;
125 default:
126 break;
127 }
128 }
129 }];
130 }
131 }

本例子使用的baseline去控制高度位置,这似乎不是太准,如果想要精准控制高度位置,可以使用一行一行添加的方法,每次当前行的top去equelTo上一行的bottom。 给个提示:


for(遍历所有行)
for(遍历所以列)
//当前行约束根据上一行去设置
......

 




推荐阅读
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • iOS Xcode汇编模式切换的方法介绍
    一、概念 1.汇编指令:模拟器上运行的是Intel指令,而真机上运行的是arm指令, 2.每条汇编指令的格式总是由: 操作码,操作 ... [详细]
  • iOS开发Debug和Release的理解
    2019独角兽企业重金招聘Python工程师标准参考:http:blog.csdn.netmad1989articledetails406580331&# ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • android:EditText属性去边框EditText继承关系:View--TextView--EditTextEditText的属性很多,这里介绍几个:android:h ... [详细]
  • linux编写弹球游戏,手把手教你开发一款基于Box2D的弹球游戏(一)
    今天我们来介绍一款物理引擎,并基于它完成一个弹球游戏。提到物理引擎,就是在游戏中模拟真实世界的运动,碰撞,摩擦等等。Coco ... [详细]
  • 在应用开发中少不了界面元素的布局、适配、自适应。之前苹果已经为我们提供了 AutoLayout 和 SizeClasses,方便我们实现页面的自适应弹性布局。但对于一些复杂的交互界 ... [详细]
  • iOS推送手机消息的技术背后的奥秘揭示
    作者:allenzzhao,腾讯IEG运营开发工程师消息推送我们几乎每天都会用到,但你知道iOS中的消息推送是如何实现的吗?本文将从推送权限申请,到本地和远程消息推送, ... [详细]
author-avatar
干豆豆腐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有