1,範例效果圖
(1)儲存格上面是文字,下面是圖片。
(2)文字標籤(UILabel)行數是自增長的。
(3)圖片顯示(UIImageVIew)寬度佔滿一行,高度隨原圖比例自適應高度。
(4)整個儲存格高度自適應,能完整地顯示全部的內容。
2,實現步驟
(1)我們先建立一個自訂的儲存格類(ImageTableViewCell.swift),同時建立其對應的 XIB 檔案(ImageTableViewCell.xib)。
(2)開啟 ImageTableViewCell.xib,在裡面添加一個 Label(用來顯示標題文字),和一個 ImageView(用來顯示內容圖片)。並將它們在對應類中做關聯引用。
(3)為了讓 Label 標籤能自動成長,將其 Lines 屬性設定為 0。
(4)對 Label 設定上下左右 4 個約束。
(5)對 ImageView 設定左右下 3 個約束。
(6)ImageTableViewCell.swift 代碼
上面約束設定後,imageView 的寬度就固定下來了。為了讓其高度自適應,我們需要在代碼中通過擷取其內部顯示圖片的寬高比,來動態地設定 imageView 的寬高比約束。保證 imageView 與原始圖片的比例是一樣的。
import UIKit
class ImageTableViewCell: UITableViewCell {
//標題文字標籤
@IBOutlet weak var titleLabel: UILabel!
//內容圖片
@IBOutlet weak var contentImageView: UIImageView!
//內容圖片的寬高比約束
internal var aspectConstraint : NSLayoutConstraint? {
didSet {
if oldValue != nil {
contentImageView.removeConstraint(oldValue!)
}
if aspectConstraint != nil {
contentImageView.addConstraint(aspectConstraint!)
}
}
}
override func awakeFromNib() {
super.awakeFromNib()
}
override func prepareForReuse() {
super.prepareForReuse()
//清除內容圖片的寬高比約束
aspectConstraint = nil
}
//載入內容圖片(並設定高度約束)
func loadImage(name: String) {
if let image = UIImage(named: name) {
//計算原始圖片的寬高比
let aspect = image.size.width / image.size.height
//設定imageView寬高比約束
aspectConstraint = NSLayoutConstraint(item: contentImageView,
attribute: .Width, relatedBy: .Equal,
toItem: contentImageView, attribute: .Height,
multiplier: aspect, constant: 0.0)
//載入圖片
contentImageView.image = image
}else{
//去除imageView裡的圖片和寬高比約束
aspectConstraint = nil
contentImageView.image = nil
}
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
}
(7)ViewController.swit
在首頁中我們建立一個 tabbleView 來測試上面我們自訂的儲存格。這裡沒什麼特別的,同前文差不多。
import UIKit
class ViewController: UIViewController , UITableViewDelegate, UITableViewDataSource {
var catalog = [[String]]()
var tableView:UITableView!
override func viewDidLoad() {
super.viewDidLoad()
//初始化列表資料
catalog.append(["第一節:Swift 環境搭建", "img1.jpg"])
catalog.append(["第二節:Swift 基本文法(類型定義、迴圈遍曆、判斷、繼承)", "img2.jpg"])
catalog.append(["第三節:Swift 資料類型", "img3.jpg"])
//建立表視圖
self.tableView = UITableView(frame: self.view.frame, style: .Plain)
self.tableView.delegate = self
self.tableView.dataSource = self
//建立一個重用的儲存格
self.tableView!.registerNib(UINib(nibName:"ImageTableViewCell", bundle:nil),
forCellReuseIdentifier:"myCell")
//設定estimatedRowHeight屬性預設值
self.tableView.estimatedRowHeight = 44.0;
//rowHeight屬性設定為UITableViewAutomaticDimension
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.view.addSubview(self.tableView!)
}
//在本例中,只有一個分區
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1;
}
//返回表格行數(也就是返回控制項數)
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.catalog.count
}
//建立各單元顯示內容(建立參數indexPath指定的單元)
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)
-> UITableViewCell {
//同一形式的儲存格重複使用
let cell = tableView.dequeueReusableCellWithIdentifier("myCell",
forIndexPath: indexPath) as! ImageTableViewCell
//擷取對應的條目內容
let entry = catalog[indexPath.row]
//儲存格標題和內容設定
cell.titleLabel.text = entry[0]
cell.loadImage(entry[1])
return cell
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
3,從網路擷取圖片
上面的範例我們是直接載入本地圖片的。在實際項目中,我們通常會通過 url 地址載入網路上的圖片並顯示。
原文:Swift - tableView儲存格高度自適應3(圖片寬度固定,高度自適應)
只需要將 ImageTableViewCell 類做如下修改可以滿足需求,同樣支援圖片的高度自適應。
import UIKit
class ImageTableViewCell: UITableViewCell {
//標題文字標籤
@IBOutlet weak var titleLabel: UILabel!
//內容圖片
@IBOutlet weak var contentImageView: UIImageView!
//內容圖片的寬高比約束
internal var aspectConstraint : NSLayoutConstraint? {
didSet {
if oldValue != nil {
contentImageView.removeConstraint(oldValue!)
}
if aspectConstraint != nil {
contentImageView.addConstraint(aspectConstraint!)
}
}
}
override func awakeFromNib() {
super.awakeFromNib()
}
override func prepareForReuse() {
super.prepareForReuse()
//清除內容圖片的寬高比約束
aspectConstraint = nil
}
//載入內容圖片(並設定高度約束)
func loadImage(urlString: String) {
//定義NSURL對象
let url = NSURL(string: urlString)
//從網路擷取資料流,再通過資料流初始化圖片
if let data = NSData(contentsOfURL: url!), image = UIImage(data: data) {
//計算原始圖片的寬高比
let aspect = image.size.width / image.size.height
//設定imageView寬高比約束
aspectConstraint = NSLayoutConstraint(item: contentImageView,
attribute: .Width, relatedBy: .Equal,
toItem: contentImageView, attribute: .Height,
multiplier: aspect, constant: 0.0)
//載入圖片
contentImageView.image = image
}else{
//去除imageView裡的圖片和寬高比約束
aspectConstraint = nil
contentImageView.image = nil
}
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
}
使用時,由原來的圖片名稱改成圖片 url 地址即可。
//初始化列表資料
catalog.append(["iPhone 6的故障率達26% 穩超安卓", "http://www.111cn.net /img1.png"])
catalog.append(["不用導航 這款無人機能夠“自製”地圖飛行", "http://www.111cn.net /img2.png"])
catalog.append(["無人汽車如何應對道德困境?Google表示不知道", "http://www.111cn.net /img33.png"])