支付宝NavBar模拟中遇到的问题及解决办法

前言

在模拟支付宝的过程中,遇到的第一个问题就是NavBar的实现,一开始打算的是自定义NavBar,但是在push和pop的时候没有了原版的动画效果,所以决定用系统自带的方法完成。接下来讲一下过程。
下面是两者的效果图。


自定义bar.png
系统方法bar.png

正文

左侧账单按钮实现

首先是左边的账单按钮,代码如下:

    UIButton *leftBtn = [UIButton new];
    leftBtn.frame = CGRectMake(0, 0, 60, 32);
    [leftBtn setImage:[[UIImage imageNamed:@"home_bill"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forState:UIControlStateNormal];
    [leftBtn setTitle:@"账单" forState:UIControlStateNormal];
    leftBtn.titleLabel.font = [UIFont systemFontOfSize:14];
    [leftBtn setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted];
    [leftBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    UIBarButtonItem *leftBarButton = [[UIBarButtonItem alloc] initWithCustomView:leftBtn];
    self.navigationItem.leftBarButtonItem = leftBarButton;

界面如下:

bar1.png

但是发现两个问题:
1、图片和文字考的太近,这个简单,只需要设置一下按钮的inset。具体可以看另一篇文章:Button的titleEdgeInsets和imageEdgeInsets

    [leftBtn setImageEdgeInsets:UIEdgeInsetsMake(0, 6, 0, 0)];
    [leftBtn setTitleEdgeInsets:UIEdgeInsetsMake(0, 12, 0, 0)];

效果蛮好,


bar2.png

2、账单按钮太靠右
想让按钮靠左,其实也不复杂。代码:

    UIBarButtonItem *leftSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
    leftSpace.width = - 16.0f;
    self.navigationItem.leftBarButtonItems = @[leftSpace, leftBarButton];

大致的解释一下代码,其实就是传建一个width为-16的item来占位,因为宽度为负数,所以leftBarButton不仅不会向右移,反而向左移了。
需要注意的是,这里我设置的width为-16.0f刚好为leftBarButtonItem的x。举个例子:设置width为-15.0f:


bar3.png

虽然不是很清楚,但是隐约可以看到按钮左侧仍有一个像素的宽度。
好了,左侧按钮完成:

bar4.png

右侧两个按钮实现

接下来要实现的是右侧两个按钮,我第一时间想到的就是使用rightBarButtonItems。来试一下:

    UIBarButtonItem *rightAddItem = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"add_tag_reverse"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:nil];
    UIBarButtonItem *rightContactItem = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"home_contacts"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:nil];
    self.navigationItem.rightBarButtonItems = @[rightAddItem, rightContactItem];
bar5.png

恩,两个按钮距离太远了,我就想到了刚刚账单按钮的方法,创建一个占位按钮,我们来试一下。

    UIBarButtonItem *rightSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
    rightSpace.width = -16.0f;
    self.navigationItem.rightBarButtonItems = @[rightAddItem, rightSpace,rightContactItem];
bar6.png

显然没什么效果,因为好奇我又换了一下items的顺序,把占位item放到最前看看有没有效果:

self.navigationItem.rightBarButtonItems = @[rightSpace, rightAddItem, rightContactItem];
bar7.png

有效果,这样看来放在两个item中间是没什么效果的。那怎么该怎么实现呢?
其实一开始我也是各种百度各种搜索,但是怎么也找不到我这么细节的问题,后来在贤者时间才想到的😁。
解决办法就是把这两个按钮放在一个view上,再设置view为leftItems的其中一个,这样就可以自由控制按钮的位置啦。

    UIView *btnView = [UIView new];
    btnView.frame = CGRectMake(0, 0, 64, 32);
    btnView.backgroundColor = [UIColor clearColor];

    UIButton *addBtn = [UIButton new];
    addBtn.frame = CGRectMake(32, 0, 32, 32);
    [addBtn setImage:[UIImage imageNamed:@"add_tag_reverse"] forState:UIControlStateNormal];
    [btnView addSubview:addBtn];

    UIButton *personBtn = [UIButton new];
    personBtn.frame = CGRectMake(0, 0, 32, 32);
    [personBtn setImage:[UIImage imageNamed:@"home_contacts"] forState:UIControlStateNormal];
    [btnView addSubview:personBtn];

    UIBarButtonItem *rightBarButton = [[UIBarButtonItem alloc] initWithCustomView:btnView];
    UIBarButtonItem *rightSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
    rightSpace.width = -16.0f;
    self.navigationItem.rightBarButtonItems = @[rightSpace, rightBarButton];

代码很清楚,就不再说了。

bar8.png

搜索栏实现

首先我们得先了解titleView到底是怎么放的。先做几个实验。实验代码如下且类似,但是会改变titleView的高度和宽度。

    UIView *titleView = [UIView new];
    titleView.frame = CGRectMake(0, 0, kWidth, 200);
    titleView.backgroundColor = [UIColor greenColor];
    self.navigationItem.titleView = titleView;

下面是效果图:

(10,200).png
(320,10).png
(320,200).png
不设置右侧item.png
右侧item的宽为200.png

可以发现,当titleView的宽度大于一定的值后,
titleView的宽就不会再大了,这个值取决于左右侧的item的宽度。
知道了这些就有助于设置searchBar了。
searchBar的实现比较简单,不多说,直接放代码。

    UITextField *searchBar = [UITextField new];
    searchBar.frame = CGRectMake(0, 0, kWidth, 28);
    searchBar.layer.cornerRadius = 2;
    searchBar.font = [UIFont systemFontOfSize:14];
    UIImageView *searchBarLeftView = [UIImageView new];
    searchBarLeftView.frame = CGRectMake(12, 7, 14, 14);
    searchBarLeftView.image = [UIImage imageNamed:@"front_search_icon"];
    [searchBar addSubview:searchBarLeftView];
    UIImageView *searchBarRightView = [UIImageView new];
    searchBarRightView.frame = CGRectMake(160, 6.5, 10, 15);
    searchBarRightView.image = [UIImage imageNamed:@"ap_titlebar_search_voice"];
    [searchBar addSubview:searchBarRightView];
    searchBar.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 0)];
    searchBar.leftViewMode = UITextFieldViewModeAlways;
    searchBar.backgroundColor = [UIColor colorWithRed:47/255.0 green:141/255.0 blue:214/255.0 alpha:1.0];
    searchBar.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"搜索" attributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
    searchBar.borderStyle = UITextBorderStyleNone;
    self.navigationItem.titleView = searchBar;

最后

温馨提示:能用系统的那就尽量别自定义了啊喂!

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,382评论 25 707
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,345评论 0 17
  • 1 苏生得美。 小而瘦而挺的脸上,一双眼睛尤其灵动,嘀溜溜转来转去,一点也不象45岁的女人,还留着一点少女态。尤其...
    徐徐大猫阅读 307评论 0 2
  • 目录 赵国,宫内偏殿。 一大早,康王赵敬祖穿好朝服,入宫来觐见赵帝。因五公主多次提到,想和女儿昭阳郡主聚一聚,康王...
    张若扬阅读 375评论 3 5