4

在我的应用程序中,我有一个UITableView动态改变宽度的场景。当宽度发生变化时,我会为场景的扩展设置动画 - 包括UITableView.

包含带有自定义视图的UITableView部分标题,其中包含UILabel锚定在视图右侧的 a。

当我的场景的宽度发生变化时,我会像这样对表格的大小调整进行动画处理:

[UIView animateWithDuration:0.22
                      delay:0.02
                    options:UIViewAnimationOptionCurveLinear
                 animations:^
 {
     //Change width to 320 from 220
     [menuTable setFrame:CGRectMake(menuTable.frame.origin.x, menuTable.frame.origin.y, 320, menuTable.frame.size.height)];
 }
                 completion:^(BOOL finished)
 {

 }];

这可以平滑地为表格的调整大小设置动画,但节标题内的标签会弹出到最终目的地 - 它没有动画。

我试过打电话reloadData- 这有同样的效果,没有动画。我试着打电话beginUpdatesendUpdates但它没有效果。

我还应该尝试什么?

4

1 回答 1

1

在我对标签扩展的实验中,我发现 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];
    }];
}
于 2013-05-15T15:49:46.877 回答