UILabel text not automatically resized using Auto Layout

I’m trying to implement a constrained UITableViewCell subclass and everything is working perfectly, except for the UILabel. The constraints that I’ve set up are definitely being enforced, but the text inside of the label does not resize to a smaller font size when the constraints clash. Instead, the height of the UILabel gets truncated and the font remains the same size, meaning the letters get cut off at the top and bottom.

Is there some method I have to call in order to get this to work? I would think Auto Layout would be smart enough to automatically resize the font size, so I’m kind of lost as to why this is happening.

  • Navigation with only Back Button and transparent background
  • How to emulate location while app isn't running
  • UIButton gradient not working
  • how to random placement of UIButton and value
  • Error Domain=kCLErrorDomain Code=2 “The operation couldn’t be completed. (kCLErrorDomain error 2.)”
  • the app references non-public selectors in payload/appname.app/appname: _terminateWithStatus
  • Relevant Code:

    self.label = [[UILabel alloc] initWithFrame:CGRectZero];
    self.label.textColor = [UIColor whiteColor];
    self.label.translatesAutoresizingMaskIntoConstraints = NO;
    self.label.textAlignment = NSTextAlignmentCenter;
    self.label.numberOfLines = 1;
    [self.contentView addSubview:self.label];
    
    NSLayoutConstraint *otherViewToLabelHorizontalConstraint =  // Make sure that the label is always to the right of the other view.
                        [NSLayoutConstraint constraintWithItem:self.label 
                                                     attribute:NSLayoutAttributeLeft 
                                                     relatedBy:NSLayoutRelationGreaterThanOrEqual
                                                        toItem:self.otherView 
                                                     attribute:NSLayoutAttributeRight 
                                                    multiplier:1.0
                                                      constant:0.0];
    
    NSLayoutConstraint *aTextFieldToLabelVerticalConstraint = 
                        [NSLayoutConstraint constraintWithItem:self.label 
                                                     attribute:NSLayoutAttributeTop 
                                                     relatedBy:NSLayoutRelationGreaterThanOrEqual
                                                        toItem:self.aTextField 
                                                     attribute:NSLayoutAttributeBottom 
                                                    multiplier:1.0
                                                      constant:0.0];
    

    Basically, these constraints are meant to enforce a cell where otherView is on the left, aTextField is on the right of otherView at the same y-level, and the label is below aTextField and to the right of the bottom of otherView.

    As usual, thanks for any help with this.

    3 Solutions Collect From Internet About “UILabel text not automatically resized using Auto Layout”

    You need

    myLabel.adjustsFontSizeToFitWidth = YES;
    myLabel.minimumScaleFactor = .5f;
    

    Then the label font size will be auto adjusted.

    Along with the setting of adjustsFontSizeToFitWidth and the minimumScaleFactor, you also need to set the content compression of the label to have a low priority. Check out the “Compression Resistance and Content Hugging” section of this objc.io essay. Basically, if your label has a lower compression resistance priority than the trailing constraint, the label should get resized:

    [myLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow
                                     forAxis:UILayoutConstraintAxisHorizontal];
    

    I solved this problem by setting a required width constraint to the view I was linking the label to.

       NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0f constant:width];
    

    And make sure the priority for this constraint is set to UILayoutPriorityRequired.

    [constraint setPriority:UILayoutPriorityRequired];
    

    Text was resizing when pinning the label to the superview but not to the textfield, so I deduced there must be a problem with intrinsic sizes of elements involved in the layout calculation for the label’s final width.