iOS开发-VFL(Visual format language)和Autolayout

简介:

AutoLayout不管是在StoryBorad还是在xib中都相对来说比较简单,VFL(Visual  fromat  language)可视化语言基本上用到的比较少,在xCode4时候自动布局的概念还没有,直接使用VFL会很方便,可视化语言依赖于oc运行时创建对应的约束,如果IBOutlet发生改变有的时候会造成莫名其妙的Bug。xCode5之后可视化语言用到的场景相对较少,但是作为一个工作的辅助还是可以稍微了解下。

基础知识

在StotyBoard中添加一个标签一个按钮,不适用自动布局,简单的控制它们之间的水平距离为80,如下图所示:

 

视图中添加约束:

1
2
NSLayoutConstraint   *labelContraint=[ NSLayoutConstraint  constraintWithItem: self .changeButton attribute: NSLayoutAttributeLeft  relatedBy: NSLayoutRelationEqual  toItem: self .descriptionLabel attribute: NSLayoutAttributeRight  multiplier:1.0 constant:60];
[ self .view addConstraint:labelContraint];

这个只是视图约束的一种方式,下面这种方式才是本文的主角:

1
2
3
4
//使用可视化语言添加约束
NSDictionary   *viewDictionary= NSDictionaryOfVariableBindings (_descriptionLabel,_changeButton);
NSArray   *visualConstraint=[ NSLayoutConstraint  constraintsWithVisualFormat:@ "[_descriptionLabel]-60-[_changeButton]"  options:0 metrics: nil  views:viewDictionary];
[ self .view addConstraints:visualConstraint];

 这里面用到的constraintsWithVisualFormat方法,具体参数说明如下:

format:参数是vfl语句,语句的基本元素下面会详细解释一下;

opts:枚举参数,默认写0;

metrics:字典,当在format中使用了动态数据,会根据字典去匹配,接下来会具体有例子;

views:字典,传入需要用到的视图集合;

具体format需要参考一下表达式的意思:

水平方向          H:

垂直方向          V:

Views         [需要定义的视图]

SuperView      |

关系         >=,==,<=

间隙            -

视图内部约束           ()

Demo实战

通过VFL控制手动添加的标签的位置,具体效果如下:

 

代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
UILabel *link=[[UILabel alloc]init];
link.text=@ "http://www.cnblogs.com/xiaofeixiang" ;
link.translatesAutoresizingMaskIntoConstraints= NO ;
[link setBackgroundColor:[UIColor greenColor]];
[ self .view addSubview:link];
NSArray  *horizontal=[ NSLayoutConstraint  constraintsWithVisualFormat:@ "H:|-40-[link]-20-|"  options:0 metrics: nil  views: NSDictionaryOfVariableBindings (link)];
 
NSArray  *vertical=[ NSLayoutConstraint  constraintsWithVisualFormat:@ "V:[_descriptionLabel]-100-[link(>=30)]"  options:0 metrics: nil  views: NSDictionaryOfVariableBindings (link,_descriptionLabel)];
 
[ self .view addConstraints:horizontal];
[ self .view addConstraints:vertical];

 第一个约束是控制标签距离父视图左右之间的距离,第二个控制标签和”博客园-FlyElephant"之间的垂直距离为100.当然如果你想通过字典控制垂直之间的距离可以按照下面这么做:

1
NSArray  *vertical=[ NSLayoutConstraint  constraintsWithVisualFormat:@ "V:[_descriptionLabel]-Vertical-[link(>=30)]"  options:0 metrics:@{@ "Vertical" : @200 } views: NSDictionaryOfVariableBindings (link,_descriptionLabel)];

 最后的结果:

友情提示在添加约束的时候不要和StoryBoard中的冲突,如果添加的水平约束StoryBoard中也有的话,就会出现下面这种情况:

1
2
3
4
5
6
7
8
9
10
11
12
2015-07-01 10:54:13.537 VFLDemo[2358:60863] Unable to simultaneously satisfy constraints.
     Probably at least one of the constraints in the following list is one you don 't want. Try this: (1) look at each constraint and try to figure out which you don' t expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you 're seeing NSAutoresizingMaskLayoutConstraints that you don' t understand, refer to the documentation  for  the UIView property translatesAutoresizingMaskIntoConstraints)
(
     "<NSLayoutConstraint:0x7fc5e3732860 H:[UILabel:0x7fc5e372ef30'\U535a\U5ba2\U56ed-FlyElephant']-(15)-[UIButton:0x7fc5e372d550'\U7fa4:228407086']>" ,
     "<NSLayoutConstraint:0x7fc5e37344e0 H:[UILabel:0x7fc5e372ef30'\U535a\U5ba2\U56ed-FlyElephant']-(60)-[UIButton:0x7fc5e372d550'\U7fa4:228407086']>"
)
 
