UITableView帧高度动画故障

时间:2009-08-23 04:08:53

标签: objective-c iphone uitableview

如果我尝试设置tableView的帧高(ex: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!

8 个答案:

答案 0 :(得分:15)

我不确定完全同样的问题,但使用[UIView setAnimationBeginsFromCurrentState:YES];解决了(部分)毛刺(我的表视图在动画帧高度变化时疯狂滑动)

答案 1 :(得分: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;

答案 2 :(得分: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 :(得分:3)

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

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

答案 4 :(得分:1)

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

如果是动画,单元格只会在动画结束时才会显示,但似乎表格视图无关紧要。

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

答案 7 :(得分: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);
}];

它会像魔法一样工作!