Я хочу изменить интервал между цифрами в UIKit
UILabel
, чтобы он был равен.
При стандартном расстоянии метка выглядит следующим образом:
Мне бы хотелось, чтобы это выглядело так:
Как это можно достичь?
Я хочу изменить интервал между цифрами в UIKit
UILabel
, чтобы он был равен.
При стандартном расстоянии метка выглядит следующим образом:
Мне бы хотелось, чтобы это выглядело так:
Как это можно достичь?
Вы можете использовать атрибут NSKernAttributeName
для приписанной строки:
UILabel *label = [UILabel new];
NSMutableAttributedString *text = [[NSMutableAttributedString alloc]
initWithString:@"127"];
// The value paramenter defines your spacing amount, and range is
// the range of characters in your string the spacing will apply to.
// Here we want it to apply to the whole string so we take it from 0 to text.length.
[text addAttribute:NSKernAttributeName
value:@-0.5
range:NSMakeRange(0, text.length)];
[label setAttributedText:text];
Самый простой способ - создать пользовательский класс UILabel и установить расстояние между буквами от Storyboard.
open class CustomLabel : UILabel {
@IBInspectable open var characterSpacing:CGFloat = 1 {
didSet {
let attributedString = NSMutableAttributedString(string: self.text!)
attributedString.addAttribute(NSKernAttributeName, value: self.characterSpacing, range: NSRange(location: 0, length: attributedString.length))
self.attributedText = attributedString
}
}
}
Вы можете использовать NSAttributedString и играть с атрибутом NSKernAttributeName. Значение по умолчанию для этого равно 0, поэтому вы хотите установить его на отрицательное число.
в Obj-C вы можете сделать что-то вроде этого:
NSMutableAttributedString* attrStr = [[NSMutableAttributedString alloc]initWithString: @"Test test test test "];
[attrStr addAttribute:NSKernAttributeName value:@(4.0) range:NSMakeRange(0, attrStr.length)];
label.attributedText = attrStr;
в Swift вы можете сделать что-то вроде этого:
let myTitle = "my title"
let titleLabel = UILabel()
let attributes: NSDictionary = [
NSFontAttributeName:UIFont(name: "FONT_NAME", size: TEXT_SIZE),
NSKernAttributeName:CGFloat(2.0)
]
let attributedTitle = NSAttributedString(string: myTitle, attributes:attributes as? [String : AnyObject])
titleLabel.attributedText = attributedTitle
Можно использовать имя NSKernAttributeName.
Но в поправке на другие ответы: Не применяйте к полной длине текста, но (text.length - 1).
Отрицательный или положительный интервал добавляется к письму, и это не требуется для последнего. Предположим, что вы добавили бы положительный интервал, который в конечном итоге достигнет интервала после последней буквы. Сцентрированная строка больше не будет центрирована. То же самое относится к отрицательному интервалу.
NSString *text = @"Sample Text";
UILabel *label = [UILabel new]
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString: text];
[attributedString addAttribute:NSKernAttributeName value:[NSNumber numberWithDouble:-1.0] range:NSMakeRange(0, text.length-1)];
[label setAttributedTitle:attributedString forState:UIControlStateNormal];
Используется для полной длины текста.
Я взял ответ от @J2K и перевел его в расширение Swift 4.2.
/// Set the text of the label but altering the kerning so that you can control the space between each characters.
///
/// - Parameters:
/// - text: New content of the label
/// - kerning: Set a value between 0 and 1 to lower the space between characters. Above 0, spacing will be increased. 0 disables kerning.
extension UILabel {
func set(text: String, withKerning kerning: CGFloat) {
let attributedString = NSMutableAttributedString(string: text)
// The value parameter defines your spacing amount, and range is
// the range of characters in your string the spacing will apply to.
// Here we want it to apply to the whole string so we take it from 0 to text.count.
attributedString.addAttribute(NSAttributedString.Key.kern, value: kerning, range: NSMakeRange(0, text.count))
attributedText = attributedString
}
}
Если вы хотите применить атрибут расстояния между буквами ко всем UILabels в Interface Builder без изменения чего-либо (для конкретного шрифта):
Swift 4:
/**
* Applies letter spacing to selected fonts in UILabels from IB.
*
* - author Alexander Volkov
* - version 1.0
*/
extension UILabel {
/// Applies letter spacing
open override func awakeFromNib() {
super.awakeFromNib()
applyLetterSpacing()
}
/// Applies letter spacing
///
/// - Parameter aDecoder: the decoder
/// - Returns: UILabel instance
open override func awakeAfter(using aDecoder: NSCoder) -> Any? {
let label = super.awakeAfter(using: aDecoder)
self.applyLetterSpacing()
return label
}
/// Applies letter spacing
func applyLetterSpacing() {
if font.fontName.contains("Oswald", caseSensitive: false) {
let characterSpacing: CGFloat = 1
let string = NSMutableAttributedString(string: self.text!)
string.addAttribute(.kern, value: characterSpacing, range: NSRange(location: 0, length: string.length - 1))
self.attributedText = string
}
}
}
NSString *myString = @"127";
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:myString];
float letterSpacing = -1.50f; // change spacing here
[attributedString addAttribute:NSKernAttributeName value:@(letterSpacing) range:NSMakeRange(0, [myString length])];
[myLabel setAttributedText:attributedString];
Также см. это для получения дополнительной информации и результатов: http://www.devsign.co/notes/tracking-and-character-spacing
щелкните ярлык и перейдите к инспектору атрибутов. Измените текст с равнины на атрибут. У вас будет несколько вариантов интервала. Надеюсь, это поможет.
Попробуй это. Это добавит интервал между символами, который вы назначаете, будь то простой текст или атрибутивный текст. fooobar.com/questions/251060/...
На быстрой реализации выглядит как
let text = "TIPS, ARTICLES & BEST OFFERS"
label.attributedText = NSAttributedString(string: text, attributes: [.kern: 3.12])