UIScrollView resizing according to content - xcode

guys! So, i have UIScrollView and several UILabels on it, and i want to resize UIScrollView so its height will fit to sum of all labels height. can you help me?

Sum the heights of the labels, add some padding and set it as the height of the scroll view's frame (or contentView, if larger than the screen).

Related

How to center and reduce the width of buttons inside a UIStackView

In a vertical UIStackView I have stacked four UIButtons. The UIStackView is centered (vertically and horizontally), the left side corresponds to the left edge of the device and the right side to the right. Inside the stackview, the buttons take all the horizontal space the stackview takes, so the stackview and its content share their width.
Now, I want to reduce the width of my buttons, so that they are 80% the width of the container (on any device except for iPad) and I want to center them too.
How can I do? I need a solution either in code (Swift) and using any possible property I can't find in XCode
Instead of pinning the stack view to both sides of its superview, give it a width constraint that causes it to be 80% of the width of its superview.
The best working solution is
button.widthAnchor.constraint(equalToConstant:self.stackview.frame-30).isActive = true
This works perfectly fine.

AutoLayout contraints - cannot resize height

I'm struggling a bit with the auto layout constraints in a super simple test view.
For test I added a label, want it x number of pixels from left side, and 5 pixels from top, right, bottom.
When I do this and do an update frame, the view collapse to the min height, and when I insert the view into a tab, the main window collapses and I cannot resize the height.
I can understand why the view collapses to min height, but why does the main window collapse, and why can't I adjust the height.
Which is the missing / wrong constraints.
Thanks
Edit: Noticed I by mistake used a TextField instead of a Label which could have explained the fixed height, but even after changing to a label I see the same issue. If I instead set the height to fixed, so the constraints are left, top, right, height, then I can resize the window as expected, but obviously the label doesn't resize its height.
The label's content-hugging priorities are presumably greater than NSLayoutPriorityWindowSizeStayPut (500). That tells the auto layout system to prefer to resize the window rather than stretch the label beyond the size required by its contents.
Reduce that priority.

Vertical scrolling UIScrollview with Imageview and textview

I spent last 2 days trying to figure out UIScrollview using storyboard. Whenever I think I got it, a new problem appears and now it seams unsolvable.
Here is what I'm trying to do (it's really simple):
I have an Imageview 400x185 taking the whole width of the scrollview (edge to edge). That means that the scrollview has the width of the imageview.
Below is a textview that has <= width of the imageview.
I used many methods described on stackoverflow:
- using a view on the scrollview and setting the width same as the parent of the scrollview.
- using just the scrollview without a view
All of them produced errors in the frame size of the image, size of the subview of scrollview, constrains, textview doesn't show up or the picture is too large even though I set the constrains edge to edge.
Can someone make a sample project with the UI described above? It would take 5 minutes for someone who knows how to deal with it.
I just did this. I know it works. Here is what I would suggest:
Make sure your 400x600 view is constrained to width 400 and height 600.
Add a scroll view to this view. Have it take up the full view and then pin top, bottom, left, and right.
Add a UIView to the scroll view. Have it take up the full view and then pin top, bottom, left, and right. This is your content view. I renamed my in the document outline to "ContentView". At this point, you will have a warning about ambiguous content size, because until you add more constraints, the content view can grow to any size.
The size of the content view will be determined by the contents, so they need to be fully constrained. Add the imageView to the content view. Constrain its width to 400, constrain its height to 185. Pin it to the left, top, and right of the contentView. At this point, the contentView will know it is 400 wide, but it still doesn't know how tall it is.
Add the textView to the contentView. Pin it a constant distance from the imageView. Constrain it to be centered in its contentView. Pin it a constant distance from the bottom of the contentView. Constrain its width to something less than 400 and its height to something big like 600.
At this point, the size of your contentView should be fully constrained. It gets it width from the width of the imageView which is 400 wide and pinned to both sides of the contentView. It gets its height from the constant distance of the imageView from the top + the height of the imageView + the constant distance between the imageView and the textView + the height of the textView + the constant distance from the textView to the bottom of the contentView.
If you want your scrollView to only scroll vertically, then constrain the contentView width to the scrollView width. This is easily done in the Document Outline view by control dragging from the contentView to the scrollView and then selecting Equal Widths from the pop up.

UIScrollView with multipe TextViews and ImageViews layout issue

I have a view in which I placed a scrollView that fits the entire view. Inside the scrollView I have a textView, below a imageView, below a textView and so on. The textViews are filled with content from the ViewController with localized text, so its height will change depending on language. I gave the textViews the constraints for top, bottom, left and right with 10 each. The ImageViews i gave the constraints top and bottom with 10 each, width 200 and centered in container horizontal. The height of the images is different for each image and no constraint for the height is given.
The first result was, the scrollView got a width of the longest text of the localized text. I changed for the
scrollView
Content Hugging Priority Horizontal to 995 and Vertical to 250.
textViews
Content Hugging Priority Horizontal of 400 and 200 Vertical,
Content Compression Resistance Priority Horizontal is 200 and Vertical 750.
Perfect result in portrait mode. When changing to landscape the width of the scrollView stays at 320 and is aligned to the left.
How can I fix the problem to let the scrollView take 100% width of the screen without giving the textViews the chance to force to enlarge themselves to 100% width?
Found solution:
The scrollView has constraints: top/bottom 8 and left/right 0 each to superview.
The textViews have constraints to top, left, bottom and right.
The images have constraints top, bottom and width, centered to X in container.
This results that the textViews take one line and grow to giant width.
Then I centered the textViews to X in Container and selected all textViews and images and centered them too.
Now the scrollView takes 100% width of screen, height as needed no matter if portrait or landscape.
So for all who have maybe the same issue: scrollView looks a bit smaller than the view, its constraints when adding are 0 to left and right and a top/bottom >0. When drag and drop scrollView in the view it takes 100% of the view size. That was the problem, the constraints were -16. Setting the scrollView to x = 16 and width = 288 results in fitting properly to the view! Next giving the textViews constraints top/left/bottom/right and center it to container (even if offset to real center, right to the item is 0 predefined - change it to use current canvas value).

NSView Autosize (Vertically)

Is it possible to have an NSView autosize (vertically) to fit its contents? The contents are just two NSTextFields, one (on top of the view) that's always the same height and the other (near the bottom of the view) that's of a variable height.
Something that could make it more difficult is that the NSView is an NSCollectionViewItem's view.
The problem is that the width needs to be known before the height can be calculated. A successful implementation requires two layout loops. The first determines the width. That width is then taken and the height is calculated. A constraint is then added or modified to reflect the height and layout must happen again.
To achieve this, I subclassed the view to store a copy of the frame size locally. When the contents of the view changed, I would clear the width to zero. If the actual frame rectangle width was discovered to be different than the stored width after layout, then I knew that height needed calculated and another layout needed to be executed in the event that the width change caused a height change.

Resources