12/08/2018, 14:05

Self-sizing Table View Cells part II

Theo hướng dẫn từ: https://www.raywenderlich.com/129059/self-sizing-table-view-cells Và tiếp theo từ phần trước: https://viblo.asia/thevinh92/posts/rQOvPNPNeYj Adding Images Bây giờ bạn đã có thể đọc được toàn bộ bio của 1 artist, nhưng vẫn còn nhiều dữ liệu cần phải show ra nữa. Mỗi một nghệ ...

Theo hướng dẫn từ: https://www.raywenderlich.com/129059/self-sizing-table-view-cells

Và tiếp theo từ phần trước: https://viblo.asia/thevinh92/posts/rQOvPNPNeYj

Adding Images

Bây giờ bạn đã có thể đọc được toàn bộ bio của 1 artist, nhưng vẫn còn nhiều dữ liệu cần phải show ra nữa. Mỗi một nghệ sĩ có 1 hình ảnh và tên. Thêm những thông tin nhỏ này vào và app sẽ nhìn cool hơn. Bạn sẽ cần phải thêm 1 image view vào ArtistTableViewCell và 1 label khác cho tên của nghệ sĩ. Mở ArtistTableViewCell và thêm vào 2 properties:

  • @IBOutlet var nameLabel: UILabel!
  • @IBOutlet var artistImageView: UIImageView!

Tên của biến image là artistImageVIew chứ không phải imageView bởi vì đã có sẵn property imageView bên trong UITableView. Mở Main.storyboard, chọn cell và ở Size Inspector đặt Row Height của nó là 140, để làm việc dễ dàng hơn:

rw-self-sizing-2-12.png

Select leading constraint của Bio Label: Bạn có thể thấy nó ở Document Outline, bên dưới Constraints của Content View:

rw-self-sizing-2-13-700x401.png

Delete constraint đó đi, bỏ qua warning của Auto Layout vào lúc này. Kéo cạnh trái của bio label về bên phải sao cho nó chiếm khoảng 1/2 chiều rộng của cell, nửa bên trái của cell sẽ dùng để hiện thị ảnh.

rw-self-sizing-2-14.png

Kéo thêm 1 label vào nữa, sửa text thành "name" và đặt nó ở bottom của cell, ở chính giữa nửa bên trái của cell:

rw-self-sizing-15.png

Kéo 1 image view vào, đặt nó phía trên name label:

rw-self-sizing-2-16.png

Cuối cùng, kết nối outlet cho cả image view và label mới:

rw-self-sizing-17-1-700x333.png

Tiếp theo, add các constraints sau, bắt đầu từ name label, sử dụng Pin menu để:

  • Ghim cạnh dưới của name lable 0 point từ lề dưới cùng của content view
  • Ghim cạnh trên của name lable 8 point từ bottom của image view
  • Ghim cạnh trên của image view 0 point từ top margin của content view
  • Ghim cạnh trái của image view 0 point từ leading margin của content view
  • Ghim cạnh phải của image view 16 point từ cạnh trái của bio label

Select image view, Control-Click và kéo vào content view của cell. Tiếp theo select Equal Widths từ menu:

rw-self-sizing-21-480x137.png

Select cái awidth constraint đó từ Document Outline và change multiplier thành 0.5:

rw-self-sizing-22-480x249.png

Điều này làm cho chiều rộng của image view sẽ bằng đúng 1/2 chiều rộng của cell. Vẫn còn 2 constraint nữa phải add:

  • Shift-Click cả vào image view và name label, chọn Equal Width từ Pin Menu
  • Shift-Click vào image view và name label, chọn Horizontal Centers từ Align Menu

Với những constraint đó, Auto Layout sẽ có thẻ có 1 ít warning cho bạn thấy rằng 1 số frame bị sai. Để fix, select Content View cảu cell, trong Document Outline và click vào Resolve Auto Layout Issues menu và chọn Update Frames bên dưới All Views:

Screen-Shot-2016-03-30-at-9.40.55-PM.png

Như vậy là đã xong việc với storyboard, tiếp theo, mở file ArtistListViewController.swift và thêm 2 dòng code sau vào bên trong method tableView(_:cellForRowAtIndexPath:), ngay sau khi bạn set text của bioLabel's:

cell.artistImageView.image = artist.image
cell.nameLabel.text = artist.name

Và add đoạn dưới đây vào sau khi bạn set textColor:

cell.nameLabel.backgroundColor = UIColor(red: 1, green: 152 / 255, blue: 0, alpha: 1)
cell.nameLabel.textColor = UIColor.white
cell.nameLabel.textAlignment = .center
cell.selectionStyle = .none

Build&Run app, ta sẽ thấy app đã đẹp hơn nhiều, nhưng khi scroll xuống đến Georgia O’Keeffe và bạn sẽ thấy có vấn đề:

rw-self-sizing-2-18.png

Name label được kéo dãn theo đúng constraints của nó: trên cùng cách image view 8 points, phía dưới sát với bottom margin. Để fixx điều này, ta phải sửa 1 ít constraints. Trong Main.storyboard, chọn Name label và tạo 1 constraint khác giưuax bottom của nó với bottom margin của cell. Chọn constraint đó từ Document Outline và đổi Relation thành Greater Than or Equal:

rw-self-sizing-18-1.png

Tiếp theo, chọn lại cái constraint cũ kia và đổi priority của nó thành 250:

rw-self-sizing-19-1.png

Bằng cách đó, Auto Layout sẽ phá vỡ constraint cũ nếu càn thiết, khi nó có priority thấp hơn constraint với relation >=0. Chạy ứng dụng 1 lần nữa và chúng ta sẽ thấy nó có vẻ uki rồi.

0