Добавьте дефисы на слове "разрыв" в 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+)

см.: Орфографический перенос слов в IOS 6.x

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

Свифт 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будет переносить слово только в том случае, если в следующей строке недостаточно места для его отображения без переноса. Но вы можете поиграть с коэффициентом, чтобы найти порог, который вам нравится.

Другие вопросы по тегам