2015-09-28 2 views
10

Есть множество настроек для NSAttributedParagraphStyle, что я могу видеть в Interface Builder:Как настроить текстовый кернинг с помощью Interface Builder в Xcode 7?

Но ни один из них для текста кернинг. Есть ли способ настроить текстовый кернинг в интерфейсе интерфейса Xcode 7 для атрибутивного текста?

(! Пожалуйста, не отвечайте тем, как сделать это в коде - я уже знаю, как это сделать)

+0

ли вы когда-нибудь найти способ? Это кажется заметным в его отсутствие. – Dov

+0

@ Не знаю ... действительно! – brandonscript

ответ

5

Вы действительно можете сделать это без использования подкласса через расширение ,

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

Хотя это не будет фактически отображаться в интерфейсе строителя будет отображаться и работать при запуске приложения.

7

Создать подкласс UILabel называют его KerningLabel у него будет состоять из следующего кода:

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

Вынуть этикетку. Измените его в подклассу UILabel. Отрегулируйте кернинг по желанию. enter image description here

В 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

Очевидно, что это не родной вариант, а довольно гладкое решение! Ницца. – brandonscript

+0

Я ищу версию Objective-C этой же части кода! Я не знаю, как преобразовать это в ObjC –

+0

@KasunRandika См. [Здесь] (https://gist.github.com/bgayman/6c9d1b705b50782e5d19d25f688f6fd9) – beyowulf

0

Укороченный попытка:

@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 
    } 
    } 
} 
Смежные вопросы