Настройка вертикальной высоты символа в NSMutableAttributedString

У меня есть NSMutableAttributedString с + в первом символе, который я хочу поднять на 2 балла.

Я могу понять это: attributedAmountText.addAttribute(NSKernAttributeName, value: 2.0, range: NSRange(location: 0, length: 1))

Есть ли способ поднять этот первый символ? Что-то вроде вертикального керна

Редактировать:

Попытка attributedAmountText.addAttribute(NSBaselineOffsetAttributeName, value: 2.0, range: NSRange(location: 0, length: 1)) фактически перемещает саму базовую линию, а не текст вертикально от базовой линии, что кажется странным, поскольку документы говорят об обратном:

Значением этого атрибута является объект NSNumber, содержащий значение с плавающей запятой, указывающее смещение символа от базовой линии в пунктах. Значение по умолчанию — 0.


person Zack Shapiro    schedule 13.11.2017    source источник
comment
Взгляните на NSBaselineOffsetAttributeName   -  person DonMag    schedule 13.11.2017
comment
Я сделал. Этот атрибут, кажется, перемещает саму базовую линию, хотя в документах говорится об обратном.   -  person Zack Shapiro    schedule 13.11.2017


Ответы (1)


Хммм... Быстрый тест этого кода:

class ScalingViewController: UIViewController {

    @IBOutlet weak var theLabel: UILabel!

    @IBOutlet weak var theOtherLabel: UILabel!

    let now = Date()

    let labelA: UILabel = {
        let v = UILabel()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = UIColor.cyan
        return v
    }()

    let labelB: UILabel = {
        let v = UILabel()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = UIColor.yellow
        return v
    }()

    let labelC: UILabel = {
        let v = UILabel()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = UIColor.green
        return v
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(labelA)
        view.addSubview(labelB)
        view.addSubview(labelC)

        labelA.topAnchor.constraint(equalTo: view.topAnchor, constant: 40.0).isActive = true
        labelA.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8.0).isActive = true

        labelB.topAnchor.constraint(equalTo: labelA.topAnchor, constant: 0.0).isActive = true
        labelB.leadingAnchor.constraint(equalTo: labelA.trailingAnchor, constant: 8.0).isActive = true

        labelC.topAnchor.constraint(equalTo: labelA.topAnchor, constant: 0.0).isActive = true
        labelC.leadingAnchor.constraint(equalTo: labelB.trailingAnchor, constant: 8.0).isActive = true

        var aText = NSMutableAttributedString()
        let baseFont = UIFont.systemFont(ofSize: 30.0, weight: UIFontWeightLight)


        let testString = "Example"
        let tsLength = testString.characters.count


        // Font only
        aText = NSMutableAttributedString()
        aText.append(NSMutableAttributedString(string: testString, attributes: [NSFontAttributeName: baseFont]))

        labelA.attributedText = aText


        // Font + positive Baseline Offset of 1st character
        aText = NSMutableAttributedString()
        aText.append(NSMutableAttributedString(string: testString, attributes: [NSFontAttributeName: baseFont]))
        aText.addAttribute(NSBaselineOffsetAttributeName, value: 10.0, range: NSRange(location: 0, length: 1))

        labelB.attributedText = aText


        // Font + negative Baseline Offset of all but 1st character
        aText = NSMutableAttributedString()
        aText.append(NSMutableAttributedString(string: testString, attributes: [NSFontAttributeName: baseFont]))
        aText.addAttribute(NSBaselineOffsetAttributeName, value: -10.0, range: NSRange(location: 1, length: tsLength - 1))

        labelC.attributedText = aText

    }

}

Дал мне этот результат:

введите здесь описание изображения

Я полагаю, если бы я знал достаточно обо всех типографских аспектах атрибутов String, это имело бы смысл?

person DonMag    schedule 13.11.2017
comment
Спасибо ДонМаг. Текст простой, это + $5.50 или какая-то денежная сумма, и я хочу поднять + на 2 балла. - person Zack Shapiro; 13.11.2017
comment
Я думаю, что третий пример должен работать для того, что я собираюсь сделать. - person Zack Shapiro; 13.11.2017