2015-07-06 33 views
6

Tôi có một ô bảng tùy chỉnh MyCell, chỉ có 1 nhãn nhiều dòng với các ràng buộc cho các cạnh. Kích thước xib là 320 x 280. enter image description hereKích thước sai được trả về bởi systemLayoutSizeFittingSize khi sử dụng nhãn nhiều dòng

Tôi đang sử dụng systemLayoutSizeFittingSize để tính toán chiều cao di động dựa trên nội dung:

- (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 trông như thế này

- (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 là thể loại đó được cập nhật preferredMaxLayoutWidth nếu chiều rộng khung không phải là giống như preferredMaxLayoutWidth

-(void)updatePreferredMaxLayoutWidth { 
    if (self.numberOfLines == 0) { 
     if (self.preferredMaxLayoutWidth != self.frame.size.width){ 
      self.preferredMaxLayoutWidth = self.frame.size.width; 
      [self setNeedsUpdateConstraints]; 
     } 
    } 
} 

Bây giờ khi tôi chạy tôi nhận được kết quả:

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

kích thước tế bào trong layoutSubviews có chiều rộng tương tự như xem bảng, đúng

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

khung self.mainLabel bên layoutSubviews là 304, bằng với kích thước nhãn bên trong tệp xib. Vì vậy, khung của nhãn không được cập nhật lên kích thước của ô mới. Tại sao?

size {290.5, 117.5} 

Kích thước systemLayoutSizeFittingSize hoàn toàn sai. Những gì tôi đã bỏ lỡ?

+1

Các bạn đã cố gắng gọi '[self.superview setNeedsLayout]; [self.superview layoutIfNeeded]; 'after' [self setNeedsUpdateConstraints]; 'được thực hiện trong' updatePreferredMaxLayoutWidth'? – Bannings

Trả lời

1

Bạn có thể sử dụng lớp này để giải quyết mọi vấn đề với UILabel và AutoLayout bạn

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() 
    } 
} 
Các vấn đề liên quan