- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下设计的 View Controller :
@interface ViewController ()
@property (nonatomic, strong) IBOutlet UILabel *l1;
@property (nonatomic, strong) IBOutlet UILabel *l2;
@property (nonatomic, strong) IBOutlet UITextField *input1;
@property (nonatomic, strong) IBOutlet UITextField *input2;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.view removeConstraints:self.view.constraints];
for (UIView *view in @[self.l1, self.l2, self.input1, self.input2])
[view setTranslatesAutoresizingMaskIntoConstraints:NO];
NSDictionary *views = @{ @"l1" : self.l1, @"l2" : self.l2,
@"input1": self.input1, @"input2" : self.input2,
@"topLayout" : self.topLayoutGuide};
NSArray *constraints;
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[l1]-[input1]"
options:NSLayoutFormatAlignAllCenterY
metrics:nil
views:views];
[self.view addConstraints:constraints];
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[l2]-[input2]"
options:NSLayoutFormatAlignAllCenterY
metrics:nil
views:views];
[self.view addConstraints:constraints];
NSString *v1 = @"V:|-20-[input1]-[input2]";
constraints = [NSLayoutConstraint constraintsWithVisualFormat:v1
options:0
metrics:nil
views:views];
[self.view addConstraints:constraints];
NSString *v2 = @"V:|-20-[l1]-[l2]";
constraints = [NSLayoutConstraint constraintsWithVisualFormat:v2
options:0
metrics:nil
views:views];
[self.view addConstraints:constraints];
}
@end
结果如下:
如果我简单地更改 v1 和 v2 以使用 topLayoutGuide:
NSString *v1 = @"V:[topLayout]-20-[input1]-[input2]";
NSString *v2 = @"V:[topLayout]-20-[l1]-[l2]";
屏幕看起来像这样被揉成一团:
当我停止在我的水平约束上使用 NSLayoutFormatAlignAllCenterY 时,我可以让它消失,但是我的行不再正确排列:
为什么会出现这个问题,在仍然使用 topLayoutGuide 的同时让行正确排列的正确方法是什么?
最佳答案
简而言之,问题是您不了解 Storyboard/ Nib 通过自动布局生成的约束与您的代码生成的约束之间的关系。因此,您的约束总是不好(即使视觉布局看起来是正确的)。顶部布局指南的问题只会导致约束的不良情况在视觉上变得更加明显。
但是,我不想重复这一点(即您的代码做错的所有事情);我宁愿直接跳到正确的方法。准备好?只需按照以下步骤操作:
在您的代码中,删除这一行(这实际上是 90% 问题的原因):
[self.view removeConstraints:self.view.constraints];
在 Storyboard中:
一个。给所有四个元素(两个标签和两个文本字段)每个一个左(前导)约束和一个顶部约束。
选择您刚刚创建的所有八个约束,并在属性检查器中选中“在构建时删除”框。
现在您的代码将完全按照您的期望工作。
正如我所说,我不想详细说明这是为什么,但基本上我已经指示您做的是在自动布局下的 Storyboard / Nib 中创建 View 并应用于那些的正确方法仅查看代码中生成的约束。
请注意,您也可以删除此行:
for (UIView *view in @[self.l1, self.l2, self.input1, self.input2])
[view setTranslatesAutoresizingMaskIntoConstraints:NO];
它没有坏处,但也没有好处,因为这些 View 已经没有将它们的自动调整掩码转换为约束。
最后一点:我们刚刚所做的一切都非常愚蠢,因为您可以采用两种更常用的方法之一:
我们本可以在 Storyboard/nib 中生成所有这些约束,然后简单地删除所有您的代码。
或者,恰恰相反,我们可以从 Storyboard/nib 中删除 subview 并在代码中创建 subview (并在代码中将它们添加到 self.view
)。
其中任何一个都意味着您的代码可以正常工作(删除所有约束的部分除外,这始终是一个灾难性的想法)。但是,我向您展示了如何做您想做的事情,只是为了支持假设。
关于ios - 皱缩的布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35421925/
我有一个具有可变数量子元素的固定大小的 div。我不知道 children 的大小。目标是缩小它们以适合父级。 例子: .parent { width: 100px; height: 100p
我是一名优秀的程序员,十分优秀!