49

アイコンはios 6では正常に表示されますが、ios 7では表示されません。viewControllerのviewDidLoadメソッドで選択状態を設定しています。ユーザーがタブ バー項目を選択すると、画像が消えます。これが私のコードです:

UITabBar *tabBar = self.tabBarController.tabBar;
if ([UITabBar instancesRespondToSelector:@selector(setSelectedImageTintColor:)]) {
    [self.tabBarController.tabBar setSelectedImageTintColor:[UIColor whiteColor]];
}
UITabBarItem *item0 = [tabBar.items objectAtIndex:0];
UITabBarItem *item1 = [tabBar.items objectAtIndex:1];
UITabBarItem *item2 = [tabBar.items objectAtIndex:2];
UITabBarItem *item3 = [tabBar.items objectAtIndex:3];
[item0 setTitle:@"Home"];
[item1 setTitle:@"Calendar"];
[item2 setTitle:@"News"];
[item3 setTitle:@"My Events"];
[item0 setFinishedSelectedImage:[UIImage imageNamed:@"homeIconSelected.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"home2.png"]];
[item1 setFinishedSelectedImage:[UIImage imageNamed:@"Calendar"] withFinishedUnselectedImage:[UIImage imageNamed:@"CalendarIconSelected"]];
[item2 setFinishedSelectedImage:[UIImage imageNamed:@"NewsIconSelected"] withFinishedUnselectedImage:[UIImage imageNamed:@"News"]];
[item3 setFinishedSelectedImage:[UIImage imageNamed:@"EventsIconSelected"] withFinishedUnselectedImage:[UIImage imageNamed:@"Events"]];
[item1 imageInsets];
[item2 imageInsets];
[item3 imageInsets];
4

20 に答える 20

55

バー アイテム イメージのレンダリング モードをオリジナルに設定すると、この問題を解決できます。これは、.xcassets 内のイメージを使用して実行できるため、多くのコードを記述する必要はありません。

最初のステップとして、バー アイテムの画像を A​​ssets.xcassets にドラッグ アンド ドロップします。

2 番目のステップで、バー アイテムの画像を選択し、[レンダリング形式] を [元の画像] に変更します。

ここに画像の説明を入力

ps: 通常、TabBarController のタブ バー項目はすべてストーリー ボードごとに設定して、多くのコードを記述しないようにしています。

ここに画像の説明を入力

于 2015-10-21T08:45:16.767 に答える
45

これらのコード行を

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
UITabBar *tabBar = tabBarController.tabBar;
UITabBarItem *tabBarItem1 = [tabBar.items objectAtIndex:0];
UITabBarItem *tabBarItem2 = [tabBar.items objectAtIndex:1];
UITabBarItem *tabBarItem3 = [tabBar.items objectAtIndex:2];
UITabBarItem *tabBarItem4 = [tabBar.items objectAtIndex:3];

tabBarItem1.selectedImage = [[UIImage imageNamed:@"selectimg"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem1.image = [[UIImage imageNamed:@"deselectimg"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem1.title = @"xxxx";

tabBarItem2.selectedImage = [[UIImage imageNamed:@"selectimg"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem2.image = [[UIImage imageNamed:@"deselectimg"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem2.title = @"xxxx";

tabBarItem3.selectedImage = [[UIImage imageNamed:@"selectimg"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem3.image = [[UIImage imageNamed:@"deselectimg"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem3.title = @"xxxx";

tabBarItem4.selectedImage = [[UIImage imageNamed:@"selectimg"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem4.image = [[UIImage imageNamed:@"deselectimg"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem4.title = @"xxxx";

return YES;
}

これは私にとってはうまくいきます...そして最高のものを願っています...

于 2013-09-23T06:35:12.287 に答える
16

この問題の解決に役立つ回答はありませんでした。主な理由は、私TabBarControllerが私のものではなかったことRootViewControllerです。

ストーリーボードに使用したソリューションで、クリックしただけで、次UITabButtonのランタイム属性を追加しましたselectedImage

に関連付けられたさまざまなビューごとに、UITabController.

于 2015-05-13T13:02:08.893 に答える
8

ストーリーボードを使用している場合は、Navigation Controller に "custom" という識別子を付ける必要があります。

それから :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Assign tab bar item with titles
    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
    UITabBar *tabBar = tabBarController.tabBar;
    UITabBarItem *tabBarItem1 = [tabBar.items objectAtIndex:0];
    UITabBarItem *tabBarItem2 = [tabBar.items objectAtIndex:1];
    UITabBarItem *tabBarItem3 = [tabBar.items objectAtIndex:2];

    (void)[tabBarItem1 initWithTitle:nil image:[UIImage imageNamed:@"home.png"] selectedImage:[UIImage imageNamed:@"home_selected.png"]];
    (void)[tabBarItem2 initWithTitle:nil image:[UIImage imageNamed:@"home.png"] selectedImage:[UIImage imageNamed:@"home_selected.png"]];
    (void)[tabBarItem3 initWithTitle:nil image:[UIImage imageNamed:@"home.png"] selectedImage:[UIImage imageNamed:@"home_selected.png"]];

    // Change the tab bar background
    UIImage* tabBarBackground = [UIImage imageNamed:@"tabbar.png"];
    [[UITabBar appearance] setBackgroundImage:tabBarBackground];



    return YES;
}

これは私にとってはうまくいきます。

于 2013-10-23T23:38:10.980 に答える
3

Xcode 6.0.1 (6A317) でも同じ問題がありました。Interface builder のバグのようです。ただし、selected imageインターフェイスビルダーで空のままにしviewDidLoadてから、挿入したビューコントローラーのそれぞれでそれを解決することができました。

[self.navigationController.tabBarItem setSelectedImage:[UIImage imageNamed:@"imagename-selected"]];

現在はうまく機能selectedImageし、グローバルティントマスクを表示しています。

于 2014-10-07T12:45:25.510 に答える
3

関数に次のように書く必要があります。

UIImage* tab_image = [UIImage imageNamed:@"tab_image.png"];
UIImage* tab_image_selected = [UIImage imageNamed:@"tab_image_selected.png"];

tab_image = [tab_image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
tab_image_selected = [tab_image_selected imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

self.tabBarItem.image = tab_image;
self.tabBarItem.selectedImage = tab_image_selected;

これが役立つことを願っています

于 2013-12-12T16:23:13.613 に答える
3

答えはどれもうまくいきませんでした-私はMonoTouchを使用していますが、選択した画像をその色で強調表示するTintColorプロパティを設定すると。UITabBarobj c では、setTintColor関数の場合があります。

于 2013-10-15T16:19:20.513 に答える
2

同様の問題がありました。ストーリーボードにタブ バーを作成し、インターフェイス ビルダー メニューからすべての画像を追加しましたが、コードには追加しませんでした。

私の修正は実際には簡単でした。IB の属性インスペクター ウィンドウの下で、「選択した画像」のタブ バー アイテム フィールドを空白にし、「画像」のバー アイテム フィールドに必要な画像を入力する必要があります。

Xcode 6.0.1 を実行しており、iOS 8.0.2 デバイスでテストしています。

于 2014-10-01T20:07:22.293 に答える
2

最初のビュー コントローラーの .h ファイルに、次を追加しました。@property (弱い、非アトミック) IBOutlet UITabBarItem *profileViewTabBarItem; @property (弱い、非アトミック) IBOutlet UITabBarItem *notificationViewTabBarItem;

(mapViewTabBarItem は、Ctrl キーを押しながら実際のタブ バー項目を .h ファイルの上部にあるプロパティ宣言のリストにドラッグすることでリンクされていることに注意してください)

次に、viewDidLoad 内の同じビュー コントローラーの .m ファイルに、次を追加します。

self.tabBarItem = [self.tabBarController.tabBar.items objectAtIndex:0];
_mapViewTabBarItem.selectedImage = [[UIImage imageNamed:@"@2x-map-icon-selected.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
self.tabBarItem.image = [[UIImage imageNamed:@"@2x-map-icon.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];

_profileViewTabBarItem = [self.tabBarController.tabBar.items objectAtIndex:1];
_profileViewTabBarItem.selectedImage = [[UIImage imageNamed:@"@2x-profile-icon-selected.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
_profileViewTabBarItem.image = [[UIImage imageNamed:@"@2x-profile-icon.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];

_notificationViewTabBarItem = [self.tabBarController.tabBar.items objectAtIndex:2];
_notificationViewTabBarItem.selectedImage = [[UIImage imageNamed:@"@2x-notifications-icon-selected.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
_notificationViewTabBarItem.image = [[UIImage imageNamed:@"@2x-notifications-icon.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
于 2014-06-23T07:05:26.603 に答える
1

以下のコードを使用して、iOS7 の画像の問題を修正します。

[[UITabBarItem alloc] initWithTitle:@"title" image:[[UIImage imageNamed:@"YOUR_IMAGE.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] selectedImage:[[UIImage imageNamed:@"YOUR_SEL_IMAGE.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
于 2013-12-17T13:00:24.157 に答える
0

他のすべての答えを試し、失敗したときに苦労した後、答えを見つけました。他の答えは、現在の迅速なバージョンでは機能しないようです。Swift 2.3 では、これでうまくいきます。それでも問題が解決しない場合は、次の方法を試してください。

tabBarItem.image = UIImage(named: "image_name")
searchVC.tabBarItem.selectedImage = UIImage(named:
     "image_name_when_selected")?.imageWithRenderingMode(.AlwaysOriginal)
于 2016-10-12T06:03:17.003 に答える
0

同じ問題がありました。しかし、StoryBoard を使用しているため、コード内の何も変更できませんでした。ストーリーボードで画像を空のままにしておくと、この障害が取り除かれました。ただし、タブのビューコントローラーのviewWillAppearメソッドにinitWithTitleを配置すると、奇妙な動作が発生しました。最初に選択した画像を取得するには追加のクリックが必要で、画像が最初以外のタブに表示されませんでした。

私にとってこれを修正するには、DidFinishLoadingWithOptions の AppDelegate に次のコードを追加しました (132206 と Amitabha に似ています)。

NSArray * vcs = [(UITabBarController*)self.window.rootViewController viewControllers];
UIViewController *tab0 = [[(UINavigationController*)[vcs objectAtIndex:0] viewControllers] objectAtIndex:0];
tab0.title = NSLocalizedString(@"Time", nil);
tab0.tabBarItem =  [[UITabBarItem alloc] initWithTitle:tab0.title image:[UIImage imageNamed:@"Recents.png"] selectedImage:[UIImage imageNamed:@"RecentsSolid.png"]];
UIViewController *tab1 = [[(UINavigationController*)[vcs objectAtIndex:1] viewControllers] objectAtIndex:0];
tab1.title = NSLocalizedString(@"Expense", nil);
tab1.tabBarItem = [[UITabBarItem alloc] initWithTitle:tab1.title image:[UIImage imageNamed:@"Euro.png"] selectedImage:[UIImage imageNamed:@"EuroSolid.png"]];
于 2013-11-20T10:19:53.240 に答える
0

これがSwift-Guys向けのSwiftソリューションです:)

class CustomTabBar: UITabBar {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        let btnNames = ["Title1", "Title2", "Title3", "Title4"]

        for (item, name) in zip(items!, btnNames) {
            item.image = UIImage(named: "bar\(name)Btn")?.imageWithRenderingMode(.AlwaysOriginal)
            item.selectedImage = UIImage(named: "bar\(name)SelectedBtn")?.imageWithRenderingMode(.AlwaysOriginal)
            item.title = name
            item.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.blackColor()], forState: .Normal)
            item.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.redColor()], forState: .Selected)
        }
    }

}

ここで正確に何が起こっているのですか:

  • btn タイトルの配列を作成し、それらに一致する画像ファイル名を考慮します
  • タブバー項目を For ループさせ、作成したばかりの btn titles 配列を作成します
  • 配列から barButtonItem のイメージとその selectedImage を設定します
  • 配列からタイトル テキストを設定する
  • 状態 .Normal および .Selected のタイトル テキストの色を設定します

アイテムのタイトルの色をデフォルトのように .Normal に灰色、.Selected に青色のままにしたくない場合は、テキストの色の部分を設定することが重要です。これは、タブ バー アイテムのカスタム イメージを検討する場合によくあることです。

于 2016-04-15T15:39:21.200 に答える
0

UIAppearance API を使用して、選択した画像と選択していない画像とタイトルを表示する Swift バージョン Appdelegate.m で、タブ ベース app.following がある場合は、次のコードをコピーします。4 つのタブ バーがあると仮定します。

let tabBarController: UITabBarController = (self.window!.rootViewController as! UITabBarController)

    let tabBar:UITabBar = tabBarController.tabBar

    let tabBarItem1:UITabBarItem = tabBar.items![0]
    let tabBarItem2:UITabBarItem = tabBar.items![1]
    let tabBarItem3:UITabBarItem = tabBar.items![2]
    let tabBarItem4:UITabBarItem = tabBar.items![3]

    tabBarItem1.title = "Home";
    tabBarItem2.title = "Maps";
    tabBarItem3.title = "My Plan";
    tabBarItem4.title = "Settings";

    tabBarItem1.selectedImage = UIImage(named: "home_selected.png")!
    tabBarItem2.selectedImage = UIImage(named: "maps_selected.png")!
    tabBarItem3.selectedImage = UIImage(named: "myplan_selected.png")!
    tabBarItem4.selectedImage = UIImage(named: "settings_selected.png")!

     tabBarItem1.image =  UIImage(named: "home.png")!
     tabBarItem2.image =  UIImage(named: "maps.png")!
     tabBarItem3.image =  UIImage(named: "myplan.png")!
     tabBarItem4.image =  UIImage(named: "settings.png")!


    let tabBarBackground: UIImage = UIImage(named: "tabbar.png")!
    UITabBar.appearance().backgroundImage = tabBarBackground
    UITabBar.appearance().selectionIndicatorImage = UIImage(named: "tabbar_selected.png")!


    UITabBarItem.appearance().setTitleTextAttributes([
        NSForegroundColorAttributeName : UIColor.whiteColor()
        ]
        , forState: .Normal)
    let titleHighlightedColor: UIColor = UIColor(red: 153 / 255.0, green: 192 / 255.0, blue: 48 / 255.0, alpha: 1.0)
    UITabBarItem.appearance().setTitleTextAttributes([
        NSForegroundColorAttributeName : titleHighlightedColor
        ]
        , forState: .Highlighted)
于 2016-08-16T11:28:03.723 に答える
0

UITabBar アイテムのカテゴリの簡単でクリーンなソリューションです。

カテゴリを作成し、Runtime Attribute を使用して、以下のようにカテゴリから参照するだけです。 選択した TabBarItem のランタイム属性を追加します カテゴリから参照して変更する

#import "UITabBarItem+CustomTabBar.h"

@implementation UITabBarItem (CustomTabBar)

-(void)setValue:(id)value forKey:(NSString *)key {
    if([key isEqualToString:@"tabtitle"]){
        if([value isEqualToString:@"contacts"]) {
            [self setSelectedImage:[[UIImage imageNamed:@"contacts-selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
        } else if([value isEqualToString:@"chat"]) {
            [self setSelectedImage:[[UIImage imageNamed:@"chat-selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
        } else if([value isEqualToString:@"groupchat"]) {
            [self setSelectedImage:[[UIImage imageNamed:@"groupchat-selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
        } else if([value isEqualToString:@"settings"]) {
            [self setSelectedImage:[[UIImage imageNamed:@"settings-selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
        }
    }
    [self setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"Roboto-Regular" size:12.0f], NSFontAttributeName, [UIColor grayColor], NSForegroundColorAttributeName, nil] forState:UIControlStateNormal];
}

@end
于 2015-07-10T04:02:57.470 に答える