We have an application with 6 to 8 screens which was developed by Swift 3.2 version. And I am using Size classes (Auto Resize),not using autolayouts for all devices its working fine.
But, Now, We want to make it compatible with iPhone X device.
While we testing app in iPhone X, there are lot of issues on top, bottom views and even centre of the screen in Subviews.
I have seen, few forums which were told, "Use adaptive Sage Guide" in Story board files of UI, and issue would be solved. But, Event I tried that, still lot of gaps and issues coming bottom and top while testing app with iPhone X.
So, how to make compatible with iPhone X with my existing code, do I need to change everything in programmatically for below iPhone X and iPhone X, or is there anything there?
Can anyone suggest me, how to proceed for this.
Note : We are using Xcode 9.2
It's not just an iPhone X thing, it's also an iOS 11 thing. iOS 11 introduces a brand new inset adjustment API that deprecates most (maybe all?) of what preceded it. And with iPhone X's physical design, even more attention to safe areas must be made.
So get used to writing these:
if #available(iOS 11.0, *) {
// new iOS 11 syntax
someView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
} else {
// pre-iOS 11 syntax
someView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true
}
the safeAreaLayoutGuide is now a property of the view itself and it's more intuitive, IMO. More examples of the new API syntax:
someView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
someView.widthAnchor.constraint(equalTo: view.safeAreaLayoutGuide.widthAnchor).isActive = true
someView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
And if you're interested in getting inset values:
if #available(iOS 11.0, *) {
someViewAnchor.constant = view.safeAreaInsets.bottom
} else {
someViewAnchor.constant = bottomLayoutGuide.length
}
If you’re using storyboards, you should open them now, go the file
inspector, then select the Use Safe Area Layout guide checkbox – that
will switch you over to the new system.
https://www.hackingwithswift.com/articles/12/how-to-update-your-app-design-for-iphone-x
After adding Safe Area Guides you need to do little changes in constraints attribute like those constraints which are using superview.top and superview.bottom of the screen after applying the Safe Guide the superview need to change to the Safe Area like in the picture below
Related
So I'm trying to update my app for the iPhone X (a little late to the game, I know), and I enabled safe area, and fixed (supposedly) all my constraints to match. It looks perfect on the iPhone X. But for some reason, on all other iPhones, it still accounts for the iPhone X's notch, despite Safe Area correctly displaying where the UI should start and end. I'm at a loss. None of the constraints in question are hard coded, I set them all to the "standard" value (or so I believe).
storyboard (first button is actually the talk bubble, which is just a static image, second is the paw print, which is an actual button)
messed up iPhone 8 (bubble and ui elements should be at very top and bottom)
Here's my storyboard file: https://ufile.io/35zvs
UPDATE: image for ercell0
You are using standard spacing for top and bottom for your Banner View with a required priority. try setting this to superView: 0 or safeArea: 0 and see if that corrects the issue for you.
The updated view:
Can you change ViewAs from iPhoneX to iPhone8, and attach an image?
Other iphones your are testing on are running iOS11 or older?
If running older versions, safe-area won't be able to help with the alignment. For pre iOS11, use the constraints you were using previously or Layout Anchors.
My old iOS app works well in all iPhone versions(Except iPhone X model). I run into iPhone X simulator and seeing some of the screens gets overlapped at bottom of iPhone X screen. My apps all uiviewcontrollers created programmatically, not designed by story board. So in all view controllers I used (self.view.frame) to find its frame size. In iPhoneX there is safe guard area to design in story board. But how do I calculate safe guard area in runtime. While searching google it gives some sample to find safe guard area which is support from iOS11.. But I want to run my app from ios9? I have lot of uiviewcontrollers in my project .. So can anyone tell me an easiest way to do this task?
One possible way to add a run-time fix for iPhone X layout issues to old (pre-storyboard manual layout) apps (with old pre-11 Deployment targets), is to add Objective C code similar to:
CGRect r0 = self.view.frame;
CGRect r1 = r0;
if (#available(iOS 11.0, *)) {
r1 = self.view.safeAreaLayoutGuide.layoutFrame;
}
if ( r1.size.height < (r0.size.height - 20.0) ) {
// fix top and bottom view overlap outside safe area here
}
inside each UIViewController's viewWillLayoutSubviews method.
The #available check will make this code safe to use under iOS versions prior to iOS 11.
I've been updating my app to so it can work in iOS 10, 11 and the new iPhone X. I don't use Storyboards, and I've noticed that when using the new safe area guides, everything works as expected on any device that runs iOS 11. However, in iOS 10, it seems that the safe area guides are not being converted to the previous layout guides.
Here's a simple example with just a view aligned to the top, left and right safe area margins:
This is what happens when using xib:
And with storyboard:
I have noticed that two people had similar enter link description here in enter link description here and in the Apple Forums but the solutions are hacky and are trying to fight the underlying framework. Is there any oficial solution to this?
For example: I have set in a storyboard scene a vertical space constraint from de bottom of a UIButton to the bottom of the superview with a constant of 20. When running in an iOS 8 device, this is correctly shown, but when running in an iOS 7 device, it looks like this constant becomes higher and the button is shown upper in the screen... I don't understand why this happens, since autolayout is supposed to be available since iOS 7.
Any help? I don`t know how to handle this.
Thanks in advance
One of new things in iOS 8 is the Layout Margin. Layout Margin is a new property available in UIView for iOS 8. So, any objects inherit from UIView will have this property. If you are developing the app for both iOS 7 and iOS 8, you should not use Layout Margin (or use layout margin in a smart way).
So, if you have any constraints related to layout margin and you didn’t do a proper check before launching the app on iOS 7 devices, the app might crash or the arrangement of the objects might be out of order.
Whenever you are trying to add new constraints from the storyboard in XCode 6, “Constrain to Margins” is ticked by default. The meaning of this selection is to add constraints with the new property in iOS 8.
If the deployment target of your app is iOS 7 and above and any of your constraints have this layout margin, the XCode will complain with the warning “Layout attributes relative to the layout margin on iOS prior to 8.0″.
If you are developing the app for both iOS 7 and 8, it is best to “Untick” the Constrain to Margins.
Reference: you should also check this great tutorial
I have created the new iOS project in xCode 5 with deployment target 6.0 and Apply Pin constraint [Bottom space to superview] to make AutoLayout applicable for iOS 7 as well iOS 6.0 with different devices but
When I choose option "View as : " : iOS 7.0 & later Button looks like following
then When I change option "View as : " : iOS 6.0 & earlier the button looks like following
How Do I manage constrait such a way that make applicable with iOS 6.0 & iOS 7.0 both ?
Thanks in advance !!
I had a similar issue in my story board, I searched a lot with no hope and ended up removing all constrains by:
Editor -> Resolve Auto-Layout Issues -> Clear all constraints in view controller
Then reordering again, this solved most of my issues.
First from Apple Transition Guide:
If business reasons require you to continue supporting iOS 6 or
earlier, you need to choose the most practical way to update the app
for iOS 7. The techniques you choose can differ, but the overall
advice remains the same: First, focus on redesigning the app for iOS
7. Then, bring the changes to the iOS 6 version as appropriate.
This means that you could face some issues in prior iOS versions, especially in layout and you need to re-layout your controls under iOS7 then test them under iOS6.
I'm developing an app that runs on both iOS 6 and iOS 7. Some of my buttons appear the same on both iOS 6 and iOS 7 and some appear to be vertically smaller on iOS 6 but normal on iOS 7. I looked and the difference appears to be that on the buttons which maintain their size, I am using a background image like so.
//...background button images are 33wx44h and 66wx88h. these correspond to the
// two name variations; <name>.png and <name>#2x.png. the former is used for
// standard resolution screens and the latter for retina screens.
// the UIEdgeInsetsMake is specifically set to 0, 16, 0, 16 (tp,lf,by,rt) so
// that we have no vertical stretching because Apple's preferred button size,
// vertically, is 44. horizontally, the button is 33w and we lock 16 from
// the left and 16 from the right to leave only a single vertical row of pixels
// to be stretched horozontally; which is the most efficient; processing wise.
UIEdgeInsets insets = UIEdgeInsetsMake( 00.0f,16.0f,00.0f,16.0f ); // tp,lf,bt,rt
UIIMage * btnImage = [[UIImage imageNamed: myImage ]
resizableImageWithCapInsets: insets];
[button setBackgroundImage: btnImage
forState: UIControlStateNormal];
I'm thinking that in my situation, I can put a background image into all of them, even if it is transparent, to maintain the same look.
Hope that's helpful.