ios 6 and ios 7 incosistance in view - ios

as we know in iOS 7 the status bar overlaps with a view but not in iOS 6 .
I developed whole application for iOS7 and now I being asked to make iOS6 support for it
but it is just a mess.
as we see in this Overlaps the status bar on view iOS7 question there is solution for iOS 7 to be like iOS6
but can I make it opposite way ? and somehow make iOS 6 behave like iOS7 with status bars ?

You can't make iOS 6 status bar act like iOS 7 status bar they are completely different designs. iOS 7 uses a flat UI whilst iOS 6 doesn't. Have a read through the iOS 7 transition guide for a better understanding and how to handle the differences.
To be specific towards the Status bar here is the section of that document that tells you how to handle it.

Short Answer: No you can't.
iOS 6 SDK does not let you to control the status bar like iOS 7 does.
What you can do is adapt the size so it does not lose any structure in your actual layout
First you can define a constant to know when it is iOS 7 or not:
#define kIS_IOS_7 (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
then in your AppDelegate you can change the navigation bar appearence like this:
UIView *background = [[UIView alloc] init];
if (kIS_IOS_7) {
background.frame = CGRectMake(0, 0, 360, 64);
} else {
background.frame = CGRectMake(0, 0, 360, 44);
}
background.backgroundColor = [UIColor blackColor]; // choose your color or image
UIGraphicsBeginImageContext(background.frame.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[background.layer renderInContext:context];
UIImage *backgroundImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[[UINavigationBar appearance] setBackgroundImage:backgroundImage
forBarMetrics:UIBarMetricsDefault];

Related

Navigation controller background image repeat it self in ios 11 using xcode 9

I had tried following code to set background image of UINavigationBar.
It was working fine before Xcode 9 but in Xcode 9 image are not set properly.
UIImage *image = [UIImage imageNamed:#"headr_bg"];
[self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
Xcode 9 image 1
Xcode 9 image 2
[before Xcode 9]
may be its not perfect solution &
but i had old project in that i had fixed it by below code. Just updated navigation bar position and navigation view frame for ios version > 11.
CGRect navbarFrame = self.navigationController.navigationBar.frame;
CGRect navFrame = self.navigationController.view.frame;
navbarFrame.size.height = 44;
navFrame.origin.y = 20;
self.navigationController.navigationBar.frame = navbarFrame;
self.navigationController.view.frame = navFrame;
I had the same issue however I could not find a fix working with insets or with a layout based approach. Ultimately a quick work around was to create a secondary background image and pad the top of the original background with 20px with the previous color of your status bar (black in your case).
Then I simply added code to change the image depending if this is iOS 11+ like so:
NSString* navBarImg = #"navbar.png";
if (#available(iOS 11.0, *)) {
navBarImg = #"navbar_ios11.png";
}
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:navBarImg] forBarMetrics:UIBarMetricsDefault];
This may not work or may need tweaks depending if the status bar visibility is shown/hidden at some points. Hopefully this will help until a better approach is discovered.

iphone 6 banner messing up after adding iphone 6 launch screen

So in my app i have my launch screen/splash screen set for the 4, 4s, 5, and 6+....basically all the splash screens except for the one for the 6.
Everything looks great. background images for the toolbar are properly scaled and everything. however on the iphone 6 its status bar is black even though its set in the plist to white and i believe it has to do with the missing iphone splash screen.
So I add in the launch screen for the 6 to correct this right? Awesome it works! but now my background image for the 6 doesnt get scaled properly and its left at the iphone 5 #2x size with a repeated edge.
How do i correct this?
Heres the code im using to implement the background image:
-(void)viewWillAppear:(BOOL)animated{
UIToolbar *toolbar = [[UIToolbar alloc] init];
toolbar.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 64);
[toolbar setBackgroundImage:[UIImage imageNamed:#"Missions.png"] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];
[self.view addSubview:toolbar];
}
and here are my image names:
missions.png (320x64)
missions#2x.png (640x128)
missions#3x.png (1242x195)
Notice i dont really have an image for the iphone 6 (750xwhatever). thats because i dont see how i could fit it in the naming convention with how the code runs it. wish it were as easy as missions#2.5x.png.....
why don't you just paste this into your UIViewController subclass
-(UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
and go into your info.plist and add the key UIViewControllerBasedStatusBarAppearance and set it to YES.

Custom navbar sizing from iphone 5 to iphone 6

I have a custom tab bar that was optimized for the iphone 5.
UINavigationBar *myBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
[self.view addSubview:myBar];
When it on the iphone 6, part of it is cut off of course because it only goes to 320 pixels.
How do i fix this? Is there a way to check which iphone its being ran on, and then run the pixel specified code? I plan on putting a background image on this navbar later so it must be centered.
In general it is a bad idea to hard code dimensions like this. This will break if you rotate, or if viewed on a screen with a different size than the original iPhone screen.
Many of these controls have a default size that you can use to your advantage. Instead of handing it a frame, consider just modifying the frame it gives you:
UINavigationBar *myBar = [[UINavigationBar alloc] init];
CGRect navBarFrame = myBar.frame;
navBarFrame.size.height // returns the right size for the current OS
navBarFrame.size.width = self.view.frame.size.width;
myBar.frame = navBarFrame;
This type of defensive coding is helpful in keeping your app laid out properly under many conditions, including when you embed this control into a parent view controller, or viewed on tomorrows larger-screened iOS devices.
All this said, are you sure you don't want a UIToolbar? Typically you don't ever create your own UINavigationBar, as that class is just used in UINavigationController for you.
UINavigationBar *myBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 50)];
[self.view addSubview:myBar];
may be this help you.

Different positioning on iOS7 iPad Mini and iOS6 iPad 3

I have a simple placement of a UILabel in my app's code:
headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 5, 884, 68)];
headerLabel.font = [UIFont fontWithName:#"HoboStd" size:64];
headerLabel.textAlignment = UITextAlignmentCenter;
headerLabel.backgroundColor = [UIColor clearColor];
headerLabel.textColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:1.0f];
headerLabel.adjustsFontSizeToFitWidth = YES;
[self.view addSubview:gameSpeaks];
On an iOS6 iPad 3 the text is showing a little higher up on the screen than it is on the iOS 7 iPad Mini with the same code, same .xib and everything. Does anybody know if this is a result of iOS6 vs iOS7 or if it is a result of the different devices or some other issue I am not aware of?
I WANT to say that the iPad Mini was showing the text in the same position as the iPad 3 when I was testing with it on iOS6, and then I upgraded it to iOS7 and noticed this difference. If it is the OS version that is causing this issue - what is the preferred way for testing for OS version in code so that I can reposition the label as needed when running on an OS7 device vs OS6?
Thanks so much!
It's a result of iOS6 vs iOS7 given that the status bar is now part of the view.
In iOS7, everything will appear about 20 pixels farther up than it did in iOS6 and previous if you do not adjust them.
In iOS6 and previous, setting a UI element's y origin to 0 would put it at the very bottom edge of the status bar. In iOS7, a y origin of 0 will now put it at the very top edge of the screen, behind the (now transparent) status bar.
You can get the current version of a device using:
[[UIDevice currentDevice] systemVersion]

