2013-04-02 7 views
6

Çeşitli yerlerdeNeden self.frame ve self.contentView.frame genellikle UITableViewCell için farklıdır? dönmek için bir UITableViewCell oluştururken

NSAssert(abs(self.frame.size.height-self.contentView.frame.size.height)<=1,@"Should be the same"); 

serpilmiştir.

Sonuç genellikle farklılık gösterir. Bazen bazen 1 piksel, bazen 2

Problemin ne olduğunu merak ediyorum. CellForRowAtIndexPath içinde onları farklı kılan bir şey var mı?

Aynısından başlıyorlar. Hiçbir düzenleme vb

BGDetailTableViewCell * cell= (BGDetailTableViewCell*)[tableView dequeueReusableCellWithIdentifier:[BGDetailTableViewCell reuseIdentifier]]; 

if (cell==nil) 
{ 
    cell = [[BGDetailTableViewCell alloc]init]; 
} 
else 
{ 
    NSAssert(abs(cell.frame.size.height-cell.contentView.frame.size.height)<=1,@"Should be the same"); //Sometimes this fail 
} 

NSOrderedSet *Reviews = [self.businessDetailed mutableOrderedSetValueForKey:footer.relationshipKey]; 
Review * theReview = [Reviews objectAtIndex:row]; 
cell.theReview = theReview; 
NSAssert(abs(cell.frame.size.height-cell.contentView.frame.size.height)<=1,@"Should be the same");//This one never fail right before returning cell 
return cell; 



`NSAssert(abs(cell.frame.size.height-cell.contentView.frame.size.height)<=1,@"Should be the same")`; never fails right before returning the cell. 

Ancak bu basit Snippet en

Bak yoktur, ben hücre bazen ikincisi sıradan çıkarma sonra başarısız olur.

Bu

tableView gruplanmış modundayken arada sonuç

(lldb) po cell 
$0 = 0x0c0f0ae0 <BGDetailTableViewCell: 0xc0f0ae0; baseClass = UITableViewCell; frame = (0 424; 320 91); hidden = YES; autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0xc01e800>> 
(lldb) po cell.contentView 
$1 = 0x0c086080 <UITableViewCellContentView: 0xc086080; frame = (10 1; 300 89); gestureRecognizers = <NSArray: 0xc0c7ee0>; layer = <CALayer: 0xc0ebbf0>> 

olduğunu. Bunun onunla bir ilgisi olduğunu düşünüyorum.

cevap

4

İki dikdörtgens farklı koordinat sistemindedir ve mutlaka eşleşmeyecektir.

cell.frame onun Superview koordinat sisteminde (cell.superview) içerisinde hücrenin rect'in belirtir. Hücrenin süper görüşü UITableView'dir. Hücrenin çerçevesi, düzgün bir şekilde yerleştirilebilmesi için tablo görünümü tarafından manipüle edilecektir. Bu ayrıca, rowHeight özelliğine veya tableView:heightForRowAtIndexPath: delege yöntemiyle döndürülen değere uydurmak için yüksekliği de değiştirmeyi içerir. Hücrenin contentView numaralı hücresinin "iç" kısmı

. Süper görüntü, alt görünümleri için kendi yerel koordinat sistemine sahip olan hücrenin kendisi. Bunlar, TableView tarafından manipüle edilmez, ancak hücre tarafından (hücre alt sınıfınız gibi) kendisinin belirlediği kısıtlamalarla. Alt sınıfınız, contentView'u istediğiniz gibi boyutlandırmak için layoutSubviews'u uygulayabilir. Eğer contentView sizin UITableViewCell alt sınıfta, senin hücrenin yüksekliğini (ve sınır) maçları sağlamak istiyorsanız

, şöyle layoutSubviews uygulamak:

-(void)layoutSubviews 
{ 
    self.contentView.frame = self.bounds; 
} 

Sen contentView çerçevesine herhangi bir değişiklik yapabilir sen İsterseniz, bunların frame yerine superview'in bounds'u kullanarak yerel koordinat sistemine göre yapılması gerektiğini düşünün.

+0

Mark, hücre genişliğinin ve hücrenin içeriğinin genişliğinin neden aynı olmadığını açıklar mısınız? –