cloudox / smoothnavdemo Goto Github PK
View Code? Open in Web Editor NEW平滑的在切换界面时隐藏/显示导航栏的demo
平滑的在切换界面时隐藏/显示导航栏的demo
iOS12 运行不了上来就崩溃,数组越界,[[self.navigationBar subviews] objectAtIndex:0]; 为什么self.navigationBar subviews 一个控件都没有,做了什么操作么?
将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;
}
}
}
RT, 能麻烦说下你的 xocde和 iOS 版本么
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;
}
运行模拟器 直接报错 环境 模拟器 iphone6 系统版本 8.1
@implementation UINavigationController (Cloudox) 第24行 数组越界
iOS 7兼容吗
1、返回时会瞬间变白一下
2、从有导航栏的页面快速滑动返回到无导航栏页面时,会出现返回按钮标题和导航栏标题错位
-(NSString *)navBarBgAlpha{
return objc_getAssociatedObject(self, CloudoxKey) ? : @"1.0";
}
加了段这个,似乎是可行的。
只需要在透明度切换的两个vc中设置navBarBgAlpha值即可
若不透明的vc不设置alpha值,会在vc已经显示完毕后 navbar才恢复不透明。
UIView *barBackgroundView = [self.navigationBar subviews].firstObject;// _UIBarBackground
iOS12 xr机型, 现在的导航栏下边有俩个imageview, 设置父视图barBackgroundView的alpha为0; 还是会显示一条白色, backgroundImageView这个view的alpha还是1
现在我这么做
backgroundImageView.hidden = alpha == 0?YES:NO;
解决的效果
用你的库,然后有个需求是白色导航栏,这样我就需要 self.navigationController.navigationBar.translucent = NO; 确实显示白色了;
然后我在返回上一个界面的时候,设置透明 发现无效,所以我又手动 self.navigationController.navigationBar.translucent = YES;
结果报错了,求解
滑动的时候导航条会变白一下
[coor notifyWhenInteractionChangesUsingBlock:^(id<UIViewControllerTransitionCoordinatorContext> context){
[self dealInteractionChanges:context];
}];
在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;
}`
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.