个人相册开发(4)

一.导航栏类的准备

1.创建一个XLNavigationController类,用于管理导航栏的一些设置

2.向UIConstants中导入一些颜色设置

//导航栏的背景颜色
#define kNavigationBarTintColor [UIColor colorWithRed:249/255.0 green:245/255.0 blue:248/255.0 alpha:1];

//按钮的颜色
#define kNavigationBarItemColor [UIColor colorWithRed:99/255.0 green:102/255.0 blue:111/255.0 alpha:1]

3.导航栏的相关设置

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //设置背景颜色
    self.navigationBar.barTintColor = kNavigationBarTintColor;
    
    //设置导航栏标题的字体大小和字体颜色
    self.navigationBar.titleTextAttributes = @{NSFontAttributeName:[UIFont systemFontOfSize:20],NSForegroundColorAttributeName:[UIColor blackColor]};
}

二.工具条类的准备

1.创建XLToolBarView类,用于充当工具条的作用

2..在EnumConstants里面定义一个block类型,用于回调工具条哪一个按钮被点击了

//定义一个block类型,用于自定义toolBar回调按钮的事件
typedef void(^ToolBarBlock) (NSInteger index);

3.定义一个数组用于接受创建的按钮信息和用于回调那个按钮被点击的变量

/**接受外部传递的信息*/
@property (nonatomic,copy) NSArray *itemsArray;

/**回调某个按钮被点了*/
@property (nonatomic,copy) ToolBarBlock block;

4.重写initWithFrame方法,设置背景颜色

-(instancetype)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
        
        self.backgroundColor = kNavigationBarTintColor;
    }
    return self;
}

5.重写itemsArray的set方法,将按钮显示

#pragma mark -------重写itemsArray的set方法 ---------
-(void)setItemsArray:(NSArray *)itemsArray{
    
    _itemsArray = itemsArray;
    
    //计算按钮之间的间距
    CGFloat kPadding = (SCREEN_WIDTH-itemsArray.count*kSize) / (itemsArray.count+1);
    
    //添加
    for (int i = 0; i < itemsArray.count; i++) {
        
        //创建
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        
        //坐标
        btn.frame = CGRectMake(kPadding+i*(kPadding+kSize), (42-kSize)/2.0, kSize, kSize);
        
        //tag值
        btn.tag = i+1;
        
        //赋予图片
        [btn setImage:[UIImage imageNamed:[itemsArray objectAtIndex:i]] forState:UIControlStateNormal];
        
        //添加事件
        [btn addTarget:self action:@selector(btnDidClicked:) forControlEvents:UIControlEventTouchUpInside];
        
        //显示
        [self addSubview:btn];
    }
}

#pragma mark -------按钮被点了 ---------
-(void)btnDidClicked:(UIButton *)sender{
    
    if (self.block) {
        
        self.block(sender.tag);
    }
    
}

三.界面类的准备

1.创建XLBaseViewController类,作为各个界面的父类

2.定义两个block类型,用于正常按钮和返回按钮被点击的回调事件

//定义的block类型
typedef void (^BackBlock)(void);
typedef void (^ItemBlock)(UIButton *item);

3.在EnumConstants里面加入两个将要用到的枚举

//导航栏上添加按钮的位置
typedef NS_ENUM(NSInteger,kButtonPostionType){
    kButtonPostionTypeLeft,  //左边
    kButtonPostionTypeRight, //右边
    kButtonPostionTypeNone   //不需要位置
};

//工具条的类型
typedef NS_ENUM(NSInteger,ToolBarType) {
    ToolBarTypeMain,  //主界面
    ToolBarTypeAlbum, //相册
    ToolBarTypeBrowser//相册浏览
};

4.定义一些接口用于相关设置

//添加正常按钮
-(UIBarButtonItem *)addItemWithName:(NSString *)name postion:(kButtonPostionType)postion complish:(ItemBlock)block;

//添加返回按钮
-(void)addBackItem:(BackBlock)block;

//添加logo
-(void)addLogo;

//添加ToolBar
-(void)showToolBarWithType:(ToolBarType)type handle:(ToolBarBlock)block;

//隐藏ToolBar
-(void)hideToolBar;

5.导入工具条类,定义一些要用到的变量,并设置默认背景颜色

#import "XLBaseViewController.h"
#import "XLToolBarView.h"

@interface XLBaseViewController ()

/**返回按钮的block属性变量*/
@property (nonatomic,copy) BackBlock backBlock;

/**左边按钮的block属性变量*/
@property (nonatomic,copy) ItemBlock leftItemBlock;

/**右边按钮的block属性变量*/
@property (nonatomic,copy) ItemBlock rightItemBlock;

/**底部工具栏*/
@property (nonatomic,strong) XLToolBarView *toolBarView;

@end

@implementation XLBaseViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //设置默认背景颜色
    self.view.backgroundColor = [UIColor whiteColor];
}

