2014-10-09 54 views
0

我有:的UILabel SETFRAME不调整大小的标签,即使是在layoutSubviews

#import "CustomTableViewCell.h" 

@interface CustomTableViewCell() 
@property (assign) CGRect titleFrame; 
@property (assign) CGRect detailFrame; 
@end 

@implementation CustomTableViewCell 
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

- (void)awakeFromNib 
{ 
    if (self.title != nil) { 
     self.titleFrame = self.title.frame; 
    } 
    if (self.detail != nil) { 
     self.detailFrame = self.detail.frame; 
    } 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{ 
    [super setSelected:selected animated:animated]; 

    // Configure the view for the selected state 
} 

- (void) setTitleTo: (NSString *)text { 
    if (self.title == nil || text == nil) { 
     return; 
    } 

    CGSize maximumLabelSize = CGSizeMake(self.title.frame.size.width, FLT_MAX); 
    CGRect expectedLabelSize = [text boundingRectWithSize:maximumLabelSize 
                options:NSLineBreakByWordWrapping | NSStringDrawingUsesLineFragmentOrigin 
               attributes:@{NSFontAttributeName:self.title.font} 
                context:nil]; 
    CGRect newFrame = self.title.frame; 
    newFrame.size.height = expectedLabelSize.size.height; 
    self.titleFrame = newFrame; 

    self.detail.lineBreakMode = NSLineBreakByWordWrapping; 
    self.detail.numberOfLines = 3; 

    [self.title setText:text]; 
    [self setNeedsLayout]; 
} 

- (void) setDetailTo: (NSString *)text { 
    if (self.detail == nil || text == nil) { 
     return; 
    } 

    CGSize maximumLabelSize = CGSizeMake(self.detail.frame.size.width, FLT_MAX); 
    CGRect expectedLabelSize = [text boundingRectWithSize:maximumLabelSize 
                options:NSLineBreakByWordWrapping | NSStringDrawingUsesLineFragmentOrigin 
               attributes:@{NSFontAttributeName:self.title.font} 
                context:nil]; 
    CGRect newFrame = self.detail.frame; 
    newFrame.size.height = expectedLabelSize.size.height; 
    self.detailFrame = newFrame; 

    self.detail.lineBreakMode = NSLineBreakByWordWrapping; 
    self.detail.numberOfLines = 3; 

    [self.detail setText:text]; 
    [self setNeedsLayout]; 
} 


- (void) layoutSubviews { 
    [super layoutSubviews]; 

    if (self.title != nil) { 
     NSLog(@"T: %@", self.title.text); 
     [self.title setFrame:self.titleFrame]; 
    } 
    if (self.detail != nil) { 
     NSLog(@"D: %@", self.detail.text); 
     [self.detail setFrame:self.detailFrame]; 
    } 
} 
@end 

从我正在读here它应该调整到适合文本。

screen shot

和NSLog的输出:

2014-10-08 20:48:29.474 Test[57397:613] T: Largest Metro 
2014-10-08 20:48:29.475 Test[57397:613] D: Oahu metropolitan area 

我的理解是“瓦胡岛首都圈”应与第二行“区域”是可见的。

+0

您会考虑使用自动布局而不是手动计算帧吗? – 2014-10-10 04:16:39

+0

@ KenKuan-我正在慢慢转换它,因为我键入。试图准确了解约束如何在途中:) – Justin808 2014-10-10 04:25:04

回答

1

三样东西,你应该改变:

  • 移动你的标签的大小计算到layoutSubviews
  • 计算标签尺寸的最精确方法是使用-[UILabel sizeThatFits:]来获得所需的尺寸。
  • 关闭自动布局
+0

更改在哪里以及如何进行计算会影响实际尺寸的变化?它像'setFrame'不起作用。 – Justin808 2014-10-09 16:57:10

+0

@ Justin808这是我的意图。这个标签会在它被布置的时候调整大小=>准确得多。标签将使用一种方法来调整尺寸,该方法完全知道**将如何渲染。例如'boundingRectWithSize'不知道你的标签被限制为3行。 ---您是否在您调用'setFrame:'时检查了所有框架属性是否正确? ---你在这个视图中使用自动布局吗? Afaik自动布局忽略手动设置的帧。 – fluidsonic 2014-10-09 17:39:07

+0

不知道发生了什么事。我转移到了你的建议,计算在'layoutSubviews'中,我使用'sizeThatFits:'来进行计算。标签的框架大小发生了变化 - 我可以'NSLog',但屏幕上没有任何反应。如果我滚动屏幕并重新打开,它会正确显示。只有最初的显示是错误的。 – Justin808 2014-10-09 23:16:17

相关问题