Set minimum height of table view cell? - ios

I have a UITableView,In this table i have created as custom cell with image & label.I have given label leading,trailing,top,bottom.I want to set the size of label to increase according to text which is happening.I have used UITableAutomaticDimension & EstimatedRowHeight.Now i want to set minimum height of cell equal to height of image.Now if text is very less in label then height of image is decreased.Now i want to keep height cell minimum as image height & increase it when there is more text.Please help how can i do it?

Looking at the view you shared i would suggest the following constraints.
Top of UIImageView to top of your cell.
Left of UIImageView top left of your cell.
Width and Height constraints of your UIImageView.
Bottom of UIImageView to the bottom of your cell which will be greater than or equal to.
Right of your UIImageView to Left of your UILabel.
Top of your UILabel to top of your cell.
Right of your UILabel to right of your cell.
Bottom of your UILabel to bottom of your cell.
Adding these constraints should solve your problems.

Related

Constraining UIImageView height to respect dynamic UILabel height in UITableViewCell

I have a UITableView filled with one type of custom UITableViewCell. Each cell contains a title (UILabel), subtitle (UILabel), and thumbnail (UIImageView), as shown below.
The widths of all three subviews are fixed, but only the subtitle label has a fixed height. The title label's height is dynamic according to the amount of text. I have set the title label's numberOfLines to 0 to reflect this.
My objective: The height of the cell should be determined by the height of the title label. In other words, the cell height should be the sum of the two labels' heights plus the three vertical padding gaps. The image height should be set to the resulting height of the cell.
My current implementation: I have set the following autolayout constraints:
Thumbnail is pegged to superview on top, left and bottom
Thumbnails width is proportional to superview width by a multiple of 0.2
Thumbnail is pegged on its right side to title and subtitle (trailing space = 8)
Title is pegged to superview on top and right (trailing space = 8)
Title is pegged on its bottom to subtitle (trailing space = 8)
Title height is greater than or equal to 24
Subtitle is pegged to superview on right and bottom (trailing space = 8)
Subtitle height is equal to 20
Additionally:
Title numberOfLines = 0
Thumbnail contentMode = Aspect Fill
Thumbnail clipToBounds = true
The problem: The image height does not respect the height of the labels, so the height of the cell is set to the full height of the image and the title label is stretched vertically. This is understandable given the constraints I have used, but is not what I want to happen.
My question: How do I constrain the UIImageView's height to respect the cell height (determined by dynamic label height), instead of having the cell height respect the UIImageView height?
My Environment:
Xcode 10
iOS 11 & 12
Swift 4.2
Try setting thumbnail vertical compression resistance lower than title vertical hugging priority. In code it'll look like this:
thumbnail.setContentCompressionResistancePriority(.defaultLow, for: .vertical)
titleLabel.setContentHuggingPriority(.required, for: .vertical)
I'll explain the vertical constraints to make this possible.
Pin the top of the label to the contentView with enough padding so that image view stays inside it.
Pin the top of the subtitleLabel to the bottom of the titleLabel.
Pin the bottom of the subtitle similarly to the bottom of the contentView, so that the image view stays inside it.
Your cell now has a height based on the above constraints. Now you just have to make sure you place the image view inside this height.
Pin the top of the thumbnail to the top of the label, bottom to the bottom of the subtitle label.
Example:
titleLabel.top -> contentView.top + 10
subtitleLabel.top -> titleLabel.bottom + 5
subtitleLabel.bottom -> contentView.bottom - 10
imageView.top -> titleLabel.top - 5
imageView.bottom -> subtitleLabel.bottom + 5

iOS: limit mini height for XIB tableViewCell?

My tableViewCell's bottom equal to that selected UILabel. But if this label have few words cell's height is too small.
So how can i limit cell's mini height equals to that imageView's bottom?
Put your imageview, label Tittle(Fantastic cos) and label description into a view says it main view. Give the main view constraints left, right top, bottom to the cell and height constant as what you what default cell height.
now give contraints to inner components w.r.t. main view:
a) imageview : top, leading, height, width(height is equal to the main view height by constant)
b) label tittle: top wrt main view, leading wrt imageview, trailing wrt main view, and constant height.
c) label description: top wrt label tittle, leading wrt imageview, trailing wrt mainview, bottom wrt main view and height.
Now you contraints given by you defines the default tablecell size i.e. whatever your label description text have this size remains atleast and at most.
Now we have minimun height of the cell, and now we have to change the height of cell as per our text size.
Now, change the both height relation of label descption and main view from equalto(=) to greaterthan or equal(>=).
Now with table view delegates impliment these two methods
a)estimatedHeightForRowAtIndexPath returns (your default tableview height)
b)heightForRowAtIndexPath returns UITableViewAutomaticDimension.
Now run and enjoy with tableview. :)
For More details you can refer : https://www.raywenderlich.com/129059/self-sizing-table-view-cells

