Добавьте дефисы на слове "разрыв" в UILabel
Как мне установить UILabel lineBreakMode, чтобы разбивать слова и добавлять дефисы к разбитым словам?
этикетка со сломанной
должен выглядеть так
6 ответов
Проработка ответа Мэтта здесь: /questions/28482002/orfograficheskij-perenos-slov-v-ios/28482006#28482006 это можно сделать с помощью NSAttributedString и NSParagraphStyle. Увидеть ниже:
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.hyphenationFactor = 1.0f;
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:titleString attributes:@{ NSParagraphStyleAttributeName : paragraphStyle }];
self.titleLabel.attributedText = attributedString;
Это приведет к разрыву метки в логических местах в середине слова с использованием дефисов. Это выглядит великолепно, и это довольно просто сделать. Это требует iOS 6.0, но я только попробовал это под 7.0.
Swift 4.0
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.hyphenationFactor = 1.0
let hyphenAttribute = [
NSAttributedStringKey.paragraphStyle : paragraphStyle,
] as [NSAttributedStringKey : Any]
let attributedString = NSMutableAttributedString(string: "Your String", attributes: hyphenAttribute)
self.yourLabel.attributedText = attributedString
Swift 3.0
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.hyphenationFactor = 1.0
let attributedString = NSMutableAttributedString(string: “Your String”, attributes: [NSParagraphStyleAttributeName:paragraphStyle])
self.yourLabel.attributedText = attributedString
Из раскадровки
Иногда важно добавить locale
ключ атрибута.
NSString *lorem = @"Lorem ipsum <et cetera>.";
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.hyphenationFactor = 1;
paragraph.alignment = NSTextAlignmentJustified;
paragraph.lineBreakMode = NSLineBreakByWordWrapping;
self.label.attributedText = [[NSAttributedString alloc] initWithString:lorem attributes:@{
NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleBody],
NSForegroundColorAttributeName: [UIColor darkGrayColor],
NSParagraphStyleAttributeName: paragraph,
@"locale": @"la", // Latin, use @"en-US" for American English, for example.
}];
Я не могу удалить это, как это было принято, но я ошибаюсь из сегодняшнего POV.
EARLIER UILabel не предлагал переносы слов.
СЕГОДНЯ это делает через NSAttributedString (ios6+)
Свифт 5
class AttributedStrings {
private func paragraphStyle(alignment: NSTextAlignment, hyphenate: Bool) -> NSMutableParagraphStyle {
let style = NSMutableParagraphStyle()
style.hyphenationFactor = hyphenate ? 0.1 : 0
style.alignment = alignment
return style
}
func string(_ string: String, font: UIFont, color: UIColor, alignment: NSTextAlignment = .left, hyphenate: Bool = true) -> NSAttributedString {
let attributes: [NSAttributedString.Key: Any] = [
NSAttributedString.Key.font: font,
NSAttributedString.Key.foregroundColor: color,
NSAttributedString.Key.paragraphStyle: paragraphStyle(alignment: alignment, hyphenate: hyphenate)
]
return NSAttributedString(string: string, attributes: attributes)
}
}
let attributedStrings = AttributedStrings()
let attributedString1 = attributedStrings.string("Hyphenate this", font: .boldSystemFont(ofSize: 24), color: .black)
let attributedString2 = attributedStrings.string("Don't hyphenate this", font: .boldSystemFont(ofSize: 24), color: .black, hyphenate: false)
let attributedString3 = attributedStrings.string("Center and hyphenate this", font: .boldSystemFont(ofSize: 24), color: .black, alignment: .center)
let label = UILabel()
label.attributedText = attributedString1
Поскольку мы не можем создать подкласс
NSAttributedString
, рассмотрите возможность создания класса поставщика, который сделает их для вас. Ключевое отличие от моего ответа - фактор переноса. Фактор переноса — это число с плавающей запятой между
0.0
а также . Фактор
1.0
всегда будет переносить слово, несмотря ни на что. Фактор
0.1
будет переносить слово только в том случае, если в следующей строке недостаточно места для его отображения без переноса. Но вы можете поиграть с коэффициентом, чтобы найти порог, который вам нравится.