【问题标题】:Why visual constraints not supporting UITableViewAutomaticDimension?为什么视觉约束不支持 UITableViewAutomaticDimension?
【发布时间】:2016-03-10 07:11:58
【问题描述】:

当我通过情节提要尝试约束时,它工作得很好。

这是我的视图控制器。

当我尝试使用视觉约束时,我得到了这样的屏幕。

这是我的视觉限制:

NSDictionary *viewsdictionary=@{@"txtview":cell.txtview,
                                    @"lbldate":cell.lbldate};
    [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[txtview]-|" options:0 metrics:nil views:viewsdictionary]];
    [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[lbldate]-|" options:0 metrics:nil views:viewsdictionary]];
    [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[txtview]-10-[lbldate(200@1000)]-|" options:0 metrics:nil views:viewsdictionary]];
    if([from isEqualToString:_tophonenumber])
    {

        cell.txtview.layer.borderWidth=2.0;
        cell.txtview.layer.borderColor=[UIColor yellowColor].CGColor;
        [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[lbldate]-10-[txtview]-|" options:0 metrics:nil views:viewsdictionary]];

    }
-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:YES];
    self.tableview.estimatedRowHeight = 160;
    self.tableview.rowHeight = UITableViewAutomaticDimension;
 }

出于某种原因,我正在更改 txtview 和标签,但这也没有改变我做错了什么?

帮我解决这个问题谢谢:)

【问题讨论】:

  • 约束是累积的,不会相互覆盖。如果您有一个现有约束,则设置另一个相同类型的约束不会覆盖前一个约束。正如我在您的代码中看到的那样,您在单元格的 contentView 上添加了许多约束,并且 tableView 单元格被重用,因此有很多更改是您一次又一次地在单元格上添加约束。但在 Interface Builder 的情况下,我会在单元对象初始化时添加一次所有约束。
  • @keshavvishwkarma 最好的方法是什么?
  • 从 Interface Builder 添加约束是最好且简单的方法,但是有一些约束是 Interface Builder 无法实现的(这些是在运行时更改),对于它们,我们必须以编程方式添加约束。
  • 要以编程方式轻松添加约束,您应该尝试github.com/keshavvishwkarma/KVConstraintExtensionsMaster library。

标签: ios objective-c autolayout nslayoutconstraint


【解决方案1】:

在您的 IB 约束中,我假设您的日期具有固定宽度,而您的文本框具有可变宽度,并且只要求坚持日期前沿,日期仅从后沿到 superview 尾随?在您的程序约束中,除非满足字符串 if 语句,否则您不会为该日期指定固定宽度,对吗?所以否则,日期没有得到它需要的约束。

此外,您是否在更新约束后调用 [cell layoutIfNeeded] ?如果您更新 cellForRowAtIndexPath 上的约束,他们可能也需要它。您可能还需要对 UITableView 做最后一件事,以便更新表格:

[self.tableView beginUpdates];
[self.tableView endUpdates];

如果您在更新单元格约束后调用它,它可以确保表格视图单元格都正确重新对齐(特别是在高度发生变化的情况下)。但我不会在每个单元格更改后调用它 - 在 tableview 完成更新时执行一次。

【讨论】:

  • 因为冲突约束出现这个问题?
  • 约束很难!您必须非常仔细地挑选每个细节以确保它们是相同的,即在您的视觉细节和程序化细节之间。用细齿梳子梳理一下:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2012-04-13
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
相关资源
最近更新 更多