9

UITableView içeren bir ipad popover var. Tablo doldurulduktan sonra, genellikle (4-5) bir kaç öğe vardır, bu yüzden gerçek tablo yüksekliği (tüm hücrelerinin toplam yüksekliği) popover (contentSizeForViewInPopover) yeniden boyutlandırmak için bir yol arıyorum . o masa üstü nüfuslu alır gibi görünüyor ve gerçek yüksekliği beri viewDidAppear ve viewWillAppear ancak başarılı:UIPopoverController'da (contentSizeForViewInPopover) Dinamik UITableView yüksekliği?

Yani, yüksekliği var ama nerede contentSizeForViewInPopover aramak için emin değilim, bunu aramaya çalıştım sadece daha sonra kullanılabilir.

Bunun hakkında herhangi bir düşünce var mı? Teşekkürler!

DÜZENLEME: Hücrelerim taşıdıkları içeriğe göre farklı yüksekliklere sahiptir, noOfRows * cellHeight ile yüksekliği önceden hesaplayamıyorum.

cevap

1

Dolaylı Yaklaşım: UITableViewCell için

Set özel yükseklik numarası almak, numberOfRowsInSection kullanarak ... programınızın bir noktada toplam satır sayısını bul

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
return [indexPath row] * 40; 
} 

kullanarak satırların

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 

return [self.yourArray count]; 

//yourArray is the array with which you are populating the tableView 
} 

Birden fazla bölümünüz varsa, etkin satır sayısı için satır sayısı için sonuçla birden çok var.

Şimdi

UITableView Actual Height = Height of UITableViewCell * Total number of rows. 

Güncelleme Cevap:

  1. daha küçük metin zorla: Hücre boyutları değişiklik varsa, bunlardan birini yaparsınız gerekebilir

    Tüm hücrelerin eşit yüksekliğe sahip olması için ... Bu,

    kullanılarak yapılabilir

    'sizeToFit'

  2. Başka bir işlev kullanarak metnin yüksekliğini bulmanız gerekir. Bir şey gibi ...

    • (şamandıra) calculatedHeight { dönüş textLabel.frame.origin.ytextLabel.frame.size.height5; }
  3. Sen değişken metin için UITableViewCell yeniden boyutlandırma için THIS öğretici bakabilirsiniz.

  4. https://discussions.apple.com/thread/1525150?start=0&tstart=0

+0

Ne yazık ki, hücreler taşıdıkları içeriğe göre farklı yüksekliklere sahipler, noOfRows * cellHeight' ile yüksekliği önceden hesaplayamıyorum. –

+0

güncellenen yanıtı kontrol edin. – Legolas

0

yüksekliği elde etmek için alternatif bir yol görünümü hiyerarşiye 0.0 bir alpha set ile UITableViewController 'ın görünümü eklemek ve daha sonra contentSize özelliğini kullanarak içerik boyutunu elde etmektir tablo görünümü. Bu, tablo görünümü kaydırma görünümünün bir alt sınıfı olduğu için mümkündür.

İçerik boyutuna eriştikten sonra, contentSizeForViewInPopover değerini ayarlayın ve sonra onu popover üzerine itin.

+0

Tamam, bu mantıklı, ama ben 'contentSize' olarak nerede aramalıyım? Tablonun doldurulduktan sonra çağrılması gerekir (aka sonra - tableView: cellForRowAtIndexPath: ') –

+0

Görünmez tablo görünümünü görünüm hiyerarşisine ekledikten sonra alın. 'AddSubview:', ardından 'tableView.contentSize' olmalıdır. –

18

contentSizeForViewInPopover görünümüm UITableView ile eşleştiğinde göründüğünde ve ayrıca satır veya bölüm eklerken veya eklerken bunu yalnızca reloadData olarak adlandırdığımda değiştirmek istedim.

Aşağıdaki yöntem doğru yüksekliğini ve genişliğini hesaplar ve contentSizeForViewInPopover

-(void) reloadViewHeight 
{ 
    float currentTotal = 0; 

    //Need to total each section 
    for (int i = 0; i < [self.tableView numberOfSections]; i++) 
    { 
     CGRect sectionRect = [self.tableView rectForSection:i]; 
     currentTotal += sectionRect.size.height; 
    } 

    //Set the contentSizeForViewInPopover 
    self.contentSizeForViewInPopover = CGSizeMake(self.tableView.frame.size.width, currentTotal); 
} 
+4

Squeeeeeeeeeee! –

+5

Hesaplamayı "CGRectGetMaxY" [self.tableView rectForSection: [self.tableView numberOfSections] - 1]) yaparak basitleştirebilirsiniz. - sadece son bölümün alt kenarını bilmeniz yeterlidir –

+0

Teşekkürler Ben Lings, gerçekten çok daha basit. – k107

11

Bu cevap yukarıdaki yorumlar birinden @BenLings sayesinde olduğunu belirler.

- (CGSize)contentSizeForViewInPopover { 
    // Currently no way to obtain the width dynamically before viewWillAppear. 
    CGFloat width = 200.0; 
    CGRect rect = [self.tableView rectForSection:[self.tableView numberOfSections] - 1]; 
    CGFloat height = CGRectGetMaxY(rect); 
    return (CGSize){width, height}; 
} 
+1

Bu benim için harika çalıştı, eğer varsa, tablo başlıklarının veya altbilgilerinin yüksekliğini de dahil etmeliydim. – tapi

+0

Bu yöntemi nereye çağırmalıyım? – Isuru

1

Bir tabloyu içeren denetleyicisinden böyle yaptım: Bu gerçekten temiz çözüm ve kendi cevap değer yaşıyor, bu iyi çalışıyor yapay kanca oluşturmak için gerek yok

- (void)updatePopoverContentSize { 
    CGSize size = { CGFLOAT_MAX, CGFLOAT_MAX }; 
    size = [self.tableView sizeThatFits: size]; 
    size.width = 320; // some hard-coded value table doesn't return anything useful for width 
    size.hight = MIN(size.hight, 400); // make sure it is not too big. 

    self.contentSizeForViewInPopover = size; 
} 
1

(iOS 7, en azından) tarih:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    CGSize size = self.view.bounds.size; 
    size.height = fmaxf(size.height, self.tableView.contentSize.height); 
    self.preferredContentSize = size; 
} 
0

Bu hile yapmak gerekir

override func viewWillLayoutSubviews() { 
     super.viewWillLayoutSubviews() 

     self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height) 
}