在我对标签扩展的实验中,我发现 Ryan Poolos 在他的评论中所说的是正确的——即使标签通过动画扩展,文本也会跳转到它的新位置(我已经将文本设置为中心理由)。
因此,我发现可行的唯一方法是使用计时器,如下所示:
-(IBAction)expandLabel:(id)sender {
[NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(expand:) userInfo:nil repeats:YES];
}
-(void)expand:(NSTimer *) aTimer {
self.widthCon.constant += 1;
if (self.widthCon.constant >= 200) [aTimer invalidate];
}
widthCon 是我放在标签上的宽度约束的 IBOutlet。如果你使用自动布局,你应该通过改变约束来做任何动画,而不是改变框架。我没有尝试在节标题中使用标签,但我认为如果您使用此方法为表格的宽度设置动画,并且标签的约束以遵循表格扩展的方式设置,它会起作用。
编辑后:
经过更多的实验,看起来 timer 方法也是使它用于移动标签(而不是扩展它)的唯一方法。在这种情况下,宽度约束将是表视图本身。
第二次编辑后:
更多的实验。我发现问题在于调用 layoutSubviews(您不应该直接调用)而不是 layoutIfNeeded。因此,您可以在没有计时器的情况下使标签位置动画化。这是我用来制作标题的代码,并在单击按钮时进行扩展:
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UITableViewHeaderFooterView *view = [[UITableViewHeaderFooterView alloc] init];
view.tintColor = [UIColor yellowColor];
UILabel *label = [[UILabel alloc] init];
[label setTranslatesAutoresizingMaskIntoConstraints:NO];
label.backgroundColor = [UIColor redColor];
label.text = @"Test";
[view.contentView addSubview:label];
[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[label]-|" options:0 metrics:nil views:@{@"label":label}]];
[view addConstraint:[NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]];
return view;
}
-(IBAction)expandTable:(id)sender {
self.widthCon.constant = 300;
[UIView animateWithDuration:1 animations:^{
[self.view layoutIfNeeded];
}];
}