我在UITableViewCell中有一个imageview。
如果图像很大,使用Aspect Fit的Imageview会在顶部和底部创建大量额外空间。额外空间(灰色背景颜色)如下图所示。
如何删除额外空间?
此特定图片为890 x 589,屏幕截图是在iphone 6S模拟器上拍摄的。
我正在使用UITableViewAutomaticDimension来自动表格单元格高度。
imageview上没有高度限制,因此可以相应调整大小。
提前谢谢。
答案 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
}