【问题标题】:How to resize an UIImageview, enclosed within a UITableview's custom cell, depending upon dynamic image URL's height?如何根据动态图像 URL 的高度调整包含在 UITableview 的自定义单元格中的 UIImageview 的大小?
【发布时间】:2018-03-20 15:58:01
【问题描述】:

我在自定义 UITableviewcell 中有一个 UIImageview 和几个其他组件,在一个单独的 xib 文件中,我将其加载到我的 UITableview 中,它位于 UIView 子类中并从 URL 动态分配图像。

现在的问题是,我想根据从 URL 获取的图像大小动态调整 UIImageview 和 Tableview 行的高度。我使用以下代码完成了这项工作,

    if  let bpImageUrls = singleComponent["picture_link"]{
        cell.newsImage.sd_setShowActivityIndicatorView(true)
        cell.newsImage.sd_setIndicatorStyle(.gray)
        cell.newsImage.sd_setImage(with: URL(string: bpImageUrls as! String))

        let imageData =  NSData(contentsOf:URL(string: bpImageUrls as! String)!)

        let myImage = UIImage(data: imageData! as Data)
        let aspectRatio = ( myImage?.size.height)! / ( myImage?.size.width)!

        cell.imageHeightConstraint.constant = UIScreen.main.bounds.size.width * aspectRatio
    }

它就像一个魅力,但问题是,这会减慢 UITableview 的滚动事件,当我尝试异步下载图像并在主线程中更新视图时,它不起作用。

视图与 image 中的自动布局相关联,我已经为此苦苦挣扎了一段时间。任何见解都会有所帮助。谢谢。

【问题讨论】:

    标签: ios swift3 uiimageview autolayout ios-autolayout


    【解决方案1】:

    当您异步加载图像时,表格视图已经完成了单元格的布局。仅根据图像高度更改单元格的高度约束不会更改表格视图中单元格的高度。

    你必须让表格视图在改变高度约束后重新计算单元格的高度。因此,当加载图像并且单元格的高度约束发生更改时,请通过调用告诉表格视图重新加载该单元格:

    if let indexPath = tableView.indexPath(for: cellWithImage) {
        tableView.reloadRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
    }
    

    【讨论】:

    • 这行得通,但我也发现,如果你的 tableview 中有很多数据要加载,滚动时会有些跳跃。有什么办法可以防止吗?
    猜你喜欢
    • 2016-08-21
    • 2011-11-11
    • 2019-01-31
    • 1970-01-01
    • 2017-02-26
    • 2019-08-15
    • 2013-11-14
    • 2015-10-26
    • 1970-01-01
    相关资源
    最近更新 更多