2017-08-20 5 views
2

:私は意図的に通常大きすぎる画像を使用して、私のタブバーの中心部にタブバーに着色UIImageの周りにある色の境界線を描画し、私は私の目標の短い説明を開始します私の問題を理解するために

を(タブバーの背景色は白です)、タブバーの上端に重ねて表示されます(タブバーの背景色は白です)。 UITabBarItemのデフォルト色は明るい灰色です(明らかにUIColor.lightGrayでも.darkGrayもありません)。UITabBarItemの色を変更したいと思います(またはこれを考慮した画像が唯一のものです)。白にこのUITabBarItem)の見た私は、正常に動作し、次の拡張機能/機能を使用しました:画像の色合いの色とタブバーの背景色の両方として

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(rawValue: 1)!) 
     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 
    } 
} 

Link to question where I found this extension

は白ですに赤色のボーダーを追加して、今度は白いイメージに追加したいと考えています。

extension UIImage { 
    func roundedImageWithBorder(width: CGFloat, color: UIColor) -> UIImage? { 
     let square = CGSize(width: min(size.width, size.height) + width * 2, height: min(size.width, size.height) + width * 2) 
     let imageView = UIImageView(frame: CGRect(origin: CGPoint(x: 0, y: 0), size: square)) 
     imageView.contentMode = .center 
     imageView.image = self 
     imageView.layer.cornerRadius = square.width/2 
     imageView.layer.masksToBounds = true 
     imageView.layer.borderWidth = width 
     imageView.layer.borderColor = color.cgColor 
     UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, false, scale) 
     guard let context = UIGraphicsGetCurrentContext() else { return nil } 
     imageView.layer.render(in: context) 
     let result = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return result 
    } 
} 

私の問題:幸いにも、私は(それがUIImageとの国境の間に非常に小さなスペースを残しているので、私は、私はこの拡張子を持つ完全コンテンツではないだということを追加する必要がありますが)、この質問に答え、別のquestion on stackoverflowを見つけることができました私はこのような連続関数を使用する場合は、今ある...:

let tabRecordButton = UIImage(named: "circle").tabBarImageWithCustomTint(tintColor: .white).roundedImageWithBorder(width: 1, color: .red) 

...ではなく、さらにボーダー(国境が描かですがUITabBarItemの色合いの色は、このデフォルトのグレーに戻り、上述行きます赤い)。

私の質問:私は両方のことができる方法がありますか?つまり、画像の色を白にし、赤色を私のUITabBarに入れますか?

答えて

1

あなたはこの行を省略した場合、あなたのイメージがあなたのタブバーから色合いを取るだけでなく、あなたの第二延長にこの行result = result.withRenderingMode(UIImageRenderingMode.alwaysOriginal)を追加する必要があり、それはあなたのオリジナルの問題である

であなたのroundedImageWithBorder拡張メソッドの実装を置き換えますこの1

func roundedImageWithBorder(width: CGFloat, color: UIColor) -> UIImage? { 
     let square = CGSize(width: min(size.width, size.height) + width * 2, height: min(size.width, size.height) + width * 2) 
     let imageView = UIImageView(frame: CGRect(origin: CGPoint(x: 0, y: 0), size: square)) 
     imageView.contentMode = .center 
     imageView.image = self 
     imageView.layer.cornerRadius = square.width/2 
     imageView.layer.masksToBounds = true 
     imageView.layer.borderWidth = width 
     imageView.layer.borderColor = color.cgColor 
     UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, false, scale) 
     guard let context = UIGraphicsGetCurrentContext() else { return nil } 
     imageView.layer.render(in: context) 
     var result = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     result = result?.withRenderingMode(UIImageRenderingMode.alwaysOriginal) 
     return result 
    } 

テスト

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    self.tabBarItem.selectedImage = UIImage(named: "icono-menu")?.tabBarImageWithCustomTint(tintColor: UIColor.magenta).roundedImageWithBorder(width: 1, color: UIColor.blue) 
    self.tabBarController?.tabBar.tintColor = UIColor.red //note that the tintColor of the tabBar is red 
} 

結果

enter image description here

+1

は完璧な理にかなって!ありがとう、ありがとう! – Moritz

関連する問題