与 NSAttributedString 真的很接近吗?
Posted
技术标签:
【中文标题】与 NSAttributedString 真的很接近吗?【英文标题】:Really close lines with NSAttributedString? 【发布时间】:2013-10-24 00:35:18 【问题描述】:我想让按钮的两行文本非常靠近(小行间距)。我有以下代码:
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"50 WPM"];
NSMutableParagraphStyle *paragrapStyle = [[NSMutableParagraphStyle alloc] init];
paragrapStyle.alignment = NSTextAlignmentCenter;
paragrapStyle.lineSpacing = -10;
[string addAttribute:NSParagraphStyleAttributeName value:paragrapStyle range:NSMakeRange(0, string.length)];
UIFont *font1 = [UIFont systemFontOfSize:22.0];
[string addAttribute:NSFontAttributeName value:font1 range:NSMakeRange(0, string.length - 4)];
UIFont *font = [UIFont systemFontOfSize:15.0];
[string addAttribute:NSFontAttributeName value:font range:NSMakeRange(string.length - 3, 3)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(0, string.length)];
[self.button setAttributedTitle:string forState:UIControlStateNormal];
但由于行间距不能为负数,因此它不会像我希望的那样接近。它看起来像这样:
有什么办法可以拉近他们的距离?
【问题讨论】:
您是否尝试过调整段落样式的paragraphSpacing
和paragraphSpacingBefore
属性?
我尝试在paragraphStyle.lineSpacing = -10;
下将paragrapStyle
上的这些属性设置为0(以及-10 后记),但都没有任何明显的效果。
@DougSmith 您根据苹果文档使用负值作为行距。尝试类似 (0.0000001)。
【参考方案1】:
好吧,如果你有一个属性字符串,那么一切都应该是可能的。 :) 你只需要看更多。
- (void)setMinimumLineHeight:(CGFloat)aFloat
- (void)setMaximumLineHeight:(CGFloat)aFloat
试试
[paragraphStyle setLineSpacing:0.0f];
[paragraphStyle setMaximumLineHeight:7.0f];
你会意识到maximumLineHeight 不是maximumLineSpacing。 ^^
例如 setMaximumLineHeight:12];
【讨论】:
我的问题是文本被截断了。 如果关闭masksToBounds
或添加基线调整或平移变换会怎样?【参考方案2】:
这里是 Swift3 中支持负 lineSpacing 的一个小扩展
extension UILabel
func set(lineSpacing: CGFloat, textAlignment: NSTextAlignment = NSTextAlignment.center)
if let text = self.text
let paragraphStyle = NSMutableParagraphStyle()
if lineSpacing < 0
paragraphStyle.lineSpacing = 0
paragraphStyle.maximumLineHeight = self.font.pointSize + lineSpacing
else
paragraphStyle.lineSpacing = lineSpacing
let attrString = NSMutableAttributedString(string: text)
attrString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
self.attributedText = attrString
self.textAlignment = textAlignment
【讨论】:
太棒了。谢谢。【参考方案3】:我建议阅读 ios7 中引入的 TextKit。我没有太多的经验,但我知道它给你的文本归属提供了很多可能性。
【讨论】:
不幸的是,像这样简单的东西真的缺乏 TextKit 教程。我感到迷失在复杂的海洋中。 不幸的是,这是真的。 Ray Wenderlich 的教程很棒,也许你可以试试他的! raywenderlich.com/50151/text-kit-tutorial【参考方案4】:在 Swift 3 中,您可以通过以下方式实现:
let paragraph = NSMutableParagraphStyle()
paragraph.lineSpacing = 0
paragraph.maximumLineHeight = 20.
保持 lineSpacing = 0。您可以调整 maximumLineHeight 使其更接近或增加间距。
【讨论】:
【参考方案5】:如何子类化UIButton
,并将 2 个UILabels
添加到靠近在一起的按钮视图中。为标签创建属性并正确设置:
CustomButton *btn = [CustomButton new];
btn.textLine1 = @"Top";
btn.textLine2 = @"Bottom";
这样做的唯一问题是当状态改变时你需要自己处理文本颜色。
【讨论】:
以上是关于与 NSAttributedString 真的很接近吗?的主要内容,如果未能解决你的问题,请参考以下文章
NSAttributedString 在文本和背景之前和之后有填充
如何绘制围绕特定点旋转的 NSAttributedString?
使用 NSAttributedString 更改字符串的颜色和字体