欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Swift4.1定制UITableView索引外观之一:索引字体

程序员文章站 2022-03-11 17:46:11
...

在这一系列博文中,本猫将会向大家介绍一下如何在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里取消了该方法呢?这个谁都说不准.

下面就是实际效果:


Swift4.1定制UITableView索引外观之一:索引字体

大家可以看到左侧的索引字体大小变得大了一些,看起来不那么费劲了.

OK,这一篇就是这样了,下一篇中本猫将会向大家展示如何编写更人性化的功能:浮动索引放大器.