It may be too late to answer this question, but the problem in such cases, as a rule, lies in the animation block, which captures all pending layouts planned in the next run cycle.
The solution I am using. I call layoutIfNeeded before the animation (before setting or canceling any restrictions), and then inside the animation block.
In your case, it will be something like this,
[theView addSubview:theTable]; [theTable reloadData]; [theView layoutIfNeeded]; [theTable invalidateIntrinsicContentSize]; [UIView animateWithDuration:.33 animations:^{ [theView layoutIfNeeded]; }];
source share