我的观点和UIButton上有一个UILabel。当按钮触摸UILabel时应更改动画高度,取决于标签内容。我正在尝试这个:
- (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];
}];
}
答案 0 :(得分:5)
在动画块之前,您需要调用[self.view setNeedsUpdateConstraints]
以便在调用layoutIfNeeded
时触发告诉视图需要更新约束
所以新方法:
- (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];
}];
}
答案 1 :(得分:1)
我有这个例子没问题。
@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
答案 2 :(得分:0)
在故事板中定义高度约束,将其添加为IBOutlet,然后在动画块中更改其值。
答案 3 :(得分:0)
也许你使用
[self.textLabel sizeToFit];
它有效。