使用 Visual Format Language 定义水平和垂直约束

1.问题:

想要定义限制条件来改变一个 UI 组件在其父视图的水平和垂直方向布局的方法。

2.讨论:

使用 visual Format Language 在水平方向的限制条件使用的三个例子 :

     H:|-100-[_button]-100-|

     H:|-(<=100)-[_button(>=50)]-(<=100)-|

     H:|-[_button(>=100,<=200)]

    V:[_button]-(>=100)-|

(注意:为了让程序看起来整齐一致并使设计者更容易做出决定,Apple 已 经制定了 UI 之间的距离或留空标准。这个标准在 Apple 的 iOS Human Interface Guidelines 中进行了介绍。)

3.例子:

使用约束条件和Visual Format Language实现我们想要的UI

1)构造 UI 组件。所以我会写两个方法来帮助完成构造。记住,我们不需要再去设置这些 UI 组件的框架了。Auto Layout(自动布局)会帮助我们完成:

- (UITextField *)textFieldWithPlaceholder:(NSString *)paramPlaceholder{
    UITextField *result = [[UITextField alloc]init];
    result.translatesAutoresizingMaskIntoConstraints = NO;
    result.borderStyle = UITextBorderStyleRoundedRect;
    result.placeholder = paramPlaceholder;

    return  result;
}
- (void)constructUIComponents{
    _textFieldEmail = [self textFieldWithPlaceholder:@"Email"];
    _textFieldConfirmEmail = [self textFieldWithPlaceholder:@"Confirm Email"];

    _registerButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    _registerButton.translatesAutoresizingMaskIntoConstraints = NO;
    [_registerButton setTitle:@"Register" forState:UIControlStateNormal];
}

这个 textFieldWithPlaceHodler:方法仅仅创建了文本框,它包含一个指定的占位符文本, constructUIComponents 方法使用前面??到的方法和按钮创建了两个文本框。

- (void)addUIComponentsToView:(UIView *)paramView{
    [paramView addSubview:_textFieldEmail];
    [paramView addSubview:_textFieldConfirmEmail];
    [paramView addSubview:_registerButton];
}

这个方法来帮助我们将控件添加到指定View

2)

接下来的的任务就是创建一些方法,这些方法允许我们构造并收集所有的限制 条件到一个数组里。为此,我们有三个方法来返回每个 UI 组件的限制条件到一个数组里。 我们还有一个方法,它将收集从这三个 UI 组件返回的所有限制条件并将它们放进一个大的 数组里。下面是我们如何实现它的:

- (NSArray *)emailTextFieldConstraints{
    NSMutableArray *result = [[NSMutableArray alloc]init];
    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_textFieldEmail);
    [result addObjectsFromArray:[NSLayoutConstraint
                                 constraintsWithVisualFormat:@"H:|-[_textFieldEmail]-|"
                                 options:0
                                 metrics:nil
                                 views:viewsDictionary]];
    //NSLayoutConstraint constraintsWithVisualFormat:<#(NSString *)#> options:<#(NSLayoutFormatOptions)#> metrics:<#(NSDictionary *)#> views:<#(NSDictionary *)#>
    [result addObjectsFromArray:[NSLayoutConstraint
                                 constraintsWithVisualFormat:@"V:|-50-[_textFieldEmail]"
                                 options:0
                                 metrics:nil
                                 views:viewsDictionary]];

    return [NSArray arrayWithArray:result];
}
- (NSArray *)confirmEmailTextFieldConstraints{
    NSMutableArray *result = [[NSMutableArray alloc]init];
    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_textFieldConfirmEmail,_textFieldEmail);
    [result addObjectsFromArray:[NSLayoutConstraint
                                 constraintsWithVisualFormat:@"H:|-[_textFieldConfirmEmail]-|"
                                 options:0
                                 metrics:nil
                                 views:viewsDictionary]];
    [result addObjectsFromArray:[NSLayoutConstraint
                                 constraintsWithVisualFormat:@"V:[_textFieldEmail]-[_textFieldConfirmEmail]"
                                 options:0
                                 metrics:nil
                                 views:viewsDictionary]];

    return [NSArray arrayWithArray:result];
}

- (NSArray *)registerButtonConstraints{
    NSMutableArray *result = [[NSMutableArray alloc]init];
    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_registerButton,_textFieldConfirmEmail);
    [result addObjectsFromArray:[NSLayoutConstraint
                                 constraintsWithVisualFormat:@"V:[_textFieldConfirmEmail]-[_registerButton]"
                                 options:0
                                 metrics:nil
                                 views:viewsDictionary]];
    [result addObject:[NSLayoutConstraint
                       constraintWithItem:_registerButton
                       attribute:NSLayoutAttributeCenterX
                       relatedBy:NSLayoutRelationEqual
                       toItem:self.view
                       attribute:NSLayoutAttributeCenterX
                       multiplier:1.0f
                       constant:0.0f]];
    return [NSArray arrayWithArray:result];
}

//实际上这是视图控制器的限制条件实例方法,它将收集三个 UI 组件的所有限制条件并 将其返回到一个大的数组里。
- (NSArray *)constraints{
    NSMutableArray *result = [[NSMutableArray alloc]init];
    [result addObjectsFromArray:[self emailTextFieldConstraints]];
    [result addObjectsFromArray:[self confirmEmailTextFieldConstraints]];
    [result addObjectsFromArray:[self registerButtonConstraints]];

    return [NSArray arrayWithArray:result];
}

