Showing/hiding navigation bar with smooth animation

前端 未结 3 1448
隐瞒了意图╮
隐瞒了意图╮ 2020-12-23 09:38

I have a navigation based app. The first view (rootcontroller) starts with three large buttons only. No navigationbar. From there, everything else is tableviews and have

相关标签:
3条回答
  • 2020-12-23 10:01

    This nifty bit of code animates the navigation bar hiding with no UI issues:

    [navigationController setNavigationBarHidden: YES animated:YES]

    But...

    1. Use the self.navigationController.navigationBarHidden property for checks in the code instead of the self.navigationController.navigationBar.hidden property. This will save you a lot of pain from unexpected UI positioning problems.
    2. Take care to place this method in - (void)viewWillAppear:(BOOL)animated or later in the view lifecycle. This is recommended because if you do it in - (void)viewDidLoad for instance, you will get an ugly black rectangular view during animations from a view which displays its navigation bar to a view which doesn't! For example, if your home view has its navigation bar hidden but all its children have the navigation bar shown, when you pop to home view, the animation will show a black bar in place of the navigation bar until the animation completes
    0 讨论(0)
  • 2020-12-23 10:14

    You can customize the navigation bar animation and duration by the following methods. It will provide you callback once animation will be completed.

       // pass a param to describe the state change, an animated flag and a completion block matching UIView animations completion
        - (void)setNavigationBarVisible:(BOOL)visible animated:(BOOL)animated completion:(void (^)(BOOL))completion {
    
            // fail if the current state matches the desired state
            if ([self navigationBarIsVisible] == visible) return completion(YES);
    
            // get a frame calculation ready
            CGFloat nheight = self.navigationController.navigationBar.frame.size.height;
            CGFloat noffsetY = (visible)? -nheight : nheight;
    
            // zero duration means no animation
            CGFloat duration = (animated)? 0.3 : 0.0;
    
            [UIView animateWithDuration:duration animations:^{
                CGRect nframe = self.navigationController.navigationBar.frame;
                self.navigationController.navigationBar.frame = CGRectOffset(nframe, 0, noffsetY);
            } completion:completion];
        }
    
        // know the current state of the navigation bar
        - (BOOL)navigationBarIsVisible {
            return self.navigationController.navigationBar.frame.origin.y < CGRectGetMinY(self.view.frame);
        }
    
        // Show or Hide navigation bar
        [self setNavigationBarVisible:![self navigationBarIsVisible] animated:YES completion:^(BOOL finished) {
            NSLog(@"navigation bar finished");
        }];
    

    Before hide a Navigation bar:

    After hide a Navigation bar:

    0 讨论(0)
  • 2020-12-23 10:15

    You can use [navigationController setNavigationBarHidden:YES animated:YES] to hide the bar smoothly.

    Reference

    0 讨论(0)
提交回复
热议问题