【问题标题】:UITableView frame height animation glitchUITableView 帧高动画故障
【发布时间】:2009-08-23 04:08:52
【问题描述】:

如果我尝试为 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];
}

有谁知道为什么会发生这种情况,或者可能有什么修复/解决方法?

非常感谢任何建议。 蒂亚!

【问题讨论】:

    标签: objective-c iphone uitableview


    【解决方案1】:

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

    【讨论】:

    • 谢谢。为我解决了。问题:动画外部视图(框架) - 并调整内部文本视图的大小(只有新高度 - pos 应保持不变)
    【解决方案2】:

    这里也有同样的问题。这就是我正在做的事情,原点动画流畅,但大小立即改变......烦人。

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

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

    self.tableView.autoresizingMask = UIViewAutoresizingNone;
    

    【讨论】:

    • 将自动调整掩码更改为“无”在我的情况下绝对有效。谢谢。
    【解决方案3】:

    对于将来遇到此问题和答案的任何人,以下是如何在 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
        }];
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

        • 经过几天的研究,这似乎是正确的理论。我不确定在过去的 9 年中是否有任何变化 :) 你有没有看到任何解决方法?
        【解决方案6】:

        终于找到解决办法了!确实有bug!!不要使用 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);
        }];
        

        它会像魔术一样工作!

        【讨论】:

          【解决方案7】:

          我在寻找调整 tableView 大小的正确方法时发现了您的问题。我认为您的问题出在您指定UIView 而不是UITableView 的动画中。我无法使用UIViewUITableView 复制您的问题,但我使用的是SDK 3.1,这可能是您发布后已修复的错误。我不确定,但我希望这会有所帮助!

          【讨论】:

          • 不,对动画调用使用“UIView”方法是正确的。
          • 我也用 3.1 尝试了相同的代码,但对我来说仍然是个问题;/我目前的解决方法是等待动画完成,然后再调整 tableview 的大小
          【解决方案8】:

          这是一个老问题,但这可能对将来的某人有所帮助;

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

          【讨论】:

          • 这将导致另一个问题,您将无法看到 tableView 的最后几个单元格,因为它们位于 tableView 的框架内但远低于 containerUIView 的可见框架,因此当您尝试滚动它时 tableView 会反弹,因为它已到达单元格的尽头,但您仍然看不到它们
          猜你喜欢
          • 2019-02-13
          • 1970-01-01
          • 2022-09-27
          • 2014-11-24
          • 2013-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-23
          相关资源
          最近更新 更多