Xcode 8 autolayout constraints don't work in custom tableViewCell - ios

I have an app that uses custom tableviewcells. When I use autolayout for subviews (e.g. UIImageView, UILabels) on runtime I dont see any of the subview even though the constraint lines are blue. Everything was fine before i updated to Xcode8.
Constraints work fine on in other views.
EDIT: Here is the screenshot. Imageview is not displayed at all, even though it has placeholder image by default and there are images in source to replace the placeholder.
EDIT: same code without constraints.

I had a similar problem when using custom table view cells and auto layout. Somehow when I called [self.tableView registerClass:[CustomCell class] forCellReuseIdentifier:#"cell"] the cell wouldn't show. However once I removed this line from the viewDidLoad: everything worked properly
It's not certain that you have things layed out this way but this is what worked for me. Also, if you use anything like an autoresizingmask, turn that off for your constraints to work. You could also try selecting the Content View of the cell in interface builder and deselect "Autoresizes Subviews".

Related

UI Table Reuse Cell Constraints Looks Fine in IB But Doesn't Work When Simulated

I am having an issue with my table reuse cell where I an unable to style it as some constraints don't seem to apply. In the IB I have applied a constraint to a stack view so it is 40 left from the superview (as seen
here.
Anyway it displays fine in the IB, there are no warnings or anything and in my code I don't change any of the constraints or layout when populating the stack view.It displays fine here.
When I run it in the simulator though it doesn't display right, completely ignoring the left constraint as seen here where the time is directly up against the side.
As I said earlier in my code to populate the table view I simply add text to the labels and change the background colour of the cell. Any help would be greatly appreciated.

Label in cell positioned in the very upper-left corner?

It's very odd - my cell labels are looking something like this:
However my constraints are set as such:
If I remove the constraints completely, then it's working. But I tested on multiple platforms and on both the simulator and an actual device. I've tried multiple combinations of constraints, none of which seem to work. This hasn't happened to me before, albeit I haven't done much iOS programming in a while. Is there something obvious I'm doing wrong or new in XCode 9?
Edit: I was able to fix by deleting and adding back a new UITableViewController and recreating it, but it's very odd and I'm wondering why this could be in the first place.
Check the custom class for your Content View, one level below your cell. If the Content View is a subclass of UITableCellView instead of UIView, you'll see this behavior. Unless you're sure you want to create a custom class for the Content View versus the cell itself, make sure not to use a Custom Cell here, in which case your Custom Class for the ContentView will be set to UIView.
Apply this constraint on label

Autolayout is ignored in custom TableViewCell

I'm trying to constrain some objects in my tableview cell so that they will be formatted correctly and won't clip on different devices. But, whenever I add a constraint to an object in there, it throws the object off screen to the top left. In the screenshot I attached I showed it with the green bar on the left but the same is true when I do it to the other labels and text fields.
Any ideas as to what I'm doing wrong?
I have a near identical table view that gets its data from another source and have them constrained the same way, but that tableview cell is formatted correctly when I build it.
I am seeing things online about Tableview cell subclasses. Is there something else I am supposed to be implementing in order to get these to stay? I'm not sure why they are working on one of my tableviews but not the other.
I am having the same issue that is being seen here Autolayout is ignored in Custom UITableViewCell but her answer is confusing me and I can't figure out how to reproduce it
This is what it looks like when the app is built:
Figured it out. For anyone else who may have this problem in the future. You need to click on the content view in the Storyboard and go to the indemnity inspector. Then from there make sure the Class is set to the default of UIView and not the custom class of the TableView Cell.

Custom UITableViewCell layout changes on click (iOS7 only)

In order to get my app in line with guidelines for iOS8, I've implemented auto layout in my custom table view cell. On iOS8 this looks fine - the cells are laid out as I'd like at all screen sizes. On iOS7 however, the text boxes start out with only one line of text each, with the remaining text cut off (with an ellipsis). When touching the button however (on touch down), the cell's layout changes and it looks more like it does on iOS8. I can't seem to find what is being called here, and there aren't any constraint errors/warnings coming up in the console. Any idea how I might debug something like this, or is this a known bug in iOS8 so far?
I've noticed too when using self-sizing cells made in a storyboard. I was able to get it to work correctly by calling layoutIfNeeded in the cell's didMoveToSuperview method,
-(void)didMoveToSuperview {
[self layoutIfNeeded];
}

UITableView in storyboard not updating content size on rotation

I'm working on project targeted for iOS 6 that leverages storyboards and auto layout. In the storyboard there are many places where a UITableView is added as a subview to a view controllers view. This table view uses prototype cells from the storyboard.
The issue we're running into is that if the view controller is initially loaded in landscape orientation and the device is then rotated to portrait, the table view begins to scroll both vertically and horizontally. The table views cells are drawn with the correct dimensions but there is additional white space to the right.
It appears that while the frame and bounds of the table view are being updated to the correct size on rotation, the table views content size is not. Regardless of any update rotation change the content size remains the same dimensions.
The issue doesn't present itself if programatic table view cells are used.
A few garish work arounds I've found, 1.) calling reloadData or reloadRowsAtIndexPaths:withRowAnimation: 2.) manually setting the property contentSize.
Both of these seem less than ideal.
I've added this
link to a dead simple sample project which demonstrates this issue. The only changes made are to the storyboard and the main view controllers implementation.
Before rotation
After rotation
I'm having the same issue - can't seems to find any documented answer related to this. I ended up manually modifying the UITableView contentSize like you mentioned in:
- (void) viewWillLayoutSubviews
{
self.tableView.contentSize = CGSizeMake(self.tableView.frame.size.height, self.tableView.contentSize.height);
}
I ran into this issue today and filed a bug report with Apple.
Appears that if you are using a custom cell with a UI element AND autoLayout, the UIScrollView content size is having problems.
If you remove all UI elements, OR turn off autoLayout, OR use a factory cell (basic, etc), all works fine.
Same issue I have rectified in my project.
I guess this is a bug in Storyboard.
Then I have solved it by manual coding in willAutorotate method by setting
tableview.contentsize = CGSizeMake(tableview.width, tableview.contentsize.height);
Hope this will work for you as well.
If you find any apple documentation regarding the same then please update me as well. Till then you can use the same solution.
Appears that if you are using a custom cell with a UI element AND autoLayout, the UIScrollView content size is having problems.
I had to turn off AutoLayout for my custom UITableViewCells to be able to scroll to the bottom on updating the data and then [self.tableView reloadData].
With AutoLayout turned on, the tableView.contentSize was being updated, but I still wasn't able to scroll to the bottom unless I rotated the device.
I found the following to work for me:
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
dispatch_async(dispatch_get_main_queue(), ^{
self.tableView.contentSize = CGSizeMake(self.tableView.frame.size.width, self.tableView.contentSize.height);
});
}
Notice the async dispatch: if that line would be executed synchronously then the contentSize change would trigger another layout pass before the current one would have completed. This triggers an exception:
Auto Layout still required after sending -viewDidLayoutSubviews to the
view controller.
Usage of Constraints helped me. Since you are using Storyboards, it is really easy to set Constraint values for all edges, so UITableView will always fill the whole ViewController (of course if UITableView fills whole ViewController) regardless of device orientation.
I had the same problem.
I found this link. When I tried to implement this I did not find the Auto-sizing attributes for my view then I clicked on Master View Controller and then clicked on the File Inspector and uncheck Use Autolayout and then go to Attributes inspector auto-resizing should be there then you can change the attributes how you want it.
I am sure you must have managed to figure this out.

Resources