使用Visual格式语言为中心的视图,它的父使用Visual格式语言为中心的视图,它的父(Cente

2019-05-12 15:29发布

我刚开始学习自动版式iOS和看了一眼视觉格式语言。

它所有的工作,除了一件事罚款:我只是不能着眼于它的父内中心。
这可能与VFL或者我需要手动创建一个约束自己?

Answer 1:

目前,还没有,它看起来并不像它可以使用中心 VFL在上海华视图。 它是,但是,并不难使用单一VFL串和一个额外的约束(每轴)做到这一点:

VFL: "|-(>=20)-[view]-(>=20)-|"

[NSLayoutConstraint constraintWithItem:view
                             attribute:NSLayoutAttributeCenterX
                             relatedBy:NSLayoutRelationEqual
                                toItem:view.superview
                             attribute:NSLayoutAttributeCenterX
                            multiplier:1.f constant:0.f];

有人会认为,你会仅仅是能够做到这一点(这是我最初以为,并试图当我看到这个问题):

[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=20)-[view(==200)]-(>=20)-|"
                                 options: NSLayoutFormatAlignAllCenterX | NSLayoutFormatAlignAllCenterY
                                 metrics:nil
                                   views:@{@"view" : view}];

我试过的许多不同的变化上面试图把它服从我的意志,但这似乎并不适用于上海华有明确两轴两个独立VFL字符串,即使( H:|V: 然后,我开始尝试,准确地隔离时的选项确实会应用到VFL。 他们似乎并不适用于VFL的上海华盈,仅适用于(在某些情况下,令人失望的),它们在VFL字符串提到任何明确的意见。

我希望在未来的苹果增加了某种新的选项,使VFL选项考虑到上海华,即使这样做只有当有只除了在VFL SuperView把一个明确的看法。 另一种解决办法是传递到VFL另一种选择,说是这样的: NSLayoutFormatOptionIncludeSuperview

不用说,我学到了很多关于VFL试图回答这个问题。



Answer 2:

是的,这是可能的中心在其与视觉格式语言上海华视图。 垂直和水平。 以下是演示:

https://github.com/evgenyneu/center-vfl



Answer 3:

我觉得这是更好地手动创建的约束。

[superview addConstraint:
 [NSLayoutConstraint constraintWithItem:view
                              attribute:NSLayoutAttributeCenterX
                              relatedBy:NSLayoutRelationEqual
                                 toItem:superview
                              attribute:NSLayoutAttributeCenterX
                             multiplier:1
                               constant:0]];
[superview addConstraint:
 [NSLayoutConstraint constraintWithItem:view
                              attribute:NSLayoutAttributeCenterY
                              relatedBy:NSLayoutRelationEqual
                                 toItem:superview
                              attribute:NSLayoutAttributeCenterY
                             multiplier:1
                               constant:0]];

现在,我们可以使用NSLayoutAnchor以编程定义自动版式:

(可在IOS 9.0和更高版本)

view.centerXAnchor.constraint(equalTo: superview.centerXAnchor).isActive = true
view.centerYAnchor.constraint(equalTo: superview.centerYAnchor).isActive = true

我建议使用SnapKit ,这是一个DSL使自动布局容易对iOS和MacOS的。

view.snp.makeConstraints({ $0.center.equalToSuperview() })


Answer 4:

绝对有可能是能够做到这一点是这样的:

[NSLayoutConstraint constraintsWithVisualFormat:@"H:[view]-(<=1)-[subview]"
                                        options:NSLayoutFormatAlignAllCenterY
                                        metrics:nil
                                          views:NSDictionaryOfVariableBindings(view, subview)];

从得知这个在这里。 以上代码中心由Y鉴于子视图明显。

Swift3:

        NSLayoutConstraint.constraints(withVisualFormat: "H:[view]-(<=1)-[subview]",
                                       options: .alignAllCenterY,
                                                       metrics: nil,
                                                       views: ["view":self, "subview":_spinnerView])


Answer 5:

添加下面的代码,并在屏幕的中央有你的按钮。 绝对有可能。

[self.view addConstraints:[NSLayoutConstraint
                           constraintsWithVisualFormat:@"H:|-[button]-|"
                           options:NSLayoutFormatAlignAllCenterY
                           metrics:0
                           views:views]];

[self.view addConstraints:[NSLayoutConstraint
                           constraintsWithVisualFormat:@"V:|-[button]-|"
                           options:NSLayoutFormatAlignAllCenterX
                           metrics:0
                           views:views]];


Answer 6:

我知道这是不是让你想,但你当然可以计算出利润,使用它们来创建可视化格式字符串;)

总之,没有。 不幸的是这是不可能做到这一点“自动”与VFL - 至少目前还没有。



Answer 7:

由于从@Evgenii答案,我创建要点一个完整的例子:

与自定义高度垂直居中红色正方形

https://gist.github.com/yallenh/9fc2104b719742ae51384ed95dcaf626

可以通过任一期运用VFL(这是不太直观的)垂直居中视图或手动使用约束。 顺便说一句,我不能同时centerY和高度VFL相结合,如:

"H:[subView]-(<=1)-[followIcon(==customHeight)]"

在当前解决方案VFL约束单独加入。



Answer 8:

什么是必须要做的是,上海华应在字典中声明。 而不是使用| 您使用@{@"super": view.superview};

NSLayoutFormatAlignAllCenterX垂直和NSLayoutFormatAlignAllCenterY用于水平作为选择。



Answer 9:

您可以使用额外的意见。

NSDictionary *formats =
@{
  @"H:|[centerXView]|": @0,
  @"V:|[centerYView]|": @0,
  @"H:[centerYView(0)]-(>=0)-[yourView]": @(NSLayoutFormatAlignAllCenterY),
  @"V:[centerXView(0)]-(>=0)-[yourView]": @(NSLayoutFormatAlignAllCenterX),
};
NSDictionary *views = @{
  @"centerXView": centerXView, 
  @"centerYView": centerYView, 
  @"yourView": yourView,
};
 ^(NSString *format, NSNumber *options, BOOL *stop) {
     [superview addConstraints:
      [NSLayoutConstraint constraintsWithVisualFormat:format
                                              options:options.integerValue
                                              metrics:nil
                                                views:views]];
 }];

如果你想它整齐,然后centerXView.hidden = centerYView.hidden = YES;

PS:我不知道我可以调用额外的意见“占位符”,因为英语是我的第二语言。 可以理解的,如果有人可以告诉我。



Answer 10:

对于那些谁来到这里的Interface Builder基础的解决方案(谷歌使我在这里),只需添加const的宽度/高度限制,并选择子视图- >控制拖动到它的上海华- >选择“中心垂直/水平在上海华”。



Answer 11:

只需要说,u可以改用此约束:

child.center = [parent convertPoint:parent.center fromView:parent.superview];


Answer 12:

@伊戈尔-穆扎克答案斯威夫特2:

NSLayoutConstraint.constraintsWithVisualFormat("H:[view]-(<=1)-[subview]", 
                                               options: .AlignAllCenterY,
                                               metrics: nil,
                                               views: ["view":view, "subview":subview])


Answer 13:

除了使用VFL的,你可以很容易地做到这一点在Interface Builder。 在主要故事板,CTRL +单击要居中的看法。 拖动到上海华盈(同时按住Ctrl),然后选择“中心X”或“中心Y”。 无代码需要的。



文章来源: Centering a view in its superview using Visual Format Language