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) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "postCell", 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: "placeholder.png")) { (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["title"] as? String
source = data["source"]as? String
chartURL = data["chartURL"] as? String
postChart = data["postChart"] as? UIImage
category = data["category"] as? String
rank = data["rank"] 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]