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

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

1:理解概念AutoLayout中文翻译过来意思是自动布局,通过内定的Constraint(约束)和各项条件来计算出合理的布局.而这个合理的布局,符合我们的的预期和意图.将我们想象

1:理解概念

Auto Layout 中文翻译过来意思是 自动布局 ,通过内定的 Constraint (约束)和各项条件来计算出合理的布局.而这个合理的布局,符合我们的的预期和意图.

将我们想象中的结果展现出来. Constraint 的设定非常灵活,实现一种布局的方法可以通过多Constraint 套来完成.

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

1:我们要抛弃以往旧的布局方式不再去关注View的Frame,Center,和autoresizing. 因为这些坐标和大小的定位都可以通过来Auto Layout完成.

2:理解每一种 Constraint 的含义,否则,当你去看别人的实现的 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,都会给出警告,提示这样的布局 Ambiguous Layout (模凌两可)

接下来,让我们来熟悉一下 Interface Builder 提供哪些实现 Autolayout 的功能:

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

L3Byb3h5L2h0dHAvd3d3LnRoNy5jbi9kL2ZpbGUvcC8yMDE0LzEwLzI5L2JhMTlhOWExY2I2OTFhYzFmMzY5YzFiMGQzMzc3MWZjLnBuZw==.jpg

这些是 Interface Builder 用来创建 Constraint 的主要方式,同时,我们也可以在 Xcode 的菜单栏中找到这些功能,如下图:

L3Byb3h5L2h0dHAvd3d3LnRoNy5jbi9kL2ZpbGUvcC8yMDE0LzEwLzI5LzU0YjlmZjczYjE1ZTIwNTk2YjVmMzkxOWQ2MmU1OTllLnBuZw==.jpg

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

L3Byb3h5L2h0dHAvd3d3LnRoNy5jbi9kL2ZpbGUvcC8yMDE0LzEwLzI5L2E3ZjhmZDVhOWI4OGIyNDBlMDZhMmNmY2RjZWI5YmI3LmpwZw==.jpg

L3Byb3h5L2h0dHAvd3d3LnRoNy5jbi9kL2ZpbGUvcC8yMDE0LzEwLzI5LzUxZmRhYzQzNmE0NGI4MmUxZGJmNzE2MTcwOGM2ODk4LnBuZw==.jpg

如果是从代码层面开始使用Autolayout,需要对使用的View的translatesAutoresizingMaskIntoConstraints 的属性设置为NO.

即可开始通过代码添加Constraint,否则View还是会按照以往的autoresizingMask进行计算.

而在 Interface Builder 中勾选了Ues Autolayout,IB生成的控件的translatesAutoresizingMaskIntoConstraints 属性都会被默认设置NO.

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

4:熟练使用Interface Builder

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

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

1:常规约束,写法非常冗长,但能实现所有的约束方式以及非常特殊的约束方式,代码如下:

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

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是一个宏定义,期作用是生成一个字典,key的名字和对象的名字标示符相同,比如{@“self.view”:self.view ,@“view1”:view1,@“view2”:view2},一般字典里包含需要自动布局的父视图和所有的子视图

NSDictionary *views = NSDictionaryOfVariableBindings(self.view,view1,view2);

[self.view addConstraints:

//添加一组约束

[NSLayoutConstraint constraintsWithVisualFormat:

//添加对水平方向上V1的控制:距离父视图左边距为0(如果是0可以忽略),同时view2的宽度和viwe1相同

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

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

metrics:

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

nil views:views]];

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

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

//添加垂直方向view1的控制:距离父视图顶部距离为0;同时viwe2的高度和view1相等

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@“V:|--[view1]--[view2(==view1)]--|” options: metrics:nil views:views]];

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

Xcode6中自动布局autolayout和sizeclass的使用   一.关于自动布局(Autolayout) 在Xcode中,自动布局看似是一个很复杂的系统,在真正使用它之前,我也是这么认为的, ...

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

Xcode6中自动布局autolayout和sizeclass的使用   一.关于自动布局(Autolayout) 在Xcode中,自动布局看似是一个很复杂的系统,在真正使用它之前,我也是这么认为的, ...

iOS:自动布局Autolayout

自动布局:Autolayout 简介: 在以前的iOS程序中,是如何设置布局UI界面的? 经常编写大量的坐标计算代码 为了保证在3.5 inch和4.0 inch屏幕上都能有完美的UI界面效果,有时还 ...

自动布局autolayout和sizeclass的使用

一.关于自动布局(Autolayout) 在Xcode中,自动布局看似是一个很复杂的系统,在真正使用它之前,我也是这么认为的,不过事实并非如此. 我们知道,一款iOS应用,其主要UI组件是由一个个相对 ...

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

一.约束的优先级 0.屏幕适配 发展历程 代码计算frame -> autoreszing(父控件和子控件的关系) -> autolayout(任何控件都可以产生关系) -> siz ...

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

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

iOS-自动布局Autolayout(原创)

前言 基础知识 在一定情况下我们需要用到自动布局(autolayout) 这样我们就能使视图与视图之间的位置相互关联起来 横向:距离父视图左侧100 视图本身的宽度最小是100 距离父视图右侧是100 ...

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

在使用storyboard和xib时,我们经常要用到ScrollView,还有自动布局AutoLayout,但是ScrollView和AutoLayout 结合使用,相对来说有点复杂.根据实践,我说一 ...

AutoLayout +Masonary

1, Masonry介绍与使用实践(快速上手Autolayout) http://adad184.com/2014/09/28/use-masonry-to-quick-solve-autolayou ...

随机推荐

协同开发中SVN的使用建议

协同开发中SVN的使用建议 1.  注意个人账户密码安全 各员工需牢记各自的账户和密码,不得向他人透漏,严禁使用他人账户进行SVN各项操作(主要考虑每个SVN账号的使用者的权限范围问题).如有忘记,请 ...

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

select channel_name,from_unixtime(createTime,'%Y-%m-%d') as tdate,count(deviceid) '安装量',count(case w ...

UIAccessibilityElement

UIaccessibilityElement类封装的项目信息对一些特殊的人可见,默认情况下是不可访问的.例如,一个图标或文字图像不会自动访问,因为它没有继承的UIView(或UIControl).一个 ...

RMAN备份与恢复之DataBase

1   准备 [oracle@TEST144239 /]$ sqlplus /nolog SQL Production :: Copyright (c) , , Oracle. All rights ...

CentOS 6.5_X64下安装MongoDB数据库

1.下载MongoDB 官网下载地址:https://www.mongodb.org/downloads 具体链接:https://fastdl.mongodb.org/linux/mongodb-l ...

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

为什么很多应用都安装在/usr/local目录下   很多应用都安装在/usr/local下面,那么,这些应用为什么选择这个目录呢?理解了最根源的原因后,也许对你理解linux组织文件的方式有更直观的 ...

TagHelper

TagHelper是怎么实现的   众所周知,在asp.net core中编写Razor视图的时候,用了一种新的写法--TagHelper 那这个TagHelper是怎么回事呢? 首先来看看TagHe ...

shell脚本定时备份数据库

脚本代码: 新建文件back_db.sh #!/bin/bash TODAYTIME="`date +%Y%m%d`" DBNAME="test mysql" ...

mybatis+spring+c3p0+maven+ehcache

项目截图 pom.xml如下



推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • vue使用
    关键词: ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文介绍了如何使用elementui分页组件进行分页功能的改写,只需一行代码即可调用。通过封装分页组件,避免在每个页面都写跳转请求的重复代码。详细的代码示例和使用方法在正文中给出。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
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社区 版权所有