Как настроить текстовый кернинг с помощью Interface Builder в Xcode 7?
Существует множество настроек для NSAttributedParagraphStyle
, которые я вижу в Interface Builder:
![vw2Pp.png]()
![UZjrZ.png]()
Но ни один из них не предназначен для текстового кернинга. Есть ли способ настроить текстовый кернинг в Xcode 7 Interface Builder для атрибутивного текста?
(Пожалуйста, не отвечайте, как это сделать в коде - я уже знаю, как это сделать!)
Ответы
Ответ 1
Фактически вы можете сделать это без использования подкласса через расширение.
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
}
}
}
![введите описание изображения здесь]()
Пока это не будет отображаться в построителе интерфейса, оно будет отображаться и работать при запуске вашего приложения.
Ответ 2
Создайте подкласс 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. Отрегулируйте кернинг по желанию. ![введите описание изображения здесь]()
В 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
Ответ 3
Укороченная попытка:
@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
}
}
}