Dinamik hüceyrə düzəlişləri və dəyişən sıra hündürlüyü üçün UITableView-də avtomatik layout istifadə

UITableViewCell daxilində avtomatik UITableViewCell masa görünüşündə necə istifadə edirsiniz ki, hər bir hüceyrə məzmunu və alt seçimi düz keçid saxlayarkən satırın boyunu (özünü / avtomatik olaraq) müəyyən edir?

1399
11 сент. 11 sentyabrda Smileyborg tərəfindən təyin olundu 2013-09-11 19:48 '13 at 7:48 PM 2013-09-11 19:48
@ 28 cavab

Tl; DR: oxumağı xoşlamırmı? Github'daki nümunə layihələrə düz gedin:

Konsepsiya təsviri

Aşağıdakı ilk iki addım, tətbiq etdiyiniz iOS versiyasından asılı olmayaraq tətbiq olunur.

1. Konfiqurasiya və məhdudiyyətlər əlavə edin

UITableViewCell alt sinifində, hüceyrə subzonlarında, kənarların contentView hücresinin kənarlarına (yuxarı və aşağı kənarlar üçün ən vacib olan) əlavə olması üçün məhdudiyyətlər əlavə edin. Qeyd. Subviews birbaşa hüceyrəyə yazmayın; yalnız contentView hücresinde! . Bu subspecies məzmununun daxili ölçüsü masa hüceyrəsinin məzmununun artımına gətirib çıxararaq, hər bir alt qrup üçün məzmunun məzmunu və məzmununun məhdudlaşdırılmasına qarşı müqavimət əlavə etdiyiniz yüksək prioritetli məhdudiyyətlər ilə yenidən təyin edilməməsinə əmin olun. ( Bəli? Buraya vurun. )

Həyatın hüceyrə subzonlarının hüceyrənin məzmununun təqdimatına şaquli olaraq bağlı olduqlarını xatırlayın ki, onlar "təzyiq tətbiq" edə və məzmunun təqdimatını onlara uyğunlaşdırsınlar. Bir neçə sahə ilə bir nümunə hüceyrəsi istifadə edərək, bəzi (hamısı deyil!) Sizin məhdudiyyətlərinizdən belə bir şəkildə görünməlidir ki,

2019

2311
11 сент. Cavab smileyborg tərəfindən verilir 11 Sep 2013-09-11 19:48 '13 at 7:48 PM 2013-09-11 19:48

İOS8 üçün həqiqətən sadədir:

 override func viewDidLoad() { super.viewDidLoad() self.tableView.estimatedRowHeight = 80 self.tableView.rowHeight = UITableViewAutomaticDimension } 

Və ya eyni

 func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension } 

Amma IOS7 üçün əsas avtomatik yerləşdirmədən sonra hündürlüyü hesablamaqdır,

 func calculateHeightForConfiguredSizingCell(cell: GSTableViewCell) -> CGFloat { cell.setNeedsLayout() cell.layoutIfNeeded() let height = cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingExpandedSize).height + 1.0 return height } 

Mühümdir

  • Etiketlər bir neçə satırdan ibarətdirsə, numberOfLines 0 olaraq təyin numberOfLines unutmayın.

  • label.preferredMaxLayoutWidth = CGRectGetWidth(tableView.bounds) unutmayın

Tam kod nümunəsi burada .

EDIT Swift 4.2 UITableViewAutomaticDimension dəyişdi

143
19 июня '15 в 11:21 2015-06-19 11:21 cavabı 19 iyun 'da saat 11:21 ' də William Hu tərəfindən verilmişdir 2015-06-19 11:21

Swift dəyişən yüksəklikli nümunə UITableViewCell

Swift 3 üçün yeniləndi

William Hu Swiftin cavabı yaxşıdır, amma ilk dəfə bir şey öyrənməyi öyrənəndə mənə sadə, lakin ətraflı addımlar atmağa kömək edir. Aşağıdakı nümunə mənim test layihəmizdir, dəyişkən bir hüceyrə hündürlüyü ilə UITableView etmək üçün necə UITableView . Mən Swift üçün bu əsas UITableView nümunəsinə əsaslanıram.

Bitmiş layihə belə olmalıdır:

Yeni bir layihə yaradın

Yalnız bir görünüş tətbiqi ola bilər.

Kodu əlavə edin

Layihəyə yeni bir Swift faylı əlavə edin. MyCustomCell deyə zəng edin. Bu sinif, hekayə panelinizə hücum etdiyiniz fikirlər üçün çıxışları ehtiva edir. Bu əsas nümunədə hər bir hüceyrədə yalnız bir etiket olacaq.

 import UIKit class MyCustomCell: UITableViewCell { @IBOutlet weak var myCellLabel: UILabel! } 

Daha sonra bu çıxışı birləşdirəcəyik.

Open ViewController.swift və aşağıdakı məzmunda olduğunuzdan əmin olun:

 import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { // These strings will be the data for the table view cells let animals: [String] = [ "Ten horses: horse horse horse horse horse horse horse horse horse horse ", "Three cows: cow, cow, cow", "One camel: camel", "Ninety-nine sheep: sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep baaaa sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep", "Thirty goats: goat goat goat goat goat goat goat goat goat goat goat goat goat goat goat goat goat goat goat goat goat goat goat goat goat goat goat goat goat goat "] // Don't forget to enter this in IB also let cellReuseIdentifier = "cell" @IBOutlet var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() // delegate and data source tableView.delegate = self tableView.dataSource = self // Along with auto layout, these are the keys for enabling variable cell height tableView.estimatedRowHeight = 44.0 tableView.rowHeight = UITableViewAutomaticDimension } // number of rows in table view func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.animals.count } // create a cell for each table view row func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell:MyCustomCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! MyCustomCell cell.myCellLabel.text = self.animals[indexPath.row] return cell } // method to run when table view cell is tapped func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print("You tapped cell number \(indexPath.row).") } } 

Важное примечание: