Можно ли изменить интервал символов (дорожки) на текст UILabel с помощью Interface Builder? Если нет, есть ли способ сделать это программно на существующей UILabel, которая уже была создана с атрибутом текста?
Изменить межсимвольный интервал на UILabel в Интерфейсном Разработчике
Ответ 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.
Правка/дополнительная идея: чтобы сделать интервал еще более изменчивым, вы можете изменить размер шрифта промежуточных символов. (Спасибо @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
}
}
}
}
Ответ 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
Примечание. Это фактически межстрочный интервал (также называемый ведущий..) в самые старые (предварительно цифровые) (металл) между линиями, чтобы увеличить зазор между строками. Для расстояния между буквами, который называется кернинг.. здесь, как сделать кернинг 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
Если вы пытаетесь сделать это для своего экрана запуска, просто создайте образ текста в другом программном инструменте. Вы не можете локализовать экран запуска в любом случае, чтобы избежать любых хакерских подходов.