根据Apple的文档,有一个名为PickerView(_:attributedTitleForRow:forComponent :)的UIPickerView委托函数。但是,我尝试使其工作,但似乎在这里做错了。我希望有人能帮助我。
为了使事情变得容易,我有一个简单的程序,在选择器视图的两个组件中显示两个数组的内容。该程序只是一个视图控制器和一个选择器视图。该代码向她显示:
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
}
}
现在,选择器视图应以Bradley Hand的形式显示标题,因此很容易发现其工作原理。 不幸的是,选择器视图未在属性字符串中显示标题。委托方法返回的字符串是属性字符串,因此应该可以使用。图片显示情况并非如此。我究竟做错了什么?
答案 0 :(得分:0)
这是问题
familyNames = UIFont.familyNames.sorted()
您获得字体系列的名称,但是UIFont
初始化程序将字体名称作为参数,而不是其系列名称。来自Apple Documentation:
姓氏
字体家族名称与字体的基本名称相对应,例如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)
答案 1 :(得分:0)
在没有解决方案之后,我向Apple要求DTS了解我做错了什么。显然,我没有做错任何事情,但是方法“ pickerView(_ pickerView:UIPickerView,attributedTitleForRow row:Int,forComponent component:Int)-> NSAttributedString?”不允许您对属性字符串进行太多操作。苹果公司的回答是:“ UIPickerView的attributedTitleForRow委托不会更改字体属性,但可以用于字体颜色等其他属性。”
幸运的是,由于我想更改字体大小和字体,因此有一种方法可以在UIPickerView中获得不同的字体和字体大小。 Apple提供的解决方案:“如果要使用NSAttributedString中可用的所有字体属性,请使用viewForRow并返回UILabel作为替代。”
代码现在看起来像这样: var familyNames =字符串 var fontName =“” 让firstArray = Array(0 ... 99) 让secondArray = Array(0 ... 99) 让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
}