Bob*_*ryn 6 objective-c uiscrollview ipad ios
在这个例子中.
当我为tabBarController设置动画(用于全屏效果)时,我正在为PhotoViewerViewController的框架设置动画.PhotoViewer使用uiscrollview生成Apple的照片应用程序所具有的相同效果.无论出于何种原因,它有时会与我的PhotoViewer框架一起动画,有时则不会.
您可以在第一个示例中看到它在增加帧大小时跳转,但在减小帧大小(并恢复标签栏)时可以很好地动画.
然而,在这个例子中,当照片是垂直的时,它会向两个方向跳跃.
在这两种情况下,如果我使用滚动视图完全放大照片,它会在两个方向上正确动画.
我知道有证据,但我无法理解这里发生的事情.
这是我的动画块:
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];
}
}
}
};
Run Code Online (Sandbox Code Playgroud)
代码改编自SO上的帖子:UITabBar不会隐藏
github上的完整源代码.
一般来说,如果动画有时会起作用,有时则不起作用,那是因为在后一种情况下,延迟执行会通过将相关属性设置为其最终值来有效地取消它们.
在特殊情况下,UIScrollView通常会-layoutSubviews在动画块关闭后调用没有动画的一个运行循环.出于这个原因,我通常会尝试避免在该方法中进行任何布局,因为我UIScrollView在视图层次结构中有一个(因为特别是在iOS 5之前,UIScrollView在设置自己需要布局时真的很高兴.)
我会建议删除您的来电-[EGOPhotoImageView layoutScrollViewAnimated:]来自-layoutSubviews并将其添加到一个覆盖-setFrame:代替.
如果您可以定位iOS4及更高版本,请查看UIViewAnimationOptionLayoutSubviews.使用基于块的动画作为选项可能只是工作而不更改任何其他内容.