实际上这是视图控制器的限制条件实例方法,它将收集三个 UI 组件的所有限制条件并 将其返回到一个大的数组里。现在到了控制器的主要部分了,就是这个 viewDidLoad 方法:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self constructUIComponents];
    [self addUIComponentsToView:self.view];
    [self.view addConstraints:[self constraints]];
}
- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskAll;
}
时间: 2024-07-30 13:10:44

使用 Visual Format Language 定义水平和垂直约束的相关文章

iOS - Visual Format Language

关于autolayout. 1. 尽量用storyboard,添加约束方便直观. 2. 不能用storyboard添加到,考虑 Visual Format Language构建约束 - 直观,易读,代码少 3. 使用NSLayoutAttribute构建约束 - 易读,代码太TM多了 这里以几个例子说明介绍Visual Format Language Visual Format Language是通过设置垂直(V)和水平(H)方向上,view与其它view的间距来实现view的定位.用以下代码添

Autolayout 中的 Visual format language

一.什么时候用autolayout比较适合 1.不负责任的骑墙派说法:apple的设备越来越多了,你的应用应该都使用al.(并且用sb) 2.要看应用内容决定.如果你的内容是信息众多,同时需要展示的类别也很多,尺寸动态不定,甚至这些是在列表中的.(如社交应用).Al能给于很大的帮助. 3.Mac os的应用.现在都做iOS了.mac app的窗口,会有大小变化.al比较合适. 4.支持多向转屏的iPad应用.(有需要支持多方向iphone场景么?那么长,脑残了?) 5.其他业务不复杂,页面较少的

Autolayout 中的Visual format language

一.什么时候用autolayout比较适合 1.不负责任的骑墙派说法:apple的设备越来越多了,你的应用应该都使用al.(并且用sb) 2.要看应用内容决定.如果你的内容是信息众多,同时需要展示的类别也很多,尺寸动态不定,甚至这些是在列表中的.(如社交应用).Al能给于很大的帮助. 3.Mac os的应用.现在都做iOS了.mac app的窗口,会有大小变化.al比较合适. 4.支持多向转屏的iPad应用.(有需要支持多方向iphone场景么?那么长,脑残了?) 5.其他业务不复杂,页面较少的

Autolayout + VFL(Visual Format Language)

最近在学习iOS的布局,在storyboard里,确定布局的思路: 1.确定能确定的: 2.无法确定的,看看是否可以想办法和其他控件关联起来,再根据关系来确定能确定的位置. 例子:实现如下图的布局 过程: 1.确定能确定的: 左上角的View,左边和上边距离父view的距离都是0(当然,这里假设了view的宽度和高度都是100) 设置完成后,点击Add 4 Constraints即可,现在界面如下所示; 左边View Controller Scene后面有个黄色图标,该图标的意思是警告的意思,是

使用Auto Layout中的VFL(Visual format language)--代码实现自动布局

使用Auto Layout中的VFL(Visual format language)--代码实现自动布局 2014-12-09 10:56 编辑: zhiwupei 分类:iOS开发 来源:机智的新手投稿 6 23450 Auto Layout自动布局VFL 招聘信息: 高级iOS开发工程师 高级PHP开发工程师 iOS高级研发工程师 iOS开发工程师 高级iOS手机应用软件开发工程师(培训讲师) 高级Cocos2d-x游戏开发工程师(培训讲师) iOS手机软件开发工程师 iOS工程师 Web后

自动布局和Visual Format Language 简要介绍

假设有一个按钮,你想把它放置在屏幕的中央.视图中心和按钮中心的相对位置可以简单地定义成如下: 按钮的center.x相当于视图中心的center.x 按钮的center.y相当于视图中心的center.y 苹果发现很多的UI组件的位置可以使用一个简单的方程等式得到解决: Object1.property1=(object2.property2*multiplier)+constant value 例如:使用这个方程式,我们可以很容易地将一个按钮放置到他的父视图中,如下所示: Button.cen

Visual Format Language(VFL)视图约束

约束(Constraint)在IOS编程中非常重要,这关乎到用户的直接体验问题. IOS中视图约束有几种方式,常见的是在IB中通过Pin的方式手动添加约束,菜单Editor->Pin->...但是我们往往需要更为灵活的操作,那么就要手动编写代码来实现这些操作. 1:长函数方法 Apple的工程师给我们提供了两种方式,第一种用长函数方法的形式 NSLayoutConstraint(item: <#AnyObject#>, attribute: <#NSLayoutAttribu

在UIScrollView中使用Auto Layout中的VFL(Visual format language)

上一篇VFL(Visual format language)的文章中讲了一些基本用法.传送门http://www.cnblogs.com/wupei/p/4150626.html. 这篇简单的讲解下UIScrollView下的自动布局.UIScrollView有一个contentSize所以,他跟其他的view不一样.其他的view你只需要指定他的四个边距,或者能固定他的大小就行.但是UIScrollView不行,约束写不好可能会导致滚动不了,或者报错或一堆警告.但是理解了他的原理就很容易去做到

Visual Format Language

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/VisualFormatLanguage.html#//apple_ref/doc/uid/TP40010853-CH27-SW1 Visual Format Language This appendix shows how to use the Auto Layout Visual Format Lan