Looks like only updating the preferredMaxLayoutWidth on any change (rotation, xib resizes etc), that effects the size, will do.
Example:
I designed a view in IB with iPhone screen size like this:

To make it work in landscape, add following code in your view controller:
- (void)updateLabelPreferredMaxLayoutWidthToCurrentWidth:(UILabel *)label
{
label.preferredMaxLayoutWidth =[label bounds].size.width;
}
-(void)updateLabels
{
[self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label1];
[self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label2];
[self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label3];
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
[self updateLabels];
}
Basically we are just changing the preferredMaxLayoutWidth of each label in willAnimateRotationToInterfaceOrientation, as the size is being changed there. Outcome is:

If you want to support multiple display size, just call the updateLabels in viewDidAppear like this:
-(void)viewDidAppear:(BOOL)animated
{
[self updateLabels];
}
This is because, I designed a single xib with iPhone display size, but want to support multiple display size. After the view is already appeared, the exact size of all the elements is calculated.
iPad Portrait Demo with same xib and adjustment code in viewDidAppear:

Hope this helps.