2015-09-28 8 views
10

Es gibt eine Vielzahl von Einstellungen für NSAttributedParagraphStyle, die ich in Interface Builder sehen:Wie passt man Textkerning mit dem Interface Builder in Xcode 7 an?

Aber keiner von ihnen sind für Text Kerning. Gibt es eine Möglichkeit, das Text-Kerning in Xcode 7's Interface Builder für attributierten Text anzupassen?

(Bitte antworten Sie nicht mit, wie dies in Code zu tun - ich weiß schon, wie das zu tun)

+0

Haben Sie jemals einen Weg finden? Das scheint in seiner Abwesenheit auffällig. – Dov

+0

@Dov nein ... in der Tat! – brandonscript

Antwort

5

Sie können dies tatsächlich tun, ohne die Verwendung einer Unterklasse durch eine Erweiterung .

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

Während dies tatsächlich nicht in Interface Builder angezeigt wird es zeigen, und die Arbeit, wenn Sie Ihre Anwendung ausführen.

7

Erstellen einer Unterklasse von UILabel nennen es KerningLabel es aus folgendem Code bestehen haben:

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 
     } 
    } 
} 

Ziehen Sie ein Etikett heraus. Ändern Sie es in Ihre UILabel-Unterklasse. Passen Sie das Kerning wie gewünscht an. 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

Offensichtlich keine native Option, aber eine ziemlich glatte Lösung! Nett. – brandonscript

+0

Ich bin auf der Suche nach der Objective-C-Version des gleichen Stück Code! Ich weiß nicht, wie man dies in ObjC umwandeln kann –

+0

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

0

Eine verkürzte Versuch:

@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 
    } 
    } 
}