6.写一个方法用来创建正常按钮

#pragma mark -------创建按钮 ---------
-(UIBarButtonItem *)createItemWithTitle:(NSString *)title image:(NSString *)imgName action:(SEL)action postion:(kButtonPostionType)postion{
    
    //获取图片
    UIImage *img = [UIImage imageNamed:imgName];
    //获取一张可拉伸的图片,拉伸点为图片的中心点
    UIImage *stretchableImg = [img stretchableImageWithLeftCapWidth:img.size.width/2.0 topCapHeight:img.size.height/2.0];
    
    //创建
    UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 45, 30)];
    //设置tag值辨别左右,0左边,1右边,参考枚举
    btn.tag = postion;
    //设置图片
    [btn setBackgroundImage:stretchableImg forState:UIControlStateNormal];
    //设置文本
    [btn setTitle:title forState:UIControlStateNormal];
    //设置文本颜色
    [btn setTitleColor:kNavigationBarItemColor forState:UIControlStateNormal];
    //添加事件
    [btn addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];
    //创建UIBarItem
    UIBarButtonItem *barItem = [[UIBarButtonItem alloc] initWithCustomView:btn];
    
    return barItem;
}

7.创建正常按钮和返回按钮,并添加方法

#pragma mark -------添加一个按钮-给左边还是右边,以及block ---------
-(UIBarButtonItem *)addItemWithName:(NSString *)name postion:(kButtonPostionType)postion complish:(ItemBlock)block{
    
    //创建按钮
    UIBarButtonItem *item = [self createItemWithTitle:name image:nil action:@selector(barBarItemDidClick:) postion:postion];
    
    //判断创建的按钮位置
    if (postion == kButtonPostionTypeLeft) {
        
        //显示
        self.navigationItem.leftBarButtonItem = item;
        
        //保存block
        self.leftItemBlock = block;
    }else{
        
        //显示
        self.navigationItem.rightBarButtonItem = item;
        
        //保存block
        self.rightItemBlock = block;
    }
    
    return item;
}

#pragma mark -------添加返回按钮 ---------
-(void)addBackItem:(BackBlock)block{
    
    //保存block
    self.backBlock = block;
    
    //创建按钮
    UIBarButtonItem *back = [self createItemWithTitle:@"Back" image:nil action:@selector(backBarItemDidClick:) postion:kButtonPostionTypeNone];
    //显示
    self.navigationItem.leftBarButtonItem = back;
}

#pragma mark -------正常按钮触发的事件 ---------
-(void)barBarItemDidClick:(UIButton *)sender{
    
    //判断按钮的位置-回调事件
    if (sender.tag == kButtonPostionTypeLeft) {
        
        if (self.leftItemBlock) {
            self.leftItemBlock(sender);
        }
    }else{
        
        if (self.rightItemBlock) {
            self.rightItemBlock(sender);
        }
        
    }
}

#pragma mark -------返回按钮触发的事件 ---------
-(void)backBarItemDidClick:(UIBarButtonItem *)sender{
    
    //回调事件
    if (self.backBlock) {
        self.backBlock();
    }
    
    //返回上一个界面
    [self.navigationController popViewControllerAnimated:YES];
}

8.导入素材,并实现添加logo的方法

-(void)addLogo{
    
    //设置图片大小
    UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 120, 19)];
    
    //设置图片
    imgView.image = [UIImage imageNamed:@"NavigationBar_Logo_normal"];
    
    //显示
    self.navigationItem.titleView = imgView;
}

9.实现添加工具条和移除工具条的方法

#pragma mark -------添加ToolBar ---------
-(void)showToolBarWithType:(ToolBarType)type handle:(ToolBarBlock)block{
    
    NSArray *itemsArray = nil;
    
    if (type == ToolBarTypeMain) {
        
        //主界面
        itemsArray = @[@"select-all",@"delete"];
    }else if(type == ToolBarTypeAlbum){
        
        //相册界面
        itemsArray = @[@"select-all",@"copy",@"cut",@"delete"];
    }else{
        
        //相册浏览界面
        itemsArray = @[@"delete",@"more"];
    }
    
    //创建toolBar
    self.toolBarView = [[XLToolBarView alloc] initWithFrame:CGRectMake(0, SCREEN_HEIGHT, SCREEN_WIDTH, 42)];
    //接受数据
    _toolBarView.itemsArray = itemsArray;
    //保存block
    _toolBarView.block = block;
    
    //显示
    [self.view addSubview:_toolBarView];
    [UIView animateWithDuration:0.5 animations:^{
        _toolBarView.y = SCREEN_HEIGHT-42;
    }];
}

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

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,111评论 1 32
  • 昨晚和一个半年没见的老朋友喝酒,她看起来心情不错,几瓶酒下肚她开始哭,然后跟我讲了她这几年来的故事。 在这里暂且称...
    第三十二片海阅读 619评论 0 0