Подтвердить что ты не робот

Изменить межсимвольный интервал на UILabel в Интерфейсном Разработчике

Можно ли изменить интервал символов (дорожки) на текст UILabel с помощью Interface Builder? Если нет, есть ли способ сделать это программно на существующей UILabel, которая уже была создана с атрибутом текста?

4b9b3361

Ответ 1

Закончено использовать это для получения существующего атрибутного текста и изменить для добавления интервала между символами:

let attributedString = discoveryTitle.attributedText as NSMutableAttributedString
attributedString.addAttribute(NSKernAttributeName, value: 1.0, range: NSMakeRange(0, attributedString.length))
discoveryTitle.attributedText = attributedString

Swift 3:

let attributedString = NSMutableAttributedString(string: discoveryTitle.text)
attributedString.addAttribute(NSKernAttributeName, value: CGFloat(1.0), range: NSRange(location: 0, length: attributedString.length))
discoveryTitle.attributedText = attributedString

Использование NSRange вместо NSMakeRange работает в Swift 3.

Ответ 2

Я знаю, что это не решение Interface Builder, но вы можете создать расширение UILabel а затем добавить интервал к любому UILabel вы хотите:

extension UILabel {
  func addCharacterSpacing(kernValue: Double = 1.15) {
    if let labelText = text, labelText.count > 0 {
      let attributedString = NSMutableAttributedString(string: labelText)
      attributedString.addAttribute(NSAttributedStringKey.kern, value: kernValue, range: NSRange(location: 0, length: attributedString.length - 1))
      attributedText = attributedString
    }
  }
}

Подумайте об изменении kernValue по умолчанию с 1.15 на что-то, что лучше работает с вашим дизайном.


При реализации всегда добавляйте межсимвольный интервал после установки значения текста:

myLabel.text = "We used to be so close"
myLabel.addCharacterSpacing()

Если вы планируете использовать разные интервалы в разных местах приложения, вы можете переопределить значение керна по умолчанию:

myLabelWithSpecialNeeds.addCharacterSpacing(kernValue: 1.3)

Ответ 3

Для полностью статичного текста, такого как заголовок представления или особенно launchScreen, вы можете вставить буквы, которые занимают небольшую часть ширины (например, символ 'l') с 0 opacity. В качестве альтернативы установите его цвет в качестве фона.

Я осознаю тот факт, что это не самое красивое решение, но это единственное решение, которое работает без написания какого-либо кода и выполняет свою работу - пока вы не сможете сделать это, указав атрибуты в XCode.

The resultHow to

Правка/дополнительная идея: чтобы сделать интервал еще более изменчивым, вы можете изменить размер шрифта промежуточных символов. (Спасибо @mohamede1945 за эту идею)

Ответ 4

Swift 3.2 и построитель интерфейса

extension UILabel {

    @IBInspectable
    var letterSpace: CGFloat {
        set {
            let attributedString: NSMutableAttributedString!
            if let currentAttrString = attributedText {
                attributedString = NSMutableAttributedString(attributedString: currentAttrString)
            }
            else {
                attributedString = NSMutableAttributedString(string: text ?? "")
                text = nil
            }

            attributedString.addAttribute(NSKernAttributeName,
                                           value: newValue,
                                           range: NSRange(location: 0, length: attributedString.length))

            attributedText = attributedString
        }

        get {
            if let currentLetterSpace = attributedText?.attribute(NSKernAttributeName, at: 0, effectiveRange: .none) as? CGFloat {
                return currentLetterSpace
            }
            else {
                return 0
            }
        }
    }
}

enter image description here

Ответ 5

попробуйте это!

создать класс CustomLabel

@interface CustomLabel : UILabel
@property (assign, nonatomic) CGFloat myLineSpacing;
@end


@implementation CustomLabel

- (void)setMyLineSpacing:(CGFloat)myLineSpacing {
    _myLineSpacing = myLineSpacing;
    self.text = self.text;
}

- (void)setText:(NSString *)text {
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.lineSpacing = _myLineSpacing;
    paragraphStyle.alignment = self.textAlignment;
    NSDictionary *attributes = @{NSParagraphStyleAttributeName: paragraphStyle};
    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text
                                                                         attributes:attributes];
    self.attributedText = attributedText;
}

и установить атрибут runtime

enter image description here

Примечание. Это фактически межстрочный интервал (также называемый ведущий..) в самые старые (предварительно цифровые) (металл) между линиями, чтобы увеличить зазор между строками. Для расстояния между буквами, который называется кернинг.. здесь, как сделать кернинг fooobar.com/questions/182036/...

Ответ 6

Почему вы все определяете NSMUTABLEAttributedString. Вам не нужно задавать диапазон явно. Это делает emojis иногда странным. Это мое решение, протестированное в Swift 4. 👍

extension UILabel {
    func addCharactersSpacing(_ value: CGFloat = 1.15) {
        if let textString = text {
            let attrs: [NSAttributedStringKey : Any] = [.kern: value]
            attributedText = NSAttributedString(string: textString, attributes: attrs)
        }
    }
}

