2011-10-04 32 views
8

Birkaç gün boyunca bu soruyla kendimi hayal kırıklığına uğrattım. UITabel'ı bir UITableViewCell'e eklemeye çalışıyorum. UILabel'ın hücrenin tüm genişliğini, görünüm için sağ ve sol taraftaki eksi 5 veya 10'u geçmesini istiyorum. Sorunum, etiketin yerleştirileceği hücre çerçevesinin boyutunun programatik olarak belirlenmesidir. Hangi UITableViewStyle kullandığımı farketmez, cell.contentVew.frame.size.width değeri, hücre çerçevesinin kendisinin genişliğine yakın değildir.Bir UITableViewCell çerçevesinin geri alınması

CGRectMake(10, 12, 397, self.contentView.frame.size.height); 

Ama sanki:

Örneğin, ben inşa ediyorum tabloda, ben tarafından (sadece deneme yanılma yoluyla) UITableViewCell sınıflara ve bir elle tespit genişliğe sahip bir UILabel oluşturarak benim istenen sonucu elde edebilirsiniz 397 numara beni rahatsız ediyor. Herhangi bir genişlik tablosu veya stili için ne olması gerektiğini programlı olarak belirlemenin bir yolunu istiyorum. Bu sadece hücrenin tüm çerçevesinin genişliğini belirleyerek ve daha sonra 10 veya 20 çıkararak basit bir işlem olmalı, böylece UILabel'ın kenarları hücrenin kenarına dokunmuyor. Denemek sonra UITableViewStyleDefault için tableViewStyle ayarlarsanız ve

Ancak:

NSLog(@"Width: %f", self.contentView.frame.size.width); 

Ben, diğer üç stilleri herhangi birine stili ayarlamak ben 320 olsun, döndürülen sayı bile 320 302. olduğunu sayı, hücre çerçevesinin genişliğine yakın bir yerde değildir (manuel olarak belirlenen 397 sayısına göre).

Hücrenin çizim çerçevesinin tüm genişliğini döndürecek erişime hangi değere ihtiyacım var? Eminim, çoğu sinir bozucu problemde olduğu gibi, çözüm beni alnımda tokatlamak isteyecektir, ama şimdi hazır olduğum noktaya geliyorum. Daha fazla bilgi için

DÜZENLEME: ilgilenen herkes için

Bir açıklama. Bu benim sorusu öncelikli olarak Gruplandırılmış bir tabloya ait.

CGFloat cellWidth = [tableView rectForRowAtIndexPath:indexPath].size.width; 

I having rectForRowAtIndexPath yöntemi hücresi olduğu çerçevenin genişliğini döndürür olmasıdır: Düz stil, yukarıda benim sorunun cevabı ile cellForRowAtIndexPath yönteminde kolayca tespit edilebilmektedir çizilmiş olan, düz bir tablo için iyi, çünkü hücre genişliği çerçevenin tüm genişliği. Ancak, gruplandırılmış bir tabloda, hücrenin genişliği, çizildiği çerçevenin genişliğinden daha azdır, bu nedenle bu yöntem, hücrenin genişliğinden biraz daha geniş bir sayıyı döndürecektir. Gruplandırılmış bir tablo stilindeki hücrenin genişliğinin, tablo çerçevesinin genişliğinden daha az sabit bir sayı olması olasıdır, bu nedenle sorunu çözmenin yolu bu olabilir. Bu soruyu araştıracağım ve eğer durum buysa kendi sorumu yanıtlayacağım.

+0

Harika bir soru Ben aynı davranışı alıyorum ve beni deli ediyor. Çözümüm çerçeve boyutu hakkında düşünmemek ve yalnızca içerik görüntüleme boyutunun yüzdesi olarak alt görünümler genişliğine başvurmaktı.İçerik görüntü çerçevesinin, aksesuarlar için ayrılan hücrenin solundaki ve sağındaki alanları (taşıma, silme, ifşa etme, vb.) Hariç tuttuğuna eminim, ancak yine de hücre çerçevelerinin neden her zaman yanlış boyutu bildirdiği konusuna cevap vermiyor. . Umarım birisi gelecek ve tüm bunları anlayacaktır. – Rog

+0

Bu manzarada mı? –

+0

@Bartosz - Örneğimde portreden numara alıyorum. – Chris

cevap

8

Kendi cevabımı belirledim ve umarım aynı sorunla karşılaşan herkese yardımcı olur. Bu grup, this StackOverflow answer. adresinde bulunan gruplandırılmış bir tablonun kenar boşluğunun hesaplanmasını içerir. Bu kod, hücrenin iki kenarı arasında bir kenar boşluğuna sahip olan ve hücre içinde dikey olarak ortalanmış bir tableView hücresi içinde bir etiket sağlayacaktır.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    UILabel *label; 
    CGFloat groupedStyleMarginWidth, tableViewWidth; 
    UIFont *labelFont = [UIFont boldSystemFontOfSize:17.0]; // Set to whatever you like 
    NSString *labelText = @"Test String"; 

    // Calculate the margin between the cell frame and the tableView 
    // frame in a grouped table view style. 
    tableViewWidth = tableView.frame.size.width; 
    if (tableView.style == UITableViewStyleGrouped) { 
     if (tableViewWidth > 20) 
      groupedStyleMarginWidth = (tableViewWidth < 400) ? 10 : MAX(31, MIN(45, tableViewWidth*0.06)); 
     else 
      groupedStyleMarginWidth = tableViewWidth - 10; 
    } 
    else 
     groupedStyleMarginWidth = 0.0; 

    if (cell == nil) { 
     CGRect tableViewRect; 
     CGRect labelRect; 
     CGFloat x, y, w, h, labelMargin; 

     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

     // Retrieve the rect of the table view. 
     tableViewRect = [tableView rectForRowAtIndexPath:indexPath]; 

     // Set whatever margin around the label you prefer. 
     labelMargin = 10; 

     // Determine rect values for the label. 
     x = tableRect.origin.x + labelMargin; 

     // Calculate width of label 
     w = tableRect.size.width - (groupedStyleMargin * 2) - (labelMargin * 2); 

     // Calculate height of table based on font set earlier. 
     h = [labelText sizeWithFont:font].height; 

     // Calculate y position for the label text baseline to center 
     // vertically within the cell. 
     y = (tableRect.origin.y/2) - (h/4); 

     labelRect = CGRectMake(x, y, w, h); 

     label = [[UILabel alloc] initWithFrame:labelRect]; 
     label.text = labelText; 
     label.tag = 0; 
     [cell.contentView addSubview:stepLabel]; 
     [label release]; 
    } 
    else { 
     label = (UILabel *)[cell viewWithTag:0]; 
    } 
1

Bu gibi sesler, günümüzde otomatik düzen kısıtlamalarıyla ele alınmalıdır.

İlgili konular