UIImageView在iOS 8的自调整大小单元格中未正确调整大小

UIImageView在iOS 8的自调整大小单元格中未正确调整大小,ios,uitableview,ios8,Ios,Uitableview,Ios8,我正在尝试实现与9gag应用程序类似的功能,其中单元格会根据图像大小自动调整大小。宽度拥抱侧面,但高度会根据需要调整大小 我有一个标签,上面有标题,上面有UIImageView,下面有共享图标等。我已经为图像设置了约束,使其成为UIImageView和较低的共享图标,以及前导和尾随空格。似乎我已经尝试过切换视图“模式”的各种组合(即,纵横比填充、纵横比匹配),当我进行纵横比匹配时,它可以正确地调整图像大小,但会在图像的上下部分添加一组填充(下面包括屏幕截图) 标签和图标都设置了相应的约束(据我所

我正在尝试实现与9gag应用程序类似的功能,其中单元格会根据图像大小自动调整大小。宽度拥抱侧面,但高度会根据需要调整大小

我有一个标签,上面有标题,上面有UIImageView,下面有共享图标等。我已经为图像设置了约束,使其成为UIImageView和较低的共享图标,以及前导和尾随空格。似乎我已经尝试过切换视图“模式”的各种组合(即,纵横比填充、纵横比匹配),当我进行纵横比匹配时,它可以正确地调整图像大小,但会在图像的上下部分添加一组填充(下面包括屏幕截图)

标签和图标都设置了相应的约束(据我所知)

我已经搜索了几个小时试图找到有类似问题的人,但没有找到任何关于使用大小可能不同的图像的自调整大小单元格的内容


有人能给我指出正确的方向或知道解决我问题的方法吗?一如既往,我们非常感谢您的帮助

正如我所看到的,您无法从Interface Builder中真正调整图像大小。您必须在ViewController.m文件中手动编写代码。有这样的东西:

- (void) adjustImageSize{
    CGSize imageSize = self.imageView.image.size;
    CGSize imageViewSize = self.imageView.frame.size;
    float imageAspectRatio = imageSize.width/imageSize.height;
    CGRect frame = self.statusImage.frame;
    frame.size.height =imageViewSize.width/imageAspectRatio;
    self.imageView.frame = frame;
    // set your Cell's frame here, based on your other constraints (labels/buttons etc), after you have resized your image
}
您可以从tableView数据源函数调用它。然后添加这个委托函数,告诉tableView每个单元格的动态高度

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    return cell.frame.size.height;
}

这就是我为基于新闻提要的应用程序动态调整图像大小的方法。希望这有帮助。

我也有同样的问题

我注意到,单元格将根据imageView中的图像计算其大小,而忽略UIImageView将更改图像大小以使其适合其边界

示例:您的图像大小为1000x1000。如果将内容模式设置为“Aspect Fit”,UIImageView将显示具有自身宽度的图像。因此,显示的图像可能与iPhone的宽度相同,例如750px,高度750px(它是一个正方形)。 现在,单元格将自行调整大小,就像imageView将以原始格式显示图像一样;1000x1000。这会导致不必要的空白

我现在的解决方法是手动缩小图像的大小,但这非常昂贵,而且还会给我的UI带来一些其他问题


您找到更好的解决方案了吗?

这是由于
UIImageView
固有的内容大小(图像大小)造成的。 虽然图像视图的宽度会因前导和尾随空间约束而调整大小,但没有任何内容限制其高度,因此它将保持与原始图像高度相同

解决方案是计算图像的纵横比,并将其设置为
UIImageView
宽度的比值约束

@interface PostImageViewCell()

@property (nonatomic, strong) NSLayoutConstraint *aspectConstraint;

@end

@implementation PostImageViewCell

- (void) setAspectConstraint:(NSLayoutConstraint *)aspectConstraint {

    if (_aspectConstraint != nil) {
        [self.postImage removeConstraint:_aspectConstraint];
        _aspectConstraint = nil;
    }
    if (aspectContraint != nil) {
        [self.postImage addConstraint:aspectConstraint];
        _aspectConstraint = aspectConstraint
    }
}

- (void)setPicture:(UIImage *)image {

    CGFloat aspect = image.size.width / image.size.height;
    self.aspectConstraint = [NSLayoutConstraint constraintWithItem:self.postImage
                                                         attribute:NSLayoutAttributeWidth
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:self.postImage
                                                         attribute:NSLayoutAttributeHeight
                                                        multiplier:aspect
                                                          constant:0.0];
    [self.postImage setImage:image];
}

@end

不幸的是,我没有找到更好的解决办法。事实上,我意识到你在调整图像大小时做了同样的事情。在图像进入查看之前,我正在对其进行预缓存,因为在图像进入查看之后,图像的比例正在缩小。你有没有实现任何预缓存?所以现在我正在缓存图像的纵向和横向版本,效果非常好。这可能需要大量内存,但动态计算图像会降低UI性能。