viewDidAppear 上的动画 UIImageView 和 UITableView

Posted

技术标签:

【中文标题】viewDidAppear 上的动画 UIImageView 和 UITableView【英文标题】:Animated UIImageView and UITableView on viewDidAppear 【发布时间】:2012-12-18 14:42:26 【问题描述】:

我有一个UIViewController,我的徽标居中,UITableView alpha 为 0。

viewDidAppear: 我有这个:

[UIView animateWithDuration:0.6 delay:0.0 options:UIViewAnimationCurveEaseInOut animations:^
    [self.logo setFrame:CGRectMake(0.0f, self.view.frame.size.height - 194.0f, 320.0f, 194.0f)];
 completion:^(BOOL finished) 
    [self.table setFrame:CGRectMake(0.0f, 0.0f, 320.0f, self.view.frame.size.height - 194.0f)];

    [UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationCurveEaseInOut animations:^
        [self.table setAlpha:1.0];
     completion:^(BOOL finished) 
        return;
    ];

    return;
];

好的,动画就是我想要的。

但是当我调用presentModalViewController: 显示下一个视图时,UIImageView 回到屏幕中心,UITableView 回到之前的高度。

动画完成后如何保持相同的大小和位置,甚至改变视图?

谢谢。

【问题讨论】:

你什么时候看到他们回去?在您关闭模态视图控制器后或显示时? 【参考方案1】:

我假设您将原始帧设置在 viewDidLoad 中,除非模态清除您的系统内存,否则这很好。视图会尽可能地被缓存。因此,如果您的 modal 使用了足够的内存来重置它,viewDidLoad 会再次被调用来重置您的视图。

解决此问题的一种快速简便的方法是在 dismissViewController:animated: 方法(如果您正在使用它)中设置您想要的值,或者为模式设置一个委托方法。

如果您没有其中任何一个,则需要以某种方式检查这是否是第一次加载。不过,这不是一种干净的处理方式。如果您显示更多代码,我们可能会找到更好的解决方案。

【讨论】:

【参考方案2】:

注意:您使用了错误的选项常量。而不是UIViewAnimationCurveEaseInOut,应该使用UIViewAnimationOptionCurveEaseInOut。这可能不会影响您的问题,但它很糟糕。

此外,您不需要在完成块中使用 return 语句。

我会检查您的 viewWillDisappear 和 viewDidDisappear 方法中的代码。您可能正在那里(甚至在 layoutSubviews 中)进行初始布局,这正在重置视图。

【讨论】:

以上是关于viewDidAppear 上的动画 UIImageView 和 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

UIView 上的顶部空间约束,而不是 UIImag

在 ViewDidAppear 上更改核心动画持续时间似乎不起作用

iOS 编程:viewDidAppear 中的自定义按钮

动画完成后执行转场

无法使用 Swift 为 UILabel 设置动画

在带有 Xamarin.iOS 的 iOS 7 上的 ViewDidAppear 方法中显示阻止的 UIAlertView 不起作用