UIPickerView со строкой атрибутов - PullRequest
0 голосов
/ 24 сентября 2018

Согласно документации Apple, существует функция делегата UIPickerView, pickerView (_: attributeTitleForRow: forComponent :).Тем не менее, я пытался заставить это работать, но я, кажется, здесь что-то не так.Я надеюсь, что кто-нибудь может мне помочь.

Чтобы упростить задачу, у меня есть простая программа, которая представляет содержимое двух массивов в двух компонентах представления выбора.Программа представляет собой просто один контроллер вида и один вид выбора.Код представлен ей:

import UIKit

класс ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

var familyNames = [String]()
var fontName = ""
let firstArray = Array(0...99)
let secondArray = Array(0...99)
let fontCount = 0

@IBOutlet weak var samplePickerView: UIPickerView!
@IBOutlet weak var fontLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    familyNames = UIFont.familyNames.sorted()
    let fontNames = UIFont.fontNames(forFamilyName: familyNames[17])
    fontName = fontNames.first!

    samplePickerView.delegate = self
    samplePickerView.dataSource = self
}

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 2
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

    if component == 0 {
        return firstArray.count
    } else {
        return secondArray.count
    }
}

func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {

    var rowTitle = ""
    let font = UIFont(name: fontName, size: 18.0)
    let stringDictionary = [NSAttributedString.Key.font: font]

    switch component {
    case 0:
        rowTitle = String(format: "%03d", firstArray[row])
    case 1:
        rowTitle = String(format: "%03d", secondArray[row])
    default:
        break
    }

    let returnString = NSAttributedString(string: rowTitle, attributes: stringDictionary as [NSAttributedString.Key : Any])
    print(returnString)
    return returnString
}

}

В представлении средства выбора теперь должны отображаться заголовки в БрэдлиРука, так что легко определить, что сработало.К сожалению, представление выбора не представляет заголовки в указанной строке.Строка, возвращаемая методом делегата, является приписанной строкой, поэтому она должна работать.На фотографиях видно, что это не так.Что я делаю неправильно?enter image description here

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Не получив решения, я попросил DTS в Apple, чтобы понять, что я делаю неправильно.Видимо, я не делал ничего плохого, но метод "pickerView (_ pickerView: UIPickerView, attribuTTitleForRow, строка: Int, компонент forComponent: Int) -> NSAttributedString?"не позволяет вам так много манипулировать приписанной строкой.Ответ от Apple был следующим: «Делегированный атрибут UIPickerView'sTitleForRow не будет изменять атрибут шрифта, но будет работать для других атрибутов, таких как цвет шрифта».

К счастью, поскольку я хотел изменить размер шрифта и шрифт, существуетспособ получить другой шрифт и размер шрифта в UIPickerView.Решение, предоставленное Apple: «Если вы хотите использовать все атрибуты шрифта, доступные в NSAttributedString, используйте viewForRow и верните UILabel в качестве альтернативы.»

Код теперь выглядит следующим образом: var familyNames = String var fontName= "" let firstArray = Array (0 ... 99) let secondArray = Array (0 ... 99) let fontCount = 0

@IBOutlet weak var samplePickerView: UIPickerView!
@IBOutlet weak var fontLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    familyNames = UIFont.familyNames.sorted()
    let fontNames = UIFont.fontNames(forFamilyName: familyNames[17])
    fontName = fontNames.first!

    samplePickerView.delegate = self
    samplePickerView.dataSource = self
}

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 2
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

    if component == 0 {
        return firstArray.count
    } else {
        return secondArray.count
    }
}

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {

    var rowTitle = ""
    let pickerLabel = UILabel()

    pickerLabel.textColor = UIColor.blue

    switch component {
        case 0:
            rowTitle = String(format: "%03d", firstArray[row])
        case 1:
            rowTitle = String(format: "%03d", secondArray[row])
        default:
            break
    }

    pickerLabel.text = rowTitle
    pickerLabel.font = UIFont(name: fontName, size: 24.0)
    pickerLabel.textAlignment = .center

    return pickerLabel
}

И результат выглядит так: enter image description here Это - манипуляция, которую я хотел бы сделать с текстом в представлении выбора.

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

Вот проблема

familyNames = UIFont.familyNames.sorted()

Вы получаете имена семейств шрифтов , но UIFont инициализатор принимает имя шрифта в качестве параметра, а не его фамилия .Из Документация Apple :

familyNames

Имена семейства шрифтов соответствуют базовому имени шрифта, например Times New Roman.Вы можете передать возвращенные строки методу fontNames(forFamilyName:), чтобы получить список имен шрифтов, доступных для этого семейства. Затем вы можете использовать соответствующее имя шрифта для извлечения фактического объекта шрифта.

Итак, если вы хотите получить имена шрифтов для данного семейного имени, используйте следующий метод,Затем вы можете использовать их для создания шрифтов.

UIFont.fontNames(forFamilyName: String)

Кроме того, не открывайте имя своего семейства шрифтов с помощью магического номера индекса, например familyNames[17], это плохой подход.Вы можете выйти за пределы, и это приведет к падению вашего приложения.

Я бы сохранил имя своего шрифта в константе, например

let pickerFontName = "MyAwesomeFont"

// later in your program
let font = UIFont(name: pickerFontName, size: 18.0)
...