何时更改i​​OS 8的自动单元格高度的单元格约束?

时间:2015-07-18 20:00:11

标签: ios uitableview autolayout

我的手机有一个图像,它是确定其高度的组件的一部分。它在故事板上定义了一个恒定的高度约束,并在代码上有一个出口。

我正在尝试使用iOS 8的自动高度。

viewDidLoad上我有这一行:self.tableView.rowHeight = UITableViewAutomaticDimension

A还在委托上实现了tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath)方法。

问题是我想在设置显示单元格时更新高度常量,但这似乎不起作用,因为此时已经计算了它的高度。所以我在日志中得到了这个错误:

(
    "<NSLayoutConstraint:0x7faed0854440 V:[winninapp.ScoreView:0x7faed08574d0(6)]>",
    "<NSLayoutConstraint:0x7faed085b020 V:[UIImageView:0x7faed085ae10(211)]>",
    "<NSLayoutConstraint:0x7faed0866700 V:|-(0)-[app.ScoreView:0x7faed08574d0]   (Names: '|':UITableViewCellContentView:0x7faed085cf90 )>",
    "<NSLayoutConstraint:0x7faed08667f0 V:[app.ScoreView:0x7faed08574d0]-(0)-[UIView:0x7faed085e180]>",
    "<NSLayoutConstraint:0x7faed0866890 V:[UIImageView:0x7faed085ae10]-(0)-|   (Names: '|':UITableViewCellContentView:0x7faed085cf90 )>",
    "<NSLayoutConstraint:0x7faed08668e0 V:[UIView:0x7faed085e180]-(0)-[UIImageView:0x7faed085ae10]>",
    "<NSLayoutConstraint:0x7faed0867d50 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7faed085cf90(44)]>"
)

更新细胞高度常数的正确位置是什么?

我在更新常量后尝试调用这些方法,但没有运气:

setNeedsUpdateConstraints()
setNeedsLayout()
layoutIfNeeded()

4 个答案:

答案 0 :(得分:2)

当我设置一个包含以下内容的简单tableviewcontroller(heightconstraint是imageview&#39;高度约束)时,一切都按预期工作:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.tableView.estimatedRowHeight = 44.0;
    self.tableView.rowHeight = UITableViewAutomaticDimension;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 10;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell" forIndexPath:indexPath];

    cell.heightConstraint.constant = arc4random_uniform(50) + 20;

    return cell;
}

这就是它的样子:

simulator screenshot

答案 1 :(得分:1)

所以,我最终在没有得到冲突警告并且单元格正确显示的情况下工作的方式是删除先前的约束并添加新约束。

我之所以这样做,是因为我已将约束从高度更改为某种比率,您无法设置约束的乘数,并且最终会起作用。

我刚刚将它添加到约束观察者:

@IBOutlet weak var thumbnailRatio: NSLayoutConstraint! {
  willSet {
    videoThumbnail?.removeConstraint(thumbnailRatio)
    videoThumbnail?.addConstraint(newValue)
  }
}

通过这种方式,无需调用setNeedsLayout()或类似的东西。

答案 2 :(得分:0)

你可以给这一行

self.tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight =预期最大高度

在viewDidLoad中

将行数设置为0,将NSLinebreakMode设置为Word换行或char换行

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/tv_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         />

    <ToggleButton
        android:id="@+id/tgl_status"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
       />
</LinearLayout>

答案 3 :(得分:0)

尝试将图像视图限制在单元格的顶部/底部,而不是在代码中调整高度约束。单元格将根据图像视图的大小正确调整大小。您可能需要更改图像视图的适合度以使其显示整个图像。