web-dev-qa-db-ja.com

タブバーボタンの色Swift 3?

In Swift 2ストーリーボードのユーザー定義ランタイム属性をtintColorのキーパスで使用して、タブバーアイテムのアイコンの色を変更しました。ただし、tintColorはSwift 3. Swift 3のタブバーコントローラーで、タブバーアイテムの選択した色を変更するにはどうすればよいですか?

ありがとう!

編集:添付のスクリーンショット

enter image description here

9
winston

使用する tabBarItem.setTitleTextAttributes個々のバーアイテムのテキストの色を変更します。
これを各タブのviewDidLoadメソッドに入れます。

self.tabBarItem.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.red()], for:.selected)

アイコンとテキストの色合いの色を一緒に変更するには、簡単な解決策は、各タブのviewWillAppearメソッドでtabBarの色合いの色を変更することです。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.tabBarController?.tabBar.tintColor = UIColor.red()
}

画像の色合いの色を変更する別の解決策は、UIImageの拡張機能を作成し、それを使用して、選択した画像をカスタムの色合いで変更することです。

extension UIImage {
    func tabBarImageWithCustomTint(tintColor: UIColor) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
        let context: CGContext = UIGraphicsGetCurrentContext()!

        context.translate(x: 0, y: self.size.height)
        context.scale(x: 1.0, y: -1.0)
        context.setBlendMode(CGBlendMode.normal)
        let rect: CGRect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)

        context.clipToMask(rect, mask: self.cgImage!)

        tintColor.setFill()
        context.fill(rect)

        var newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()

        newImage = newImage.withRenderingMode(UIImageRenderingMode.alwaysOriginal)
        return newImage
    }
}

選択した画像を変更するには、次のコードを使用します。

self.tabBarItem.selectedImage = self.tabBarItem.selectedImage?.tabBarImageWithCustomTint(tintColor: UIColor.red())
11
Sam_M

パーSwift 3としての最新のコードは

extension UIImage {

    func tabBarImageWithCustomTint(tintColor: UIColor) -> UIImage {

        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
        let context: CGContext = UIGraphicsGetCurrentContext()!

        context.translateBy(x: 0, y: self.size.height)
        context.scaleBy(x: 1.0, y: -1.0)
        context.setBlendMode(CGBlendMode.normal)
        let rect: CGRect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)

        context.clip(to: rect, mask: self.cgImage!)

        tintColor.setFill()
        context.fill(rect)

        var newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()

        newImage = newImage.withRenderingMode(UIImageRenderingMode.alwaysOriginal)
        return newImage
    }
}
0
Amit Majumdar