UITableView帧高度动画故障

问题描述 投票:18回答:8

如果我试图为tableView(例如:height -= 200)的帧高设置动画,则在帧的平滑动画完成之前,最后200px中出现的单元格会突然消失。

为了确保我正在做的其他事情,我创建了一个新的基于视图的应用程序。在主要的viewController我用足够的tableview创建我自己的pseudo rows来填满整个屏幕。在选择一行时,我会做一个简单的高度动画。

最相关的代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.myTable = [[[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)] autorelease];
    myTable.delegate = self;
    myTable.dataSource = self;
    [self.view addSubview:myTable];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    CGRect frame = self.myTable.frame;
    frame.size.height = 200;
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDelay:.5f];
    [UIView setAnimationDuration:0.5f];
    self.myTable.frame = frame;
    [UIView commitAnimations];
}

有谁知道为什么会这样,或者修复/解决方法可能是什么?

任何建议真的很感激。 TIA!

objective-c iphone uitableview
8个回答
15
投票

我不确定我是否有完全相同的问题,但使用[UIView setAnimationBeginsFromCurrentState:YES];解决了(部分)故障(我的表格视图在动画帧高度变化时疯狂地滑动)。


8
投票

这里也有同样的问题。这就是我正在做的事情并且原点动画平滑,但是尺寸立即变化......很烦人。

    [UIView beginAnimations:@"HideTabbar" context:nil];
    [UIView setAnimationDuration:.3];
        self.tableView.frame = CGRectMake(0.0, 44.0, 320, 366);
    [UIView commitAnimations];

更新:尝试在动画之前添加:

self.tableView.autoresizingMask = UIViewAutoresizingNone;

4
投票

对于今后遇到这个问题和答案的人来说,这里是如何在iOS 4中引入的UIView基于块的动画中使用@ ryyst的答案。

    [UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
            // change frame etc here
    } completion:^(BOOL finished) {
            // any clean up here
    }];

3
投票

这是一个古老的问题,已经有一些解决方法的建议,但我想我会添加我的。

我最终动画了contentInsetscrollIndicatorInsets属性,这提供了表本身正在调整大小的错觉。


1
投票

我有完全一样的问题。我认为tableviews在“setFrame:”上有一个特殊的行为,似乎tableview删除了新框架不可见的单元格。

在动画的情况下,单元格仅在动画结束时不可见,但似乎tableviews不关心。

如果有人有更好的理论,我会很高兴听到它!


0
投票

终于找到了解决方案!确实有一个错误!!不要使用variables,当动画高度使用[[UIScreen mainScreen] bounds]。像这样:

[UIView animateWithDuration:0.5 animations:^{
            tableView.frame=CGRectMake(0, 38, fullScreenRect.size.width, [[UIScreen mainScreen] bounds].size.height-38);
}];

不是:

[UIView animateWithDuration:0.5 animations:^{
            tableView.frame=CGRectMake(0, 38, fullScreenRect.size.width, fullScreenRect.size.width-38);
}];

它会像魔术一样工作!


0
投票

我在寻找适当的方法来调整tableView时发现了你的问题。我认为你的问题是在你的动画中你指定了UIView而不是UITableView。我无法使用UIViewUITableView复制您的问题,但我使用的是SDK 3.1,它可能是自您的帖子以来已修复的错误。我不确定,但我希望这有帮助!


0
投票

这是一个古老的问题,但这可能有助于未来的某些人;

我通过在tableview中嵌入UIView并调整UIView而不是tableview来解决类似的问题。我将tableview's高度设置为一个较大的值,并在UIView上设置“剪辑子视图”属性。我调整UIView的大小与tableview的contentSize成比例。它不是一个好的解决方案,但它适用于我的目的。

© www.soinside.com 2019 - 2024. All rights reserved.