2014-01-21 133 views
5

我对我的看法和UIButton有一个UILabel。当按下按钮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 [email protected]"short text":@"long long long text\nlong long long text\nlong long long text\n"; 
     [UIView animateWithDuration:1.0 
         animations:^{ 
          [self.view layoutIfNeeded]; 
        }]; 
} 
+0

是否文本变化的结果,在当按钮被触动的那一刻正常显示,而你只是想制作动画呢?或者,按钮的结果框架也是错误的? –

+0

@obuseme生成的框架是正确的,但它没有动画变化 – somedev

+0

好的,请参阅下面的答案。你只是缺少一行 –

回答

0

定义故事板中的高度限制,将其添加为IBOutlet,然后在动画块内更改它的值。

5

右键动画块之前,你需要调用[self.view setNeedsUpdateConstraints]才能触发告诉认为,制约因素需要更新,当你调用layoutIfNeeded

因此,新的方法:

- (void)buttonTouched:(id)buttonTouched { 
    self.shortText =!self.shortText; 
    self.textLabel.text= self.shortText [email protected]"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]; 
    }]; 
} 
0

也许如果您使用

[self.textLabel sizeToFit]; 

它的工作原理。

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

+0

我检查了你的代码。 UILabel框架更改无需动画。 – somedev