我正在通過斯坦福的cs193p。作業4讓我們創建一個自定義的UITableVIewCell,並將網頁中的圖片加載到單元格內的UIImageView中。自定義的UITableViewCell的UIImageView將不會適應,直到點擊
我的UIImageView和我的單元格將其內容模式設置爲故事板上的Aspect Fit。並且ImageView在自動佈局上設置爲擁抱單元格。 然而,當圖片第一次加載時,它會流出UIImageView。當我點擊它時,它會正確地適應方面。
我試圖在分配圖像之前在代碼中設置內容模式,但那也行不通。我也嘗試在分配圖像後立即調用layoutSubviews()和setNeedsLayout,雖然這有助於通過實際顯示圖像(而不是在用戶單擊單元格之前不顯示任何內容),但它仍然以錯誤的大小顯示,直到用戶單擊它。
這是該小區的代碼:
import UIKit
class ImageTableViewCell: UITableViewCell {
@IBOutlet weak var pictureView: UIImageView!
var pictureURL: URL? {
didSet {
fetchImage()
}
}
fileprivate func fetchImage() {
if let url = pictureURL {
pictureView.image = nil
let queue = DispatchQueue(label: "image fetcher", qos: .userInitiated)
queue.async { [weak weakSelf = self] in
do {
let contentsOfURL = try Data(contentsOf: url)
DispatchQueue.main.async {
if url == self.pictureURL {
weakSelf?.pictureView?.image = UIImage(data: contentsOfURL)
weakSelf?.layoutSubviews()
print("loaded")
}
}
} catch let exception {
print(exception.localizedDescription)
}
}
}
}
}
這是加載在其TableViewController細胞代碼:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = UITableViewCell()
switch indexPath.section {
case 0:
cell = tableView.dequeueReusableCell(withIdentifier: "imageCell", for: indexPath)
if let imageCell = cell as? ImageTableViewCell {
imageCell.pictureURL = tweet?.media[indexPath.row].url
// other stuff not programmed yet
}
return cell
,讓我在小區的代碼身高:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.row == 0 && tweet != nil {
let media = tweet?.media[indexPath.row]
return tableView.frame.width/CGFloat(media!.aspectRatio)
}
return UITableViewAutomaticDimension
}
我很抱歉粘貼所有這些代碼,但我不知道問題出在哪裏,所以我盡我所能,這可能是相關的。
我不確定,但我認爲在完成獲取圖像並將其設置在單元格內後,您可能必須重新加載該特定單元格!如果'UIImageView'已經爲零,而不是每次調用該函數時都將其設置爲零,那麼您是不是應該只抓取圖像? – Rikh
@Rikh這是教練的職責。我認爲這是因爲單元格是可重用的,所以你想清除以前調用的內容。通過在分配圖像之後調用setNeedsLayout()或layoutSubviews()來重新加載單元格。雖然實際上得到的圖像顯示(而不是一個空白的屏幕)它不適應正確的大小(方面適合)。 –