首页 文章

iOS 11大 Headers 更改事件

提问于
浏览
2

我希望在iOS 11大 Headers 更改时获得此活动 . 即,当用户滚动视图时,它将位置更改为导航栏和从导航栏更改 . 我已经检查了UINavigationBar类,但我无法从中获取它 .

我要实现的屏幕设计就像大 Headers 可见时我想要透明导航栏但是当 Headers 滚动到导航栏时我想要纯色的导航栏 .

3 回答

  • 1

    它可以通过scrollViewDidScroll func获取UINavigationBar的当前高度来完成 .

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
    
        //Get current height of navigation bar when tableview/collectionview/scrollview did scroll
        guard let navBarHeight = navigationController?.navigationBar.frame.height else {
            return
        }
    
        //Compare with standard height of navigation bar.
        if navBarHeight > 44.0 {
            self.navigationController?.navigationBar.shadowImage = UIImage()
            self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
            self.navigationController?.navigationBar.barTintColor = .clear
        } else {
            self.navigationController?.navigationBar.shadowImage = nil
            self.navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
            self.navigationController?.navigationBar.barTintColor = .green
        }
    }
    
  • 2

    Piyush Hirpara答案(关于性能)的一个小改进是子类化您的navigationBar并且仅在 layoutSubviews 上更新:

    class ObservingLargeTitleNavigationBar: UINavigationBar {
    
        override func layoutSubviews() {
            super.layoutSubviews()
    
            updateLargeTitle()
        }
    
        private func updateLargeTitle() {
            if #available(iOS 11.0, *) {
                if frame.height >= 44 {
                    // code logic when large title is visible
                } else {
                    // code logic when large title is hidden
                }
            }
        }
    }
    

    请注意,在某些情况下可能需要调整 frame.height44 的值 . 我在 60 有它,例如我在iPhone X上的配置 .

  • 2

    我在UIViewController的子类的ViewWillAppear中添加了这个观察者 . 并根据其高度设置颜色如下:

    在ViewWillAppear中:

    UINavigationBar *navBar = self.navigationController.navigationBar;
    [navBar addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];
    

    在viewWillDisappear中:

    UINavigationBar *navBar = self.navigationController.navigationBar;
    [navBar removeObserver:self forKeyPath:@"frame" context:NULL];
    
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if ([keyPath isEqualToString:@"frame"]) {
        [self setNavigationBarColour];;
    }
    

    }

    - (void)setNavigationBarColour
    {
        UINavigationBar *navBar = self.navigationController.navigationBar;
        CGFloat height = navBar.bounds.size.height;
        if(height>44)
        {
            [navBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
            [navBar setTranslucent:YES];
            [navBar setShadowImage:[UIImage new]];
        }
        else
        {
            [navBar setBackgroundImage:[[UINavigationBar appearance] backgroundImageForBarMetrics:UIBarMetricsDefault] forBarMetrics:UIBarMetricsDefault];
            [navBar setTranslucent:NO];
            [navBar setShadowImage:[[UINavigationBar appearance] shadowImage]];
        }
    }
    

相关问题