web-dev-qa-db-ja.com

選択されたUITabBarアイコンと選択されていないUITabBarアイコンの元の画像の色を保持する

構造は次のとおりです。

ストーリーボードには、Tab Bar Controllerオブジェクトを含むTab Barがあります。このオブジェクトには、次のメソッドのみを持つカスタムクラスがあります。

- (void)awakeFromNib
{
  NSArray *imageNames = @[@"test1", @"test2", @"test3", @"test4", @"test5"];
    for (int i=0; i<5; i++) {
      UITabBarItem *item = [self.items objectAtIndex:i];
      NSString *imageName = [imageNames objectAtIndex:i];
      item.image = [[UIImage imageNamed:imageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
      item.selectedImage = [UIImage imageNamed:[imageName stringByAppendingString:@"-selected"]];
    }
}

選択したバージョンと選択していないバージョン(異なる色)の両方のタブバーアイコンを含むAsset Catalogを作成しました。

documentation for UIImageRenderingModeAlwaysOriginal言及テンプレートとして扱わずに、常に元の画像を描画します。元の画像の色を保持する必要があります。これは発生していないようで、 this 提案も機能しませんでした。

代わりに、選択した状態で、タブバーアイコンがデフォルトの青い色合いになります。

私が気づいたことの1つは、didFinishLaunchingWithOptionsAppDelegateで次のこと( ここ から取得)を実行すると、選択した色を設定できることです。私が望むタブバーアイコン:

[[UITabBar appearance] setTintColor:[UIColor purpleColor]];

setTintColorのドキュメントには次のように記載されています。

タブバーのタブバーアイテムに適用する色合いの色。 iOS 7.0以降、タブバーのタブバーアイテムに適用される色合いの色は、タブバー自体から始まり、ビュー階層の最初のデフォルト以外の色合いの色になります。

これは、タブバーアイコンの色(画像自体の元の色)に関係なく、選択した状態では常​​にtintColorの色になることを意味しますか?

それとも私は何か間違ったことをしている/何かを逃していますか?

IOS7.0および7.1でこの問題が発生しています。

18
Alex

完璧な質問、本当によく説明されています。

選択した画像にimageWithRenderingMode:UIImageRenderingModeAlwaysOriginalを設定していません。

selectedImageimageWithRenderingMode:UIImageRenderingModeAlwaysOriginalを追加するだけです。

  item.selectedImage = [[UIImage imageNamed:[imageName stringByAppendingString:@"-selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

この他をチェックしてください answer

24
Gabriel.Massana

画像アセットのプロパティに移動し、プロパティとしてレンダリングを「元の画像」に設定するだけです

enter image description here

そして、あなたは行ってもいいです!

30
Abdoelrhman

Swift

    for item in self.tabBar.items!{
        item.selectedImage = item.selectedImage?.withRenderingMode(.alwaysOriginal)
        item.image = item.image?.withRenderingMode(.alwaysOriginal)
    }
6

非選択画像を常に元のレンダリングに設定し、選択1を常にテンプレート)に設定しますrender私のためにトリックをしました。

iOS 1およびSwift 5.1のソリューション

let item = UITabBarItem(title: "item_title",
                        image: UIImage(named: "img")?.withRenderingMode(.alwaysOriginal),
                        selectedImage: UIImage(named:"img_selected")?.withRenderingMode(.alwaysTemplate))
2
Mikhail Vasilev