动画UIView框架,子视图UIScrollView并不总是动画

时间:2011-07-11 08:49:52

标签: objective-c ios ipad uiscrollview

this示例中。

当我为tabBarController设置动画(用于全屏效果)时,我正在为PhotoViewerViewController的框架设置动画。 PhotoViewer使用uiscrollview生成Apple的照片应用程序所具有的相同效果。无论出于何种原因,它有时会与我的PhotoViewer框架一起动画,有时它不会。

你可以在第一个例子中看到它在增加帧大小时跳转,但在减小帧大小(和恢复标签栏)时动画效果很好。

然而,在this示例中,当照片垂直时,它会向两个方向跳跃。

在这两种情况下,如果我使用滚动视图完全放大照片,它会在两个方向上正确动画。

我知道有证据,但我无法理解这里发生的事情。

这是我的动画块:

void (^updateProperties) (void) = ^ {
    self.navigationController.navigationBar.alpha = hidden ? 0.0f : 1.0f;
    self.navigationController.toolbar.alpha = hidden ? 0.0f : 1.0f;
    if (self.tabBarController) {

        int height = self.tabBarController.tabBar.bounds.size.height;
        for(UIView *view in self.tabBarController.view.subviews)
        {
            int newHeight;
            UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
            if (UIInterfaceOrientationIsPortrait(orientation)) {
                newHeight = hidden ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.height - height;
            } else {
                newHeight = hidden ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.width - height;
            }


            if([view isKindOfClass:[UITabBar class]])
            {
                [view setFrame:CGRectMake(view.frame.origin.x, newHeight, view.frame.size.width, view.frame.size.height)];
            } 
            else 
            {
                CGRect newFrame = CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, newHeight);
                [view setFrame:newFrame];

                // update our VC frame with animation
                [self.view setFrame:newFrame];

            }

        }
    }

};

根据SO上的帖子改编的代码:UITabBar wont hide

github上的完整来源。

2 个答案:

答案 0 :(得分:6)

一般情况下,如果动画有时会起作用,有时却不起作用,那是因为在后一种情况下,延迟执行会通过将相关属性设置为最终值来有效地取消它们。

UIScrollView的特定情况下,经常会在动画块关闭后调用-layoutSubviews而没有动画一个运行循环。出于这个原因,我通常会尝试避免在该方法中进行任何布局,其中我在视图层次结构中有UIScrollView(因为特别是在iOS 5之前,UIScrollView真的很高兴自己需要设置自己需要布局)。

我建议您从-[EGOPhotoImageView layoutScrollViewAnimated:]移除对-layoutSubviews的来电,然后将其添加到被覆盖的-setFrame:

如果您可以定位iOS4及更高版本,请查看UIViewAnimationOptionLayoutSubviews。使用基于块的动画作为选项可能只是在不改变任何其他内容的情况下工作。

答案 1 :(得分:0)

我在iPad 4.2和4.3模拟器上尝试了你的github代码,它工作正常......没有任何图像调整大小!可能存在一些版本问题。 此外,我尝试更改您的动画块,以下内容用于相同的目的:

void (^updateProperties) (void) = ^ {
            self.navigationController.navigationBar.alpha = hidden ? 0.0f : 1.0f;
            self.navigationController.toolbar.alpha = hidden ? 0.0f : 1.0f; }

如果我遗漏了某些东西,请告诉我。)