UILabel sizeToFit and constraints

前端 未结 3 1449
终归单人心
终归单人心 2020-12-13 01:28

Is there any simple way which can help me to change position of dependent views dynamically using their content size?

I want to show several views in column which al

相关标签:
3条回答
  • 2020-12-13 01:35

    This works too. https://github.com/jszumski/auto-layout-table-cells/blob/master/DynamicCellHeights/JSLabel.m

    @interface JSLabel : UILabel
    
    @end
    
    @implementation JSLabel
    
    - (id)init {
        self = [super init];
    
        // required to prevent Auto Layout from compressing the label (by 1 point usually) for certain constraint solutions
        [self setContentCompressionResistancePriority:UILayoutPriorityRequired
                                              forAxis:UILayoutConstraintAxisVertical];
    
        return self;
    }
    
    - (void)layoutSubviews {
        [super layoutSubviews];
    
        self.preferredMaxLayoutWidth = CGRectGetWidth(self.bounds);
    
        [super layoutSubviews];
    }
    
    @end
    
    0 讨论(0)
  • 2020-12-13 01:53

    If you still want to use Auto Layout Constraint for your Label. This is a solution:

    [self.lblBadgeValue sizeToFit];
    self.constraintWidthBadgeLabel.constant =  self.lblBadgeValue.frame.size.width;
    [self.lblBadgeValue needsUpdateConstraints];
    [self.lblBadgeValue layoutIfNeeded];
    
    • Explain more:
    • sizeToFit -> make label fit height, width with content of it.
    • So in runtime you need to update constraint height, or width for label
    • After that you need to say for compiler know that what need update constraint.
    • And in the end you need to call layout if have change on constraint.
    0 讨论(0)
  • 2020-12-13 01:56

    -sizeToFit should not be called if you are using auto-layout. That's part of the 'old' system.

    It looks like IB has inserted explicit heights into your constraints (the vertical bars next to the labels indicate this). Try selecting the labels and hitting Cmd+= to clear these.

    For multiline labels you will also need to do the following in your view controller to make everything work correctly when rotating/resizing the view:

    - (void)updateLabelPreferredMaxLayoutWidthToCurrentWidth:(UILabel *)label
    {
        label.preferredMaxLayoutWidth =
            [label alignmentRectForFrame:label.frame].size.width;
    }
    
    - (void)viewDidLayoutSubviews
    {
        [super viewDidLayoutSubviews];
    
        [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label1];
        [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label2];
        [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label3];
    
        [self.view layoutSubviews];
    }
    

    Multiline labels expose one of the weaknesses of auto-layout. We have to update preferredMaxLayoutWidth to force the label to reflow and adjust its height, otherwise if the view is resized/rotated, auto-layout does not realize the label needs to be reflowed and resized.

    0 讨论(0)
提交回复
热议问题