Как добавить отступы к NSMutableAttributedString? - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть метка, которая использует NSMutableAttributedString для записи текста в виде:

enter image description here

Что я хочу сделать, это уменьшить верхний отступ звездочкитак что его середина равна даже слову «Кухня», как показано ниже:

enter image description here

Как добавить заполнение, используя NSMutableAttributedString?

Я знаю, что могу создать отдельную метку с одной звездочкой и использовать якоря с постоянной для центрирования, но я хочу посмотреть, как это возможно, используя NSMutableAttributedString

let cuisineLabel: UILabel = {
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false

    let attributedText = NSMutableAttributedString(string: "Cuisine ", attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 17), NSAttributedStringKey.foregroundColor: UIColor.lightGray])

    attributedText.append(NSAttributedString(string: "*", attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 24), NSAttributedStringKey.foregroundColor: UIColor.red]))

    label.attributedText = attributedText

    return label
}()

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Для этой цели используется атрибутный ключ baselineOffset.

let cuisine = NSMutableAttributedString(string: "Cuisine")
let asterisk = NSAttributedString(string: "*", attributes: [.baselineOffset: -3])
cuisine.append(asterisk)

enter image description here

Очевидно, у вас будетрассчитать смещение, используя размер шрифта остальной части текста.Вот почему я считаю, что использовать звездочку полной ширины (*) проще.

Результат со звездочкой полной ширины (возможно, вы хотите, чтобы размер шрифта был пропорцией размера шрифта остальной части строки):

enter image description here

0 голосов
/ 14 сентября 2018

Как указывает код Различия, вы можете сделать это с атрибутом baselineOffset.Для вашего случая должно работать значение -8:

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {
    override func loadView() {
        let view = UIView()
        view.backgroundColor = .white

        self.view = view

        let cuisineLabel: UILabel = {
            let label = UILabel()
            label.translatesAutoresizingMaskIntoConstraints = false
            label.frame = CGRect(x: 150, y: 200, width: 200, height: 20)
            let attributedText = NSMutableAttributedString(string: "Cuisine ", attributes: [
                NSAttributedStringKey.font: UIFont.systemFont(ofSize: 17),
                NSAttributedStringKey.foregroundColor: UIColor.lightGray])

            attributedText.append(NSAttributedString(string: "*", attributes: [
                NSAttributedStringKey.font: UIFont.systemFont(ofSize: 24),
                NSAttributedStringKey.baselineOffset: -8,
                NSAttributedStringKey.foregroundColor: UIColor.red]))

            label.attributedText = attributedText

            return label
        }()

        view.addSubview(cuisineLabel)

    }
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()

Если вы боретесь с ошибками смещения высоты строки из-за новой базовой линии и используете многострочную метку, попробуйтеигра с lineHeightMultiple:

let lineStyle = NSParagraphStyle()
lineStyle.lineHeightMultiple = 0.8

...

NSAttributedStringKey.paragraphStyle = style

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

...