Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UILabel height animation with autolayout

I have an UILabel on my view and UIButton. When button touched UILabel should change height animated, depends on label content . I was trying this:

    - (void)viewDidLoad {
        self.textLabel= [[UILabel alloc] initWithFrame:CGRectZero];
        self.textLabel.numberOfLines=0;
        self.textLabel.font= [UIFont systemFontOfSize:14];
        self.textLabel.backgroundColor= [UIColor lightGrayColor];
        self.textLabel.text= @"short text";
        [self.view addSubview:self.textLabel];
        [self.textLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
        [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[_textLabel]-10-|"
        options:0
        metrics:nil
        views:NSDictionaryOfVariableBindings(_textLabel)]];


        self.button= [UIButton buttonWithType:UIButtonTypeSystem];
        [self.button addTarget:self action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside];
        [self.button setTitle:@"Tap" forState:UIControlStateNormal];
        self.button.backgroundColor= [UIColor greenColor];
        [self.button setTranslatesAutoresizingMaskIntoConstraints:NO];
        [self.view addSubview:self.button];

        [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[_button]-10-|"
                                   options:0
                                   metrics:nil
                                   views:NSDictionaryOfVariableBindings(_button)]];

        [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-50-[_textLabel(>=0)]-10-[_button(==20)]"
                                   options:0
                                   metrics:nil
                                    views:NSDictionaryOfVariableBindings(_textLabel,_button)]];

}

- (void)buttonTouched:(id)buttonTouched {
        self.shortText =!self.shortText;
        self.textLabel.text= self.shortText ?@"short text":@"long long long text\nlong long long text\nlong long long text\n";
        [UIView animateWithDuration:1.0
                         animations:^{
                             [self.view layoutIfNeeded];
                     }];
}
like image 216
somedev Avatar asked Jan 21 '14 14:01

somedev


2 Answers

Right before the animation block, you need to call [self.view setNeedsUpdateConstraints] in order to trigger tell the view that the constraints need to be updated when you call layoutIfNeeded

So the new method:

- (void)buttonTouched:(id)buttonTouched {
    self.shortText =!self.shortText;
    self.textLabel.text= self.shortText ?@"short text":@"long long long text\nlong long long text\nlong long long text\n";
    [self.view setNeedsUpdateConstraints];
    [UIView animateWithDuration:1.0
                     animations:^{
                         [self.view layoutIfNeeded];
    }];
}
like image 199
Andy Obusek Avatar answered Nov 01 '22 12:11

Andy Obusek


I have this example working no problem.

@interface ViewController ()

@end

@implementation ViewController
{
    __weak UIView *_bgView;
    __weak UILabel *_label;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    UIView *bgView = [[UIView alloc] initWithFrame:CGRectZero];
    bgView.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.5];
    bgView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:bgView];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[bgView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(bgView)]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[bgView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(bgView)]];
    _bgView = bgView;
    
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
    label.backgroundColor = [[UIColor greenColor] colorWithAlphaComponent:0.5];
    label.text = @"ahoj";
    label.numberOfLines = 99;
    label.textAlignment = NSTextAlignmentCenter;
    label.translatesAutoresizingMaskIntoConstraints = NO;
    [bgView addSubview:label];
    [bgView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-8-[label]-8-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label)]];
    [bgView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-8-[label]-8-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label)]];
    _label = label;
    
    [self performSelector:@selector(animate) withObject:nil afterDelay:1];
}

- (void)animate
{
    _label.text = @"ahoj, ahoj\ntotalka ahoj";
    
    [UIView animateWithDuration:1 animations:^{
        [_bgView.superview layoutIfNeeded];
    } completion:^(BOOL finished) {
        ;
    }];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
like image 1
kubbing Avatar answered Nov 01 '22 11:11

kubbing