AutoLayout UITableViewCell中的两个标签?

时间:2013-12-10 03:16:11

标签: ios objective-c uitableview uilabel autolayout

我对iOS编程很新,可能也不理解视图层次结构,因此无法在我创建的自定义表单元格类中成功获取两个标签以正确自动调整。即"translatesAutoresizingMaskIntoConstraints"属性让我有点困惑。

我没有在这部分代码中使用故事板:我有一个TableViewController,我在tableView中创建了自己的viewDidLoad。在cellForRowAtIndexPath我创建了自己的TableViewCell实现。

我遇到的问题是,当我为表视图设置"setTranslatesAutoresizingMaskIntoConstraints"NO时,我创建的UILabels然后添加我的约束,我收到以下错误:

"Terminating app due to uncaught exception `'NSInternalInconsistencyException',` reason: 'Auto Layout still required after executing `-layoutSubviews`. UITableView's implementation of `-layoutSubviews` needs to call super.'"

如果我注释掉setTranslatesAutoresizingMaskIntoConstraints行,我的应用程序会运行但是我会收到有关约束的以下警告:

  

“无法同时满足约束条件。可能至少有一个   以下列表中的约束是您不想要的。尝试   这个:(1)看看每个约束并试着弄清楚你是哪个   不要指望; (2)找到添加了不需要的约束的代码或   约束并修复它。 (注意:如果你看到了   您不明白的NSAutoresizingMaskLayoutConstraints,请参阅   到UIView属性的文档   translatesAutoresizingMaskIntoConstraints)“

基本上我想做的是在这里输入代码,让两个标签相互冲洗,并根据方向/设备调整大小(我会在它们上面设置一个背景颜色,所以希望它们看起来'连续' )

任何人都可以帮我解释我错过的东西吗?提前谢谢。

我添加标签的代码是:

self.nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200.0f, 30.0f)];
self.nameLabel.textColor = [UIColor redColor];
self.nameLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:12.0f];
self.nameLabel.backgroundColor = [UIColor brownColor];
[self.nameLabel setText:@"Test"];
// [self.nameLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.contentView addSubview:self.nameLabel];

...

NSDictionary *viewsDictionary = 
 NSDictionaryOfVariableBindings(nameLabel, summaryLabel);
NSArray *constraints = 
 [NSLayoutConstraint constraintsWithVisualFormat:@"|-[nameLabel][summaryLabel]-|" 
                                         options:0 
                                         metrics:nil 
                                           views:viewsDictionary];

2 个答案:

答案 0 :(得分:1)

  

我对ios编程很新,可能不太了解   查看层次结构以及我应该因此而未能成功   在我创建的自定义表格单元格类中获取两个标签   自动调整。即   " setTranslatesAutoresizingMaskIntoConstraints"财产有我   有点困惑。

好吧,translatesAutoresizingMaskIntoConstraints是Apple创建的一个属性,可以更轻松地从Autoresizing (Spring and Struts)过渡到Autolayout。比如说,您的视图有一些AutoresizingMasks,而您只是在不设置任何约束的情况下切换Autolayout。然后,您现有的AutoresizingMasks将转换为约束,以保持视图到位。因此,默认情况下translatesAutoresizingMaskIntoConstraints属性设置为YES。但是,当您开始添加约束时,在90%的情况下,它们将与转换AutoresizingMasks时创建的约束冲突。因此,最好通过设置view.translatesAutoresizingMaskIntoConstraints = NO

将其关闭

在您的代码中,以下内容可能会产生问题:


  • Frame
  • 的设置

您不应将帧设置为要添加约束的对象。这是一种范式转变。当您以 Autolayout方式进行思考时,框架只是设置正确约束的效果,它们共同决定了相关视图的框架。 所以,请删除框架设置。

self.nameLabel = [[UILabel alloc] init];就足够了。

  • 设置适当的约束

您的密码:


NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(nameLabel, summaryLabel);
NSArray *constraints = 
 [NSLayoutConstraint constraintsWithVisualFormat:@"|-[nameLabel][summaryLabel]-|" 
                                         options:0 
                                         metrics:nil 
                                           views:viewsDictionary];
  • <强> NameLabel

    • 现在,上述限制告诉我们nameLabel应该水平(因为你没有提到H:或V :)间隔&#34;标准&#34;距容器的距离(20px),与summaryLabel相邻。 但是它的Y位置和宽度和高度呢? 所以我们需要更多约束。
  • <强> summaryLabel

    • 同样适用于summaryLabel

所以,让我们正确定义它们:

NSDictionary *viewsDictionary =
NSDictionaryOfVariableBindings(nameLabel, summaryLabel);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[nameLabel(100)][summaryLabel]-|" options:0 metrics:nil views:viewsDictionary];
NSArray *constraints1 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[nameLabel(30)]" options:0 metrics:nil views:viewsDictionary];
NSArray *constraints2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[summaryLabel]" options:0 metrics:nil views:viewsDictionary];
NSArray *constraints3 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[nameLabel(==summaryLabel)]" options:0 metrics:nil views:viewsDictionary];


[self.view addConstraints:constraints];
[self.view addConstraints:constraints1];
[self.view addConstraints:constraints2];
[self.view addConstraints:constraints3];

现在你的观点看起来不错了。


在任何时候,要检查您的视图是否缺少任何约束,请暂停调试器并在控制台中键入以下内容

po [[UIWindow keyWindow] _autolayoutTrace]

它会显示您的哪些观看次数为AMBIGUOUS LAYOUT

另外,请记住在Storyboard / IB中,如果约束显示为&#34; orange&#34;颜色,你需要更多的约束来定义对象的位置。一旦添加了所有必要的约束,约束颜色就会变为&#34;蓝色&#34;

答案 1 :(得分:0)

首先,您是否在创建后向self.contentView添加约束?

其次,也许你的约束集不足以进行自动布局,它会根据自动调整掩码创建自己的约束。尝试为标签添加垂直约束和宽度约束。