UITabBarController background image is not set correctly - ios

I am trying to add UITabBarController programmatically. Everything is working fine but I am having two issues.
I am setting tabbar background image but it shows a different image which I dont even have in resources.
I am using this image as tabbar background image with a green line above :
But it shows another green line at bottom like this:
Here is the code I am using for this:
[self.myTabBarController.tabBar setBackgroundImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:#"tabbar.png" ofType:nil]]];
Another issue is, I am setting tabbar item images using this code:
MyViewController *myController = [[MyViewController alloc] initWithNibName:#"MyViewController" bundle:nil];
UINavigationController *myNavController = [[UINavigationController alloc] initWithRootViewController: myController];
[myNavController.tabBarItem initWithTitle:#"" image:[UIImage imageNamed:#"ads_inactive.png"] selectedImage:[UIImage imageNamed:#"ads_active.png"]];
Images are set but when i try to add title in MyViewController's viewDidLoad using this:
self.title = #"My Ads";
It shows same title on tabbar item too but I dont want any title there.
How I can fix this issue?
Thanks

The image size is less than the frame size of tab bar , so to cover to frame area background image show two times.
You can change it in two ways
1.)Change the image size that will be not the best option
2.) set the content insets of tabBar like (0,0,0,0)

Example:
UITabBar *tabBar = self.tabBarController.tabBar;
iterm0.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0);
UITabBarItem *iterm0 = [tabBar.items objectAtIndex:0];
[iterm0 setImage:[[UIImage imageNamed:#"tab1_normal"]
imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
[iterm0 setSelectedImage:[[UIImage imageNamed:#"tab1_selected"]
[(UITabBarItem *)[self.tabBarController.tabBar.items objectAtIndex:0] setTitle:#""];

Related

iOS: Why is custom tab bar item showing only as grey silhouette?

I am trying to set the tab bar icons of my UITabBarController with custom *.png files (one for the selected and one for unselected).
The images are all in non-interlaced png format and are named correctly (#2x, #3x, etc) residing in an *.imageset.
But the tab bar items are only shown as silhouettes like this:
I tried to set these images within Interface Builder, without success. Then I also tried to set them programmatically in the "loadView" function of MyTabBarController (which is extending UITabBarController) like this:
UIImage *selectedImage;
UIImage *unselectedImage;
// tab1
selectedImage = [UIImage imageNamed:#"cmdGamesActive"];
unselectedImage = [UIImage imageNamed:#"cmdGamesInactive"];
UITabBarItem *item1 = [self.tabBar.items objectAtIndex:0];
item1 = [item1 initWithTitle:#"Games" image:unselectedImage selectedImage:selectedImage];
// tab2
selectedImage = [UIImage imageNamed:#"cmdFriendsActive"];
unselectedImage = [UIImage imageNamed:#"cmdFriendsInactive"];
UITabBarItem *item2 = [self.tabBar.items objectAtIndex:1];
item2 = [item2 initWithTitle:#"Friends" image:unselectedImage selectedImage:selectedImage];
// tab3
selectedImage = [UIImage imageNamed:#"cmdTrophiesActive"];
unselectedImage = [UIImage imageNamed:#"cmdTrophiesInactive"];
UITabBarItem *item3 = [self.tabBar.items objectAtIndex:2];
item3 = [item3 initWithTitle:#"Trophies" image:unselectedImage selectedImage:selectedImage];
// tab4
selectedImage = [UIImage imageNamed:#"cmdSettingsActive"];
unselectedImage = [UIImage imageNamed:#"cmdSettingsInactive"];
UITabBarItem *item4 = [self.tabBar.items objectAtIndex:3];
item4 = [item4 initWithTitle:#"Settings" image:unselectedImage selectedImage:selectedImage];
... with the same result.
Any ideas how to solve this issue ?
According to this answer, I did something extra and kind of have answer for you here. I have my custom UITabBarController, which is linked with my UITabBarController in the StoryBoard file. So in order to remove the automatic tint provided by iOS when the TabBar is unselected, I ended up removing it in this manner. The images can be a vast variety of images but just in the way recommended here. Here it goes:
NSArray *navConArr = self.viewControllers;//self is custom UITabBarController
UINavigationController *naviOne = [navConArr objectAtIndex:0];//I have 3 different tabs, objectAtIndex:0 means the first tab navigation controller
UITabBarItem *naviBtn = naviOne.tabBarItem;
UIImage *image = [[UIImage imageNamed:#"iconNaviOne"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[naviBtn setSelectedImage:image];
[naviBtn setImage:image];
Thankfully, this works like a charm (:
I was facing a similar issue.
I had chosen few icons for my tabs such as 'mic', 'smiley' and 'settings'.
But the only things visible when I executed the program were grey and blue squares.
I modified my '.png' images to be transparent and now they are visible as they were intended to.
i.e, make sure the images used for tab icons do not have a background.
This should do the trick:
UITabBarItem *item0 = [_tabBar.items objectAtIndex:0];
item0.image = [[UIImage imageNamed:#"edit_profile_tab"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
item0.selectedImage = [[UIImage imageNamed:#"edit_profile_tab_active"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

Trouble showing UITabBarItem.image correct size in iOS 7

I have created a UITabBarcontroller programatically as follows:
UITabBarController *tbc = [[UITabBarController alloc] init];
[tbc setViewControllers:[NSArray arrayWithObjects:vc1,vc2,vc3,vc4,vc5,nil]];
which works ok. For each of the UIViewControllers, i want to set their tabbaritem.image to a specified image so i do this:
UITabBarItem *tbi1 = [[UITabBarItem alloc] initWithTitle:#"Search" image:
[UIImage imageNamed:#"tab_bar_search_50_50.png"] tag:0];
vc1.tabBarItem = tbi1;
and i have also tried
vc1.tabBarItem.image = [UIImage imageNamed:#"tab_bar_search_50_50.png"];
and
UITabBarItem *tbi1 = [[UITabBarItem alloc] initWithTitle:#"Search" image:
[UIImage imageNamed:#"tab_bar_search_50_50.png"] selectedImage:
[UIImage imageNamed:#"tab_bar_search_50_50.png"]];
The image size is 50x50 because according to apple-> https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/IconMatrix.html#//apple_ref/doc/uid/TP40006556-CH27-SW1
a tabbar icon of size "About 50 x 50 (maximum: 96 x 64) is ok". Yet when i run this in both the simulator and on a device (both retina screens) the image is way too large and hangs over the top of the the tab bar.
Ive even tried adding #2x as a suffix to the file name which doesnt work, but i thought since the app is building only for ios7 that these were no longer needed?
Im guessing the problem is either a bug in iOS7 or the issue lies with the image size, but i read in the documentation that if the image is too big it will be clipped to a certain bound?
I believe i have solved my problem. The problem was that when i added the #2x suffix, i also included this in the naming of the UIImage:
[UIImage imageNamed #"image#2x.png"];
But this needs to be:
[UIImage imageNamed #"image.png"];

iOS 7: UITabBarItem badge z-index

I'd like to show a UITabBarItem badge above the selectionIndicatorImage. There are 3 screenshots:
Screenshots
Light gray color is the selectionIndicatorImage. Yes, badge looks good. When I touch up inside at the cloud icon UITabBar become:
It's wrong.. I'd like to show badge above the selection image.
If there is no icon for UITabBar - it looks good.
How can I fix this issue?
Thanks in advance.
Edited
I add icons in the storyboard. For badge I've made the code:
UITabBarItem *cartTabBarItem = (UITabBarItem *)[self.tabBarController.tabBar.items objectAtIndex:3];
if ([[DataSourceWrapper getInstance] getFullCost] == 0)
cartTabBarItem.badgeValue = nil;
else
cartTabBarItem.badgeValue = [NSString stringWithFormat:#"%.0f тнг", [[DataSourceWrapper getInstance] getFullCost]];
For selectionIndicatorImage
[[UITabBar appearance] setSelectionIndicatorImage:[UIImage imageNamed:#"selected-tabbar-bg.png"]];
I know it's a bit tricky, but I think Apple didn't add TabBar subview in correct order.
anyway I've fixed it the following way
for (UIView *subview in marketTrackerAppDelegate.tabBarController.tabBar.subviews)
{
if ([marketTrackerAppDelegate.tabBarController.neededController.tabBarItem respondsToSelector:#selector(view)] &&
[marketTrackerAppDelegate.tabBarController.neededController.tabBarItem performSelector:#selector(view)] == subview)
{
[marketTrackerAppDelegate.tabBarController.tabBar bringSubviewToFront:subview];
break;
}
}
I had the same issue. You can fix it with code that #dollar8 suggested or change order of UITabBarItems creation.
I have 4th tab with badge and SelectionIndicatorImage of 5th tab overlay badge of 4th tab, so first I set 5th tab:
UIImage *item5image = [UIImage imageNamed:#"profile_tabbar_item"];
UIImage *item5imageSel = [UIImage imageNamed:#"profile_tabbar_item_selected"];
item5image = [item5image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
item5imageSel = [item5imageSel imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
tab5.tabBarItem = [[UITabBarItem alloc] initWithTitle:#"" image:item5image selectedImage:item5imageSel];
and after set 4th tab:
UIImage *item4image = [UIImage imageNamed:#"messages_tabbar_item"];
UIImage *item4imageSel = [UIImage imageNamed:#"messages_tabbar_item_selected"];
item4image = [item4image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
item4imageSel = [item4imageSel imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
tab4.tabBarItem = [[UITabBarItem alloc] initWithTitle:#"" image:item4image selectedImage:item4imageSel];
And the order of subview will be right.
When I set 4th tab before 5th tab - the SelectionIndicatorImage overlay badge view.

Setting Image To The UITabbar in iphone?

I am new to ios development.
I created UITabbar programatically and set its delegate to self. All functions well. But my tabbar consists three tab bar items. I have given different images to the different tab bar items. But they all shows another image.
This is my code:
UITabbarItem item1 = [[UITabBarItem alloc] initWithTitle:#"item1" image:[UIImage imageNamed:#"imagename"] tag:1];
Try this :
UIImage *selectedImage0 = [UIImage imageNamed:#"tab-selected.png"];
UIImage *unselectedImage0 = [UIImage imageNamed:#"tab-unselected.png"];
[item1 setFinishedSelectedImage:selectedImage0 withFinishedUnselectedImage:unselectedImage0];

Setting the height of UITabBar

I've created a simple custom tabbar by setting the images of each item, as following:
UITabBar *tabBar = self.tabBarController.tabBar;
UITabBarItem *item0 = [tabBar.items objectAtIndex:0];
UITabBarItem *item1 = [tabBar.items objectAtIndex:1];
UITabBarItem *item2 = [tabBar.items objectAtIndex:2];
[item0 setFinishedSelectedImage:[UIImage imageNamed:#"activity_active.png"] withFinishedUnselectedImage:[UIImage imageNamed:#"activity.png"]];
[item1 setFinishedSelectedImage:[UIImage imageNamed:#"agenda_active.png"] withFinishedUnselectedImage:[UIImage imageNamed:#"agenda.png"]];
[item2 setFinishedSelectedImage:[UIImage imageNamed:#"settings_active.png"] withFinishedUnselectedImage:[UIImage imageNamed:#"settings.png"]];
While this works great, I noticed that there is a black blank space under my tabbar
My images are 44px in height, but I think I have to somehow change the height of my tabbar.
The tabBar itself is 49px, and it is rendered in black color behind your images (perhaps in [UITabBar layoutSubviews]). Then your images are rendered on top. The reason of the offset is because the images you supply are too large, UITabBar expects 30x30px icons, not a picture of the entire UITabBarItem.
Here's a few things to try:
Supply only a 30x30px icon, instead of the entire tab button
After you set your images on the tab item, try this:
[item setImageInsets:UIEdgeInsetsMake(6, 0, -6, 0)]; // play with insets until it renders correctly
Subclass UITabBar and override layoutSubviews to first call super, then reposition your image as you like. Not recommended, it might break in future iOS versions.
Use -
tabBar.frame=CGRectMake(x,y,w,h);
In this way you can set xCord, yCord, width and height.
Check this:
[self.tabBar setFrame:CGRectMake(self.tabBar.frame.origin.x, self.tabBar.frame.origin.y - 30, self.tabBar.frame.size.width, self.tabBar.frame.size.height + 30)];

Resources