1.概述

  • 通常我们通过storyboard能够完成的,代码也能够完成,所以这里介绍下代码实现约束的添加,通常我们不这么干(在不使用第三方框架的情况下,使用系统自带的类添加约束特别繁琐),所以这里仅仅简单介绍下代码实现原理

2.实现效果

  • 实现效果 
  • 纯OC代码 
    • 在storyboard中的一条约束在代码中的体现就是一个约束对象,所以添加在storyboard上添加一条约束,相当于创建了一个约束对象并将该约束对象添加到对应的视图上
    • 第一步:创建子控件视图
    • 第二步:禁用子控件的autoresizing属性
    • 第三步:创建约束对象
    • 第四步:添加约束对象
  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3. // 1.创建一个子视图,添加到父视图上面
  4. UIView *redView = [[UIView alloc] init];
  5. redView.backgroundColor = [UIColor redColor];
  6. [self.view addSubview:redView];
  7. #warning 注意点: 如果通过代码来设置Autolayout约束, 那么必须先禁用Autoresizing
  8. // 2.禁用autoresizing
  9. // 2.1给需要设置约束的视图禁用autoresizing,禁用父视图autoresizing对子控件无效
  10. //self.view.translatesAutoresizingMaskIntoConstraints = NO;//错误写法
  11. redView.translatesAutoresizingMaskIntoConstraints = NO;
  12.  
  13. // 3.添加约束
  14. // 3.1红色(红色距离顶部和左边以及右边的边距固定为20,高度固定为50)
  15. // 3.1.1顶部(基于父控件)
  16. /*
  17. constraintWithItem:需要设置约束的view
  18. attribute:需要设置约束的位置
  19. relatedBy:约束的条件
  20. toItem:约束依赖目标
  21. attribute:依赖目标约束位置
  22. multiplier:配置系数
  23. constant:额外需要添加的长度
  24. */
  25. /*
  26. 计算公式:redView.attribute = self.view.attribute * multiplier + constant;
  27. 其中:=符号取决于relatedBy:参数
  28. typedef NS_ENUM(NSInteger, NSLayoutRelation) {
  29. NSLayoutRelationLessThanOrEqual = -1, 小于等于
  30. NSLayoutRelationEqual = 0, 等于
  31. NSLayoutRelationGreaterThanOrEqual = 1, 大于等于
  32. };
  33. */
  34. // 3.1.1.1创建约束对象
  35. NSLayoutConstraint *redTopCos = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:20];
  36. // 3.1.1.2判断约束条件的层级关系,并添加到对应的视图
  37. [self.view addConstraint:redTopCos];
  38. /*
  39. attribute:传入的是枚举参数
  40. NSLayoutAttributeLeft = 1, 左边距
  41. NSLayoutAttributeRight, 右边距
  42. NSLayoutAttributeTop, 距离顶部边距
  43. NSLayoutAttributeBottom, 距离底部边距
  44. NSLayoutAttributeLeading, 左对齐
  45. NSLayoutAttributeTrailing, 右对齐
  46. NSLayoutAttributeWidth, 宽度
  47. NSLayoutAttributeHeight, 高度
  48. NSLayoutAttributeCenterX, 中点X
  49. NSLayoutAttributeCenterY, 中点Y
  50. NSLayoutAttributeBaseline, 文本底线对齐
  51. */
  52. // 3.1.2左边约束(基于父控件)
  53. NSLayoutConstraint *redLeftCos = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:20];
  54. // 3.1.2.2判断约束条件的层级关系,并添加到对应的视图
  55. [self.view addConstraint:redLeftCos];
  56.  
  57. // 3.1.3右边约束(基于父控件)
  58. NSLayoutConstraint *redRightCos = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1.0 constant:-20];
  59. // 3.1.3.2判断约束条件的层级关系,并添加到对应的视图
  60. [self.view addConstraint:redRightCos];
  61.  
  62. // 3.1.4 高度约束(自身)
  63. NSLayoutConstraint *redHeightCos = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1.0 constant:50];
  64. // 3.1.3.2判断约束条件的层级关系,并添加到对应的视图
  65. [redView addConstraint:redHeightCos];
  66. }

  

  1.  

