Giter Site home page Giter Site logo

smoothnavdemo's Introduction

SmoothNavDemo

平滑的在切换界面时隐藏/显示导航栏的demo

简单版的详细说明请查看传送门壹

进阶版:使用Category和Runtime来做到真正的透明导航栏,以及与不透明导航栏之间切换时的平滑渐变过渡效果。详细说明查看传送门贰

smoothnavdemo's People

Contributors

cloudox avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

smoothnavdemo's Issues

在iOS8和iOS9中会崩溃……

将UINavigationController+Cloudox.m 方法“- (void)setNeedsNavigationBackground:(CGFloat)alpha” 中的barBackgroundView、backgroundImageView、backgroundEffectView修改成下方……

// 导航栏背景透明度设置
UIView *barBackgroundView;// _UIBarBackground
UIImageView *backgroundImageView;// UIImageView
UIView *backgroundEffectView;// UIVisualEffectView

if (@available(iOS 10.0, *)) {//
    barBackgroundView = [self.navigationBar.subviews objectAtIndex:0];
    backgroundImageView = [barBackgroundView.subviews objectAtIndex:0];
    backgroundEffectView = [barBackgroundView.subviews objectAtIndex:1];
}else{
    for (UIView *view in self.navigationBar.subviews) {
        if ([view isKindOfClass:NSClassFromString(@"_UINavigationBarBackground")]) {
            barBackgroundView = view;
        }
    }
    for (UIView *otherView in barBackgroundView.subviews) {
        if ([otherView isKindOfClass:NSClassFromString(@"UIImageView")]) {
            backgroundImageView = (UIImageView *)otherView;
        }else if ([otherView isKindOfClass:NSClassFromString(@"_UIBackdropView")]) {
            backgroundEffectView = otherView;
        }
    }
}

9.3.5 崩溃

iOS 9.3.5 应该是UINavigationBar的层级结构不一样造成了崩溃

// 设置导航栏背景透明度
- (void)setNeedsNavigationBackground:(CGFloat)alpha {
    // 导航栏背景透明度设置
    UIView *barBackgroundView = [[self.navigationBar subviews] objectAtIndex:0];// _UIBarBackground
    UIImageView *backgroundImageView = [[barBackgroundView subviews] objectAtIndex:0];// UIImageView
    if (self.navigationBar.isTranslucent) {
        if (backgroundImageView != nil && backgroundImageView.image != nil) {
            barBackgroundView.alpha = alpha;
        } else {
// 崩溃位置
            UIView *backgroundEffectView = [[barBackgroundView subviews] objectAtIndex:1];// UIVisualEffectView
            if (backgroundEffectView != nil) {
                backgroundEffectView.alpha = alpha;
            }
        }
    } else {
        barBackgroundView.alpha = alpha;
    }
    
    // 对导航栏下面那条线做处理
    self.navigationBar.clipsToBounds = alpha == 0.0;
}

滑动返回发现两个问题

1、返回时会瞬间变白一下
2、从有导航栏的页面快速滑动返回到无导航栏页面时,会出现返回按钮标题和导航栏标题错位

遇到一个问题

用你的库,然后有个需求是白色导航栏,这样我就需要 self.navigationController.navigationBar.translucent = NO; 确实显示白色了;
然后我在返回上一个界面的时候,设置透明 发现无效,所以我又手动 self.navigationController.navigationBar.translucent = YES;

结果报错了,求解

iOS 10之前显示数组越界问题

在iOS 9.3 iPhone5 真机测试的时候,crash在[[barBackgroundView subviews] objectAtIndex:1],iOS 10 之前导航栏的subView和iOS10之后的有所不同,所以数组中只有一个imageView,显示数组越界;
本来想判断[barBackgroundView subviews]的个数防止越界,绕开了这个赋值操作,结果在第二次跳转的时候crash在了backgroundImageView.image,显示'unrecognized selector sent to instance ',最后只判断了是否存在backgroundImageView就设置透明度,目前iOS 10之前之后的版本都试了,真机也跑通了,就是想想下Cloudox,请问这个判断.image是否为空是否是刚需....可能目前只是没遇到这个bug,而已.

`- (void)setNeedsNavigationBackground:(CGFloat)alpha {
// 导航栏背景透明度设置
UIView *barBackgroundView = [[self.navigationBar subviews] objectAtIndex:0];// _UIBarBackground
UIImageView *backgroundImageView = (UIImageView *)[[barBackgroundView subviews] objectAtIndex:0];// UIImageView
if (self.navigationBar.isTranslucent) {
if (backgroundImageView) {// != nil && backgroundImageView.image != nil
barBackgroundView.alpha = alpha;
} else {

        UIView *backgroundEffectView = [[barBackgroundView subviews] objectAtIndex:1];// UIVisualEffectView
        if (backgroundEffectView != nil) {
            backgroundEffectView.alpha = alpha;
        }
    }
} else {
    barBackgroundView.alpha = alpha;
}

// 对导航栏下面那条线做处理
self.navigationBar.clipsToBounds = alpha == 0.0;

}`

导航栏没有隐藏

UIView *barBackgroundView = [self.navigationBar subviews].firstObject;// _UIBarBackground

iOS12 xr机型, 现在的导航栏下边有俩个imageview, 设置父视图barBackgroundView的alpha为0; 还是会显示一条白色, backgroundImageView这个view的alpha还是1
现在我这么做
backgroundImageView.hidden = alpha == 0?YES:NO;
解决的效果

iOS 9 ,5S崩溃

        [coor notifyWhenInteractionChangesUsingBlock:^(id<UIViewControllerTransitionCoordinatorContext> context){
            [self dealInteractionChanges:context];

}];

iOS 11无法隐藏_UIBarBackground

  • (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    self.navBarBgAlpha = @"0";
    }
    iOS11这种写法,无法隐藏_UIBarBackground

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.