好的,又是一个UITableViewCell动态高度问题,但有一点不同。不幸的是,我不能只使用iOS 8,否则问题就可以解决了。需要iOS >= 7.1。
我试图实现一个单元格,其中顶部有两个图像,下面是一个标题标签,下面是一个描述标签。我知道两个顶部图像将是正方形,因此我希望它们具有相同的大小并保持正方形纵横比,但在屏幕大小变化(如方向更改或不同设备)时调整大小。
以下是可能有助于可视化的图像(由于声誉不能包括): http://i.stack.imgur.com/kOhkl.png 注意最后一段文字后面的间隙,那里本应该没有间隙。
我根据以前应用程序中的动态高度实现了自动布局,方法如下:在UITableView中使用Auto Layout进行动态单元格布局和可变行高(成功),现在也是使用相同的方法。
我已经使用storyboards和编程方式设置了约束,但没有成功。
高度值远远大于阅读时的高度:
另一个问题是,如果我去掉图像的纵横比约束,并将其仅更改为显式高度约束,则可以正常工作。
对于任何愿意帮助的人,我准备了一个非常简单的示例项目,以说明问题: https://github.com/alefr/DynamicTableCellHeight 它设置使用故事板进行约束,并有一个额外的分支:ExplicitHeightConstraint,仅将图像的纵横比约束更改为高度约束。
所以问题是: 有人能看到任何使其混淆高度计算的约束错误吗?还是有任何替代建议以获得想要的结果?(尽管我想使用自动布局来处理视图)。
有很多约束正在运作中(尽管没有什么特别复杂的),因此我认为查看提供的故事板(GitHub链接)比在此明确说明它们更容易。但是,如果有人喜欢,我也可以这样做。预估的高度计算如下:
我试图实现一个单元格,其中顶部有两个图像,下面是一个标题标签,下面是一个描述标签。我知道两个顶部图像将是正方形,因此我希望它们具有相同的大小并保持正方形纵横比,但在屏幕大小变化(如方向更改或不同设备)时调整大小。
以下是可能有助于可视化的图像(由于声誉不能包括): http://i.stack.imgur.com/kOhkl.png 注意最后一段文字后面的间隙,那里本应该没有间隙。
我根据以前应用程序中的动态高度实现了自动布局,方法如下:在UITableView中使用Auto Layout进行动态单元格布局和可变行高(成功),现在也是使用相同的方法。
我已经使用storyboards和编程方式设置了约束,但没有成功。
然而,这里有一个关键点。在调用时:
CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
输入:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
高度值远远大于阅读时的高度:
cell.contentView.frame
另一个问题是,如果我去掉图像的纵横比约束,并将其仅更改为显式高度约束,则可以正常工作。
对于任何愿意帮助的人,我准备了一个非常简单的示例项目,以说明问题: https://github.com/alefr/DynamicTableCellHeight 它设置使用故事板进行约束,并有一个额外的分支:ExplicitHeightConstraint,仅将图像的纵横比约束更改为高度约束。
所以问题是: 有人能看到任何使其混淆高度计算的约束错误吗?还是有任何替代建议以获得想要的结果?(尽管我想使用自动布局来处理视图)。
有很多约束正在运作中(尽管没有什么特别复杂的),因此我认为查看提供的故事板(GitHub链接)比在此明确说明它们更容易。但是,如果有人喜欢,我也可以这样做。预估的高度计算如下:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
// Don't care about memory leaks now:
DynamicTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"dynamicCell"];
[self populateCell:cell withContent:self.tableData[indexPath.row]];
// Make sure the constraints have been set up for this cell, since it may have just been created from scratch.
// Use the following lines, assuming you are setting up constraints from within the cell's updateConstraints method:
[cell setNeedsUpdateConstraints];
[cell updateConstraintsIfNeeded];
// Set the width of the cell to match the width of the table view. This is important so that we'll get the
// correct cell height for different table view widths if the cell's height depends on its width (due to
// multi-line UILabels word wrapping, etc). We don't need to do this above in -[tableView:cellForRowAtIndexPath]
// because it happens automatically when the cell is used in the table view.
// Also note, the final width of the cell may not be the width of the table view in some cases, for example when a
// section index is displayed along the right side of the table view. You must account for the reduced cell width.
cell.bounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(tableView.bounds), CGRectGetHeight(cell.bounds));
// Do the layout pass on the cell, which will calculate the frames for all the views based on the constraints.
// (Note that you must set the preferredMaxLayoutWidth on multi-line UILabels inside the -[layoutSubviews] method
// of the UITableViewCell subclass, or do it manually at this point before the below 2 lines!)
[cell setNeedsLayout];
[cell layoutIfNeeded];
// Get the actual height required for the cell's contentView
CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
// So we can read debug values
CGRect contentFrame = cell.contentView.frame;
CGRect firstImageFrame = cell.firstArtwork.frame;
CGRect secondImageFrame = cell.secondArtwork.frame;
CGRect nameFrame = cell.name.frame;
CGRect numArtworksFrame = cell.numArtworks.frame;
// Add an extra point to the height to account for the cell separator, which is added between the bottom
// of the cell's contentView and the bottom of the table view cell.
height += 1.0f;
return height;
}
- (void)populateCell:(DynamicTableViewCell*)cell withContent:(DynamicContent*)content
{
cell.firstArtwork.image = content.firstImage;
cell.secondArtwork.image = content.secondImage;
cell.name.text = content.name;
cell.numArtworks.text = [NSString stringWithFormat:@"%@ artworks", content.numImages];
}
谢谢