3.VFL语言实现约束的添加

  • 苹果同时为我们提供了VisualFormat语言快速添加约束(使用起来比OC简便一些) 

  • 同样实现上述效果,代码如下:

  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3. // 1.创建二个子视图,添加到父视图上面
  4. UIView *redView = [[UIView alloc] init];
  5. redView.backgroundColor = [UIColor redColor];
  6. [self.view addSubview:redView];
  7.  
  8. UIView *blueView = [[UIView alloc] init];
  9. blueView.backgroundColor = [UIColor blueColor];
  10. [self.view addSubview:blueView];
  11.  
  12. #warning 注意点: 如果通过代码来设置Autolayout约束, 那么必须先禁用Autoresizing
  13. // 2.禁用autoresizing
  14. // 2.1给需要设置约束的视图禁用autoresizing,禁用父视图autoresizing对子控件无效
  15. //self.view.translatesAutoresizingMaskIntoConstraints = NO;//错误写法
  16. redView.translatesAutoresizingMaskIntoConstraints = NO;
  17. blueView.translatesAutoresizingMaskIntoConstraints = NO;
  18.  
  19. // 3.添加约束
  20. /*
  21. VisualFormat: VFL语句
  22. options: 对齐方式等
  23. metrics: VFL语句中使用到的一些变量
  24. views: VFL语句中使用到的一些控件
  25. */
  26. // 3.1红色视图
  27. // 水平方向
  28. NSArray *hCos = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[redView]-20-|" options:kNilOptions metrics:nil views:NSDictionaryOfVariableBindings(redView)];
  29. [self.view addConstraints:hCos];
  30.  
  31. //竖直方向
  32.  
  33. NSArray *vCos = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[redView(==50)]" options:kNilOptions metrics:nil views:NSDictionaryOfVariableBindings(redView)];
  34. [self.view addConstraints:vCos];
  35.  
  36. // 3.2蓝色视图
  37. // 垂直方向
  38. NSArray *vBlueCos = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[redView]-20-[blueView(==50)]" options:NSLayoutFormatAlignAllRight metrics:nil views:NSDictionaryOfVariableBindings(redView,blueView)];
  39. [self.view addConstraints:vBlueCos];
  40. // 水平方向
  41. NSLayoutConstraint *hBlueCos = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:redView attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0.0];
  42. [self.view addConstraint:hBlueCos];
  43. /*VFL格式说明
  44. 功能        表达式
  45. 水平方向       H:
  46. 垂直方向       V:
  47. Views        [view]
  48. SuperView      |
  49. 关系         >=,==,<=
  50. 空间,间隙       -
  51. 优先级        @value
  52. */
  53. }
  1. NSDictionaryOfVariableBindings(redView,blueView) 也相当于:
  2. @{@"redView": redView , @"blueView": blueView}
  3.  
  4. [self.contentView addSubview:self.headerImageViewBackgroundView];
  5. [self.contentView addSubview:self.conversationTitle];
  6. [self.contentView addSubview:self.messageCreatedTimeLabel];
  7. [rightContentView addSubview:self.conversationStatusImageView];
  8. [rightContentView addSubview:self.lastSendMessageStatusView];
  9. [self.contentView addSubview:rightContentView];
  10. [self.contentView addSubview:self.messageTypeLabel];
  11. [self.contentView addSubview:self.messageContentLabel];
  12.  
  13. self.cellSubViews = NSDictionaryOfVariableBindings(_headerImageViewBackgroundView, _conversationTitle,_messageCreatedTimeLabel, _conversationStatusImageView,_lastSendMessageStatusView,rightContentView,_messageContentLabel,_messageTypeLabel);
  14.  
  15. [self.contentView
  16. addConstraints:
  17. [NSLayoutConstraint
  18. constraintsWithVisualFormat:
  19. @"H:|-portrait_margin_left-[_headerImageViewBackgroundView(width)]-portrait_margin_right-[_"
  20. @"conversationTitle]-5-[_messageCreatedTimeLabel(==40)]-12-"
  21. @"|" options:0 metrics:@{
  22. @"portrait_margin_left" :@(portrait_margin_left),
  23. @"portrait_margin_right" :@(portrait_margin_right),
  24. @"width" :
  25. @([RCIM sharedRCIM].globalConversationPortraitSize.width)
  26. } views:self.cellSubViews]];

  

  

  1.  

