Forum Xamarin.iOS
We are excited to announce that the Xamarin Forums are moving to the new Microsoft Q&A experience. Q&A is the home for technical questions and answers at across all products at Microsoft now including Xamarin!

We encourage you to head over to Microsoft Q&A for .NET for posting new questions and get involved today.

Auto layout not working till row/table is reloaded

JF.0444JF.0444 USMember ✭✭✭
edited August 2016 in Xamarin.iOS

I have a custom table cell which i'm using auto layout to determine hight of cell.

in my view controller ViewDidLoad() I have

tableView.EstimatedRowHeight = 150;
tableView.RowHeight = UITableView.AutomaticDimension;

I set up all the constraints on storyboard and it appears to have all necessary constraints to make auto layout work.

image

But when I load the page I get

image

I have some logic that reloads the row if user taps on the check box on the left. After that is tapped the row adjusts properly to

image

(Will also fix itself if user scrolls down then back up, pretty much any reload will fix it)

Notice that after cell is reloaded the address properly wraps and expands. But on initial page load the last word of the address is cut off because the label is not expanding vertically.
Everything except that address label has a height constraint and all bottom labels have a constraint to the bottom of the view. If I remove the height constraint from the top most bolded label the address expands properly but the top label shrinks. I tried messing with CompressionResistance but no matter what I have either the top most label shrinking when it shouldn't, or have the address label cutting of second line of text.

I am able to fix the issue by

                tableView.BeginUpdates ();
                tableView.ReloadRows (_mainTableView.IndexPathsForVisibleRows, UITableViewRowAnimation.Automatic);
                tableView.EndUpdates ();

but this creates some strange behavior when the page loads because things are moving around.

Code snippet from ViewDidLoad()

                _mainTableView.EstimatedRowHeight = 140;
                _mainTableView.RowHeight = UITableView.AutomaticDimension;
                _mainTableView.Hidden = true;
                _activityIndicator.Hidden = false;
                _activityIndicator.StartAnimating();

                SetUpDataSource();

                _mainTableView.Source = new CustomTableViewSource();

                _mainTableView.ReloadData ();

                // shouldn't be nescessary but auto layout does not seem to work on first reload
                //_mainTableView.BeginUpdates ();
                //_mainTableView.ReloadRows (_mainTableView.IndexPathsForVisibleRows, UITableViewRowAnimation.Automatic);
                //_mainTableView.EndUpdates ();

                _mainTableView.Hidden = false;
                _activityIndicator.Hidden = true;
                _activityIndicator.StopAnimating();

My first instinct is to mess with constraints and priorities but the fact that it works perfectly after a second reload is a bit strange.

Best Answer

Answers

Sign In or Register to comment.