iOS 自定义导航栏按钮的那些事儿

关于导航栏

iOS系统自2007年1月在苹果举办的MacWorld大会上伴随着第一款苹果手机问世以来,经历过数版本的衍变,当初的第一代手机,曾经被无数人吐槽的所谓智能机,在数10年间迅速边成了全球无数果粉痴迷的产品,在外观从iPhone1到iPhone5s一直延续乔布斯人性化的设计理念,虽然后来的第六代,第七代产品以及最近曝光的iPhone8慢慢摆脱乔布斯的影子,但在用户体验,简约设计等花费的功夫更不逊色与历代的任何一款产品。

不论如何衍变,iOS系统从1.0发展到如今的10.3,有一个细节是值得我们关注的,那就是导航栏,从7.0以前常见的系统自带的导航栏到7.0之后扁平化的风格,给UI交互上提升了一大步。

接下来回到文章的主题,在iOS系统中导航栏使用UINavigationController作为容器,装载并管理视图控制器UIViewController的进栈和出栈,在UIViewController切换的过程中,导航栏发挥了桥梁的作用。

系统导航栏

在实际开发过程中,经常遇到系统默认的导航栏,可以满足简单的需求,系统提供的样式如下:

typedefNS_ENUM(NSInteger, UIBarButtonSystemItem) {

UIBarButtonSystemItemDone,

UIBarButtonSystemItemCancel,

UIBarButtonSystemItemEdit,

UIBarButtonSystemItemSave,

UIBarButtonSystemItemAdd,

UIBarButtonSystemItemFlexibleSpace,

UIBarButtonSystemItemFixedSpace,

UIBarButtonSystemItemCompose,

UIBarButtonSystemItemReply,

UIBarButtonSystemItemAction,

UIBarButtonSystemItemOrganize,

UIBarButtonSystemItemBookmarks,

UIBarButtonSystemItemSearch,

UIBarButtonSystemItemRefresh,

UIBarButtonSystemItemStop,

UIBarButtonSystemItemCamera,

UIBarButtonSystemItemTrash,

UIBarButtonSystemItemPlay,

UIBarButtonSystemItemPause,

UIBarButtonSystemItemRewind,

UIBarButtonSystemItemFastForward,

UIBarButtonSystemItemUndoNS_ENUM_AVAILABLE_IOS(3_0),

UIBarButtonSystemItemRedoNS_ENUM_AVAILABLE_IOS(3_0),

UIBarButtonSystemItemPageCurlNS_ENUM_AVAILABLE_IOS(4_0),

};

举个例子:左边放两个系统按钮,右边放3个按钮,需要注意的是leftBarButtonItems的数组是从左往右摆放,而rightBarButtonItems是从右往左摆放

