Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamically change aspect ratio of view controlled by autolayout

Problem

In UI I have some view which content is stretchable but should conserve some aspect ratio. This aspect ratio changes during run-time and views layout should be updated when some property describing aspect ratio changes.

I've exposed NSLayoutConstraint, but its property used for aspect ratio: multiplier is read only. What is more funny similar property constant can be changed.

Possible solutions

  1. I could just use constraint which fixes width or height and calculate it based on expected ratio, but this requires extra boiler plate code which will react on geometry/layout changes and I prefer to avoid this.
  2. I could experiment with intrisicContentSize and sizeThatFits: but I'm not sure how this should be used with NSLayoutConstraint
like image 352
Marek R Avatar asked Dec 14 '22 14:12

Marek R


1 Answers

Ok I'm whining to much. Removing and recreating constraint is not such a big problem (thanks @vacawama):

- (void)updateASpectRatio: (float)aspectRatio {
    // self.aspectRatioConstraint - has to be a strong reference
    [self.aspectRatioView removeConstraint: self.aspectRatioConstraint];
    self.aspectRatioConstraint = [NSLayoutConstraint constraintWithItem: self.aspectRatioConstraint.firstItem
                                                              attribute: self.aspectRatioConstraint.firstAttribute
                                                              relatedBy: self.aspectRatioConstraint.relation
                                                                 toItem: self.aspectRatioConstraint.secondItem
                                                              attribute: self.aspectRatioConstraint.secondAttribute
                                                             multiplier: self.aspectRatioView.aspectRatio
                                                               constant: 0.0];
    [self.aspectRatioView addConstraint: self.aspectRatioConstraint];
}
like image 149
Marek R Avatar answered Feb 12 '23 11:02

Marek R