2015-07-06 14 views
6

Sadece kenarları kısıtlı 1 çok satırlık etiket içeren özel bir tablo hücresi MyCell var. Xib boyutu 320 x 280. enter image description hereÇok satırlı etiket kullanırken systemLayoutSizeFittingSize tarafından yanlış boyut döndürüldü

Ben içeriğine dayalı hücre yüksekliğini hesaplamak için systemLayoutSizeFittingSize kullanıyorum

:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
     MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"]; 

     // set cell width = table width 
     CGRect rect = cell.frame; 
     rect.size.width = CGRectGetWidth(tableView.frame); 
     cell .frame= rect; 

     // update the text 
     cell.mainLabel.text = @"Some multiline text. Some multiline text. Some multiline text. Some multiline text. Some multiline text. Some multiline text. Some multiline text. Some multiline text."; 

     [cell setNeedsLayout]; 
     [cell layoutIfNeeded]; 

     CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 

     NSLog(@"size %@", NSStringFromCGSize(size)); // {290.5, 117.5} 

     return size.height; 
    } 

MyCelllayoutSubviews bu

- (void) layoutSubviews { 
    [super layoutSubviews]; 

    NSLog(@"cell frame %@", NSStringFromCGRect(self.frame)); // {{0, 0}, {375, 280}} 
    NSLog(@"self.mainLabel frame %@", NSStringFromCGRect(self.mainLabel.frame)); // {{8, 8}, {304, 264}} 

    [self.mainLabel updatePreferredMaxLayoutWidth]; 
} 

updatePreferredMaxLayoutWidth benziyor çerçeve genişliği değilse preferredMaxLayoutWidth güncellenmiş kategoridir preferredMaxLayoutWidth

ile aynı I çalıştırmak
-(void)updatePreferredMaxLayoutWidth { 
    if (self.numberOfLines == 0) { 
     if (self.preferredMaxLayoutWidth != self.frame.size.width){ 
      self.preferredMaxLayoutWidth = self.frame.size.width; 
      [self setNeedsUpdateConstraints]; 
     } 
    } 
} 

Şimdi elde çıkışı:

cell frame {{0, 0}, {375, 280}} 

layoutSubviews Hücre boyutu layoutSubviews içinde

self.mainLabel frame {{8, 8}, {304, 264}} 

self.mainLabel çerçeve 304 doğru Tablo görünümü ile aynı genişliğe sahiptir, Bu, xib dosyasının içindeki etiket boyutuna eşittir. Dolayısıyla, etiketin çerçevesi yeni hücrenin boyutuna güncellenmedi. Niye ya? tamamen yanlış systemLayoutSizeFittingSize ait

size {290.5, 117.5} 

boyutu. Neleri özledim? Hücrenin layoutSubviews yılında

[self.contentView layoutIfNeeded]; 

çağrılması

+1

Eğer 'aramaya denediniz [self.superview setNeedsLayout]; [self.superview layoutIfNeeded]; '[self setNeedsUpdateConstraints];' 'updatePreferredMaxLayoutWidth' içinde yürütüldü? – Bannings

cevap

1

class UILabelPreferedWidth : UILabel { 
    override var bounds: CGRect { 
     didSet { 
      if (bounds.size.width != oldValue.size.width) { 
       self.setNeedsUpdateConstraints() 
      } 
     } 
    } 

    override func updateConstraints() { 
     if(preferredMaxLayoutWidth != bounds.size.width) { 
      preferredMaxLayoutWidth = bounds.size.width 
     } 
     super.updateConstraints() 
    } 
}