利用代码添加autolayout约束的更多相关文章

  1. 使用代码创建AutoLayout约束

    使用代码创建AutoLayout约束 1.代码创建约束的步骤 2.代码创建约束的常用方法 3.代码创建约束的原则 4.禁用Autoresizing的原因 5. 设置相对状态栏的约束,使用self.to ...

  2. iOS代码添加视图约束

    项目要做这样一个效果的启动页. 考虑到版本号是会不断变更的,因此采用动画效果启动页,让版本号动态加载iOS启动页动画效果 - 简书 考虑到屏幕适配问题,因此采用代码对视图添加约束.在添加约束的过程中遇 ...

  3. 代码实现Autolayout

    代码实现Autolayout的步骤 利用NSLayoutConstraint类创建具体的约束对象 添加约束对象到相应的view上 - (void)addConstraint:(NSLayoutCons ...

  4. 【转】iOS学习之Autolayout(代码添加约束) -- 不错不错

    原文网址:http://www.cnblogs.com/HypeCheng/articles/4192154.html DECEMBER 07, 2013 学习资料 文章 Beginning Auto ...

  5. 【转】iOS6中的Auto Layout:通过代码添加约束

        最近做的项目用到了Auto Layout,于是经过了一番大量的google,这是我看到的讲用代码创建约束最清晰的一篇教程,于是想跟更多的人分享一下.原文也比较简单,可以直接过去看,如果我翻译的 ...

  6. 七、eclipse添加离线约束,使不联网也能有一些代码的提示,例如dubbo

    eclipse添加离线约束,使不联网也能有一些代码的提示,例如dubbo 1.将dubbo.xsd文件放到一个无中文目录下 2.eclipse->windows->preferences- ...

  7. 【原】iOS学习之苹果原生代码实现Autolayout和VFL语言

    1.添加约束的规则 在创建约束之后,需要将其添加到作用的view上 在添加时要注意目标view需要遵循以下规则: 1)对于 两个同层级view之间 的约束关系,添加到它们的父view上 2)对于 两个 ...

  8. 史上比较用心的纯代码实现 AutoLayout

    入职有两三个月了吧,都是使用 Objective-C 纯代码(虽然有时候偷偷参杂一些 Swift 开源库)来编写公司APP,写布局的时候几乎都是要么在初始化的时候用 initWithFrame,要么就 ...

  9. 如何优雅的代码编写 AutoLayout

    概述 使用 Objective-C 纯代码编写 AutoLayout,看 AutoLayout 的字面理解就是自动布局,听起来好像蛮屌的样子.说白了就是适配:适应.兼容各种不同的情况,包括不同版本的操 ...

随机推荐

  1. xp 下查看进程指令

    xp 下快速查看进程及关联 exe 的指令,刚发现,还没有测试 win7 和 win10 支持不支持. wmic process where creationclassname="win32 ...

  2. 【总结】使用WebBrowser遇到的陷阱

    一.前言 一直想用WebBrowser做一些好玩的东西,比如抓取分析感兴趣的网站页面.自动点击提交页面等,所以最近在研究WebBrowser.WebBrowser的功能十分强大,就是一个微型的Brow ...

  3. [教程] [授权翻译] 使用补丁修改DSDT/SSDT [DSDT/SSDT综合教程]

    [教程] [授权翻译] 使用补丁修改DSDT/SSDT [DSDT/SSDT综合教程] http://bbs.pcbeta.com/viewthread-1571455-1-1.html [教程] [ ...

  4. tensorflow学习

    tensorflow安装时遇到gcc: error trying to exec 'as': execvp: No such file or directory. 截止到2016年11月13号,源码编 ...

  5. 【转】真正从零开始,TensorFlow详细安装入门图文教程!(帮你完成那个最难的从0到1)

    AI这个概念好像突然就火起来了,年初大比分战胜李世石的AlphaGo成功的吸引了大量的关注,但其实看看你的手机上的语音助手,相机上的人脸识别,今日头条上帮你自动筛选出来的新闻,还有各大音乐软件的歌曲& ...

  6. 为什么不用rxjava?

    rxjava等系列产品.思想是很好的,但是被大多数人用成了一坨屎! 就拿rx最经典的那个例子来说: 假设有这样一个需求:界面上有一个自定义的视图 imageCollectorView ,它的作用是显示 ...

  7. 聊一聊PV和并发

    最近和几个朋友,聊到并发和服务器的压力问题.很多朋友,不知道该怎么去计算并发?部署多少台服务器才合适? 所以,今天就来聊一聊PV和并发,还有计算web服务器的数量 的等方法.这些都是自己的想法加上一些 ...

  8. .Net GridView 序号列

    给GridView增加一列:序号列 <asp:TemplateField HeaderText="序号"> <ItemTemplate> <%# (( ...

  9. Boost正则表达式的编译与使用方法集

    下载boost 在boost官网上下载任何版本都可以www.boost.org . 将boost压缩包解压到D盘目录下 (我下载的是boost_1_54_0.zip),目录为D:\boost_1_54 ...

  10. [cocos] ( 01 ) cocos2d-x 3.x 开发 环境配置

    有几个需要注意的问题 Windows上使用时, Unable to execute dex: Multiple dex files define 在eclipse中libcoco2dx的Java Bu ...