Проблемы с NSAttributedString и Button

nwar1994 спросил: 13 июня 2018 в 11:28 в: ios

Я пытаюсь обновить поле названия кнопки с помощью NSAttributedString. Поэтому я попытался установить присвоенный заголовок, но он не работает должным образом. Он не отображает правильные атрибуты, которые я поместил в NSAttributedString. Я пришел к выводу, что либо мой метод для инициализации NSAttributedString неверен, либо кнопка переопределяет цвет.

Я получаю исходное значение строки, но не с атрибутными свойствами.

p>

Card Struct

struct Card {
    private var shape : Shape = Shape.none
    private var color : Color = Color.none
    private var number : Number = Number.none
    private var shading : Shading = Shading.none
    //These attributes are not showing up
    private var strokeTextAttributes : [NSAttributedStringKey:Any] = [NSAttributedStringKey:Any]() 
    private var manipulatedValue : String = ""    init(shape : Shape, color : Color, number : Number, shading : Shading){
        self.shape = shape
        self.color = color
        self.number = number
        self.shading = shading
        //How many multiples of the shape should be on the card
        for _ in 1...number.rawValue{
            manipulatedValue.append(shape.rawValue)
        }
        //0 is the NSStringKey, 1 is the UIColor
        strokeTextAttributes[color.rawValue.0] = color.rawValue.1
    }    func rawValue() -> NSAttributedString{
        return NSAttributedString(string: manipulatedValue, attributes: strokeTextAttributes)
    }
}

Класс ViewController

class ViewController: UIViewController {
    private var game : Set = Set()    override func viewDidLoad() {
        super.viewDidLoad()        for index in 0...game.cardsInPlay.count-1{
            cardButtons[index].layer.borderWidth = 3.0
            cardButtons[index].layer.borderColor = UIColor.black.cgColor
            cardButtons[index].layer.cornerRadius = 8.0
            cardButtons[index].setAttributedTitle(game.cardsInPlay[index]!.rawValue(), for: UIControlState.normal)
        }
    }    @IBOutlet var cardButtons: [UIButton]!
}

Я пытался жестко кодировать значения в инициализаторе структуры Card , Но тот же самый случай повторится. Кнопка отображает правильную форму карты и номер, но не правильный цвет. Цвет будет цветом по умолчанию в инспекторе Main.Storyboard. Светло-синий. Проблема заключается либо в том, что словарь не работает, поэтому strokeTextAttributes не содержит ничего значимого, или UIButton делает что-то глупое.


1 ответ

Есть решение
Larme ответил: 14 июня 2018 в 09:18

Вы устанавливаете NSAttributedStringKey.strokeColor, но вы не устанавливаете NSAttributedStringKey.strokeWidth. Вот почему вы не получаете желаемого результата.
Если этого нет, я думаю (и это имеет смысл), то же самое при установке .strokeWidth на 0, что указано в документации "ничего не делать":

Указать 0 (по умолчанию) без дополнительных изменений

Я получил тот же результат, установив его на 0 или не установив его вообще.

Пример теста код:

let str = "Hello !"
let attributedString = NSMutableAttributedString.init(string: str,
                                                      attributes: [.font: UIFont.systemFont(ofSize: 40),
                                                                   .foregroundColor: UIColor.white])let label1 = UILabel(frame: CGRect(x: 30, y: 40, width: 200, height: 50))
label1.backgroundColor = .lightGray
label1.attributedText = attributedStringlet label2 = UILabel(frame: CGRect(x: 30, y: 95, width: 200, height: 50))
label2.backgroundColor = .lightGray
label2.attributedText = attributedStringlet label3 = UILabel(frame: CGRect(x: 30, y: 150, width: 200, height: 50))
label3.backgroundColor = .lightGray
label3.attributedText = attributedStringlet label4 = UILabel(frame: CGRect(x: 30, y: 205, width: 200, height: 50))
label4.backgroundColor = .lightGray
label4.attributedText = attributedStringattributedString.addAttributes([NSAttributedStringKey.strokeColor: UIColor.red],
                               range: NSRange.init(location: 0, length: attributedString.string.utf16.count))
label2.attributedText = attributedString
print("Only Stroke Color:\n\(attributedString)")attributedString.addAttributes([NSAttributedStringKey.strokeWidth: 0],
                               range: NSRange.init(location: 0, length: attributedString.string.utf16.count))
label3.attributedText = attributedString
print("Stroke Color + Width set to 0:\n\(attributedString)")attributedString.addAttributes([NSAttributedStringKey.strokeWidth: -4],
                               range: NSRange.init(location: 0, length: attributedString.string.utf16.count))
label4.attributedText = attributedString
print("Stroke Color + Width set to -4:\n\(attributedString)")self.view.addSubview(label1)
self.view.addSubview(label2)
self.view.addSubview(label3)
self.view.addSubview(label4)

Выход журнала:

$>Only Stroke Color:
Hello !{
    NSColor = "UIExtendedGrayColorSpace 1 1";
    NSFont = "<UICTFont: 0x7f8973e11120> font-family: \".SFUIDisplay\"; font-weight: normal; font-style: normal; font-size: 40.00pt";
    NSStrokeColor = "UIExtendedSRGBColorSpace 1 0 0 1";
}
$>Stroke Color + Width set to 0:
Hello !{
    NSColor = "UIExtendedGrayColorSpace 1 1";
    NSFont = "<UICTFont: 0x7f8973e11120> font-family: \".SFUIDisplay\"; font-weight: normal; font-style: normal; font-size: 40.00pt";
    NSStrokeColor = "UIExtendedSRGBColorSpace 1 0 0 1";
    NSStrokeWidth = 0;
}
$>Stroke Color + Width set to -4:
Hello !{
    NSColor = "UIExtendedGrayColorSpace 1 1";
    NSFont = "<UICTFont: 0x7f8973e11120> font-family: \".SFUIDisplay\"; font-weight: normal; font-style: normal; font-size: 40.00pt";
    NSStrokeColor = "UIExtendedSRGBColorSpace 1 0 0 1";
    NSStrokeWidth = "-4";
}

Рендеринг:

nwar1994 ответил: 14 июня 2018 в 12:24
Бро, ты легенда ... Я почесываю голову на 2 дня! Могу я спросить, как вы поняли это из журналов?
Larme ответил: 14 июня 2018 в 12:44
Я знаком с NSAttributedString. Некоторые из них нуждаются в двух настройках. Когда вы знаете, сколько вы можете изменить настройки, кажется нормальным, чтобы можно было установить ширину для штриха, а в вашем журнале этого не было, только цвет. Кроме того, логика похожа на myView.layer.borderColor и myView.layer.borderWidth.

Дополнительное видео по вопросу: Проблемы с NSAttributedString и Button

Swift Tutorial - Custom UIButton Class (Reusable)

Swift 4 c нуля: UIKit урок 15 - UIButton

UIButton Animation - Swift