- (void)viewDidLoad {

[superviewDidLoad];

self.title=@"Detail";

self.view.backgroundColor=[UIColorwhiteColor];

UIBarButtonItem*reply=[[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemReplytarget:nilaction:nil];

UIBarButtonItem*add=[[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAddtarget:nilaction:nil];

UIBarButtonItem*book=[[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarkstarget:nilaction:nil];

UIBarButtonItem*search=[[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemSearchtarget:nilaction:nil];

UIBarButtonItem*refresh=[[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemRefreshtarget:nilaction:nil];

self.navigationItem.leftBarButtonItems=@[reply,add];

self.navigationItem.rightBarButtonItems=@[refresh,search,book];

}

运行结果如下:


自定义导航栏

在如今各种层出不穷的app中,尤其是爆款至上的年代,系统按钮远远满足不了各位PM大咖的要求,学会使用自定义导航栏是自管重要的,接下来先上一段代码。

UIImageView*saveImgv=[[UIImageViewalloc]initWithFrame:CGRectMake(0,0,22,22)];

saveImgv.image=[UIImageimageNamed:@"保存.png"];//保存

UIImageView*shareImgv=[[UIImageViewalloc]initWithFrame:CGRectMake(0,0,22,22)];

shareImgv.image=[UIImageimageNamed:@"分享.png"];//分享

UIBarButtonItem*saveBitem=[[UIBarButtonItemalloc]initWithCustomView:saveImgv];

UIBarButtonItem*shareBitem=[[UIBarButtonItemalloc]initWithCustomView:shareImgv];

UIBarButtonItem*spaceBar = [[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpacetarget:nilaction:nil];

spaceBar.width=15;//间隔作用

self.navigationItem.rightBarButtonItems=@[shareBitem,spaceBar,saveBitem];

完美的解决的了自定义按钮之间的间隔


自定义导航栏动画效果

控制器在跳转过程中执行了push或者pop动画都是系统自带的,从左往右滑动,或者present 和dismiss 从下往上弹出视图,在特定的场景下有时需要自定义跳转的动画,或者跟随手势的上下滑动而执行跳转或者退出的动画,这时候自定义动画可以满足这样场景。

首先需要实现导航栏的两个代理

@interfaceViewController()<UINavigationControllerDelegate,UIViewControllerTransitioningDelegate>

@end


#pragma mark UINavigationControllerDelegatepush pop

-(id)navigationController:(UINavigationController*)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController*)fromVC toViewController:(UIViewController*)toVC {

if(operation==UINavigationControllerOperationPush) {

PushAniation *pushani=[[PushAniation alloc]init];//自定义一个跳转动画继承UIViewControllerAnimatedTransitioning

returnpushani;

}elseif(operation==UINavigationControllerOperationPop) {

PopAniation *pushani=[[PopAniation alloc]init];//自定义一个跳转动画继承UIViewControllerAnimatedTransitioning

returnpushani;

}

returnnil;

}

顺便贴上自定义动画的代码,可以根据自己的需求改动动画:

#import

#import

@interfaceWGC_CustomPushAnimation :NSObject

@end

------------------WGC_CustomPushAnimation。

#import"WGC_CustomPushAnimation.h"

#import"FUTabBarControllerMgr.h"

@implementationWGC_CustomPushAnimation

-(NSTimeInterval)transitionDuration:(id)transitionContext {

return0.3;

}

//设定好了转场的动画的起始位置和最终位置,系统自己计算出中间帧,当执行动画时候,系统自动播放帧,我不用去维护这个动画的帧

-(void)animateTransition:(id)transitionContext {

//目的ViewController

UIViewController*toView=[transitionContextviewControllerForKey:UITransitionContextToViewControllerKey];

//起始ViewController

UIViewController*fromView=[transitionContextviewControllerForKey:UITransitionContextFromViewControllerKey];

UIView*containerViews=[transitionContextcontainerView];

//添加toView到上下文

[containerViewsinsertSubview:toView.viewaboveSubview:fromView.view];

//自定义动画

CGRectbound=[UIScreenmainScreen].bounds;

toView.view.transform=CGAffineTransformMakeTranslation(0, bound.size.height);

[UIViewanimateWithDuration:[selftransitionDuration:transitionContext]animations:^{

//fromView.view.transform = CGAffineTransformMakeTranslation(-320, -568);

toView.view.transform=CGAffineTransformIdentity;//相当于初始状态,有点像重置

}completion:^(BOOLfinished) {

fromView.view.transform=CGAffineTransformIdentity;//相当于初始状态,有点像重置

[[FUTabBarControllerMgrshareMgr]hidenWithAnimation:YES];

//声明过渡结束时调用completeTransition:这个方法

[transitionContextcompleteTransition:![transitionContexttransitionWasCancelled]];

if(![transitionContexttransitionWasCancelled]) {

[[FUTabBarControllerMgrshareMgr]hidenWithAnimation:YES];

}

}];

}

@end

参考这个方法即可完成导航栏自定义动画的效果。

欢迎各位同学指出问题,相互学习~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容