相关疑难解决方法(0)

当我NSLog myBtn.constraints时会记录额外的约束

我在视图中有一个按钮.我在界面构建器中为我的按钮设置了图像.我在界面构建器中添加到按钮的约束是:

正确的超视空间= 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)

我知道顶部和左右和底部约束不应该在这里记录,因为它们是超视图约束而不是按钮约束.但在这里我没有添加任何宽度和高度约束到我的按钮(即使在代码中).

为什么在控制台中记录约束高度和宽度?

ios ios-autolayout

5
推荐指数
1
解决办法
806
查看次数

为什么UIView的intrinsicContentSize总是返回(-1.0,-1.0)?

具有正确自动布局的 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)视图的框架返回正确的大小,但这并不能真正回答我的问题。另外 - 它对我的特定情况没有帮助,但这超出了这个问题的范围。)

uiview ios autolayout swift

5
推荐指数
1
解决办法
1740
查看次数

动态UILabel,具有比例宽度和文本驱动高度

我正在尝试以编程方式创建一个包含两个UILabel子视图的容器视图,其行为如下:

  • 容器宽度固定在其超视图上; 它的高度受限于适合标签
  • 标签水平放置,标签间距(8pts)
  • 左标签宽度是容器宽度的25%
  • 正确的标签宽度填充可用空间,减去标准水平间距
  • 在文字边界处流过多行时,应该打破长文本; 两个标签必须垂直增长以适应长文本

我用numberOfLines = 0和定义了标签lineBreakMode = NSLineBreakByWordWrapping.

请注意,容器的大小是完全动态的; 它的宽度由其超视图决定,而其高度由其子视图(标签)决定.标签的大小也是动态的; 它们的宽度与容器宽度成正比,它们的高度取决于文本的长度.

我已经能够实现上述所有内容,除了最后一项,具有以下约束(伪代码).A是左侧标签,B是右侧.

  • A.top == container.top
  • B.top == container.top
  • A.leading = container.leading
  • A.trailing == B.leading - 8
  • B.trailing == container.trailing
  • A == .25*container.width
  • container.height> = A.height
  • container.height> = B.height

最后2个约束旨在拉伸容器以适应标签的高度,但布局引擎似乎忽略了标签可能是多行的事实.也就是说,无论文本的长度如何,我总是会显示一行.

那么我需要添加/修改/删除哪些约束才能实现上述全部行为?

ios autolayout

4
推荐指数
2
解决办法
1万
查看次数

在导航栏中使用提示时自动布局警告

我正在使用带有提示的导航栏,如下所示: 在此处输入图片说明

我在控制台中收到以下自动布局警告:

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)

uinavigationbar ios autolayout swift

4
推荐指数
1
解决办法
784
查看次数

两个标签彼此相邻,截断一个

我有两个彼此相邻的标签,但是即使我在左边的标签上设置了截断规则,右边的标签也会被截断。

我的代码:

// 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)

我应该怎么做?

objective-c ios

1
推荐指数
1
解决办法
614
查看次数