【问题标题】:Animating a UIView frame, subview UIScrollView doesn't always animate动画 UIView 框架,子视图 UIScrollView 并不总是动画
【发布时间】:2011-10-02 15:05:18
【问题描述】:

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 上的完整源代码。

【问题讨论】:

    标签: objective-c ios ipad uiscrollview


    【解决方案1】:

    我在 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; }
    

    如果我遗漏了什么,请告诉我:)

    【讨论】:

    • 要测试我在视频中演示的内容,您需要将其添加到 tabbarcontroller,并且我建议您在构建时使用来自 flickr 的各种图片。如果您需要,我可以制作样品。
    【解决方案2】:

    一般来说,如果动画有时有效,有时无效,这是因为在后一种情况下,延迟执行会通过将相关属性设置为其最终值而导致它们被有效取消。

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

    我建议您从-layoutSubviews 中删除您对-[EGOPhotoImageView layoutScrollViewAnimated:] 的调用,并将其添加到覆盖的-setFrame: 中。

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

    【讨论】:

    • 谢谢。后者不起作用,但我会尝试前者。
    • 虽然我还没有解决它,但我想你已经为我指明了正确的方向。我不确定这个特定的转换是在 PhotoImageView 本身上触发的,还是在包含它的滚动条上触发的。
    • 就我个人而言,我会将所有用于将滚动视图的内容居中的逻辑移动到滚动视图子类本身。在那里,您可以覆盖 -setContentOffset: 来执行布局,而不是使用缩放委托方法。
    • 是的,好主意。我想我会在有机会的时候重写这个类的所有显示逻辑(一旦这个项目完成并且我有一些喘息的空间。)还有其他一些小问题,比如滑动图像时轻微的口吃,这我认为与在滚动期间布置其他图像的子视图有关。当它允许我时,我会把你的赏金交给你。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多