Bar translucency gone in iOS 7.0.3

Compare the two screenshots:
Done on iOS 7.0 simulator
And the one done on iOS 7.0.3 iPhone 4S:
Same code here and there and same stuff! Any idea why the translucency is gone on the real device?
I have this code to simulate it (I know it's probably awkward and not right but that's how it is):
topMenuView = [[UIView alloc] initWithFrame:CGRectMake(self.view.frame.origin.x, 0, self.view.frame.size.width, TOP_BAR_ORIG_HEIGHT)];
topMenuView.clipsToBounds = YES;
UIToolbar *topMenuViewBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, -4, self.view.frame.size.width, TOP_BAR_ORIG_HEIGHT + 4)];
topMenuViewBar.barStyle = UIBarStyleDefault;
topMenuViewBar.barTintColor = [BSFunctions getColorFromHex:#"1ea6ff"];
const CGFloat statusBarHeight = 20;
UIView *underlayView = [[UIView alloc] initWithFrame:CGRectMake(0, -statusBarHeight, topMenuViewBar.frame.size.width, topMenuViewBar.frame.size.height + statusBarHeight)];
[underlayView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
[underlayView setBackgroundColor:[BSFunctions getColorFromHex:#"1ea6ff"]];
[underlayView setAlpha:0.36f];
[topMenuViewBar insertSubview:underlayView atIndex:1];
UIView *underlayView2 = [[UIView alloc] initWithFrame:CGRectMake(0, -statusBarHeight, topMenuViewBar.frame.size.width, topMenuViewBar.frame.size.height + statusBarHeight)];
[underlayView2 setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
[underlayView2 setBackgroundColor:[BSFunctions getColorFromHex:#"0291ff"]];
[underlayView2 setAlpha:0.36f];
[topMenuViewBar insertSubview:underlayView2 atIndex:2];
[topMenuView addSubview:topMenuViewBar];
[self.view addSubview:topMenuView];
The main point is it used to work before on the device! But after iOS 7.0.3 came out it changed. I'm noticing the same behavior in Facebook and Fitocracy iOS apps.
UPDATE
On Xcode 5.0.1 with iOS 7.0.3 simulator we have this (which is different from the first image on iOS 7.0 simulator as you can see):
OK, so after having played around with the colours a bit more, I managed to get a similar sort of appearance with the blur!
Previously, I was setting a barTintColor on the navigation bar appearance which had the following values:
R:17
G:63
B:95
A:1
This was fine in iOS < 7.0.3, and the output color in the nav bar (with the blur effect) was actually:
R:62
G:89
B:109
Since iOS 7.0.3, the barTintColor seems to take into account the alpha value of the color we set. This meant that the nav bar was actually outputting a solid color 17,63,95, and there was no blur effect.
The key to getting the blur effect back is setting an alpha < 1 in the barTintColor.
After lots of guess work and trying different RGB values, I managed to get the exact same RGB output from the nav (and tab) bar, using the following RGBA:
R:4.5
G:61.6
B:98
A:0.65
It does not look like there's a magic ratio to apply to the previous color to obtain the new one.
Anyway I've actually rejected the binary that got approved this afternoon, and have re-submitted with these new values so that user's don't get an ugly app :)
Hope this helps.

Resources