UILabel负线间距

max*_*hud 6 objective-c ios

我有一个UILabel,我想让行间距小于0(所以文本靠得更近而不是更远).我究竟做错了什么?

    UIFont* customFont = [UIFont fontWithName:@"BebasNeue" size:70];
    NSString * text = @"Their \nIdeas";

    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:text];
    NSMutableParagraphStyle *paragrahStyle = [[NSMutableParagraphStyle alloc] init];
    paragrahStyle.lineSpacing = -30;
    [attributedString addAttribute:NSParagraphStyleAttributeName value:paragrahStyle range:NSMakeRange(0, [text length])];

    UILabel *lbl1 = [[UILabel alloc] init];
    lbl1.frame = CGRectMake(120, 0, viewWidth, 300);
    lbl1.backgroundColor = [UIColor clearColor];
    lbl1.textColor = grayColor;
    lbl1.numberOfLines = 2;
    lbl1.attributedText = attributedString;
    lbl1.userInteractionEnabled = NO;
    lbl1.font = customFont;
    [view addSubview:lbl1];
    [lbl1 setTransform:CGAffineTransformMakeRotation(0.35)];
Run Code Online (Sandbox Code Playgroud)

Eri*_*hey 23

NSMutableAttributedString* attrString = [[NSMutableAttributedString alloc] initWithString:labelText];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
CGFloat minMaxLineHeight = (font.pointSize - font.ascender + font.capHeight);
NSNumber *offset = @(font.capHeight - font.ascender);
NSRange range = NSMakeRange(0, labelText.length);
[style setMinimumLineHeight:minMaxLineHeight];
[style setMaximumLineHeight:minMaxLineHeight];
if (isCentered) {
    [style setAlignment:NSTextAlignmentCenter];
}
[attrString addAttribute:NSParagraphStyleAttributeName
                   value:style
                   range:range];
[attrString addAttribute:NSBaselineOffsetAttributeName
                   value:offset
                   range:range];
Run Code Online (Sandbox Code Playgroud)

这应该使您在文本上接近零间距,并且可以安全地使用任何字体类型和大小.


Bar*_*a R 6

请参阅Apple setLineSpacing - NSMutableParagraphStyle中的以下文档,值不能为负数

setLineSpacing: 设置段落中行之间添加的点的距离aFloat.

 - (void)setLineSpacing:(CGFloat)aFloat
Run Code Online (Sandbox Code Playgroud)

讨论

该值必须是非负的.

还有与线条最小和最大高度相关的方法......可能将线条空间设置为0并修改高度可以帮助您达到您想要的效果 -


Chr*_*ell 6

Eric Murphey 的回答基础上,我用 Swift 4 语法创建了一个扩展。

extension UILabel{    
    public func zeroLineSpace(){
        let s = NSMutableAttributedString(string: self.text!)
        let style = NSMutableParagraphStyle()
        let lineHeight = self.font.pointSize - self.font.ascender + self.font.capHeight
        let offset = self.font.capHeight - self.font.ascender
        let range = NSMakeRange(0, self.text!.count)
        style.maximumLineHeight = lineHeight
        style.minimumLineHeight = lineHeight
        style.alignment = self.textAlignment
        s.addAttribute(.paragraphStyle, value: style, range: range)
        s.addAttribute(.baselineOffset, value: offset, range: range)
        self.attributedText = s
    }
}
Run Code Online (Sandbox Code Playgroud)

简单地这样称呼它

myUiLabel.zeroLineSpace()
Run Code Online (Sandbox Code Playgroud)

  • 帮了我很多忙!谢谢! (2认同)
  • 这效果很好,但对于 Xcode 11 和 iOS 13,这似乎不再有效。我在集合视图中使用它,当我滚动标签时,文本不会在标签本身内部居中。任何帮助都会很棒! (2认同)