我刚开始学习自动版式iOS和看了一眼视觉格式语言。
它所有的工作,除了一件事罚款:我只是不能着眼于它的父内中心。
这可能与VFL或者我需要手动创建一个约束自己?
我刚开始学习自动版式iOS和看了一眼视觉格式语言。
它所有的工作,除了一件事罚款:我只是不能着眼于它的父内中心。
这可能与VFL或者我需要手动创建一个约束自己?
目前,还没有,它看起来并不像它可以使用中心仅 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试图回答这个问题。
是的,这是可能的中心在其与视觉格式语言上海华视图。 垂直和水平。 以下是演示:
https://github.com/evgenyneu/center-vfl
我觉得这是更好地手动创建的约束。
[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() })
绝对有可能是能够做到这一点是这样的:
[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])
添加下面的代码,并在屏幕的中央有你的按钮。 绝对有可能。
[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]];
我知道这是不是让你想,但你当然可以计算出利润,使用它们来创建可视化格式字符串;)
总之,没有。 不幸的是这是不可能做到这一点“自动”与VFL - 至少目前还没有。
由于从@Evgenii答案,我创建要点一个完整的例子:
与自定义高度垂直居中红色正方形
https://gist.github.com/yallenh/9fc2104b719742ae51384ed95dcaf626
可以通过任一期运用VFL(这是不太直观的)垂直居中视图或手动使用约束。 顺便说一句,我不能同时centerY和高度VFL相结合,如:
"H:[subView]-(<=1)-[followIcon(==customHeight)]"
在当前解决方案VFL约束单独加入。
什么是必须要做的是,上海华应在字典中声明。 而不是使用|
您使用@{@"super": view.superview};
。
而NSLayoutFormatAlignAllCenterX
垂直和NSLayoutFormatAlignAllCenterY
用于水平作为选择。
您可以使用额外的意见。
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:我不知道我可以调用额外的意见“占位符”,因为英语是我的第二语言。 可以理解的,如果有人可以告诉我。
对于那些谁来到这里的Interface Builder
基础的解决方案(谷歌使我在这里),只需添加const的宽度/高度限制,并选择子视图- >控制拖动到它的上海华- >选择“中心垂直/水平在上海华”。
只需要说,u可以改用此约束:
child.center = [parent convertPoint:parent.center fromView:parent.superview];
@伊戈尔-穆扎克答案斯威夫特2:
NSLayoutConstraint.constraintsWithVisualFormat("H:[view]-(<=1)-[subview]",
options: .AlignAllCenterY,
metrics: nil,
views: ["view":view, "subview":subview])
除了使用VFL的,你可以很容易地做到这一点在Interface Builder。 在主要故事板,CTRL +单击要居中的看法。 拖动到上海华盈(同时按住Ctrl),然后选择“中心X”或“中心Y”。 无代码需要的。