Xcode Imageview Aspect Fit删除额外空间

时间:2016-07-20 09:49:52

标签: xcode uitableview uiimageview tableview aspect-fit

我在UITableViewCell中有一个imageview。

如果图像很大,使用Aspect Fit的Imageview会在顶部和底部创建大量额外空间。额外空间(灰色背景颜色)如下图所示。

如何删除额外空间?

Imageview Extra Space
几点说明:

  1. 此特定图片为890 x 589,屏幕截图是在iphone 6S模拟器上拍摄的。

  2. 我正在使用UITableViewAutomaticDimension来自动表格单元格高度。

  3. imageview上没有高度限制,因此可以相应调整大小。

  4. 提前谢谢。

2 个答案:

答案 0 :(得分:3)

我有同样的问题。当原始图像大小(宽度和/或高度)比保存它的UIImageView更大并且使用Aspect Fit调整图像大小以适合UIImageView时,会发生这种情况。

此处,图像宽度大于可以放入UIImageView的图像宽度,因此Aspect Fit会调整图像大小,保持原始高宽比。如果您读取图像大小(通过手表或断点等),您将看到图像大小(例如)600(h)x 800(W)(3:4比率)。 UIImageView宽度是(例如)320(w),因此显示的图像缩放到240(h)×320(w)(保持3:4比率)。但是图像宽度仍然是真正的600 x 800,并且由于UIImageView高度没有限制,UIImageView尺寸为600 x 320 - >它将UIImageView高度设置为原始图像高度(600),因为它可以。

我的解决方案是:( Swift 3)

将高度约束添加到Main.storyboard中的UIImageView并通过Outlet链接它:

@IBOutlet weak var displayimage: UIImageView!
@IBOutlet weak var displayimageHeightConstraint: NSLayoutConstraint!

然后测试UIImageView是否比它所拥有的图像更小(宽度)。如果是这样,请设置高度约束,以使UIImageView高度:宽度比与图像宽高比相同:

if displayimage.frame.size.width < (displayimage.image?.size.width)! {
    displayimageHeightConstraint.constant = displayimage.frame.size.width / (displayimage.image?.size.width)! * (displayimage.image?.size.height)!
}

如果由于调整UIImageView高度受限且宽度设置为原始图像宽度的问题而在图像两侧出现空白,也可以进行补充操作。

@IBOutlet weak var displayimageWidthConstraint: NSLayoutConstraint!

if displayimage.frame.size.height < (displayimage.image?.size.height)! {
    displayimageWidthConstraint.constant = displayimage.frame.size.height / (displayimage.image?.size.height)! * (displayimage.image?.size.height)!
}

答案 1 :(得分:0)

使用UITableViewAutomaticDimension时,上述答案无效。

一般来说,问题是在tableView函数中“cellForRowAt indexPath”tableView还没有布局单元格和它的子视图。

因此,该问题的一个解决方案是使用UITableView的子类:

class MyUITableView: UITableView {

    // Makes real device cell width available in "cellForRowAt indexPath"
    override func dequeueReusableCell(withIdentifier identifier: String, for indexPath: IndexPath) -> UITableViewCell {
        let cell = super.dequeueReusableCell(withIdentifier: identifier, for: indexPath)
        cell.frame.size.width = self.frame.size.width
        cell.layoutIfNeeded()
        return cell
    }
}

现在您可以使用任何解决方案,例如Md Rais评论中的链接。以我自己的代码为例:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! ViewCell

    if let attach = eventsByDay[indexPath.section][indexPath.row].attachPhoto {
        let cellWidth = cell.attachPhoto.frame.size.width
        let scale = cellWidth / attach.size.width
        let size = CGSize(width: cellWidth, height: attach.size.height * scale)

        UIGraphicsBeginImageContextWithOptions(size, true, 0.0)             
        attach.draw(in: CGRect(origin: CGPoint.zero, size: size))
        cell.attachPhoto.image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    } else {
        cell.attachPhoto.image = nil
    }

    // ...
    return cell
}