【问题标题】:change UITabBar.appearance().tintColor at runtime在运行时更改 UITabBar.appearance().tintColor
【发布时间】:2021-12-14 09:38:25
【问题描述】:

我想允许用户更改整个 App-Color。 但是每当我选择一种颜色时,它只会在应用程序重新启动后才会更改。

是否有任何选项可以在运行时更改颜色?

我已经设置了一个Button,具有这样的功能来创建一个ColorPicker

@IBAction func colorChange(_ sender: UIButton) {
        // Initializing Color Picker
        let picker = UIColorPickerViewController()

        // Setting the Initial Color of the Picker
        picker.selectedColor = UIColor(named: "MyGreen")!

        // Setting Delegate
        picker.delegate = self

        // Presenting the Color Picker
        self.present(picker, animated: true, completion: nil)
    }

当用户选择一种颜色时,我会在这个函数中进行更改

func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) {
        defaults.set(viewController.selectedColor, forKey: "myColor")
        UITabBar.appearance().tintColor = viewController.selectedColor
    }

为了在启动时更改颜色,我在 AppDelegate 中实现了这一点

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        var myColor = defaults.color(forKey: "myColor")
        if  myColor == nil {
            myColor = UIColor(named: "MyGreen")
        }
        UITabBar.appearance().tintColor = myColor
        
        return true
    }

【问题讨论】:

  • 这里引用了苹果文档“iOS 在视图进入窗口时应用外观更改,它不会更改已经在窗口中的视图的外观。要更改视图的外观当前在一个窗口中,从视图层次结构中删除该视图,然后将其放回原处。”希望这会帮助你链接:developer.apple.com/documentation/uikit/uiappearance
  • 感谢您来自 Apple Doc 的信息,不幸的是,我没有足够的经验来删除视图然后将其放回原处。你能给我一些代码吗? (如果这有帮助,我正在使用故事板)

标签: swift uitabbar color-picker


【解决方案1】:

您尝试过使用UITabBar.appearance().barTintColor 吗?

【讨论】:

  • 对作者的问题最好在 cmets 中提交。
  • 不是我用错了我想改的项目。它完美地改变了一切,但不幸的是,只有在我重新启动应用程序之后。
【解决方案2】:

有人给了我一篇文章来阅读如何做到这一点。 https://zamzam.io/protocol-oriented-themes-for-ios-apps/

我最终这样做了:

 func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) {
        defaults.set(viewController.selectedColor, forKey: "myColor")
        apply(for: UIApplication.shared, color: viewController.selectedColor)
    }

通过添加此功能

func apply(for application: UIApplication, color: UIColor) {
        UITabBar.appearance().tintColor = color
        application.windows.reload()
    }

还有这些扩展

public extension UIWindow {

    /// Unload all views and add back.
    /// Useful for applying `UIAppearance` changes to existing views.
    func reload() {
        subviews.forEach { view in
            view.removeFromSuperview()
            addSubview(view)
        }
    }
}

public extension Array where Element == UIWindow {
    
    /// Unload all views for each `UIWindow` and add back.
    /// Useful for applying `UIAppearance` changes to existing views.
    func reload() {
        forEach { $0.reload() }
    }
}

它好不好我不知道 - 但它对我有用。

【讨论】:

    猜你喜欢
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2021-02-12
    • 2015-04-10
    相关资源
    最近更新 更多