我在视图中有一个按钮.我在界面构建器中为我的按钮设置了图像.我在界面构建器中添加到按钮的约束是:
正确的超视空间= 10
顶级空间到superview = 10
底部空间到superview> = 10
将空格留给标签> = 10
一切正常,我的布局没问题.但是当我使用以下代码记录按钮约束时:
NSLog(@"constraints for btnBack is: %@", self.btnBack.constraints);
Run Code Online (Sandbox Code Playgroud)
控制台日志:
constraints for btnBack is:(
"<NSContentSizeLayoutConstraint:0x7c35c400 H:[UIButton:0x7c3588a0(102)] Hug:250 CompressionResistance:750>"
"<NSContentSizeLayoutConstraint:0x7c35c450 V:[UIButton:0x7c3588a0(92)] Hug:250 CompressionResistance:750>")
Run Code Online (Sandbox Code Playgroud)
我知道顶部和左右和底部约束不应该在这里记录,因为它们是超视图约束而不是按钮约束.但在这里我没有添加任何宽度和高度约束到我的按钮(即使在代码中).
为什么在控制台中记录约束高度和宽度?
具有正确自动布局的 UIView 不会返回正确的内在内容大小。尽管我可以看到它在情节提要中和应用程序运行时的大小都正确,但我得到了 (-1.0, -1.0)。
我尝试创建一个 Playground 来创建 UIView (a) 和 UILabel。我将标签添加为 (a) 的子视图并设置左、右、上、下约束。我还设置了一些文本并验证我的标签具有正确的内在尺寸(确实如此)。我的 (a) 视图返回 (-1.0, -1.0) 作为内在内容大小。
我还尝试使用故事板创建一个新项目。我在视图中添加了一个 UIView (a) 并将其居中(X 和 Y)。我在我的 (a) 视图中添加了一个 UILabel 并约束左、右、上、下。我可以看到 (a) 视图大小正确。当我运行该应用程序时,我发现它的大小仍然正确。我的 (a) 视图返回 (-1.0, -1.0) 作为内在内容大小。
考虑到 UIView 根据其内在内容大小(即子视图和相关约束)进行布局,我发现这非常奇怪。
假设我的标签对 (a) 视图边缘的约束距离均为 0,那么我希望我的 (a) 视图的内在内容大小等于我的标签框架的内在内容大小(基于内在大小)标签,但这有点没有意义)。
我真的不明白视图如何将其框架设置为等于其子元素的固有大小,同时没有固有的内容大小。
((a)视图的框架返回正确的大小,但这并不能真正回答我的问题。另外 - 它对我的特定情况没有帮助,但这超出了这个问题的范围。)
我正在尝试以编程方式创建一个包含两个UILabel子视图的容器视图,其行为如下:
我用numberOfLines = 0和定义了标签lineBreakMode = NSLineBreakByWordWrapping.
请注意,容器的大小是完全动态的; 它的宽度由其超视图决定,而其高度由其子视图(标签)决定.标签的大小也是动态的; 它们的宽度与容器宽度成正比,它们的高度取决于文本的长度.
我已经能够实现上述所有内容,除了最后一项,具有以下约束(伪代码).A是左侧标签,B是右侧.
最后2个约束旨在拉伸容器以适应标签的高度,但布局引擎似乎忽略了标签可能是多行的事实.也就是说,无论文本的长度如何,我总是会显示一行.
那么我需要添加/修改/删除哪些约束才能实现上述全部行为?
我在控制台中收到以下自动布局警告:
2019-09-01 21:26:03.225576+0200 Hortus[85622:2386450] [LayoutConstraints] 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.
(
"<NSLayoutConstraint:0x600002d16990 UILabel:0x7fc9eb816f50'Testen'.centerX == _UINavigationBarModernPromptView:0x7fc9ebe27780.centerX (active)>",
"<NSLayoutConstraint:0x600002d15c20 UILabel:0x7fc9eb816f50'Testen'.leading >= UILayoutGuide:0x6000037571e0'UIViewLayoutMarginsGuide'.leading (active)>",
"<NSLayoutConstraint:0x600002d10ff0 '_UITemporaryLayoutWidth' _UINavigationBarModernPromptView:0x7fc9ebe27780.width == 0 (active)>",
"<NSLayoutConstraint:0x600002d16a30 'UIView-leftMargin-guide-constraint' H:|-(8)-[UILayoutGuide:0x6000037571e0'UIViewLayoutMarginsGuide'](LTR) (active, names: '|':_UINavigationBarModernPromptView:0x7fc9ebe27780 …Run Code Online (Sandbox Code Playgroud) 我有两个彼此相邻的标签,但是即使我在左边的标签上设置了截断规则,右边的标签也会被截断。
我的代码:
// Club name
labelFirst = [[UILabel alloc] init];
labelFirst.adjustsFontSizeToFitWidth = NO;
[labelFirst setLineBreakMode:NSLineBreakByTruncatingTail];
[labelFirst setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.contentView addSubview:labelFirst];
labelSecond = [[UILabel alloc] init];
[labelSecond setAdjustsFontSizeToFitWidth:NO];
[labelSecond setTranslatesAutoresizingMaskIntoConstraints:NO];
[labelSecond setText:NSLocalizedString(@"IsCancelled", nil)];
[self.contentView addSubview:labelSecond];
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-73-[label]-[label2]-10-|" options:0 metrics:nil views:@{@"label": labelFirst, @"label2": labelSecond}]
[self.contentView addConstraints:constraint];
Run Code Online (Sandbox Code Playgroud)
我应该怎么做?