>

首先说一下定义navgationBar的分类,sbf282.com复制代

- 编辑:澳门博发娱乐官网 -

首先说一下定义navgationBar的分类,sbf282.com复制代

 

UltraEdit 换行替换,ultraedit换行替换

需求:想在每行结尾添加   '),

sbf282.com 1

 

 

方案:在查找栏填写(^r^n)  替换栏('),^r^n)

sbf282.com 2

 

效果:

sbf282.com 3

 

换行替换,ultraedit换行替换 需求:想在每行结尾添加 '), 方案:在查找栏填写( ^r^n ) 替换栏( '),^r^n ) 效果:...

 

2、记录透明度

每个控制器都应该有自己的导航栏透明度且当透明度发生变化后我们都应该把值保存下来,以方便下次的使用,这里我们就给UIViewController添加一个分类并加一个navBarAlpha的属性,这样我们就可以直接通过控制器去设置导航栏的透明度啦~

- (CGFloat)xa_navBarAlpha{
    return [objc_getAssociatedObject(self, _cmd)floatValue] ;
}

- (void)setXa_navBarAlpha:(CGFloat)xa_navBarAlpha{
    if(xa_navBarAlpha > 1){
        xa_navBarAlpha = 1;
    }
    if(xa_navBarAlpha < 0){
        xa_navBarAlpha = 0;
    }
    objc_setAssociatedObject(self, @selector(xa_navBarAlpha), @(xa_navBarAlpha), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    [self.navigationController xa_changeNavBarAlpha:xa_navBarAlpha];
}
/**
 设置导航栏背景色

 @param color 背景色
 */
- (void)lm_setNavgationBarBackgroundColor:(UIColor *)color;


/**
 设置导航栏透明度

 @param alpha 透明度
 */
- (void)lm_setNavgationBarBackgroundAlpha:(CGFloat)alpha;


/**
 设置导航栏位移
 @param translationY 位移
 */
- (void)lm_setTranslationY:(CGFloat)translationY;
/**
 重置导航栏
 */
- (void)lm_resetNavgation;

/**
 显示导航栏下面的分割线
 */
- (void)lm_showNavigationBarBottomLineView;

/**
 隐藏导航栏下面的分割线
 */
- (void)lm_hiddenNavigationBarBottomLineView;

 

 动画效果是我根据自己的喜好来写的,喜欢的可以自己更改特效。。

3、实现平滑过渡

现在存在的问题就是我在某个页面设置了导航栏的透明度,back回上一个界面,导航栏的透明度值仍然是上个界面的

sbf282.com 4

navbug

这里做过渡有两种情况,一种是手势滑动back回上一个界面,还有一种情况是直接点击了back按钮回到上一个界面的。根据这两种情况我们分别做一下处理。

下拉放大,上推缩小.gif

需求:想在每行结尾添加   '),

复制代码 代码如下:

3.2、按钮点击back

当点击buttonItem back控制器的时候我们可以在'viewWillAppear:'的时候设置回当前控制器的透明度值,所以我们同样要交换'viewWillAppear:'方法的实现,那么每当控制器要显示的时候,我们总是要将它重置回当前控制器应有的透明度值。

这里另外还需要做两个逻辑判断:

  • 一个是判断手势是否正在滑动。如果是YES表示当前的状态是手势滑动back的状态则不需要处理。
  • 另外一个逻辑是判断当前控制器是否设置过navBarAlpha的属性值。如果有设置过,那么每次控制器要显示的时候都要将导航栏透明度设置成控制器储存的透明值。反之,我们给这个控制器设置一个默认的透明度值
- (void)xa_viewWillAppear:(BOOL)animated{
    [self xa_viewWillAppear:animated];

    //当前控制器父控制器是导航控制器并且不是通过手势滑动显示的
    if([self.parentViewController isKindOfClass:[UINavigationController class]] &&
       (!self.navigationController.xa_isGrTransitioning)){
        //如果在控制器初始化的时候用户设置过导航栏的值,那么我们直接设置该导航栏应有的透明度值,没有设置过的话默认透明度给1
        if(self.xa_didSetBarAlpha){
            [self.navigationController xa_changeNavBarAlpha:self.xa_navBarAlpha];
        }else{
            self.xa_navBarAlpha = 1;
        }
    }
}

有经验的同学,一看就知道利用runtime完成这个分类效果最佳:

本文由胜博发-操作发布,转载请注明来源:首先说一下定义navgationBar的分类,sbf282.com复制代