iosdynamic尺寸标签
我试图在网上search,但还没有find明确的答案,所以我来问你的专家意见。 我有一个视图上有2个标签。 第一个标签用于显示名称的缩写,2-3个字母。 第二个标签显示全名。
我有的问题是,如果有一种方法可以根据给定的字体types,大小和string长度dynamic调整标签的大小? 我问,因为我希望第二个标签接近第一个,没有太多的空白空间之间或没有第一个标签重叠第二。
这不是全部在一个标签的原因是因为第一个标签应该有一个更大的字体和不同的配色scheme,然后第二个标签。
任何意见是极大的赞赏。
你可以计算你的string出现的大小,然后可以将你的UILabel的框架设置为这个大小,参见下面的代码样本 –
//Calculate the expected size based on the font and linebreak mode of your label CGSize maximumLabelSize = CGSizeMake(296,9999); CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font constrainedToSize:maximumLabelSize lineBreakMode:yourLabel.lineBreakMode]; //adjust the label the the new height. CGRect newFrame = yourLabel.frame; newFrame.size.height = expectedLabelSize.height; yourLabel.frame = newFrame;
更新 –
使用sizeWithAttributes:
相反,现在需要一个NSDictionary
。 用键UITextAttributeFont
和你的字体对象UITextAttributeFont
,如下所示:
CGSize size = [string sizeWithAttributes: @{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}];
检查更换不推荐sizeWithFont:在iOS 7? 更多细节
这也将做的伎俩,并将考虑到归属文本
label.attributedText = attrString; CGSize maximumLabelSize = CGSizeMake(187,CGFLOAT_MAX); CGSize requiredSize = [label sizeThatFits:maximumLabelSize]; CGRect labelFrame = label.frame; labelFrame.size.height = requiredSize.height; label.frame = labelFrame;
'sizeWithFont:'已被弃用:在iOS 7.0中首先不推荐使用。
所以请尝试sizeWithAttributes
- (void)viewDidLoad { [super viewDidLoad]; label = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 300, 20)]; label.backgroundColor = [UIColor blueColor]; const CGFloat fontSize = 30; UIFont *regularFont = [UIFont systemFontOfSize:fontSize]; UIColor *foregroundColor = [UIColor blackColor]; attrs = [NSDictionary dictionaryWithObjectsAndKeys: regularFont, NSFontAttributeName, foregroundColor, NSForegroundColorAttributeName , nil]; NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:@"Test Text" attributes:attrs]; [label setAttributedText:attributedText]; [self.view addSubview:label]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { CGSize expectedLabelSize = [label.text sizeWithAttributes:attrs]; // iOS 7 Code <-- CGRect newFrame = label.frame; newFrame.size.width = expectedLabelSize.width; label.frame = newFrame; NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:@"Longer Test Text" attributes:attrs]; [label setAttributedText:attributedText]; }
由于sizeWithFont:
在iOS 7中被弃用 ,所以你需要使用sizeWithAttributes
(正如这里解释的maver)。 为了简化代码,你可以添加一个你可以像这样重用的方法:
-(CGRect)rectForText:(NSString *)text usingFont:(UIFont *)font boundedBySize:(CGSize)maxSize { NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:text attributes:@{ NSFontAttributeName:font}]; return [attrString boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin context:nil]; }
并利用它
CGSize maximumLabelSize = CGSizeMake(280,9999); UIFont *font = [UIFont systemFontOfSize:20]; CGRect titleRect = [self rectForText:post.title // <- your text here usingFont:font boundedBySize:maximumLabelSize];
除了Saurabh的回答。 我有同样的问题,你应该添加这一行
[yourLabel setNumberOfLines:0];
以便整个文本以X行显示。