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
. Çok satırlı etiket kullanırken systemLayoutSizeFittingSize tarafından yanlış boyut döndürüldü
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;
}
MyCell
layoutSubviews
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
-(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ı
Eğer 'aramaya denediniz [self.superview setNeedsLayout]; [self.superview layoutIfNeeded]; '[self setNeedsUpdateConstraints];' 'updatePreferredMaxLayoutWidth' içinde yürütüldü? – Bannings