Swift4.1定制UITableView索引外观之一:索引字体
在这一系列博文中,本猫将会向大家介绍一下如何在UITableView索引的外观上做文章,添加一些不一样的赶脚.
在此篇博文中,我们探讨一下如何修改UITableView索引的字体.
一.找到索引视图
要想修改索引的字体,首先要找到索引视图,该视图不用想也知道是UITableView的子视图:
var sectionIndexView:UIView?{
//明确指定类型为AnyClass,否则编译器会有警告.
let tableViewIndexClass:AnyClass = NSClassFromString("UITableViewIndex")!
for view in tableView.subviews{
if view.isKind(of: tableViewIndexClass){
_sectionIndexView = view
return _sectionIndexView
}
}
return nil
}
如上所示,索引视图的类名为UITableViewIndex,通过一个简单的遍历就可以找到,这很容易.
二.获取索引视图的时机
光知道怎么获取视图是不行的!关键在于在什么时机获取它?
1.在viewWillAppear()中:不可以!此时sectionIndexView还未创建
2.在viewDidAppear()中:虽然此时已创建,但会有一个”生硬”的字体变化,体验不佳
我们选择在func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int)里面获取:
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
guard isIndexFontSeted == false else {return}
setTableViewIndexFont(UIFont.systemFont(ofSize: 15))
}
为了不至于重复设置字体,我添加了一个实例变量isIndexFontSeted,如果其被设置为true,表示字体已经设置过,没必要再设置了.
那么问题又来了,在哪里设置isIndexFontSeted变量呢?
当然是在setTableViewIndexFont()方法里.
三.修改索引视图的字体
首先,索引视图必须是要支持设置字体方法的,否则就GG了…因为索引视图类不在官方API文档里,那么怎么知道有这么一个方法呢???一种答案是:****!
不过这就扯远了,你就暂且相信本猫的人品:它绝对有这个方法! :)
接下来,我们就来尝试实现setTableViewIndexFont()方法:
///设置TableView索引的字体
func setTableViewIndexFont(_ font:UIFont){
if let siView = sectionIndexView{
let selector = Selector("setFont:")
if siView.responds(to: selector){
siView.perform(selector, with: font)
//光是用上一句修改字体还不够,还需要修改siView的宽度.
siView.bounds = CGRect(x: 0, y: 0, width: 50, height: siView.bounds.height)
isIndexFontSeted = true
}
}
}
上面代码,熟悉ObjC的人都会觉得用Swift这么一写,特别(第四声)扭!
是的,运行时动态测试一个对象拥有的能力是ObjC的拿手好戏,Swift不是不行,更不是没有(出自哪部电影台词?),只是有些勉强而已.
保险起见,不拼猫品,我们在调用setFont方法(严谨的说,这个只是font属性的setter器)前,还是要测试一下到底有没有!万一iOS 19里取消了该方法呢?这个谁都说不准.
下面就是实际效果:
大家可以看到左侧的索引字体大小变得大了一些,看起来不那么费劲了.
OK,这一篇就是这样了,下一篇中本猫将会向大家展示如何编写更人性化的功能:浮动索引放大器.