Soru UITableView'un autolayout özelliği ile yükseklik dinamiği nasıl yapılır?


Xcode 5'de autolayout kullanıyorum.

Tablo görünümünün yüksekliğini 200px'den büyük veya ona eşit olarak ayarlıyorum. Bunun dinamik bir boyuta sahip olmasını istiyorum. Çünkü bazen çok sayıda satır olacak, bazen birkaç satır olacak.

Ama boyut her zaman 200px'dir. Ve eğer içerik bundan daha büyükse, alt sıraları görmek için aşağı kaydırmalıyım.

Tableview dinamik boyutunu vermek için ne yapmalıyım?enter image description here


35
2017-08-28 21:00


Menşei


İstediğiniz sınırları sağlayabilir misiniz? Örneğin 200 puandan 400 puana kadar. - Juan Catalan
Aslında benim sınırlarım yok. Çünkü satır bulunamaz ya da 10 satır olabilir. - Burak
Dinamik bir boyut istediğinizi söylüyorsunuz, yani boyut değişiyor. Tabloda 0 satır varsa hangi yüksekliği istiyorsunuz? Tablo tüm ekranı kaplayabilir mi veya belli bir boyuta sınırlamak ister mi? - Juan Catalan
0 satır olduğunda, yükseklik 0 olmalıdır. Ve daha fazla varsa, sınır yoktur. Yükseklik (row_count * row_height) + (section_count * section_header_height) - Burak


Cevaplar:


Bu Xcode'un en son sürümü ile test edilir.

1) Xcode'ta storyboard'a gidin ve seçmek için tablo görünümüne tıklayın.

2) Yardımcı programlar bölmesinde (bkz. Resim 1) tablo görünümü yüksekliğinin tanımlanmış olduğundan emin olun.

Table view heigth constraint

3) Tablo görünümünü görüntüleyen denetleyicide, bu kısıtlamaya bir çıkış oluşturun:

Swift 3'te

@IBOutlet weak var dynamicTVHeight: NSLayoutConstraint!

Amaç C

@property (strong, nonatomic) IBOutlet NSLayoutConstraint *dynamicTVHeight;

4) Hikaye panosunda, UITableView ve sağdaki simgenin rengi mordan maviye değiştirdiğini doğrulayın (bkz. resim 2)

Table view heigth constraint after outlet

4) Ayrıca bu kodu aynı görüntü denetleyicisine koyun:

hızlı

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    tableView.reloadData()
}


override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let height = min(self.view.bounds.size.height, tableView.contentSize.height)
    dynamicTVHeight.constant = height
    self.view.layoutIfNeeded()
}

Hedef C

- (void)viewWillAppear:(BOOL)animated
{
    // just add this line to the end of this method or create it if it does not exist
    [self.tableView reloadData]; 
}

-(void)viewDidLayoutSubviews
{
    CGFloat height = MIN(self.view.bounds.size.height, self.tableView.contentSize.height);
    self.dynamicTVHeight.constant = height;
    [self.view layoutIfNeeded];
}

Bu probleminizi çözmeli.

Bunlar, örnek projenin iki versiyonuna, istediğinizi yapan, Objective C ve diğeri Swift 3 için olan linklerdir. Indirin ve Xcode ile test edin. Her iki proje de Xcode, Xcode 8.3.2'nin en son sürümü ile çalışır.

https://github.com/jcatalan007/TestTableviewAutolayout https://github.com/jcatalan007/TestTableviewAutolayoutSwift


64
2017-08-29 13:25



XCode 5'teki Kullanıcı Kısıtlamasına Yükseltme bulmuyorum. Simge hala mor. IBOutlet'i kısıtlama ile bağlayamadım. - Burak
Endişelenmeyin, IBOutlet'i yapın, bundan sonra mavi olacak. Utilities bölmesinde oultet'i başka bir şekilde yapmak da var. - Juan Catalan
@Burak: dowloand sampel projesini ve nasıl çalıştığını görün. - Juan Catalan
@JuanCatalan İlk görüşümüzü oluşturmak için storyboard kullandığımdan beri, partiye yeni bir görünüm eklemeye çalıştığımda önceden tanımlanmış düzen kısıtlamasını nasıl düzenleyeceğimi anlamakta zorlandım ve NSLayoutConstraint'i bir IBOutlet olarak algılayabileceğimizi fark etmedik. . Cevabınız için teşekkür ederim, bana çok zaman kazandır. - vaz
Harika! Tamam XCode 8.2 çalışır. Swift 3 için: dahili geçersiz kılma func viewDidLayoutSubviews () {let height = min (self.view.bounds.size.height, self.tableView.contentSize.height) self.dynamicTVHeight.constant = yükseklik self.view.layoutIfNeeded ()} - diegomercado


xib veya storyboard ile hücrenizi oluşturun. çıkışının içeriğini ver. şimdi CellForRowAtIndexPath olarak adlandırın. Örneğin. Hücrenin yüksekliğini Comment'in etiket metnine göre ayarlamak isterseniz.enter image description here

bu yüzden size yorumlarLbl.numberOfLine = 0;

sonra ViewDidLoad içinde

 self.table.estimatedRowHeight = 44.0 ;
self.table.rowHeight = UITableViewAutomaticDimension;

ve şimdi

-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;}

voila ............ bunu yaptın ....


4
2018-05-19 14:26



OP'nin sorduğu bu değildi. OP, içeriğine bağlı olarak tüm UITableView'un yüksekliğini nasıl değiştireceğini sordu. Tanımladığınız şey, bireysel hücrelerin yüksekliğini etkiler. - yf526


Programlı olarak yapılabilir. Kavram (ve kodun kendisi) aslında çok basit:

MyTableView'ın süper görünümünün updateConstraints yönteminde, myTableView öğesinin yüksekliğinin myTableView.contentSize.height öğesine eşit olması için bir kısıtlama ekleyin.

İOS 7'yi hedefleyen Xcode 6'da test edildi.


2
2018-01-28 03:54



myTableView.contentSize.height = 0 içinde updateConstraints tablodaki verilerde veri olmasına rağmen satır sınırını belirleyen satırın yorumunu yaparken satırları gösterir. myTableView.contentSize.height. Bunu başka bir yerde güncellediniz mi? - Crashalot


Ctrl + UITableView'ınızın yükseklik kısıtını görünüm denetleyicinizin kaynak koduna sürükleyip ona bir ad verebilirsiniz. Daha sonra ViewController'ınızın updateViewConstraints bölümünde bu kısıtlamanın sabitini tableView.contentSize.height olarak ayarlayabilirsiniz.

....

@IBOutlet weak var tableViewHeightConstraint: NSLayoutConstraint?

....

override func updateViewConstraints() {
    super.updateViewConstraints()
    tableViewHeightConstraint?.constant = tableView.contentSize.height
}

1
2017-08-17 12:28



tableView.contentSize.height = 0 içinde updateConstraints Tabloda veriler olsa ve 'tableViewHeightConstraint? .constant = tableView.contentSize.height' ifadesini görüntülerken satırlar gösterilmesine rağmen. Bunu başka bir yerde güncellediniz mi? - Crashalot