Advertisement

android自动布局优先级,自动布局AutoLayout

阅读量:

1:理解概念

Auto Layout 的中文意思是 自动布局。它通过预设的 Constraint 和各项条件按照一定的规则来计算出合适的布局。这种合理安排能够满足我们预期和目标的需求。

展示我们想象中的结果 Constraint 的设置非常灵活 通过采用多个 Constraint 套的方式 则能够较为灵活地实现各种布局需求

以下几点是我们在开始使用之前必须弄清楚的事情:

我们要摒弃传统的布局方式,并无需再去关注View中的Frame、Center以及autoresize功能。由于这些坐标与大小的位置都可以通过Auto Layout来进行定位。

掌握每一种Constraint的概念非常重要,因为当遇到别人实现的时候会有一种难以理解的感觉.

3:遵循设计意图,在所有情况下都以预期效果为基础进行规划; 当约束条件设置得当时, 必然能达到目标规划。

2:开始使用

先从 Interface Builder 开始吧. 打开某个 Xib 或者 StoryBoard ,

在右侧 Show in file inspector 里面找到 Ues Autolayout ,将其勾选.如下图:

L3Byb3h5L2h0dHAvd3d3LnRoNy5jbi9kL2ZpbGUvcC8yMDE0LzEwLzI5LzlmZDRlNWM1MmMxN2UzOWViMDZmYmJjMmViOWFjM2VmLnBuZw==.jpg

从此, Autolayout 该机制已被正常启用, 并不再使用autoresizingMask这一机制.它所承担的功能与特性已由Autolayout完全替代.

这种定位方法不再是旧方法,而是通过推导出每个坐标值来确定其具体位置,其中每个坐标值由x和y参数决定。

思考一下, 该控件与左右两边的距离如何?

然而,在某些情况下,同样遵循特定的规范和标准。例如,在确定控制点位置时,必须具备x和y坐标的值。如果缺少任何一个就无法正常运行。

同样地,在Autolayout创建约束时也是如此:完成对上边距的考虑后还需再次审视上边距问题;否则将导致控件显示位置出现异常。

换句话说,为了使Autolayout能够确定合适的位置坐标,必须确保水平间距与垂直间距同时存在.若不满足这一条件, IDE均会发出警告信息,提示这种布局方式存在模棱两可的问题

接下来,让我们来了解 Interface Builder 实现 Autolayout 功能的方式有哪些:

观察一下界面预览右下角,有一排如下图这样的按钮:

L3Byb3h5L2h0dHAvd3d3LnRoNy5jbi9kL2ZpbGUvcC8yMDE0LzEwLzI5L2JhMTlhOWExY2I2OTFhYzFmMzY5YzFiMGQzMzc3MWZjLnBuZw==.jpg

这些主要展示了Interface Builder如何构建Constraint。
与此同时,在Xcode的操作系统功能列表中也能发现此相关内容。
如上图所示。

L3Byb3h5L2h0dHAvd3d3LnRoNy5jbi9kL2ZpbGUvcC8yMDE0LzEwLzI5LzU0YjlmZjczYjE1ZTIwNTk2YjVmMzkxOWQ2MmU1OTllLnBuZw==.jpg

这些功能分别如下图中描述的那样:

L3Byb3h5L2h0dHAvd3d3LnRoNy5jbi9kL2ZpbGUvcC8yMDE0LzEwLzI5L2E3ZjhmZDVhOWI4OGIyNDBlMDZhMmNmY2RjZWI5YmI3LmpwZw==.jpg
L3Byb3h5L2h0dHAvd3d3LnRoNy5jbi9kL2ZpbGUvcC8yMDE0LzEwLzI5LzUxZmRhYzQzNmE0NGI4MmUxZGJmNzE2MTcwOGM2ODk4LnBuZw==.jpg

如果是在代码层面上应用Autolayout机制,应将所使用的View的transImmutable属性配置为不可更改状态.

就可以启动在代码中添加Constraint,否则在View组件中,默认会根据之前的autoresizingMask属性进行尺寸调整.