Will attempt to recover by breaking constraint
< NSLayoutConstraint :0x7fc5e37344e0 H:[UILabel:0x7fc5e372ef30 '博客园-FlyElephant' ]-(60)-[UIButton:0x7fc5e372d550 '群:228407086' ]>
 
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to  catch  this  in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4612683.html,如需转载请自行联系原作者
相关文章
|
2天前
|
人工智能 Android开发 iOS开发
安卓与iOS开发:平台选择的艺术
在移动应用开发的广阔天地里,安卓和iOS两大操作系统各占半壁江山。本文将深入探讨这两个平台的开发环境、工具及市场趋势,帮助开发者在选择适合自己项目的平台时做出更明智的决策。通过比较各自的优势与局限,我们不仅能更好地理解每个系统的核心特性,还能洞察未来技术发展的脉络。无论你是刚入行的新手还是资深开发者,这篇文章都将为你提供有价值的参考和启示。
14 5
|
2天前
|
开发工具 Android开发 iOS开发
安卓与iOS开发:一场操作系统的较量
在数字时代的浪潮中,安卓和iOS这两大操作系统如同海上的两艘巨轮,各自承载着不同的使命与梦想。本文将深入浅出地探讨这两个系统在开发领域的异同,从用户体验、开发工具、市场趋势等多个维度进行比较分析。通过这场技术的较量,我们可以更好地理解每个系统的优势与局限,以及它们如何影响我们的日常生活和工作。
|
6天前
|
安全 编译器 Swift
探索iOS开发之旅:Swift编程语言的魅力与挑战
【9月更文挑战第5天】在iOS应用开发的广阔天地中,Swift作为苹果官方推荐的编程语言,以其简洁、高效和安全的特点,成为了开发者的新宠。本文将带领你领略Swift语言的独特魅力,同时探讨在实际开发过程中可能遇到的挑战,以及如何克服这些挑战,成为一名优秀的iOS开发者。
|
3天前
|
移动开发 开发工具 Android开发
安卓与iOS开发:平台差异及其对开发者的影响
在移动开发的大潮中,安卓和iOS两大阵营各领风骚。本文将探讨这两个平台的关键差异,包括开发环境、编程语言、用户界面设计、应用分发以及商业模式等方面。通过比较分析,我们旨在为开发者提供一个清晰的指导,帮助他们根据项目需求和个人偏好做出明智的平台选择。同时,文章也将分享一些跨平台开发工具的使用经验,以期最大化开发效率和市场覆盖。
|
4天前
|
Java 开发工具 Android开发
安卓与iOS开发:平台选择对项目成功的影响
在移动应用开发的浩瀚宇宙中,安卓和iOS两大星系璀璨夺目,各自拥有独特的光芒。本文将穿梭于这两个平台之间,探讨它们在开发环境、用户群体、成本效益等方面的差异,以及这些差异如何影响一个项目的航向和终点。我们将从初学者的视角出发,逐步深入,揭示选择合适平台的重要性,以及如何根据项目需求做出明智的选择。无论你是即将启航的新手开发者,还是已经在这片星海中航行的老手,这篇文章都将为你提供有价值的导航信息。
14 2
|
6天前
|
设计模式 前端开发 Swift
探索iOS开发:Swift与Objective-C的较量
在这篇文章中,我们将深入探讨iOS开发的两大编程语言——Swift与Objective-C。我们将分析这两种语言的特性、优势和局限性,并讨论它们在现代iOS开发中的应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和建议。
19 3
|
9天前
|
Java 开发工具 Android开发
探索安卓与iOS开发的差异:平台选择对项目的影响
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据着重要的位置。本文旨在深入探讨这两个平台在开发过程中的主要差异,包括编程语言、开发工具、用户界面设计、性能优化以及市场分布等方面。通过对比分析,我们将揭示平台选择如何影响项目规划、执行效率和最终成果,为开发者在选择适合自己项目需求的平台时提供参考依据。
|
10天前
|
开发工具 Swift iOS开发
探索iOS开发中的SwiftUI框架
【9月更文挑战第1天】在本文中,我们将一起潜入iOS开发的海洋,特别聚焦于SwiftUI这一现代且富有表现力的框架。SwiftUI不仅简化了界面设计流程,还为开发者提供了声明式Swift语法的便利。通过这篇文章,你将学会如何利用SwiftUI构建灵活且响应式的用户界面,并理解其背后的原理。无论你是刚入门的新手还是寻求进阶的开发者,本文都将为你提供有价值的指导和启示。
|
11天前
|
API iOS开发
探索iOS开发:打造你的第一个天气应用
【8月更文挑战第31天】 在这篇文章中,我们将一起潜入iOS开发的海洋,从初学者的角度出发,一步步构建我们自己的天气应用。通过实际的项目实践,你将学习到如何获取网络数据、如何在界面上展示这些数据,以及如何处理用户交互。文章以通俗易懂的语言,结合代码示例,引导你理解并实现一个简单天气应用的核心功能。无论你是编程新手还是希望扩展你的iOS开发技能,这篇文章都将为你提供宝贵的指导和启发。
|
3天前
|
开发工具 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的关键考量
在数字时代的浪潮中,安卓和iOS这两大操作系统如同双子星座般耀眼夺目,引领着移动应用的潮流。它们各自拥有独特的魅力和深厚的用户基础,为开发者提供了广阔的舞台。然而,正如每枚硬币都有两面,安卓与iOS在开发过程中也展现出了截然不同的特性。本文将深入剖析这两者在开发环境、编程语言、用户体验设计等方面的显著差异,并探讨如何根据目标受众和项目需求做出明智的选择。无论你是初涉移动应用开发的新手,还是寻求拓展技能边界的资深开发者,这篇文章都将为你提供宝贵的见解和实用的建议,帮助你在安卓与iOS的开发之路上更加从容自信地前行。