iOS: formSheet modalPresentationStyle view controller size shrinked - ios

I'm presenting a view controller with modalPresentationStyle set to formSheet, then I noticed the size of the view controller displayed isn't the same as how it's designed, it looks like iOS tries to shrink it to be smaller.
The doc says:
In a horizontally regular environment, the view controller is sized so that its content area is smaller than the screen size and a dimming view is placed underneath the content.
It's not clear to me how the resizing is done (ie. "the view controller is sized so that..."), I have a button with left/right edge margin, which isn't preserved. Is this how iOS works? Do I need to set preferredContentSize if I want to force it to have certain size?
Thanks!

Related

Override horizontally compact environment behaviour for modalPresentationStyle of '.formSheet'

When presenting a UIViewController with modalPresentationStyle = .formSheet, Horizontally compact environment behaves same as UIModalPresentationStyle.fullScreen
According to Apple's Documentation
UIModalPresentationStyle.formSheet.
In a horizontally regular environment, the view controller is sized so that its content area is smaller than the screen size and a dimming view is placed underneath the content. If the device is in a landscape orientation and the keyboard is visible, the position of the view is adjusted upward so that the view remains visible. All uncovered areas are dimmed to prevent the user from interacting with them.
In a horizontally compact environment, this option behaves the same as UIModalPresentationStyle.fullScreen.
It looks like Apple Maps settings screen is presented with modalPresentationStyle = .formSheet but for Horizontally compact environment, it doesn't cover fullscreen but it covers only half the screen.
How can we override the behaviour for Horizontally Compact environment so that it covers only the half of the screen?

"Present as Popover" segues and view size

Can anyone point to any guidance/documentation on how items should be placed in a view controller that will be displayed as a popover so that the components are appropriately positioned with auto layout?
Specifically: I'm working in Xcode 8.3 with the new "Present as Popover" segue, with the new "universal" storyboards. I add a view controller and then a popover segue to that view controller. When it is displayed, I see that roughly the top-left quadrant of the view controller is displayed as a popover, but that no auto layout appears to be taking place as far as I can see to accommodate the slightly different sizes of an iPad popover vs "full screen" behaviour on the different sized iPhones -- so in effect, a slightly different section of the view controller is visible depending on the device.
I assume this isn't really how things are supposed to work, and the whole raison d'ĂȘtre of the universal popover segue is to appropriately fit things to the popover size via auto layout? So can anyone shed some light on what I'm doing wrong or how popups are supposed to work with respect to auto layout?
Something to watch for with popovers is that on devices like the iPad, the size class for the popover is not the same as the controller which raises it.
You will probably find that the size class goes from regular width to compact width when you use a popover on an iPad. If you have layout coded to regular width for your popover content, then it will not work in the popover.
The size of the popover itself comes from the content size properties for the controller presented. You can set this size explicitly in the attribute inspector for the view controller or in code. See: How to present popover properly in iOS 8
To make the elements display correctly on screen, change the size class control to Any-Any (near the layout toolbar at the bottom of the Interface Builder canvas) before adding elements in the Storyboard in the View Controller that will act as a popover.

"Freeform" size in IB - Storyboard

As I understand and tried, if I change the simulated size of the ViewController in the storyboard it will still stretch its main "view" property to the whole screen.
So my question is when and why should I change this "Freeform" property?
Whenever I needed to make some overlay, I just make the main "view" transparent and create another view on top of that with my content, then I present it I do it as a container.
As I see there is no need for it, And I couldn't find anywhere in Apple documentation about it.
This property is only for simulating a different size.
ViewControllers do not always have to be fullscreen containers, for example View Controller containment, or the new iOS 7 View Controller transitions may lead to a View Controller that's size covers some partial area of the screen.
You would use the 'freeform' mode to change the size in interface builder, so you can simulate what the end size would be, whilst you work with it.
This was answered in the Q UIViewController Freeform size issue: uncheck "Resize View From NIB" in your View Controller's Attributes Inspector and your freeform view controller's view will indeed be decoded at the size you designed in your storyboard.
You are not quite on the right track. If you use Freeform for the size of the view controller, you can specify the desired size of your controller.
Also it's really important how you use the controller, how you set the springs & struts or layout constraints. If you set the springs or constraints to stretch your controller's view to "match" the parent size then the view will be stretched, if not it will keep the size you mentioned but not in all cases. For example if you present the view controller modally and you specify a different explicit size in IB then the view will have this size.
Usually you use the freeform property when you add the view controller as a child to another view controller programatically and you really want to have that fixed size.
If you push the view controller or you present it as modal view controller (and you use the modal presentation styles) then there is no need to use freeform.
Also another use of the freeform property is to preview the actual size of your view controller when is presented as a modal view controller using existent presentation styles.
Another wrongly implementation that I seen before regarding the size of the view controller's view is to check the size in viewDidLoad. Always check the size in viewWillAppear|| viewDidAppear.

How to show an explicit size for a popover in storyboard

I have multiple popovers in my app and need each one of them to be exact sizes. When I set each view controller an explicit size, the explicit size doesn't show in storyboard, but it does in the simulator.
Select the view controller in the storyboard and set its Size pop-up menu in the Simulated Metrics section of its Attributes inspector to Freeform. Now you can adjust the size to match the size it will be when the app runs.
Do note, however, that the size of a view controller's view in the storyboard is completely unimportant. It has no effect on the app when it runs. The view controller's view is always resized to fit its surroundings when the app runs. The only thing that matters in this case the popoverContentSize or preferredContentSize - the storyboard is just a place to draw in. You should be using constraints in such a way that the fact that the view is resized when the app runs doesn't matter to you.

How do I resize a UINavigationController's contents when a UISplitViewController rotates to portrait

I have a UISplitViewController that uses a navigation controller for its master (left) pane. When it rotates to portrait, this navigation controller is represented within a UIPopoverController. I'm noticing that the UITableView that is being shown in the navigation controller's current view does not resize when the app rotates to portrait. Namely, I see the popover at full height (about 1024 pixels), but the table is black along the bottom, seemingly still about 700 pixels in height.
How do I adjust the navigation and/or table view height properly?
This question is old, but for future reference, the documented way of handling this is to set the contentSizeForViewInPopover property on the view controller. You can also use the popoverContentSize property of the popover controller. See the dev docs for details.

Resources