gpt4 book ai didi

iphone - 动画化 UITableView 部分标题的自定义 View

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:22:06 24 4
gpt4 key购买 nike

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

UITableView 包含带有自定义 View 的节标题,其中包含锚定到 View 右侧的 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 但没有任何效果。

我还应该尝试什么?

最佳答案

在我的标签扩展实验中,我发现 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。如果您正在使用自动布局,则应该通过更改约束而不是更改框架来制作任何动画。我没有在节标题中使用标签尝试过此操作,但我认为如果您使用此方法为表格的宽度设置动画,并且标签的约束按照表格扩展的方式设置,它会起作用。

编辑后:

经过更多的实验,似乎计时器方法是使其也适用于移动标签(而不是展开标签)的唯一方法。在那种情况下,宽度约束将是表格 View 本身。

第二次编辑后:

更多实验。我发现问题出在调用 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];
}];
}

关于iphone - 动画化 UITableView 部分标题的自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16568631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com