How is it possible that UITableViewCellContentView height is different from heightForRowAtIndexPath:
I’m facing a really weird problem on my UITableView.
I have some different cells that I want to display on a newsfeed-like table view.
And I have a problem with a cell after reuse.
The cell contains two images, two labels and a view with the share/like/comment buttons.
I’m gonna try to draw it, but I’m not sure it’s gonna be pretty :
------------------------------------------------- | | __ ____________________________ | | | |_2| | | | | | | 3 | | | | | | | | 1 | |____________________________| | | | | | |_______________________________________| | | | | | 4 | |_______|_______________________________________| | | | 5 | |_______________________________________________| 1 : objectImage 2 : subjectImage 3 : titleLabel 4 : commentLabel 5 : actionsView
And my constraints are :
"H:|-0-[objectImage(60)]-7-[subjectImage(30)]-7-[titleLabel]-7-|" "H:|-0-[objectImage(60)]-0-[commentLabel]-0-|" "H:|-0-[actionsView]-0-|" "V:|-0-[objectImage(>=35)]-0-[actionsView(44)]-0-|" "V:|-7-[subjectImage(30)]" "V:|-7-[titleLabel(>=46)]-7-[commentLabel(>=35)]-0-[actionsView(44)]-0-|"
And every time the cell is drawn, I change this constraint:
The cells display perfectly the first time.
But, the problem I have is that at a point, after some reuse (I can’t reproduce it every time) the app crashes because of a constraint problem.
Here is the exception:
"<NSLayoutConstraint:0x205a75b0 V:[UILabel:0x1ef31430(105)]>", "<NSLayoutConstraint:0x1ef34440 V:[UILabel:0x1ef31430]-(0)-[UIView:0x1ef2fe50]>", "<NSLayoutConstraint:0x1ef34380 V:[UILabel:0x1ef31250]-(7)-[UILabel:0x1ef31430]>", "<NSLayoutConstraint:0x1ef33900 V:|-(7)-[UILabel:0x1ef31250] (Names: '|':UITableViewCellContentView:0x1ef2bf50 )>", "<NSLayoutConstraint:0x1ef34340 V:[UILabel:0x1ef31250(>=46)]>", "<NSLayoutConstraint:0x1ef33210 V:[UIView:0x1ef2fe50]-(0)-| (Names: '|':UITableViewCellContentView:0x1ef2bf50 )>", "<NSLayoutConstraint:0x1ef331d0 V:[UIView:0x1ef2fe50(44)]>", "<NSAutoresizingMaskLayoutConstraint:0x1ef36f90 h=--& v=--& V:[UITableViewCellContentView:0x1ef2bf50(147)]>" Will attempt to recover by breaking constraint <NSLayoutConstraint:0x1ef34380 V:[UILabel:0x1ef31250]-(7)-[UILabel:0x1ef31430]>
The problem is that the constraint [UITableViewCellContentView:0x1ef2bf50(147)] is not right.
What is weird is that the heightForRowAtIndexPath: returns the correct value which is 217.
And what I don’t understand is that the height of the UITableViewCell is correct!
(lldb) po 0x1ef2bf50 $0 = 519225168 <UITableViewCellContentView: 0x1ef2bf50; frame = (0 0; 320 147); gestureRecognizers = <NSArray: 0x1ef30a20>; layer = <CALayer: 0x1ef2a3d0>> (lldb) po [0x1ef2bf50 superview] $1 = 0x1ef30e40 <NewsSubjectCommentCell: 0x1ef30e40; baseClass = UITableViewCell; frame = (0 1055; 320 217); hidden = YES; autoresize = W; layer = <CALayer: 0x1ef25e10>>
So I don’t understand how is it possible that the height constraint of UITableViewCellContentView is 147. It is the height of another cell of the same type, but it should be changed to 209, right?
So, if you have any insight on how this can happen (maybe I did something wrong), I’d be glad.
- How can I rearrange views when autorotating with autolayout?
- Auto Layout UILabels
- iOS ScrollView needs constraint for y position or height
- UICollectionViewCell systemLayoutSizeFittingSize returns incorrect width
- How to set topLayoutGuide position for child view controller
- Unable to simultaneously satisfy constraints Warnings with AVPlayerViewController embedded in storyboard
4 Solutions Collect From Internet About “How is it possible that UITableViewCellContentView height is different from heightForRowAtIndexPath:”
I found the answer here : Auto layout constraints issue on iOS7 in UITableViewCell
We just have to set the AutoresizingMask of the contentView to UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth and … problem solved!
You could try to set the (/some) heights at a lower priority (e.g. @900). I had a similar issue (my UITableViewCellContentView was too small and the constraints could not be satisfied). After I lowered the priority of my “wrong” height it was laying out nicely at the intended heights.
You have to turn off autoresizing conversion for the view that contains your constraints if you add your constraints with code or visual language:
This prevents the
[UITableViewCellContentView:0x1ef2bf50(147)] constraint from being created.
In cellForRowAtIndexPath you request a cell from the tableview. The cell you get will either be a newly created cell (with size 320,44) or a cell that has been dequeued and sent the prepareForReuse message (with whatever size it had previously). When you apply code NSLayoutConstraints to the contentView they are resolved before the cell fits itself to the tableview space provided. This makes no sense but is definitely the conclusion of my observations.
So, in my instance I was getting new cells with 44 height but one of my constraints was for a fixed height of 48. This was throwing exceptions constantly and making debugging a pain. All I did to make the exceptions go away was to set the frame of the cell to the correct height (and width I suppose if you are experiencing issues on the horizontal dimension) when I was preparing it in cellForRowAtIndexPath.
UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:CellIdentifier]; if(cell==nil) cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; // If the cell is new its frame will be (0,0,320,44) cell.frame = CGRectMake(0,0,tableview.frame.size.width,calculatedHeightRequiredForLayout); [cell.contentView addConstraints:constraints];
The cell will automatically resize itself to the correct dimensions before it displays in the tableview so you won’t cause any issues, but your layout constraints will be applied without ‘needing to be broken’ by iOS…
- Xcode 5: Multiple test targets in one scheme: “Simulator already in use”
- How to pass data backwards to a view controller after passing forward?
- iCarousel stop at user picked index
- Read binary QR Code with AVFoundation
- How to automatically take a picture without pressing the phototaken button on the imagepickercontroller?
- StoreKit returns invalid product identifiers – only on the real App Store, only on iOS7
- Using CFNotificationCallback in Swift, or, @convention(c) blocks in Swift
- Core Data saving objects in background issue
- How to set a UIView's origin reference?
- Circular Cropper Camera with UIImagePickerController iOS?
- Why retain count in negative value?
- Alamofire: file download and validation failure
- NSSortDescriptor issue
- How to fix Failed to fetch default token error?
- How to verify ios device supports Apple Pay