XQWBStatusCell
和對應的xib文件,而且拖入對應的空間,設置約束/// 微博視圖模型 var viewModel: XQWBStatusViewModel? { didSet { // 微博文本 statusLabel?.text = viewModel?.status.text // 姓名 nameLabel.text = viewModel?.status.user?.screen_name // 設置會員圖標 (直接使用屬性不用計算) memberIconView.image = viewModel?.memberIcon // 認證圖標 vipIconView.image = viewModel?.vipIcon // 用戶頭像 iconView.xq_setImage(urlString: viewModel?.status.user?.profile_image_url, placeholderImage: UIImage(named: "avatar_default_big"), isAvatar:true) // 底部工具欄 toolBar.viewModel = viewModel // 配圖視圖的高度 pictureView.heightCons.constant = viewModel?.pictureViewSize.height ?? 0 // 配圖視圖的數據 pictureView.urls = viewModel?.status.pic_urls } }
2.1 配圖視圖的處理 咱們首先將9個圖片所有建立而且隱藏,在咱們設置圖片的時候,根據圖片數組的數量,將對應的UIImageView顯示, 這樣的作能夠優化一些性能(儘可能避免動態建立視圖)git
// 建立9個UIImageView for i in 0..<9 { let iv = UIImageView() iv.contentMode = .scaleAspectFill iv.clipsToBounds = true // 行 - > Y let row = CGFloat(i / 3) // 列 - > X let col = CGFloat(i % 3) iv.frame = rect.offsetBy(dx: col * (itemWidth + InnerMargin), dy: row * (itemWidth + InnerMargin)) addSubview(iv) } // 在設置圖片數組的時候講對應的UIImageView顯示 var urls : [XQWBStatusPicture]? { didSet { // 1. 隱藏全部的iv for v in subviews { v.isHidden = true } // 遍歷urls 順序設置圖像 var index = 0 for url in urls ?? [] { // 得到對應的imageView let iv = subviews[index] as! UIImageView if index == 1 && urls?.count == 4 { index += 1 } // 設置圖像 iv.xq_setImage(urlString: url.thumbnail_pic, placeholderImage: nil) // 顯示圖像 iv.isHidden = false index += 1 } }
2.2 設置XQWBStatusToolBarswift
var viewModel: XQWBStatusViewModel? { didSet { retweetedBtn.setTitle(viewModel?.retweetedStr, for: .normal) commentBtn.setTitle(viewModel?.commentStr, for: .normal) likeBtn.setTitle(viewModel?.likeStr, for: .normal) } }
// 1.取出cell let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! XQWBStatusCell // 2.設置cell let viewModel = listViewModel.statusList[indexPath.row] cell.viewModel = viewModel
4.1 咱們單首創建XQWBStatusViewModel,管理每一條微博的數據, 其中包含如下屬性數組
/// 微博模型 var status: XQWBStatus /// 會員圖標 var memberIcon: UIImage? /// vip 認證類型 var vipIcon: UIImage? /// 轉發文字 var retweetedStr: String? /// 評論文字 var commentStr: String? /// 點贊文字 var likeStr: String? /// 配圖視圖大小 var pictureViewSize = CGSize()
4.2 在設置重寫的構造方法中,咱們對每一個屬性進行計算賦值函數
init(model: XQWBStatus) { self.status = model // 會員等級 if (model.user?.mbrank)! > 0 && (model.user?.mbrank)! < 7 { let imageName = "common_icon_membership_level\(model.user?.mbrank ?? 1)" memberIcon = UIImage(named: imageName) } // 認證圖標 switch model.user?.verified_type ?? -1 { case 0: vipIcon = UIImage(named: "avatar_vip") case 2, 3, 4: vipIcon = UIImage(named: "avatar_enterprise_vip") case 220: vipIcon = UIImage(named: "avatar_grassroot") default: break } // 設置toolbar 字符串 retweetedStr = countStr(count: model.reposts_count, defaultStr: "轉發") commentStr = countStr(count: model.comments_count, defaultStr: "評論") likeStr = countStr(count: model.attitudes_count, defaultStr: "贊") // 計算配圖視圖大小 pictureViewSize = calcPictureViewSize(count: status.pic_urls?.count) }
4.3 在處理構造函數中有幾個子方法單獨處理工具
// 設置評論,轉發等數字格式 private func countStr(count: Int, defaultStr: String) -> String { if count == 0 { return defaultStr } if count < 10000 { return count.description } return String(format: "%.02f萬", Double(count) / 10000.0) } // 根據配圖的數量計算配圖視圖大小 private func calcPictureViewSize(count: Int?) -> CGSize { if count == 0 || count == nil { return CGSize() } // 1.計算寬度 (common) // 2.計算高度 let row = (count!-1) / 3 + 1 // 行數 var height = OutterMargin height += CGFloat(row) * itemWidth height += CGFloat(row - 1) * InnerMargin return CGSize(width: ViewWidth, height: height) }
這樣在cell的XQWBStatusViewModel屬性的setter方法中,咱們就能夠直接根據計算處理好的數據直接對UI進行渲染佈局