Ответ 7

Вдохновленный ответом budidinho, это более гибкое решение, когда вы хотите изменить интервал между ярлыками с разными расстояниями между линиями. Вместо того, чтобы переходить внутрь функции и изменять значение, вы можете просто передать ее в качестве параметра.

extension UILabel {
  func setTextSpacingBy(value: Double) {
    if let textString = self.text {
      let attributedString = NSMutableAttributedString(string: textString)
      attributedString.addAttribute(NSKernAttributeName, value: value, range: NSRange(location: 0, length: attributedString.length - 1))
      attributedText = attributedString
    }
  }
}

Ответ 8

Удлинитель SWIFT 4 UILabel:

import UIKit

extension UILabel {

    @IBInspectable
    var letterSpace: CGFloat {
        set {
            let attributedString: NSMutableAttributedString!
            if let currentAttrString = attributedText {
                attributedString = NSMutableAttributedString(attributedString: currentAttrString)
            } else {
                attributedString = NSMutableAttributedString(string: text ?? "")
                text = nil
            } 
            attributedString.addAttribute(NSAttributedString.Key.kern,
                                          value: newValue,
                                          range: NSRange(location: 0, length: attributedString.length))
            attributedText = attributedString
        }

        get {
            if let currentLetterSpace = attributedText?.attribute(NSAttributedString.Key.kern, at: 0, effectiveRange: .none) as? CGFloat {
                return currentLetterSpace
            } else {
                return 0
            }
        }
    }
}

Ответ 9

Попробуй это. Это добавит интервал между символами, который вы назначаете, будь то простой текст или атрибутивный текст.

open class UHBCustomLabel : UILabel {
    @IBInspectable open var characterSpacing:CGFloat = 1 {
        didSet {
            updateWithSpacing()
        }

    }

    open override var text: String? {
        set {
            super.text = newValue
            updateWithSpacing()
        }
        get {
            return super.text
        }
    }
    open override var attributedText: NSAttributedString? {
        set {
            super.attributedText = newValue
            updateWithSpacing()     
        }
        get {
            return super.attributedText
        }
    }
    func updateWithSpacing() {
        let attributedString = self.attributedText == nil ? NSMutableAttributedString(string: self.text ?? "") : NSMutableAttributedString(attributedString: attributedText!)
        attributedString.addAttribute(NSKernAttributeName, value: self.characterSpacing, range: NSRange(location: 0, length: attributedString.length))
        super.attributedText = attributedString
    }
}

Ответ 10

Вот решение для Swift 4, которое не будет переопределять существующие текстовые атрибуты:

extension UILabel {

    /**
     Add kerning to a UILabel existing 'attributedText'
     - note: If 'UILabel.attributedText' has not been set, the 'UILabel.text'
     value will be returned from 'attributedText' by default
     - note: This method must be called each time 'UILabel.text' or
     'UILabel.attributedText' has been set
     - parameter kernValue: The value of the kerning to add
     */
    func addKern(_ kernValue: CGFloat) {
        guard let attributedText = attributedText,
            attributedText.string.count > 0,
            let fullRange = attributedText.string.range(of: attributedText.string) else {
                return
        }
        let updatedText = NSMutableAttributedString(attributedString: attributedText)
        updatedText.addAttributes([
            .kern: kernValue
            ], range: NSRange(fullRange, in: attributedText.string))
        self.attributedText = updatedText
    }
}

Ответ 11

Подход к программированию. (попробуйте, он должен работать для вас)
Примечание: я тестировал в Swift 4

let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40

// Line spacing attribute
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: style, range: NSRange(location: 0, length: stringValue.characters.count))

// Character spacing attribute
attrString.addAttribute(NSAttributedStringKey.kern, value: 2, range: NSMakeRange(0, attrString.length))

label.attributedText = attrString

Ответ 12

Вы можете использовать следующее расширение Swift 4 UILabel, которое учитывает как существующий приписанный текст, так и простой текст, чтобы не перекрывать существующие настройки:

import UIKit

extension UILabel {
    func addCharacterSpacing(_ kernValue: Double = 1.30) {
        guard let attributedString: NSMutableAttributedString = {
            if let text = self.text, !text.isEmpty {
                return NSMutableAttributedString(string: text)
            } else if let attributedText = self.attributedText {
                return NSMutableAttributedString(attributedString: attributedText)
            }
            return nil
            }() else { return}

        attributedString.addAttribute(
            NSAttributedString.Key.kern,
            value: kernValue,
            range: NSRange(location: 0, length: attributedString.length)
        )
        self.attributedText = attributedString
    }
}

Ответ 13

Если вы пытаетесь сделать это для своего экрана запуска, просто создайте образ текста в другом программном инструменте. Вы не можете локализовать экран запуска в любом случае, чтобы избежать любых хакерских подходов.