简体   繁体   中英

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

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];
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM