gpt4 book ai didi

objective-c - 用动画同时隐藏NavBar和TabBar

转载 作者:太空狗 更新时间:2023-10-30 03:29:30 25 4
gpt4 key购买 nike

编辑:我把赏金奖励给了约翰,因为他为他的回答付出了很多努力,而且无论如何都会得到它,但仍然没有有效的解决方案。我仍在寻找答案,如果有人知道如何做到这一点,我将不胜感激。

我想在我的应用程序中添加一个“最大化”按钮以隐藏导航栏和标签栏。导航栏和标签栏应该平滑地滑入/滑出,内部/内容 View 也应该以与导航栏和标签栏相同的速率扩展和收缩。

我使用 [self.navigationController setNavigationBarHidden: YES/NO animated: YES]; 作为导航栏并找到了这个线程 How to hide uitabbarcontroller用于隐藏标签栏。

UITabBar 类扩展:

- (void) setTabBarHidden:(BOOL)hidden animated:(BOOL)animated {
CGRect screenRect = [[UIScreen mainScreen] bounds];

float screenHeight = screenRect.size.height;
if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
screenHeight = screenRect.size.width;
}
if (!hidden) {
screenHeight -= self.tabBar.frame.size.height;
}
[UIView animateWithDuration: (animated ? UINavigationControllerHideShowBarDuration : 0) animations: ^{
for (UIView* each in self.view.subviews) {
if (each == self.tabBar) {
[each setFrame: CGRectMake(each.frame.origin.x, screenHeight, each.frame.size.width, each.frame.size.height)];
} else {
[each setFrame: CGRectMake(each.frame.origin.x, each.frame.origin.y, each.frame.size.width, screenHeight)];
}
}
} completion: ^(BOOL finished) {
NSLog(@"Animation finished %d", finished);
}];
}

问题是当我同时使用两者时(隐藏/显示导航和标签栏),它不干净。如果导航栏在前,则锚定在底部的任何内容都会跳转(请参见下面的示例),如果标签栏在前,则顶部会跳转。

示例:我将 UIButton 放在右下角并设置其自动调整掩码

resizeButton.frame = CGRectMake(self.view.bounds.size.width - 50, self.view.bounds.size.height - 100, 32, 32); // hardcoded just for testing purposes
resizeButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin;

但是当导航栏和标签栏被最小化时,UIButton 会在两种状态之间跳转(不会随着标签栏一起滑动)。但是,如果我将它更改为附加到右上角,它会与导航栏完美滑动。

有人知道怎么解决吗?


编辑:这是迄今为止我拥有的最精巧和最优雅的解决方案(只是想获得一个可行的概念):

[UIView animateWithDuration: UINavigationControllerHideShowBarDuration animations: ^{
if (self.isMaximized) {
self.tabBarController.view.frame = CGRectMake(0, 20, screenRect.size.width, screenRect.size.height + 49 - 20);
[self.navigationController setNavigationBarHidden:YES animated:YES];
} else {
self.tabBarController.view.frame = CGRectMake(0, 20, screenRect.size.width, screenRect.size.height - 20);
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
} completion: ^(BOOL finished) {
NSLog(@"Frame done: %@", NSStringFromCGRect(self.view.frame));
return;
}];

关于最大化:

  • 向上滑动导航栏,同时向下滑动标签栏
  • inner/content view顶部向上滑动,本view底部向下跳

关于最小化:

  • 向下滑动导航栏,同时向上滑动标签栏
  • 内部/内容 View 的顶部正确向下滑动,但底部跳转到最终值,留下空白,然后由滑动标签栏覆盖

如果我重新排列最小化动画的顺序(因此首先调用导航栏动画),则内部/内容 View 中的顶部会跳转

最佳答案

我使用的解决方案应该可以消除您看到的跳跃问题。

此解决方案源自发现的 Objective-C 类别 Carlos Oliva's github page ,虽然该代码的版权是“保留所有权利”,但我写信给他,他提供了使用许可。

我的类别代码与他的代码略有不同。另外,在类别代码下方找到我在我的应用程序中使用的调用代码。

来自 UITabBarController+HideTabBar.m

// the self.view.frame.size.height can't be used directly in isTabBarHidden or
// in setTabBarHidden:animated: because the value may be the rect with a transform.
//
// further, an attempt to use CGSizeApplyAffineTransform() doesn't work because the
// value can produce a negative height.
// cf. http://lists.apple.com/archives/quartz-dev/2007/Aug/msg00047.html
//
// the crux is that CGRects are normalized, CGSizes are not.

- (BOOL)isTabBarHidden {
CGRect viewFrame = CGRectApplyAffineTransform(self.view.frame, self.view.transform);
CGRect tabBarFrame = self.tabBar.frame;
return tabBarFrame.origin.y >= viewFrame.size.height;
}


- (void)setTabBarHidden:(BOOL)hidden {
[self setTabBarHidden:hidden animated:NO];
}


- (void)setTabBarHidden:(BOOL)hidden animated:(BOOL)animated {
BOOL isHidden = self.tabBarHidden;
if (hidden == isHidden)
return;
UIView* transitionView = [self.view.subviews objectAtIndex:0];

if (!transitionView)
{
#if DEBUG
NSLog(@"could not get the container view!");
#endif
return;
}

CGRect viewFrame = CGRectApplyAffineTransform(self.view.frame, self.view.transform);
CGRect tabBarFrame = self.tabBar.frame;
CGRect containerFrame = transitionView.frame;
tabBarFrame.origin.y = viewFrame.size.height - (hidden ? 0 : tabBarFrame.size.height);
containerFrame.size.height = viewFrame.size.height - (hidden ? 0 : tabBarFrame.size.height);
[UIView animateWithDuration:kAnimationDuration
animations:^{
self.tabBar.frame = tabBarFrame;
transitionView.frame = containerFrame;
}
];
}

来 self 的 ScrollableDetailImageViewController.m

- (void)setBarsHidden:(BOOL)hidden animated:(BOOL)animated
{
[self setTabBarHidden:hidden animated:animated];
[self setStatusBarHidden:hidden animated:animated];

// must be performed after hiding/showing of statusBar
[self.navigationController setNavigationBarHidden:hidden animated:animated];
}

- (void)setTabBarHidden:(BOOL)hidden animated:(BOOL)animated
{
id parent = self.navigationController.parentViewController;
if ([parent respondsToSelector:@selector(isTabBarHidden)]
&& hidden != [parent isTabBarHidden]
&& [parent respondsToSelector:@selector(setTabBarHidden:animated:)])
[parent setTabBarHidden:hidden animated:animated];
}

关于objective-c - 用动画同时隐藏NavBar和TabBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17036961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com