如何创建带有两行文本且第一行文本大于第二行的 UIButton?
Posted
技术标签:
【中文标题】如何创建带有两行文本且第一行文本大于第二行的 UIButton?【英文标题】:How would I create a UIButton with two lines of text and the first line of text being larger than the second? 【发布时间】:2013-10-23 20:40:07 【问题描述】:基本上,我想要一个看起来像这样的按钮作为最终结果:
按钮跨越两行,顶行的字体较大。在这张图片中,顶部是 38pt,底部是 24pt。
我知道这将是 NSAttributedString 的一项任务,但我无法弄清楚如何正确执行它。我的故事板中有一个 UIButton,文本设置为属性(并且换行符设置为自动换行),然后是 viewDidLoad
中的一个出口,我执行以下操作:
UIFont *font = [UIFont systemFontOfSize:39.0];
UIFont *font2= [UIFont systemFontOfSize:17.0];
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"625 WPM"];
[string addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, string.length)];
[string addAttribute:NSFontAttributeName value:font2 range:NSMakeRange(string.length - 2, 2)];
self.button.titleLabel.attributedText = string;
基本上我给所有的东西一个大字体,然后对于最后几个字母我把它变小。但它看起来很大胆。
我做错了什么?
【问题讨论】:
你的 NSMakeRange 看起来不对。 【参考方案1】:UIButton
的 titleLabel
不能像独立的 UILabel
那样访问。
您需要使用UIButton
的setAttributedTitle:forState:
方法。
编辑:(添加到回答行间距问题)
在本例中,属性为NSParagraphStyleAttributeName
,值为pStyle
NSMutableParagraphStyle *pStyle = [[NSMutableParagraphStyle alloc] init];
pStyle.lineSpacing = 8;
return @
NSParagraphStyleAttributeName : pStyle
;
【讨论】:
现在可以控制行距吗?它们相距太远。 是的,我已经更新了我的答案,以展示如何使用 NSAttributedString 调整行距。如果您喜欢,请接受该答案。谢谢! 接受!非常感谢帮助,非常清楚。【参考方案2】:我是在一个 BarButtonItem 上完成的,我需要 2 个标签,一个接一个,具有不同的文本大小和属性。
我设置了对 2 UILabel 的强引用,然后:
-(void) initBottomBar
UIColor *labelColor;
if ([Utility getiosVersion] == 7)
labelColor = [UIColor colorWithRed:43.0f/255.0f green:41.0f/255.0f blue:81.0f/255.0f alpha:1.0f]; // grayblue color
else
labelColor = [UIColor whiteColor];
labelStringCategory = [[UILabel alloc] initWithFrame:CGRectMake(0, 3, 300, 22)];
labelStringCategory.backgroundColor = [UIColor clearColor];
labelStringCategory.textColor = labelColor;
labelStringCategory.font = [UIFont systemFontOfSize:14];
labelStringCategory.numberOfLines = 1;
labelStringCategory.textAlignment = NSTextAlignmentLeft;
labelStringCategory.adjustsFontSizeToFitWidth = YES;
labelStringCategory.text = @"First Row";
changeStringCategory = [[UILabel alloc] initWithFrame:CGRectMake(0, 19, 300, 22)];
changeStringCategory.backgroundColor = [UIColor clearColor];
changeStringCategory.textColor = labelColor;
changeStringCategory.font = [UIFont systemFontOfSize:12];
changeStringCategory.numberOfLines = 1;
changeStringCategory.textAlignment = NSTextAlignmentLeft;
changeStringCategory.adjustsFontSizeToFitWidth = YES;
changeStringCategory.text = @"Second row";
UIButton *displayButton = [UIButton buttonWithType:UIButtonTypeCustom];
displayButton.frame = CGRectMake(0, 0, 300, 44);
[displayButton addSubview:labelStringCategory];
[displayButton addSubview:changeStringCategory];
displayButton.showsTouchWhenHighlighted = YES;
[displayButton addTarget:self action:@selector(displayCategorySelected:) forControlEvents:UIControlEventTouchDown];
UIBarButtonItem *labelStringCategoryBarItem = [[UIBarButtonItem alloc] initWithCustomView:displayButton];
//...
然后我可以在两个标签上分别设置文本或文本属性。 例如,将 1 个标签的部分子字符串设置为粗体:
const CGFloat fontSize = 13;
UIFont *boldFont = [UIFont boldSystemFontOfSize:fontSize];
UIFont *regularFont = [UIFont systemFontOfSize:fontSize];
//UIColor *foregroundColor = [UIColor whiteColor];
// Create the attributes
NSDictionary *attrs = [NSDictionary dictionaryWithObjectsAndKeys:
regularFont, NSFontAttributeName, nil];
NSDictionary *subAttrs = [NSDictionary dictionaryWithObjectsAndKeys:
boldFont, NSFontAttributeName, nil];
const NSRange range = NSMakeRange(iFrom,iTo - iFrom);
// Create the attributed string (text + attributes)
NSMutableAttributedString *attributedText =
[[NSMutableAttributedString alloc] initWithString:aText
attributes:attrs];
[attributedText setAttributes:subAttrs range:range];
// Set it in our UILabel and we are done!
[aLabel setAttributedText:attributedText];
希望这会有所帮助! 米克
【讨论】:
以上是关于如何创建带有两行文本且第一行文本大于第二行的 UIButton?的主要内容,如果未能解决你的问题,请参考以下文章