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

猜你喜欢

转载自blog.csdn.net/mydo/article/details/81556548