2014-04-09 19 views
5

Ho un UILabel e voglio rendere l'interlinea inferiore a 0 (in modo che il testo si avvicini piuttosto che più lontano). Che cosa sto facendo di sbagliato?UILabel interlinea negativa

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)]; 
+0

Cosa fa apparire come con il codice qui? – erdekhayser

+0

Non hai davvero bisogno di un'etichetta qui, quindi quello che farei al tuo posto è creare un UIView personalizzato in cui disegno il testo da solo. In questo modo, puoi mettere le linee dove preferisci. – matt

+0

@matt Stavo per suggerire la stessa cosa. CoreText è probabilmente la strada da percorrere qui. – Fogmeister

risposta

3

Si prega di consultare la seguente documentazione da Apple setLineSpacing - NSMutableParagraphStyle, valore non deve essere negativo

setLineSpacing: imposta la distanza in punti aggiunti tra le righe all'interno del paragrafo a aFloat.

- (void)setLineSpacing:(CGFloat)aFloat 

Discussione

Questo valore deve essere non negativo.

ci sono anche i metodi relativi al minimo e altezza massima per le linee ... probabilmente l'impostazione linea spazio a 0 e modificando l'altezza potrebbe aiutare a raggiungere l'effetto che si desidera-

+0

Beh, ho un font così rotto che in realtà ho bisogno di interlinea negativa ma non riesco a ottenerlo ... – Alper

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

Questo dovrebbe ottenere ti avvicini alla spaziatura zero sul testo e dovresti essere sicuro da usare con qualsiasi tipo di carattere e dimensione.

+0

Lifesaver! Finalmente qualcuno con la risposta che volevo! –

0

Partendo dalla risposta di Eric Kenny, ho creato un'estensione nella sintassi 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 
    } 
} 

Basta chiamarlo in questo modo

myUiLabel.zeroLineSpace()