菜鸟教程小白 发表于 2022-12-13 15:54:32

ios - 使用 SDWebImage 的动态单元格高度


                                            <p><p>我有一个表格 View 和带有 ImageView 的表格 View 单元格。我希望它们具有固定宽度但具有动态高度(取决于来自服务器的图像)。 </p>

<p>我正在使用 <code>SDWebImage</code> 下载和设置图像,但是表格 View 单元格变得很奇怪。</p>

<p>我没有忘记:</p>

<pre><code>postTableView.estimatedRowHeight = UITableViewAutomaticDimension
postTableView.rowHeight = UITableViewAutomaticDimension
</code></pre>

<p>cellForRow 方法:</p>

<pre><code>func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: &#34;postCell&#34;, for: indexPath) as! TableViewCell
    let post = postArray
    cell.setupCell(with: post)
    return cell
}
</code></pre>

<p>表格 View 单元格类:</p>

<pre><code>class TableViewCell: UITableViewCell {

    @IBOutlet weak var postTitle: UILabel!
    @IBOutlet weak var postSource: UILabel!
    @IBOutlet weak var postChart: UIImageView!

    internal var aspectConstraint: NSLayoutConstraint? {
      didSet {
            if oldValue != nil {
                postChart.removeConstraint(oldValue!)
            }
            if aspectConstraint != nil {
                postChart.addConstraint(aspectConstraint!)
            }
      }
    }

    override func awakeFromNib() {
      super.awakeFromNib()
      selectionStyle = UITableViewCellSelectionStyle.none
    }

    override func prepareForReuse() {
      super.prepareForReuse()
      postChart.image = nil
      aspectConstraint = nil
    }

    func setupCell(with post: Post) {
      postTitle.text = post.title
      postSource.text = post.source
      let tempImageView = UIImageView()
      tempImageView.sd_setImage(with: URL(string: post.chartURL!), placeholderImage: UIImage(named: &#34;placeholder.png&#34;)) { (image, error, cache, url) in
            if let image = image {
                self.setCustomImage(image: image)
            }
      }
    }

    func setCustomImage(image: UIImage) {
      let aspect = image.size.width / image.size.height
      let constraint = NSLayoutConstraint(item: postChart, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: postChart, attribute: NSLayoutAttribute.height, multiplier: aspect, constant: 0.0)
      constraint.priority = UILayoutPriority(rawValue: 999)
      aspectConstraint = constraint
      postChart.image = image
      setNeedsLayout()
    }
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>你只需要告诉整个 <code>tableView</code> 刷新它的 View 。在持有 <code>tableView</code> 的 ViewController 中使用此代码:</p>

<pre><code>func refreshTableView() {
    self.tableView.beginUpdates()
    self.tableView.setNeedsDisplay()
    self.tableView.endUpdates()
}
</code></pre>

<p>使用委托(delegate)模式告诉 viewController 刷新 <code>tableView</code>,如下所示:</p>

<pre><code>func setCustomImage(image: UIImage) {
    let aspect = image.size.width / image.size.height
    let constraint = NSLayoutConstraint(item: postChart, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: postChart, attribute: NSLayoutAttribute.height, multiplier: aspect, constant: 0.0)
    constraint.priority = UILayoutPriority(rawValue: 999)
    aspectConstraint = constraint
    postChart.image = image

    // call this to refresh table
    delegate.refreshTableView()
}
</code></pre>

<p>岗位类:</p>

<pre><code>class Post {
    var title : String?
    var source : String?
    var chartURL : String?
    var postChart: UIImage?
    var category : String?
    var rank : CGFloat?
    var imageSize: CGSize?

    init(data: NSDictionary) {
      title = data[&#34;title&#34;] as? String
      source = data[&#34;source&#34;]as? String
      chartURL = data[&#34;chartURL&#34;] as? String
      postChart = data[&#34;postChart&#34;] as? UIImage
      category = data[&#34;category&#34;] as? String
      rank = data[&#34;rank&#34;] as? CGFloat
    }
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用 SDWebImage 的动态单元格高度,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/48385949/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/48385949/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用 SDWebImage 的动态单元格高度