Why do StackViews not have intrinsic content size? - swift

I've always wondered why UIStackviews don't have an intrinsic content size? What is Apple's reasoning for not having them calculate the intrinsic content size like a normal View does?
I use stackViews in autoresizing tableView cells, and I usually have to custom subclass the StackView to make the intrinsic content size be calculated correctly.

It does has an intrinsic content size for distribution type .fill but this needs the subviews to have intrinsic content size like label and button , otherwise give them a height , also make sure that you hook constraints properly from top to bottom inside the cell

Related

Image view crush stackview constraints in swift?

I have some issue about my stackview contraints or imageview constraints ı dont know actually.Probably both . This is my stackview constraints stackViewConst and this my imageview constraints imaviewConstraints . When ı try to run ı expect everything looks awesome however unfortunately ı get this screen screen my stackview is lost.How ı can figure out this help me
Answer: add stackview height constraint
(or add stack view content resistence and content hugging priorities higher than those of your UIImageView)
Explanation:
Since you are using storyboard's Interface builder (IB) for creating constraints, as opposed to pure code. The IB uses feature of auto-constraints, which basically means that the IB can figure itself the layout and constraints based on what is displayed in your storyboard. The UIStackView is using some dynamic resizing (so that elements within stackview are properly layed out) and it is always good idea to give it size constraints, or at least size constraints to elements inside UIStackView , otherwise it might decide that every element has size of CGSize(height:0,width:0) You can also make priorities of your UIStackView higher than those of your UIImageView so that IB would prioritize the size of your stackview's constraints to those of your imageView

Have xib's size conform to contents?

I'm creating a xib for a custom view of mine. I want the main part of the view to be 44 pixels high, with a 4 pixel shadow below it, and have the width fit the contents of the view. Right now, I have my xib's Size set to Freeform.
But my problem now is that my xib is 500x500 pixels, while my view is meant to only stretch to the width of its contents and its height should only be 44 pixels.
How can I make it so that the xib's size changes according to the views inside it?
Freeform views won't automatically resize in the interface builder from the autolayout constraints of its content; they do at runtime if you set your constraints right.
If the size of your view in the IB mismatches your constraints' description, you'll get a conflicting constraints warning that won't affect the way the view is displayed during runtime. You can remove them by manually resizing the frame in the IB so all constraints are satisfied.

Trying to resize my UIView containers to fit smaller iPhone screen sizes

I am trying to have my layout fit on multiple iPhone screen sizes, but I am having trouble resizing my UIView's to resize themselves when on screen sizes smaller than the iPhone xr.
I have constrained the views, labels, and buttons properly and everything is aligned, but when viewing the app on smaller screen size, I don't fully understand how to resize my UIView containers to resize themselves to fit smaller screens.
On smaller screens, my button does not show up because the screen size is too small. The UIView's are the issue and the stack views inside them also need to resize or shrink the text to fit everything on the screen.
Image of my storyboard, and respective screen sizes
"I don't fully understand how to resize my UIView containers to resize themselves to fit smaller screens." -UIViews won't resize according to the screen, you will have to add constraint for them so that they pick their width and height. Alternatively you have to set constraint for fixed height and width.
In my opinion, for supporting smaller screen size, you must use scrollviews as parentview. So that user can scroll in the app. Also you can give relative width and height for views inside scrollview.
Scrollviews are required because you will always want some minimum width and height for buttons, labels etc. Otherwise on larger screen like Ipad they will be very large, while on smaller screens they will be very small.
You can use TPKeyboardAvoidingScrollView: How to use TPKeyboardAvoidingScrollView, or just google for that. It handles keyboard showing and hiding task, which is a headache otherwise.
Here is how I think you can solve your issue:
Set Some minimum height and width for your topmost view(scrollview preferably).
Now add other views inside it and use relative width and height. In relative width and height you give values in ratios. Here you can get an idea how to do that: -Giving width in % values in autolayout.
Also add additional constraint on your internal views for minimum height and width so they don't fall below certain size.
I would not suggest, but you may always use UIScreen.main.bounds.size.width and UIScreen.main.bounds.size.height to get the width and height of screen. And according set values for your constraints in your view/controller class. Here is a link for setting value of constraint in swift class:
set contraint value programatically

How to make view controller expand to fit layout on smaller screens?

I am working on adding constraints to my view. I have everything perfectly laid out for the iPhone X and it looks great, but I would like my view to expand/scroll to accommodate smaller screens sizes. How can I transform my current view to scroll only if the screen size is not as tall as the iPhone X? ideally with as little reconfiguring as possible.
I follow this approach.
Put all your UI components inside a UIView say it ContainerView.
Now put ContainerView inside a UIScrollView.
Now select ContainerView, add constraints to make width and height equal as of scroll view.
Add a constraint of height on ContainerView. Set its relation as "Greater Than or Equal". Set constant value equal to the height which you want.
Set priority of equal height constraint to High.

Dynamically set UIView size depending on height of grouped table view

Setup: I have a UIView with a scroll view nested within it. Within the scroll view I have a label, uiimage, and a tableview (grouped). The label, uiimage, and tableveiw are populated by a webservice. The last section in the grouped table view contains text that will never be the same and could be as long as 5 characters to 250+. Also, this view is pushed from a basic tableview (so it has a navigation bar. If that matters at all).
Expected: The uiview should extend in height depending on the height tableview extends to. Then I will be able to set the scrollview to accommodate the height I need to be able to scroll.
Problem: I'm not quite sure how to approach the issue. I really only know how to change the height to fixed values, which will not work properly in almost any scenario.
Am I using UIScrollView incorrectly? Do I need to resize the UIView at all?
You don't have to modify your UIView frame size, which has to be the size of your screen. The UIScrollView frame size must also be the same, it represents the part of its view actually displayed.
What must change is the UIScrollView contentSize, which defines height and width for data inside it ;)
You can calculate it using each inside element's height and by adding the correct margin.
Thus, you could have a UIScrollView content size of 320 * 600, which will let you automatically scroll down.
In fact, you have to display your content independently of the final frame size. If you have a content of 500*500, just display it inside your UIScrollView. Then tell it the size of it's content, and it will automatically set scrolling possibilities if needed.
Turns out I had to create a UIView programmatically and set it as the header of the UITableView. It works perfectly now. :)