在使用 AutoLayout 的布局器界面中选择 AutoLayout 选项后,默认情况下会将 IB 生成的控件的 trans.isEnabled 属性预设为不可编辑。

3:从旧的IB布局中转换成Auto layout

4:熟练使用Interface Builder

5:通过代码来构建自动布局

代码创建的约束有两种方式:

常规约束的书写方式较为复杂,并且能够处理多种类型的约束条件

//添加两个允许自动布局的子视图

UIView *view1 = [[UIView alloc]initWithFrame:CGRectZero];

//使用Autolayout,关闭Autorisizing

view1.translatesAutoresizingMaskIntoConstraints = NO;

view1.backgroundColor = [UIColor redColor];

[self.view addSubview:view1];

UIView *view2 = [UIView new];

view2.frame = CGRectZero;

view2.translatesAutoresizingMaskIntoConstraints = NO;

view2.backgroundColor = [UIColor grayColor];

[self.view addSubview:view2];

/**

  • 第一种简单方法

*/

//设置子视图的宽度和父视图的宽度相同

// [self.view addConstraint:

// //添加一个约束

// [NSLayoutConstraint constraintWithItem:

// //给谁添加约束(view1)

// view1 attribute:

// //约束的属性是宽

// NSLayoutAttributeWidth relatedBy:

// //约束的关系是怎样的,相等,还是大于小于

// NSLayoutRelationEqual toItem:

// //和谁建立约束关系(父视图)

// self.view attribute:

// //和父视图的哪个属性建立

// NSLayoutAttributeWidth multiplier:

// //比例

// 1.0 constant:

// //约束的值

// -100]];

//“view1.attr1 = view2.attr2 * multiplier + constant”

//设置子视图的高度是父视图高度的一半

// [self.view addConstraint:[NSLayoutConstraint

constraintWithItem:view1

attribute:NSLayoutAttributeHeight

relatedBy:NSLayoutRelationEqual

toItem:self.view

attribute:NSLayoutAttributeHeight

multiplier:0.5

constant:-

]

];

#import "DDYViewController.h"

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

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

@interface DDYViewController ()

@property (nonatomic, weak)UITextField *loginName;

@end

@implementation DDYViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor = [UIColor lightGrayColor];

//imageView 背景图片

[self settingImageView];

//texdField 文本框

[self settingTextField];

}

#pragma mark - texdField

- (void)settingTextField

{

//创建组件

UITextField *loginName = [[UITextField alloc]init];

//设置frame,约束完删除

//loginName.frame = CGRectMake(10, 10, 100, 30);

//用autolayout

loginName.translatesAutoresizingMaskIntoConstraints = NO;

//文本颜色

loginName.textColor = [UIColor blueColor];

//背景颜色

loginName.backgroundColor = [UIColor whiteColor];

//默认显示

loginName.placeholder = @"password";

//样式

[loginName setBorderStyle:UITextBorderStyleRoundedRect];

//全局

_loginName = loginName;

//添加组件

[self.view addSubview:loginName];

/* 约束 */

[self.view addConstraint:[NSLayoutConstraint

constraintWithItem:loginName

attribute:NSLayoutAttributeHeight

relatedBy:NSLayoutRelationEqual

toItem:nil

attribute:NSLayoutAttributeNotAnAttribute

multiplier:

constant:

]

];

[self.view addConstraint:[NSLayoutConstraint

constraintWithItem:loginName

attribute:NSLayoutAttributeWidth

relatedBy:NSLayoutRelationEqual

toItem:nil

attribute:NSLayoutAttributeNotAnAttribute

multiplier:

constant:

]

];

[self.view addConstraint:[NSLayoutConstraint

constraintWithItem:loginName

attribute:NSLayoutAttributeTop

relatedBy:NSLayoutRelationEqual

toItem:self.view

attribute:NSLayoutAttributeTop

multiplier:

constant:

]

];

[self.view addConstraint:[NSLayoutConstraint

constraintWithItem:loginName

attribute:NSLayoutAttributeCenterX

relatedBy:NSLayoutRelationEqual

toItem:self.view

attribute:NSLayoutAttributeCenterX

multiplier:

constant:

]

];

}

