美文网首页
UIKit框架(八) —— 动态尺寸UITableViewCel

UIKit框架(八) —— 动态尺寸UITableViewCel

作者: 刀客传奇 | 来源:发表于2018-11-23 09:37 被阅读91次

    版本记录

    版本号 时间
    V1.0 2018.11.23 星期五

    前言

    iOS中有关视图控件用户能看到的都在UIKit框架里面,用户交互也是通过UIKit进行的。感兴趣的参考上面几篇文章。
    1. UIKit框架(一) —— UIKit动力学和移动效果(一)
    2. UIKit框架(二) —— UIKit动力学和移动效果(二)
    3. UIKit框架(三) —— UICollectionViewCell的扩张效果的实现(一)
    4. UIKit框架(四) —— UICollectionViewCell的扩张效果的实现(二)
    5. UIKit框架(五) —— 自定义控件:可重复使用的滑块(一)
    6. UIKit框架(六) —— 自定义控件:可重复使用的滑块(二)
    7. UIKit框架(七) —— 动态尺寸UITableViewCell的实现(一)

    源码

    1. Swift

    首先看一下工程文件结构

    再看一下xib文件

    下面就是看一下源码了

    1. AuteurListViewController.swift
    
    import UIKit
    
    class AuteurListViewController: UIViewController {
      let auteurs = Auteur.auteursFromBundle()
      @IBOutlet weak var tableView: UITableView!
      
      override func viewDidLoad() {
        super.viewDidLoad()
        tableView.rowHeight = UITableView.automaticDimension
        tableView.estimatedRowHeight = 600
        navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 34, weight: .bold) ]
        navigationItem.largeTitleDisplayMode = .automatic
      }
      
      override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destination = segue.destination as? AuteurDetailViewController,
          let indexPath = tableView.indexPathForSelectedRow {
          destination.selectedAuteur = auteurs[indexPath.row]
        }
      }
    }
    
    extension AuteurListViewController: UITableViewDataSource {
      func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return auteurs.count
      }
     
      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! AuteurTableViewCell
        let auteur = auteurs[indexPath.row]
        
        cell.bioLabel.text = auteur.bio
        cell.auteurImageView.image = UIImage(named: auteur.image)
        cell.nameLabel.text = auteur.name
        cell.source.text = auteur.source
        cell.auteurImageView.layer.cornerRadius = cell.auteurImageView.frame.size.width / 2
        cell.nameLabel.textColor = .white
        cell.bioLabel.textColor = UIColor(red:0.75, green:0.75, blue:0.75, alpha:1.0)
        cell.source.textColor = UIColor(red:0.74, green:0.74, blue:0.74, alpha:1.0)
        cell.source.font = UIFont.italicSystemFont(ofSize: cell.source.font.pointSize)
        cell.nameLabel.textAlignment = .center
        cell.selectionStyle = .none
        
        return cell
      }
    }
    
    2. AuteurDetailViewController.swift
    
    import UIKit
    
    class AuteurDetailViewController: UIViewController {
      var selectedAuteur: Auteur!
      let moreInfoText = "Tap For Details >"
      @IBOutlet weak var tableView: UITableView!
      
      override func viewDidLoad() {
        super.viewDidLoad()
        tableView.rowHeight = UITableView.automaticDimension
        tableView.estimatedRowHeight = 300
        title = selectedAuteur.name
        self.tableView.contentInsetAdjustmentBehavior = .never
      }
    }
    
    extension AuteurDetailViewController: UITableViewDataSource {
      func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return selectedAuteur.films.count
      }
      
      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! FilmTableViewCell
        let film = selectedAuteur.films[indexPath.row]
        cell.filmTitleLabel.text = film.title
        cell.filmImageView.image = UIImage(named: film.poster) 
        cell.filmTitleLabel.textColor = .white
        cell.filmTitleLabel.textAlignment = .center
        cell.moreInfoTextView.textColor = .red
        cell.selectionStyle = .none
        cell.moreInfoTextView.text = film.isExpanded ? film.plot : moreInfoText
        cell.moreInfoTextView.textAlignment = film.isExpanded ? .left : .center
        cell.moreInfoTextView.textColor = film.isExpanded ? UIColor(red:0.75, green:0.75, blue:0.75, alpha:1.0) : .red
    
        return cell
      }
    }
    
    extension AuteurDetailViewController: UITableViewDelegate {
       func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        guard let cell = tableView.cellForRow(at: indexPath) as? FilmTableViewCell else { return }
        var film = selectedAuteur.films[indexPath.row]
        film.isExpanded = !film.isExpanded
        selectedAuteur.films[indexPath.row] = film
        cell.moreInfoTextView.text = film.isExpanded ? film.plot : moreInfoText
        cell.moreInfoTextView.textAlignment = film.isExpanded ? .left : .center
        cell.moreInfoTextView.textColor = film.isExpanded ? UIColor(red:0.75, green:0.75, blue:0.75, alpha:1.0) : .red
        tableView.beginUpdates()
        tableView.endUpdates()
        tableView.scrollToRow(at: indexPath, at: .top, animated: true)
      }
    }
    
    3. AuteurTableViewCell.swift
    
    import UIKit
    
    class AuteurTableViewCell: UITableViewCell {
      @IBOutlet weak var bioLabel: UILabel!
      @IBOutlet weak var nameLabel: UILabel!
      @IBOutlet weak var source: UILabel!
      @IBOutlet weak var auteurImageView: UIImageView!
    }
    
    4. FilmTableViewCell.swift
    
    import UIKit
    
    class FilmTableViewCell: UITableViewCell {
      @IBOutlet weak var filmImageView: UIImageView!
      @IBOutlet weak var filmTitleLabel: UILabel!
      @IBOutlet weak var moreInfoTextView: UITextView!
    }
    
    5. Auteur.swift
    
    import UIKit
    
    struct Auteurs : Codable {
      let auteurs : [Auteur]
    }
    
    struct Auteur: Codable {
      let name: String
      let bio: String
      let source: String
      let image: String
      var films: [Film]
      
      // Decode JSON
      static func auteursFromBundle() -> [Auteur] {
        var auteurs: [Auteur] = []
        let url = Bundle.main.url(forResource: "auteurs", withExtension: "json")!
        do {
          let data = try Data(contentsOf: url)
          let json = try JSONDecoder().decode(Auteurs.self, from: data)
          auteurs = json.auteurs
        }
        catch {
          print("Error occured during Parsing", error)
        }
        return auteurs
      }
    }
    
    6. Film.swift
    
    import UIKit
    
    struct Film: Codable {
      let title: String
      let year: String
      let poster: String
      let plot: String
      var isExpanded: Bool
      
      // Custom init to set isExpanded bool to false
      init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        title = try container.decode(String.self, forKey: .title)
        year = try container.decode(String.self, forKey: .year)
        poster = try container.decode(String.self, forKey: .poster)
        plot = try container.decode(String.self, forKey: .plot)
        isExpanded = false
      }
    }
    

    下面看下效果

    后记

    本篇主要讲述了动态尺寸UITableViewCell的实现源码,感兴趣的给个赞或者关注~~~

    相关文章

      网友评论

          本文标题:UIKit框架(八) —— 动态尺寸UITableViewCel

          本文链接:https://www.haomeiwen.com/subject/sxyrqqtx.html