Почему моя игровая площадка падает на NSRange () - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь узнать о NSMutableAttributedString и NSAttributedString, поэтому я создал простую игровую площадку, чтобы попробовать некоторые вещи.Тем не менее, у меня есть пара проблем, которые я не могу выяснить даже после просмотра множества примеров SO (например, здесь и NSRange из Swift Range? в другом месте.

Проблема со свойством длины. Если я указываю длину как attribLabelText.length, это вызывает неперехваченное исключение. Если я задаю attribLabelText.length - 1, ошибки нет, но только буквы «Репор» имеют атрибуты, которые я устанавливаю:

enter image description here

import UIKit
import PlaygroundSupport

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

        let label = getLabel1(labelText: "Report")
        view.addSubview(label)
        self.view = view
    }
}

func getLabel1(labelText: String) -> UILabel {
    let label = UILabel()
    label.frame = CGRect(x: 150, y: 200, width: 200, height: 20)
    label.textColor = .black

    let attribLabelText: NSMutableAttributedString = NSMutableAttributedString(string: labelText)
    let attributes = [
        NSAttributedString.Key.foregroundColor : UIColor.gray.cgColor,
        NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 14)
        ] as [NSAttributedString.Key : Any]

    attribLabelText.addAttributes(attributes, range: NSRange(location: 0, length: attribLabelText.length)) <-- this causes an uncaught exception of type NSException

    label.attributedText = attribLabelText

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

У меня такое чувство, что это будет чем-то очевидным, но у меня нет идей, чтобы попробовать. Кто-нибудь может указатьчто я делаю не так?

1 Ответ

0 голосов
/ 13 ноября 2018

Вы должны передать UIColor для цвета переднего плана вместо CGColor.

UILabel, кажется, использует атрибут цвета переднего плана немного по-другому при рисовании строки в зависимости от того, охватывает ли атрибут весь диапазон строки или просто поддиапазон.

Версия, которую он использует, когда атрибут охватывает всю строку, работает только с UIColor, но версия, которую он использует, когда атрибут охватывает только подстроку, похоже, также работает с CGColor (хотя это поведение не задокументировано, поэтому не следует полагаться), что объясняет, почему добавление -1 к диапазону позволяет избежать исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...