#pragma mark - imageView

- (void)settingImageView {

//创建组件

UIImageView *backImageView = [[UIImageView alloc]init];

//背景色,无背景图片时可用

//backImageView.backgroundColor = [UIColor grayColor];

//背景图片

backImageView.image = [UIImage imageNamed:@"form-big"];

//开启用户交互,往其上添加可交互组件时开启

//backImageView.userInteractionEnabled = YES;

//添加组价

[self.view addSubview:backImageView];

//使用autolayout

backImageView.translatesAutoresizingMaskIntoConstraints = NO;

/* 约束 */

[self.view addConstraint:[NSLayoutConstraint

constraintWithItem:backImageView

attribute:NSLayoutAttributeHeight

relatedBy:NSLayoutRelationEqual

toItem:nil

attribute:NSLayoutAttributeNotAnAttribute

multiplier:

constant:

]

];

[self.view addConstraint:[NSLayoutConstraint

constraintWithItem:backImageView

attribute:NSLayoutAttributeWidth

relatedBy:NSLayoutRelationEqual

toItem:nil

attribute:NSLayoutAttributeNotAnAttribute

multiplier:

constant:

]

];

[self.view addConstraint:[NSLayoutConstraint

constraintWithItem:backImageView

attribute:NSLayoutAttributeTop

relatedBy:NSLayoutRelationEqual

toItem:self.view

attribute:NSLayoutAttributeTop

multiplier:

constant:

]

];

[self.view addConstraint:[NSLayoutConstraint

constraintWithItem:backImageView

attribute:NSLayoutAttributeCenterX

relatedBy:NSLayoutRelationEqual

toItem:self.view

attribute:NSLayoutAttributeCenterX

multiplier:

constant:

]

];

}

item1.attribute = multiplier ⨉ item2.attribute + constant

2:可视化格式语言约束VFL

/**

  • 第二种方法

*/

//NSDictionaryOfVariableBindings是一种宏定义,在iOS开发中被用来自动生成字典结构。其中键名与对象名称标识符保持一致,默认情况下会包含所有需要进行自动生成布局的父视图及其所有子视图。例如,在使用@符号标记的情况下,默认生成的内容包括@{“self.view”: self.view, “view1”: view1, “view2”: view2}等字段配置项。

创建为查看视图并绑定变量的键值对的对象 views 等于调用方法 NordicDictionaryOfVariableBindings 调用参数 self.view、view1 和 view2

[self.view addConstraints:

//添加一组约束

[NSLayoutConstraint constraintsWithVisualFormat:

//对水平方向上V₁的管理:将左边缘设为零(若无需此设置则可省略),确保V₂与V₁在宽度上保持一致

@“H:|--[view1]--[view2(==view1)]--|” options:

//字典类型的值,可以点进去看枚举类型,一般给0

metrics:

//衡量标准,一般为nil,参数从NSDictionary传过来

nil views:views]];

在self.view中设置约束

在self.view中设置约束

// [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@“V:|-100-[view2]-100-|” options:0 metrics:nil views:views]];

在垂直方向上对view1施加约束:设置其顶端至父视图顶端的距离为零;同时将view2的高度调整至与view1一致

添加约束到当前视图... 视觉布局配置为 ... ,其中包含 ... 的相关属性设置 ...

Xcode6中自动布局autolayout和sizeclass的使用

在Xcode 6环境中,自动生成布局(Autolayout)以及尺寸类(Size Class)的运用已成为开发者的必备技能之一。一、关于自动生成布局(Autolayout) 自从接触自动生成布局功能以来,在实际操作之前我也曾有这样的想法——这是一个看起来是一个相当复杂且难以掌握的系统。然而通过深入学习与实践,在逐渐掌握了其核心原理后发现这一工具远比我最初想象的更加强大与灵活。例如,在设计一个带有滚动功能的应用时,Xcode会根据自动生成布局(Autolayout)来计算滚动条的位置。

