UISearchBar MinimalStyle Selected Color - ios

My UISearchBar in my UISearchController is acting funny when I tap it.
There are three states to the look of the bar.
1: Untapped
2: Tapped
3: Tapped with Text
As you can see, the third one's color is off. Instead of being black like the others, it's tint color is white.
Here's the code chunk containing the setup of the UISearchController & UISearchBar
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:#"Main" bundle:[NSBundle mainBundle]];
UINavigationController *navController = (UINavigationController *)[storyboard instantiateViewControllerWithIdentifier:#"searchVC"];
self.theSearchController = [[UISearchController alloc] initWithSearchResultsController:navController];
self.theSearchController.searchResultsUpdater = self;
self.theSearchController.searchBar.placeholder = #"Search";
self.theSearchController.delegate = self;
self.theSearchController.dimsBackgroundDuringPresentation = YES;
self.theSearchController.searchBar.delegate = self;
self.theSearchController.hidesNavigationBarDuringPresentation = YES;
self.definesPresentationContext = YES;
[self.theSearchController.searchBar sizeToFit];
[self.theSearchController.searchBar setTintColor:[UIColor whiteColor]];
[self.theSearchController.searchBar setBarTintColor:[UIColor blackColor]];
[self.theSearchController.searchBar setSearchFieldBackgroundImage:[UIImage imageNamed:#"SearchBG.png"] forState:UIControlStateNormal];
[self.theSearchController.searchBar setBarStyle:UIBarStyleBlackTranslucent];
[self.theSearchController.searchBar setSearchBarStyle:UISearchBarStyleMinimal];
[self.tableView setTableHeaderView:self.theSearchController.searchBar];

I just stumbled upon the answer in my storyboard file.
The UINavigationController that the UISearchController was connected to of course had a UINavigationBar. When you tapped and inserted a letter, the UISearchBar blended into the UINavigationBar, inheriting it's color. Once I made the style of the UINavigationBar to Black, the UISearchBar inherited it and it worked.

Related

UIDocumentInteractionController presentPreviewAnimated navigation bar style is incorrect for ios15

I use the UIDocumentInteractionController to present an image full screen and since upgrading to xcode 13, iOS 15 devices have white and translucent navigation bars when doing [_documentInteractionController presentPreviewAnimated:YES];. All other navigation bars are fine.
This is what the delegate looks like
- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller
{
UINavigationController* navController = [self navigationController];
navController.navigationBar.tintColor = [UIColor primaryColor];
navController.navigationBar.barTintColor = [UIColor primaryColor];
navController.view.backgroundColor = [UIColor primaryColor];
return navController;
}
The closest I came to fixing the issue was doing this in the delegate
UINavigationBarAppearance *app = [UINavigationBarAppearance new];
[app configureWithOpaqueBackground];
app.backgroundColor = UIColor.redColor;
[[UINavigationBar appearance] setBarStyle: UIBarStyleBlack];
navController.navigationBar.standardAppearance = app;
navController.navigationBar.translucent = NO;
however the bar stays translucent. This is the result, the colour should be red.
Setting navController.navigationBar.translucent = NO; doesnt seem to make a difference.

UINavigationBar leftBarButtonItem position

I have an iOS project with UINavigationController.
When I pushviewcontroller with
animated = YES
[self.navigationController pushViewController:viewController animated:YES];
the top leftbarbuttonitem (with image) is well positioned.
But if I set pushviewcontroller with
animated = NO
[self.navigationController pushViewController:viewController animated:NO];
the top leftbarbuttonitem (with image) is not positioned exactly the same place with previous one. Does anyone have any idea?
SAMPLE CODE
- (void)addBackButtonWithoutAnimation {
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
UIImage *closeImage = [UIImage imageNamed:#"icon_back"];
UIBarButtonItem *closeBackButton = [[UIBarButtonItem alloc] initWithImage:closeImage style:UIBarButtonItemStylePlain target:self action:#selector(closeBackButtonwithoutAnimationDidClick)];
self.navigationItem.leftBarButtonItem = closeBackButton;
self.navigationItem.hidesBackButton = YES;}

UINavigationController issue - if i return to first view, i see the color of second view

I am creating UINavigationController and it's UIViewControllers like this. First with yellow color, second with blue color.
Then adding it to stack. Yellow is displayed for a while, then the second blue.
What's the problem - if i press the button in top bar to get back to previous Controller, i don't see yellow background but blue, thought the title of window is "One" which is correct.
Why is this happening? Thx
UIViewController *one = [[UIViewController alloc] init];
[one.view setBackgroundColor:[UIColor yellowColor]];
[one setTitle:#"One"];
UIViewController *two = [[UIViewController alloc] init];
[two.view setBackgroundColor:[UIColor blueColor]];
[two setTitle:#"Two"];
UINavigationController * navController = [[UINavigationController alloc] init];
[self.view addSubview:navController.view];
[navController pushViewController:one animated:YES];
[navController pushViewController:two animated:YES];
I figured out what's the reason.
Because navController was relased from the memory.

ABUnknownPersonVIewController and NavigationBarColor

I've converted an app from ios6 to ios7. The app sets the background color of the navigationbar in the following way.
[[UINavigationBar appearance] setBackgroundColor: [UIColor blueColor]];
This works fine almost everywhere. But when I use the ABUnknownPersonViewController and click "create new contact" or "add to existing contact" the header is white on white background.
Is there any way to change the navbar background color of this view?
The view is initiated like this
ABUnknownPersonViewController *picker = [[ABUnknownPersonViewController alloc] init];
picker.unknownPersonViewDelegate = self;
picker.displayedPerson = aContact;
picker.allowsAddingToAddressBook = YES;
picker.allowsActions = YES;
picker.alternateName = self.contact.fullName;
picker.title = self.contact.fullName;
[self.navigationController pushViewController:picker animated:YES];
The first view looks fine with the custom header/background color. It's when you click "add" or "create" that the header goes white.
Thanks
Johan
Try
[[UINavigationBar appearance] setBarTintColor: [UIColor blueColor]];
try like this....
ABUnknownPersonViewController *picker = [[ABUnknownPersonViewController alloc] init];
UINavigationController *newNavigationController = [[UINavigationController alloc] initWithRootViewController:picker];
// customise navigation bar of navigation controller
[self presentModalViewController:newNavigationController animated:YES];

UITabBar appearance setSelectionIndicatorImage does not work on first launch iOS7

I have a customised UITabBar and use the following code in the AppDelegate:
- (void)tabBarController:(MainUITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
[self customizeTabBar];
}
- (void)customizeTabBar {
NSLog(#"*******customizeTabBar*******");
UIImage *tabBackground = [[UIImage imageNamed:#"unselectedtab"]
resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
// Set background for all UITabBars
[[UITabBar appearance] setBackgroundImage:tabBackground];
// Set tint color for the images for all tabbars
[[UITabBar appearance] setSelectedImageTintColor:[UIColor whiteColor]];
// Set selectionIndicatorImage for all tabbars
[[UITabBar appearance] setSelectionIndicatorImage:[UIImage imageNamed:#"selectedtab"]];
}
- (void)tabBarController:(MainUITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed
{
NSLog(#"*******didEndCustomizingViewControllers*******");
}
This is all fine in iOS5+ but in 7 on first load the first TabBarItem the item indicator is white and the button seems to have been selected but the "selectedTab" image is not loaded.
When I press another tab the new tab is red and appears correctly - as does the first or any tab bar item selected after this - it only doesn't work on first launch.
customizeTabBar get called but the selected image does not appear on first launch.
didEndCustomizingViewControllers does not seem to get called at all.
This doesn't work in emulator or device on iOS7 - but does on iOS5, 6.
Any ideas?
Thanks in advance.
Setting the selection indicator image for the tab bar directly once again, apart from doing it via appearance, worked for me!
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
....
UITabBarController *tabBarContr = (UITabBarController *)self.window.rootViewController;
...
[[UITabBar appearance] setSelectionIndicatorImage:[UIImage imageNamed:#"tab_bar_selection_indicator.png"]];
// iOS7 hack: to make selectionIndicatorImage appear on the selected tab on the first app run
[[tabBarContr tabBar] setSelectionIndicatorImage:[UIImage imageNamed:#"tab_bar_selection_indicator.png"]];
return YES;
}
I am seeing this exact same issue. Here is my didFinishLaunching
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self applyStyleSheet];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
self.window.backgroundColor = [UIColor redColor];
self.window.tintColor = [UIColor whiteColor];
UITabBarController *tabBarController = [self setupTabBarController];
self.window.rootViewController = tabBarController;
[self.window makeKeyAndVisible];
return YES;
}
Here is how I setup the tab bar:
- (UITabBarController *)setupTabBarController
{
UITabBarController *tabBarController = [[UITabBarController alloc] init];
UINavigationController *nav1 = [[UINavigationController alloc] initWithRootViewController:[[FirstViewController alloc] init]];
UINavigationController *nav2 = [[UINavigationController alloc] initWithRootViewController:[[SecondViewController alloc] init]];
UINavigationController *nav3 = [[UINavigationController alloc] initWithRootViewController:[[ThirdViewController alloc] init]];
UINavigationController *nav4 = [[UINavigationController alloc] initWithRootViewController:[[FourthViewController alloc] init]];
UINavigationController *nav5 = [[UINavigationController alloc] initWithRootViewController:[[FifthViewController alloc] init]];
[tabBarController setViewControllers:#[nav1, nav2, nav3, nav4, nav5]];
return tabBarController;
}
And finally, this is the tab bar customization block:
- (void)applyStyleSheet
{
UITabBar *tabBar = [UITabBar appearance];
[tabBar setBackgroundImage:[UIImage imageWithColor:[UIColor redColor]]];
[tabBar setTintColor:[UIColor whiteColor]];
[tabBar setSelectionIndicatorImage:[UIImage imageNamed:#"tab-selected"]];
[tabBar setSelectedImageTintColor:[UIColor whiteColor]];
}
As stated, the "tab-selected" image is not loaded on the first tab. However, I added the following line after [self.window makeKeyAndVisible] so that my tab starts up with a different tab opened, and the "tab-selected" image does show up on this tab:
[tabBarController setSelectedIndex:1];
So here's my finalized didFinishLaunching with the subtle hack that makes it work :)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self applyStyleSheet];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
self.window.backgroundColor = [UIColor redColor];
self.window.tintColor = [UIColor whiteColor];
UITabBarController *tabBarController = [self setupTabBarController];
self.window.rootViewController = tabBarController;
[self.window makeKeyAndVisible];
[tabBarController setSelectedIndex:1];
[tabBarController setSelectedIndex:0];
return YES;
}
ok.
not the best of fixes but hey have to submit.
Remove the customisation code in the appdelegate and in the projects xib file (is an old project) on the TabBars attributes inspector (using xcode 5) - add the tab bars background and selection images.
This works for ios7 without the need for any of the customisation code in the appdelegate.
For pre iOS5 + 6 (this app only supports 5+) however we still need the code so I added a simple check for version and kept the code as is:
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
if(SYSTEM_VERSION_LESS_THAN(#"7.0"))
{
UIImage *tabBackground = [[UIImage imageNamed:#"unselectedtab"]
resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
// Set background for all UITabBars
[[UITabBar appearance] setBackgroundImage:tabBackground];
[[UINavigationBar appearance] setTintColor:[UIColor blackColor]];
// Set tint colour for the images for all tabbars
[[UITabBar appearance] setSelectedImageTintColor:[UIColor whiteColor]];
// Set selectionIndicatorImage for all tabbars
[[UITabBar appearance] setSelectionIndicatorImage:nil];
[[UITabBar appearance] setSelectionIndicatorImage:[UIImage imageNamed:#"selectedtab.png"]];
}
I think I also have had the same problem when doing my design for the new App in iOS 7!!
iOS 7 has been built more of the stuff different as we all were used to things different.
Here as I have understood we all were using StoryBoards, and were unable to integrate that Segues in our Code! :)
So I choose not to mess with the code, after I tried most of all the StackOverFlow Answers regarding this! :) Because, why you wanna do so, when you have given a Goody Good Interface Builder (IB) and Story Boarding Tool?
Question:
When we have set our Selected Tab Image, background image specially for the tab bar, it doesn't shows which tab is selected with the image we have set in our code...???
Solution
Following are the screenshots of my StoryBoard Settings I did to solve this problem!
Select your TabBarController from your via document outline panel:
Set your settings for the Tab Bar from the Utilities Panel:
Then your Program is set up to run! It now knows that first tab is selected when the App first shows the First Tab View and also which image should be shown for all the Tab Bar indicators when each of them are selected! :)
hope you all got a clue!!!
If I helped you I'm Happy!!!
But if I have wasted your Time I'm So Sorry!!! :(
But trust me, This worked me like a charm!!!
- (void)customizeTabBar {
UIImageView *customizeTabBar = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,320.0,50)];
customizeTabBar.image=[UIImage imageNamed:#"Tab_bar.png"];
firstTab = [[UIImageView alloc] initWithImage:[UIImage imageNamed:#"tab1.png"] highlightedImage:[UIImage imageNamed:#"tab11.png"]];
[firstTab setFrame:CGRectMake(8.0,01.0,90.0,49.0)];
[customizeTabBar addSubview: firstTab];
secondTab = [[UIImageView alloc] initWithImage:[UIImage imageNamed:#"tab2"] highlightedImage:[UIImage imageNamed:#"tab22"]];
[secondTab setFrame:CGRectMake(115.0,01.0,90.0,49.0)];
[customizeTabBar addSubview: secondTab];
thirdTab = [[UIImageView alloc] initWithImage:[UIImage imageNamed:#"tab3"] highlightedImage:[UIImage imageNamed:#"tab33"]];
[thirdTab setFrame:CGRectMake(223.0,01.0,90.0,49.0)];
[customizeTabBar addSubview: thirdTab];
self.tabBar.tag=10;
[self.tabBar addSubview:customizeTabBar];
}

Resources