与 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];

但由于行间距不能为负数,因此它不会像我希望的那样接近。它看起来像这样:

有什么办法可以拉近他们的距离?

【问题讨论】:

您是否尝试过调整段落样式的paragraphSpacingparagraphSpacingBefore 属性? 我尝试在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 更改字符串的颜色和字体

用另一个 NSAttributedString 替换 NSAttributedString 的子字符串

ios: NSAttributedString 分配错误

使用 NSAttributedString 设置字体