如何在项目中为所有ImageView统一设置Kingfisher指示器类型?
当然可以实现全局统一配置啦!其实不用在AppDelegate里挨个处理ImageView,Kingfisher本身就提供了非常方便的全局设置能力,一步就能搞定所有ImageView的指示器配置:
方法一:利用Kingfisher全局默认选项(推荐)
在App启动初期(比如AppDelegate的application(_:didFinishLaunchingWithOptions:)方法中),设置Kingfisher的全局默认加载选项,这样所有通过Kingfisher加载图片的ImageView都会自动使用你指定的指示器类型,无需在每个页面重复设置。
代码示例:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 全局配置所有Kingfisher加载的ImageView默认使用activity指示器 KingfisherManager.shared.defaultOptions = [.indicatorType(.activity)] // 其他App启动配置... return true }
设置完成后,不管你在哪个视图控制器里调用imageView.kf.setImage(with: imageURL),这个ImageView都会自动显示activity指示器,完全不需要再单独写imageView.kf.indicatorType = .activity啦。
特殊场景覆盖全局配置
如果某个ImageView需要使用不同的指示器(比如不需要指示器),你仍然可以单独设置它的indicatorType来覆盖全局配置:
// 这个ImageView不显示指示器,覆盖全局设置 specialImageView.kf.indicatorType = .none
方法二:扩展UIImageView(备选方案)
如果你不想依赖Kingfisher的全局设置,也可以通过扩展UIImageView的方式,让所有ImageView在初始化时默认设置指示器类型。不过这种方式需要覆盖不同的初始化场景(xib/storyboard创建、代码创建),相对繁琐一些:
extension UIImageView { // 处理从xib/storyboard加载的ImageView override open func awakeFromNib() { super.awakeFromNib() kf.indicatorType = .activity } // 处理代码创建的ImageView convenience init(withDefaultIndicator: Bool = true) { self.init() if withDefaultIndicator { kf.indicatorType = .activity } } }
需要注意的是,代码创建ImageView时要调用这个便利初始化方法,才能生效;而xib/storyboard创建的会自动触发awakeFromNib。所以对比下来,第一种全局配置的方式更省心高效。
内容的提问来源于stack exchange,提问作者user3051673