(转)Xcode6中自动布局autolayout和sizeclass的使用

在Xcode6开发环境中,实现自动生成布局元素的功能主要依赖于Autolayout和SizeClass两个机制。1. 自动布局(Autolayout) 在实际操作过程中,Xcode中的自动生成布局功能往往让人感到复杂难懂。经过一番深入学习后我发现这一看法并不完全正确。

iOS:自动布局Autolayout

自动布局:Autolayout 简介: 在iOS程序开发中,设计界面布局的方法是什么? 开发过程中经常需要编写复杂的坐标计算逻辑 为了确保在不同屏幕尺寸下呈现最佳效果,通常需要进行大量的调试与优化工作 ...

自动布局autolayout和sizeclass的使用

一.关于自动布局(Autolayout) 在Xcode中,自动布局虽然看似复杂,但实际操作起来并不困难. 我们知道,一款iOS应用的核心用户界面元素都是通过Auto Layout系统进行布局管理的. 以前我也一直对此持有疑虑,但通过实践后才发现其便捷性.

iOS 自动布局 Autolayout 优先级的使用

一. 约束优先级 0. 界面适配 演变历史 代码计算模块->autoresize(父组件与子组件之间的关系)->autolayout(各组件之间相互关联)->siz...

IOS手动添加的View 在代码中使用(自动布局)autoLayout

- (void)viewDidLoad { [super viewDidLoad]; UIButton *btnTest = [UIButton buttonWithType:UIButtonType ...

iOS-自动布局Autolayout(原创)

引言

【转】iOS学习之Storyboard中的UIScrollView使用自动布局

当开发基于storyboard和XIB的应用时,我们通常会采用ScrollView以及AutoLayout。然而,在整合ScrollView与AutoLayout时往往需要额外注意。基于实践经验,我建议大家 ...

AutoLayout +Masonary

Masonry 是一种广泛应用的建筑砌筑系统,在快速上手 Autolayout 方面具有显著优势;通过这一系统可以在较短时间内完成砌筑设计与施工规划;学习 Masonry 可以为从事相关领域工作打下坚实的基础;同时结合 Autolayout 技术可以显著提高工作效率与设计精度

随机推荐

协同开发中SVN的使用建议

建议提醒每位员工熟记个人账号及密码,并避免泄露个人信息。为了确保操作安全,请勿泄露账号信息给他人,在必要时也请避免使用他人的账号进行SVN操作(主要考虑每个SVN账号的使用者的权限范围问题)。如若遗忘,请及时联系相关部门进行重置或修改。

颤抖吧,骚年们,2016年末最牛逼的sql语句

获取并按日期统计各渠道的日安装量信息
从unixtime函数中提取createTime参数的日期字段
并对该字段进行计数统计
同时对设备id字段进行计数统计
将结果分别命名为'安装量'和'活跃设备数'

UIAccessibilityElement

UIaccessibilityElement类打包的相关信息可供少数人查看。通常情况下无法被访问。例如,因为它们不具备继承自UIView的能力,一个图标或文字图像不会自动被访问。

RMAN备份与恢复之DataBase

开始进入 Oracle SQL Production 环境中的 SQL Enhanced Plus 服务器,并运行非登录会话

CentOS 6.5_X64下安装MongoDB数据库

获取MongoDB软件的官方下载页面

获取MongoDB软件的官方下载页面

为什么很多应用都安装在/usr/local目录下

因为大量应用程序通常会选择位于$usr/local这个特定的存储位置以确保资源的一致性与可管理性

TagHelper

在ASP.NET Core框架中编写 Razor 视图时,采用了全新的方法--TagHelper. 那么这个TagHelper到底是怎么回事呢?让我们深入了解一下. 首先,我们来探讨一下其背后的技术原理是什么.

shell脚本定时备份数据库

创建文件back_db.sh #!/bin/bash
获取当前日期并存储于变量TODAYTIME中
设置数据库名为test_mysql ...

mybatis+spring+c3p0+maven+ehcache

项目截图 pom.xml如下

全部评论 (0)

还没有任何评论哟~