Setting top constraint on UIImageView causes UILabel to be fixed height

I'm having this weird issue with my constraints which causes the UILabel (Caption Label) to be a fixed height instead of dynamically changing height depending on the text.
I have a view (Vertical View) with a top constraint on the label above it. The Vertical View contains a view (called View) which I'm using as a divider that is centered from top to bottom with a width of 1. On the left of the divider is a UIImageView (Left Image View) with constraints leading, top, bottom equal to superview and trailing equal to View. I want to do the exact same thing to the UIImageView on the right of the divider but here is where my issue comes up.
If I use a fixed height as seen below, the UILabel above Vertical View dynamically changes its height like I want but this is obviously not how I want the UIImageView on the right to appear. I want it to be similar to the UIImageView on the left of the divider with equal height and width.
If I set the top constraint of the UIImageView on the right to the superview Vertical View, similar to the UIImageView on the left of the divider, the UILabel above Vertical View doesn't dynamically change height anymore. The UILabel now has a fixed height which I believe comes from the fact that UILabel has a height of >= 14.
How can I properly set the constraints so that I can have both UIImageViews next to each other with equal and height contained within the Vertical View and still have the UILabel above Vertical View dynamically change height depending on the text that I set the UILabel to?
On the RightImageView, you first need to get rid of the "Height = 50" constraint. This is what is causing it to be small.
Next, if that alone doesn't fix you, can you try setting the following constraints instead of using the superview for the constrains (instead make it mirror the LeftImageView):
Left: Leading spacing to divider view
Top: Align top edges to LeftImageView
Right: Horizontal space to superview (your vertical container view)
Bottom: Align bottom edges to LeftImageView
This should allow the views to remain the same height and width (assuming your distances between left/right edge of vertical container view are the same, and the distances between divider are the same).
Now, ensure the size constraint for width of the divider is set to 1 and not >= 1. Also, ensure the vertical container view has a Compression lower than the Label.
One final note--your screenshot shows the result that IB is showing you (with the dotted yellow box) on the LeftImageView. One you update your constraints correctly, this yellow box should go away.
Regarding the UILabel - if you want this to grow dynamically, you need to do the following:
myUILabel.numberOfLines = 0;
myUILabel.text = #"Enter large amount of text here";
[myUILabel sizeToFit];

Cell with Dynamic Height

I have a UIImageView in custom cell ,Maximum size of UIImagView Can be 100X100. if there is no Image in UIImageView than its height should be Zero. How to specify constraint for this in xib?
Observer left cell image. "There is blank space of height 100 because cell does not have any image to display." There should not be any blank space between hello and heart button.
Right cell image is fine.There is image to display so cell is displaying it.and other component are coming below it.
Put the image inside a div element and set the max-height css property to 100px.
If an Iboutet is connected to the height constraint of the UIImageView then in the custom cell class you may check if there is image set the height constraint a value otherwise set to 0 and the heart and comment components should be pinned to image view.
So that on setting height constraint to 0, rest of the components move closer to "hello".

Auto Layout inside UITableViewCell - dynamic height based on variable size of two different elements

Inside of a uitableviewcell I have an image view and a label side by side. I'm using systemlayoutfittingsize + a sizing cell to drive the table view cell height via autolayout for ios7/8. I'm also using setting up these constraints programatically (no storyboard answers please). Two possible scenarios...
Scenario 1: Label height is intrinsically smaller than image height
Desired result: Size of the cell expands so that the image (set explicitly to 100 width, 75 height) is centered vertically in the bounding area, and the label's top edge is aligned with the images top edge.
Scenario 2: Label height is intrinsically greater than the image height
Desired result: Size of the cell expands so that the label is centered vertically in the cell. The image's top edge aligns with the label's top edge.
So the constraints needed for this appear to be
For the image view:
1. Pin width = 100
2. Pin height = 75
3. Pin leading space to superview = 10
4. Pin top space to superview = 10
For the label:
1. Pin top space to superview = 10
2. Pin bottom space to superview = 10
3. Pin width = 200
4. Pin trailing to superview = 10
5. Pin horizontal spacing = 10 (between label and image view)
Then in the code all we have to worry about is the "heightForRow" UITableView delegate method. Since we did not set a static height for the label and we pinned it to the top and bottom of the superview/cell it will change size dependent on the height of the UITableView cell. We have to calculate the "numberOfLines" for the dynamic length of the text of the label. There are many links out there that can help you with this - How to calculate UILabel height dynamically?

Resources