2015-09-28 16 views
10

Ci sono una miriade di impostazioni per NSAttributedParagraphStyle che posso vedere in Interface Builder:Come si regola la crenatura del testo utilizzando Interface Builder in Xcode 7?

Ma nessuno di questi sono per la crenatura del testo. C'è un modo per regolare la crenatura del testo in Interface Builder di Xcode 7 per il testo attribuito?

(! Si prega di non rispondere con il modo di fare questo nel codice - so già come fare)

+0

Avete mai trovato un modo? Ciò sembra evidente in sua assenza. – Dov

+0

@Dov nope ... anzi! – brandonscript

risposta

5

Si può effettivamente fare questo senza l'uso di una sottoclasse tramite un'estensione .

import UIKit 

@IBDesignable 
extension UILabel { 
    @IBInspectable 
    public var kerning:CGFloat { 
     set{ 
      if let currentAttibutedText = self.attributedText { 
       let attribString = NSMutableAttributedString(attributedString: currentAttibutedText) 
       attribString.addAttributes([NSKernAttributeName:newValue], range:NSMakeRange(0, currentAttibutedText.length)) 
       self.attributedText = attribString 
      } 
     } get { 
      var kerning:CGFloat = 0 
      if let attributedText = self.attributedText { 
       attributedText.enumerateAttribute(NSKernAttributeName, 
                in: NSMakeRange(0, attributedText.length), 
                options: .init(rawValue: 0)) { (value, range, stop) in 
                kerning = value as? CGFloat ?? 0 
       } 
      } 
      return kerning 
     } 
    } 
} 

enter image description here

Anche se questo non sarà effettivamente visualizzato in costruttore di interfaccia verrà visualizzato e il lavoro quando si esegue la vostra applicazione.

7

Creare una sottoclasse di UILabel chiamano KerningLabel farla essere composto il seguente codice:

import UIKit 

@IBDesignable 
class KerningLabel: UILabel { 

    @IBInspectable var kerning: CGFloat = 0.0 { 
     didSet { 
      if attributedText?.length == nil { return } 

      let attrStr = NSMutableAttributedString(attributedString: attributedText!) 
      let range = NSMakeRange(0, attributedText!.length) 
      attrStr.addAttributes([NSAttributedStringKey.kern: kerning], range: range) 
      attributedText = attrStr 
     } 
    } 
} 

Trascinare un'etichetta. Passalo alla sottoclasse UILabel. Regola la crenatura come desiderato. enter image description here

In obj-c:

.h

IB_DESIGNABLE 
@interface KerningLabel : UILabel 

@property (nonatomic) IBInspectable CGFloat kerning; 

@end 

.m

@implementation KerningLabel 

- (void)setKerning:(CGFloat)kerning 
{ 
    _kerning = kerning; 
    if(self.attributedText) 
    { 
     NSMutableAttributedString *attribString = [[NSMutableAttributedString alloc]initWithAttributedString:self.attributedText]; 
     [attribString addAttribute:NSKernAttributeName value:@(kerning) range:NSMakeRange(0, self.attributedText.length)]; 
     self.attributedText = attribString; 
    } 
} 

@end

+0

Ovviamente non è un'opzione nativa, ma una soluzione carina! Bello. – brandonscript

+0

Sto cercando la versione Objective-C di questo stesso pezzo di codice! Non so come convertire questo in ObjC –

+0

@KasunRandika Vedi [qui] (https://gist.github.com/bgayman/6c9d1b705b50782e5d19d25f688f6fd9) – beyowulf

0

Un tentativo accorciata:

@IBDesignable class KerningLabel: UILabel { 


    @IBInspectable var kerning: CGFloat = 0.0 { 
    didSet { 
     let attrStr = NSMutableAttributedString(string: "Foobar") 
     attrStr.addAttributes([NSKernAttributeName: kerning], 
          range: NSMakeRange(0, attrStr.string.characters.count)) 
     attributedText = attrStr 
    } 
    } 
} 
Problemi correlati