【问题标题】:How to hide custom tab bar button when hidesBottomBarWhenPushed is "TRUE"当 hidesBottomBarWhenPushed 为“TRUE”时如何隐藏自定义标签栏按钮
【发布时间】:2012-06-28 20:30:57
【问题描述】:

我正在使用 Tito 的代码 sn-p 将自定义按钮添加到我的标签栏: https://github.com/tciuro/CustomTabBar

(继承 UITabbarController 并使用添加自定义按钮

// .. created a UIButton *button
[self.view addSubview:button];

)

这对我的基于故事板的应用程序非常有用,但导航控制器中的子视图启用了“在推送时隐藏底栏”选项的情况除外。 这会按承诺隐藏标签栏,但不会隐藏自定义按钮。 似乎按钮应该作为子视图添加到标签栏本身? 我尝试了这个丑陋的代码,它甚至没有显示按钮:

for(UIView *view in self.view.subviews)
{
    if([view isKindOfClass:[UITabBar class]])
    {
        [view addSubview:button];
        break;
    }
}

有什么想法吗?

更新: 我的解决方案: 在我的 ApplicationDelegate 中,我定义了以下方法,只要需要,我就会在 viewWillAppear 或 viewWillDisappear 方法中调用它们:

-(void)hideCenterButton:(BOOL)animated
{
    if(animated){

    [UIView animateWithDuration:0.3
                          delay:0.0f
                        options:UIViewAnimationCurveLinear
                     animations:^{
                         CGRect frame = self.centerButton.frame;
                         frame.origin.x = -100;
                         self.centerButton.frame = frame;
                     }
                     completion:^(BOOL finished){
                     }];
    }
}

-(void)showCenterButton:(BOOL)animated
{
    if(animated){

    [UIView animateWithDuration:0.35
                          delay:0.0f
                        options:UIViewAnimationCurveLinear
                     animations:^{
                         CGRect frame = self.centerButton.frame;
                         frame.origin.x = (self.view.superview.frame.size.width / 2) - (self.centerButton.frame.size.width / 2);
                         self.centerButton.frame = frame;
                     }
                     completion:^(BOOL finished){
                     }];
    }
}

我必须将动画的持续时间设置为 0.35 秒才能获得与标签栏相协调的平滑效果。

【问题讨论】:

  • 嘿,UIViewAnimationCurveLinear 会抛出警告,你应该改用UIViewAnimationOptionCurveLinear
  • 经过一些测试,看起来最自然的动画选项是UIViewAnimationOptionCurveEaseInOut
  • 我测试了你的代码,它可以工作,但是按钮返回到标签栏后面,有什么解决办法吗?

标签: ios ios5 uitabbarcontroller


【解决方案1】:

为什么不把按钮作为标签栏的一部分。

tabBarController.tabBar.addSubView(yourButton)

一切都会解决的。干杯!

【讨论】:

    【解决方案2】:

    我认为有两种方法可以解决这个问题。

    1) 尝试将按钮放入旧顶视图控制器上方的视图和标签栏但在被推送的新顶视图控制器下方的视图中。

    2) 当新的视图控制器被按下时,按钮动画消失。

    第一个需要处理未记录、不受支持且随时可能更改的 iOS 专有视图层次结构。

    第二个问题是让动画看起来足够流畅,让您的用户不会注意到。这不完全是表现完美的问题,只是表现得恰到好处。

    我个人会推荐按钮消失的动画(将其 alpha 设置为 0)并根据您的视图控制器越过标签栏是出现还是消失而重新出现。

    导航动画是(我相信)0.3 秒。如果按钮位于标签栏的中间,您可能希望它在视图控制器中的动画到达它时不可见(如果不是更早的话),因此可以使用 0.1 到 0.15 秒之间的时间将其动画出来。

    现在这并没有使按钮的行为与标签栏完全相同,但是由于转换的速度如此之短,用户不会真正注意到它。

    现在只是提供一个问题让您问自己。为什么需要推送一个与标签栏重叠的视图控制器?为什么这比呈现模态视图控制器更可取/必要?如果您可以强烈支持它,请坚持下去,祝您好运,如果没有必要,您也许可以使用模态视图控制器获得您想要的体验。

    【讨论】:

    • 感谢您的建议。我通过在我的应用程序委托中定义两个函数来选择您的第二个解决方案。查看我的更新
    【解决方案3】:

    处理此问题的一种简单方法是在文件的 .h 中创建按钮的实例。

    UIButton *customTabButton;
    

    在按下时调用隐藏底栏时,将按钮属性设置为隐藏,如果底栏可见,则在其他视图中再次将其重置。

        shareFbButton.hidden=YES;
    

    您可以检查这是所有文件的 viewDidLoad 并在需要时放置这行代码,以确保您在所有需要的页面上显示按钮并隐藏按钮。

     if(self.tabBarController.tabBar.isHidden){
    
     // set or reset the custom button visibility here 
    }
    

    这是一种方式。

    【讨论】:

    • 请解释一下,删除子视图会如何干扰用户界面。在一个屏幕被推出之前,按钮丢失并且看起来很糟糕。想知道其他应用是如何做到这一点的。
    • 我不确定你在问我什么,你能改写一下这个问题吗?
    【解决方案4】:

    选中this 以在UITabBar 上放置一个按钮。使用hidesBottoBarWhenPushed 看看它是否有效。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多