2013-05-15 43 views
3

在我的应用程序中,我有一个场景内的UITableView动态更改宽度。当宽度改变时,我为场景的扩展添加动画 - 包括UITableView动画UITableView部分标题的自定义视图

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

当我的场景变化的宽度,我动画的表像这样调整大小:

[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,但它没有效果。

我还应该尝试什么?

+0

您是否使用自动布局? – rdelmar

+0

UILabel的动画文字不会变化。如果您为标签设置背景颜色,则应该看到标签框架正确动画,文本等待后跳转到位。您需要UILabel的一个子类来完全控制文本如何生成。 –

+0

@rdelmar - 我正在使用自动布局。 – BreadicalMD

回答

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的宽度约束我把在标签上。如果您使用自动布局,您应该通过更改约束来执行任何动画,而不是更改框架。我没有在节标题中用标签试过,但我认为它会起作用,如果您使用此方法为表的宽度设置动画,并且标签的约束条件设置为遵循表的扩展。

编辑后:

更多的试验后,它看起来像计时器的方法是,使之成为移动标签(而不是扩大它)工作过的唯一途径。在这种情况下,宽度约束将是表格视图本身。

第二个编辑后:

更多的实验。我发现问题是调用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]; 
    }]; 
} 
+0

我实际上并没有改变标签的宽度,只有它的位置。所以也许Ryan Poolos所说的宽度变化是正确的,但对于位置变化,至少在这种情况下,这不是问题。 使用计时器手动移动标签的框架可能会奏效,但这很麻烦。我希望这是最后的手段 - 在我看来,应该有一种方法来向Section Header View表明它应该有动画? – BreadicalMD

+0

@BreadicalMD,好的,对不起,我误解了你的问题。但是我的建议是用约束进行动画处理仍然存在 - 如果使用约束对表的宽度变化进行动画处理,则标签位置应该正确地跟随。我会更新我的答案以反映这一点。 – rdelmar

+0

这也行不通:不幸的是,试图阻止表本身从动画 - 它的宽度现在改变而不是动画。 'self.tableWidth.constant = 320; [UIView animateWithDuration:0.22 delay: 0.02 选项:UIViewAnimationOptionCurveLinear 动画:^ { [menuTable layoutSubviews]; [self.view layoutSubviews]; } 完成:^(BOOL完成) { }];' – BreadicalMD

相关问题