2014-11-22 17 views
6

Pracuję nad nową aplikacją i mam pewne problemy, aby dostosować UITabBar i sprawić, by działał (projekt) świetnie w iPhone 5 i 6 przy użyciu @ 2x obraz.UITabBar i UITabBarItem z określonym obrazem @ 2x dla iPhone 5 i iPhone 6

W AppDelegate.m w sposobie didFinishLaunchingWithOptions, ustawić obrazy dla tła, poz wybrany:

//TABBAR 
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]; 
UITabBarItem *tabBarItem5 = [tabBar.items objectAtIndex:4]; 

[[UITabBar appearance] setBackgroundImage:[UIImage imageNamed:@"tab_bg"]]; 
[[UITabBar appearance] setSelectionIndicatorImage:[UIImage imageNamed:@"icone_home_selecionado"]]; 
[[UITabBar appearance] setShadowImage:[[UIImage alloc] init]]; 

a następnie w ten sam sposób dla każdej pozycji ustawić obraz i wstawka:

tabBarItem1.title = nil; 
tabBarItem1.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0); 
[tabBarItem1 setImage:[[UIImage imageNamed:@"icone_home_teste"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]]; 

tabBarItem2.title = nil; 
tabBarItem2.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0); 
[tabBarItem2 setImage:[[UIImage imageNamed:@"icone_home_teste"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]]; 

tabBarItem3.title = nil; 
tabBarItem3.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0); 
[tabBarItem3 setImage:[[UIImage imageNamed:@"icone_home_teste"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]]; 

tabBarItem4.title = nil; 
tabBarItem4.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0); 
[tabBarItem4 setImage:[[UIImage imageNamed:@"icone_home_teste"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]]; 

tabBarItem5.title = nil; 
tabBarItem5.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0); 
[tabBarItem5 setImage:[[UIImage imageNamed:@"icone_home_teste"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]]; 

Mój problem jest związany iPhone 5 i 6 szer stosując tę ​​samą @ 2x obraz, jak iPhone 5 ma 640 (320pts) oraz iPhone 6 ma 750px (375pts), więc decydują się stworzyć selectedIndicatorImage nazwie „ [email protected] "o szerokości rozmiar = 150px

Bo mam 5 UITabBarItem, więc 750/5 = 150px (każda pozycja)

[email protected] obrazu (150px x x 96 pikseli):

icone_home_selecionado@2x.png (150px x 96px)

To działa naprawdę świetnie, kiedy uruchom na iPhonie 6, jak widzisz: enter image description here

Ale kiedy przetestować go na iPhone 5, gdy element jest wybrany, obszar UITabBarItem jest rozszerzony o tę samą 150px (jak szerokość obrazu) inst ead of reduce to 128px (prawdopodobnie ma taki rozmiar, aby zmieścił się na iPhonie 5), jak widać: enter image description here

(zauważ różnicę szerokości od pierwszej pozycji do drugiej pozycji, ale zdarza się to wszystkim im, wydaje się, że wybrany obraz nakłada się na UITabBarItem)

Obraz My @ 2x ma 150 pikseli, ale ponieważ mam używać 2x obrazów dla iPhone'a 5 i 6, jak mogę obsłużyć ten przypadek, aby dopasować obraz do UITabBarItem? Wygląda na to, że zadziała tylko wtedy, gdy mam jeden obraz 150px (dla 6) i inny obraz 128px (dla 5)

Czy są jakieś rozwiązania wykorzystujące ten sam obraz 2x lub muszę kodować, aby zidentyfikować rozmiar ekranu i a następnie wybrać, który obraz?

+3

Zapytany na 22 listopada 14 i wciąż nie ma odpowiedzi ??? – myexec

+0

@Fernando Jakieś mocne rozwiązanie z tym? Mam również ten sam problem: http://stackoverflow.com/questions/30460648/remove-mask-from-deselected-tabs-uitabbaritem-swift/30462346#30462346 – Bonnke

+0

@Bonnke niestety nie mogłem znaleźć świetnego rozwiązania, więc daleko, moje obejście (wstyd) jest bardzo podobne do odpowiedzi poniżej, sprawdzanie rozmiaru ekranu, a następnie wybór odpowiedniego obrazu: -/ – Fernando

Odpowiedz

0

sam problem z:

UITabBar.appearance().backgroundImage = UIImage(named: "bg_bottom_menu") 

Ze względu na obrazie jest rozliczana przez 4 cali wyświetla go nie działa poprawnie w iPhone 6.

używam kodu wykonać, aby to naprawić:

if Utilities.isIphone5() { 
    UITabBar.appearance().backgroundImage = UIImage(named: "bg_bottom_menu_4_inches") 
} else { 
    UITabBar.appearance().backgroundImage = UIImage(named: "bg_bottom_menu") 
} 

W narzędzia::

class func isIphone5() -> Bool { 
    return isIphone() && UIScreen.mainScreen().bounds.size.height == 568.0 
} 

EDIT:

Dotychczasowe prace kod, ale najlepszym rozwiązaniem jest śledzić jeden.

Przejdź do pliku Images.xcssets -> Twój obraz -> Inspektor atrybutu -> Wybierz urządzenie w obszarze Urządzenia -> wybierz Retina 4-calowy i przeciągnij i upuść obraz 4-calowy.

Powiązane problemy