UIView 纵横比混淆 systemLayoutSizeFittingSize [英] UIView aspect ratio confuses systemLayoutSizeFittingSize

查看:13
本文介绍了UIView 纵横比混淆 systemLayoutSizeFittingSize的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好的,另一个 UITableViewCell 动态高度问题,但有点扭曲.不幸的是,我不能仅在发布时才跳转到 iOS 8,否则问题将得到解决.需要 iOS >= 7.1.

Alright, another UITableViewCell dynamic height problem, but with a little twist. Unfortunately I can't jump to iOS 8 only when released, otherwise the problem would be solved. Need iOS >= 7.1.

我正在尝试实现一个单元格,该单元格顶部有两个图像,下方有一个标题标签,下方有一个描述标签.我知道两个顶部图像将是方形的,因此我希望它们具有相同的尺寸并保持方形纵横比,但在屏幕尺寸变化时调整大小(如方向改变或不同的设备).

I'm trying to achieve a cell with two images on the top of the cell, a title label below them and a description label below that. I know the two top images will be square and thus I want them to be of the same size and to keep the square aspect ratio but resize when the screen size varies (like orientation change or different device).

可能有助于可视化的图像(由于代表而无法包含.没关系颜色,可视化帮助):http://i.stack.imgur.com/kOhkl.png

An image that might help with the visualization (can't include because of rep. Nevermind the colors, visualization help): http://i.stack.imgur.com/kOhkl.png

注意最后一个文本后面的空白,那不应该存在.

Notice the gap after the last text, that's not supposed to be there.

我在之前的应用程序中实现了动态高度,根据:在 UITableView 中为动态单元格使用自动布局布局和可变行高(成功),现在也使用相同的方法.

I implemented dynamic height in previous application according to: Using Auto Layout in UITableView for dynamic cell layouts & variable row heights (with success), and used the same method now as well.

我已经使用情节提要和编程设置了约束,但没有成功.

I have setup the constraints using both storyboards and programmatically but with no success.

这是踢球者.调用时:

CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

在:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

高度值远大于阅读时的高度:

the height value is way bigger than the height when reading:

cell.contentView.frame

另一个问题是,如果我删除图像的纵横比约束,只将其更改为明确的高度约束,它就可以正常工作.

Another issue is that if I remove the aspect ratio constraints on the images and only changes it to an explicit height constraint it works fine.

对于任何愿意帮助的人,我整理了一个非常简单的示例项目来说明问题:https://github.com/alefr/DynamicTableCellHeight

For anyone willing to help I put together a really simple sample project illustrating the problem: https://github.com/alefr/DynamicTableCellHeight

设置为使用情节提要进行约束,并且有一个额外的分支:ExplicitHeightConstraint,它除了将纵横比约束更改为图像的高度约束之外什么都不做.

It's setup to use storyboards for constraints and there's an extra branch: ExplicitHeightConstraint that does nothing but change the aspect ration constraint to a height constraint for the images.

**所以问题是:**任何人都可以看出限制条件有什么问题会混淆高度计算,或者有没有人有任何替代建议来获得想要的结果?(虽然我想对视图使用自动布局).

**So the question is: ** Can anyone see anything wrong with the constraints that makes it confuse the height calculations, or do anyone have any alternative suggestions to get the wanted result? (Although I'd like to use auto layout for the views).

作品中有很多限制(虽然没什么特别的),所以我认为查看提供的故事板(github 链接)比在此处明确说明它们更容易.但是,如果有人认为我也可以这样做.估计的高度计算如下:

There's quite a few constraints in the works (although nothing really fancy) so I think it's easier to look in the provided storyboard (github link) than stating them explicitly here. But if someone fancies that I can do that as well. The estimated height calculations look like:

- (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];
}

谢谢

推荐答案

我遇到了同样的情况,解决了覆盖给定单元格中的 systemLayoutSizeFittingSize 函数并将 aspectRation 约束替换为高度约束.在下面的示例中,mediaPlayerAspectRationConstraint 在视图生命周期中添加到视图中,并且 mediaPlayerHeightContraint 将用于确定单元格的正确高度(参见下面的代码).

I was in the same situation, and solved it to override the systemLayoutSizeFittingSize function in the given cell and replace the aspectRation constraint to a height constraint. In the following example the mediaPlayerAspectRationConstraint is added to the view during the view lifecycle and the mediaPlayerHeightContraint is going to use to determine the right height of the cell (see the code below).

所以,我用了

CGFloat height = [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

而不是 [cell.contentView systemLayoutSizeFittingSize:].

- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize {
    self.mediaPlayerHeightContraint.constant = CGRectGetHeight(self.experienceMedia.frame);

    //Lets replace it with an exact height constraint (workaround).

    //To remove the Unable to simultaneously satisfy constraints. exceptions
    [self.contentView layoutIfNeeded];

    [self.experienceMedia removeConstraint:self.mediaPlayerAspectRationConstraint];
    [self.experienceMedia addConstraint:self.mediaPlayerHeightContraint];

    [self setNeedsUpdateConstraints];

    CGSize res = [self.contentView systemLayoutSizeFittingSize:targetSize];

    [self.contentView layoutIfNeeded];

    [self.experienceMedia removeConstraint:self.mediaPlayerHeightContraint];
    [self.experienceMedia addConstraint:self.mediaPlayerAspectRationConstraint];

    [self setNeedsUpdateConstraints];

    return res;
}

这篇关于UIView 纵横比混淆 systemLayoutSizeFittingSize的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