[英]UILabel height animation with autolayout
I have an UILabel on my view and UIButton. 我的观点和UIButton都有一个UILabel。 When button touched UILabel should change height animated, depends on label content .
当按钮触摸UILabel时应更改动画高度,取决于标签内容。 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];
}];
}
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
在动画块之前,您需要调用
[self.view setNeedsUpdateConstraints]
以触发告诉视图在调用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];
}];
}
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
在故事板中定义高度约束,将其添加为IBOutlet,然后在动画块中更改其值。
Maybe if you use 也许如果你使用
[self.textLabel sizeToFit];
it works. 有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.