iOS之ToolBar定制

ToorBar的定制

在诸如社区类的app里面,很多都涉及到用户发布消息,如现今最流行的新浪微博,每条信息底部都会有个工具条,正如下图所示,有转发、评论和点赞三个按钮的工具条。

993270-20160905085219754-634797937.png

结构

1.作为一个独立存在的toolBar,必须要有个View作为载体,这里选择用UIImageView;
2.toolBar有三个可以点击的按钮,所以就要创建三个button。

下面直接上代码了!

YJYStatusToolBar.h文件

#import <UIKit/UIKit.h>

@class YJYStatusToolBar;
@class YJYStatus;
typedef enum{
    YJYStatusToolBarButtonTypeRetweet,        //转发            
    YJYStatusToolBarButtonTypeComment,     //评论
    YJYStatusToolBarButtonTypeAttribude       //点赞
}YJYStatusToolBarButtonType;

//设置代理方法,标记点击了哪个按钮
@protocol  YJYStatusToolBarDelegate<NSObject>
-(void)statusToorBarButonClicked:(YJYStatusToolBarButtonType )type status:(YJYStatus *)status;
@end

@interface YJYStatusToolBar : UIImageView
@property (nonatomic, strong)YJYStatus *status;        //传入的数据模型
@property (nonatomic, weak)id<YJYStatusToolBarDelegate>delegate;

@end

YJYStatusToolBar.m文件

993270-20160905094642941-1176184509.png

在.m文件里的私有属性有两个可变数组,和三个按钮,数组通过懒加载创建

-(NSMutableArray *)btns{
    if (!_btns) {
        _btns = [NSMutableArray array];
    }
    return _btns;
}

-(NSMutableArray *)dividesV{
    if (!_dividesV) {
        _dividesV = [NSMutableArray array];
    }
    return _dividesV;
}

重写initWithFrame方法:UIImageView交互必须要打开(self.userInteractionEnabled = YES)

-(instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        [self setupAllChildView];
        self.userInteractionEnabled = YES;
        self.image = [UIImage strechableImage:@"timeline_card_bottom_background"]; 
    }
    return self;
}

在init方法里调用setupAllChildView方法

-(void)setupAllChildView
{
    UIButton *retweet = [self setupOneButtonWithImage:[UIImage imageNamed:@"timeline_icon_retweet"] title:@"转发" type:YJYStatusToolBarButtonTypeRetweet];
    _retweet = retweet;

    UIButton *comment = [self setupOneButtonWithImage:[UIImage imageNamed:@"timeline_icon_comment"] title:@"评论" type:YJYStatusToolBarButtonTypeComment];
    _comment = comment;

    UIButton *unlink = [self setupOneButtonWithImage:[UIImage imageNamed:@"timeline_icon_unlike"] title:@"赞" type:YJYStatusToolBarButtonTypeAttribude];
    _unlink = unlink;

    for (int i = 0; i < 2; i++) {
        UIImageView *divideV = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"timeline_card_bottom_line"]];
        [self addSubview:divideV];
        [self.dividesV addObject:divideV];
    }
}

再抽调方法setupOneButtonWithImage: title: type:

-(UIButton *)setupOneButtonWithImage:(UIImage *)image title:(NSString *)title type:(YJYStatusToolBarButtonType)type
{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setTitle:title forState:UIControlStateNormal];
    [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [button setImage:image forState:UIControlStateNormal];
    button.titleLabel.font = [UIFont systemFontOfSize:12];
    button.titleEdgeInsets = UIEdgeInsetsMake(0, 5, 0, 0);
    button.tag = type;
    [button addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];

    [self addSubview:button];
    [self.btns addObject:button]; //每创建一个button就加入到数字里

    return button;
}

由于在一个View的控件上添加了三个button而没有设置frame值,所以要layoutSubView一下

-(void)layoutSubviews{
    [super layoutSubviews];

    NSUInteger count = self.btns.count;  //通过self.btn.count得出toolBar里button的数量,方便设置frame
    CGFloat w = YJYScreenWidth / count;
    CGFloat h = self.height;
    CGFloat x = 0;
    CGFloat y = 0;

    for (int i = 0; i < count; i++) {                                //设置button的frame
        UIButton *btn = self.btns[i];
        x = w * i;
        btn.frame = CGRectMake(x, y, w, h);
    }
    int i = 1;
    for (UIImageView *divide in self.dividesV) {          //设置间隔线的坐标
        UIButton *btn = self.btns[i];
        divide.x = btn.x;
        i++;
    }
}

实现代理方法:参数有type和status,即是按钮类型和这个消息的数据

-(void)btnClicked:(UIButton *)btn{
    if ([_delegate respondsToSelector:@selector(statusToorBarButonClicked:status:)]) {
        [_delegate statusToorBarButonClicked:(YJYStatusToolBarButtonType)btn.tag status:self.status];
    }
}

因为toolBar上有转发数,评论数和点赞数,涉及到数据模型YJYStatusModel,所以实现一下setter的方法

-(void)setStatus:(YJYStatus *)status
{
    _status = status;

    [self setBtn:_retweet title:status.reposts_count];
    [self setBtn:_comment title:status.comments_count];
    [self setBtn:_unlink title:status.attitudes_count];

}
-(void)setBtn:(UIButton *)btn title:(int)count
{    
    NSString *title = nil;
    if (count) {
        if (count >= 10000) {
            CGFloat floatCount = count / 10000.0;
            title = [NSString stringWithFormat:@"%.1fW", floatCount];
            title = [title stringByReplacingOccurrencesOfString:@".0" withString:@""];
        }else{
            title = [NSString stringWithFormat:@"%i", count];
       }
        [btn setTitle:title forState:UIControlStateNormal];
    }
}

用到的工具类

993270-20160905102459379-567072627.png

UIImage+Image.m主要方法:图片渲染和图片拉伸的两个方法

+(instancetype)imageWithOriginName:(NSString *)imageName{
    UIImage *image = [UIImage imageNamed:imageName];
    return [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
}
+(instancetype)strechableImage:(NSString *)imageName{
    UIImage *image = [UIImage imageNamed:imageName];
    return [image stretchableImageWithLeftCapWidth:image.size.width / 2 topCapHeight:image.size.height / 2];
}

UIView+Frame.m 坐标的拓展方法:x.y.with.height.size五个坐标属性的getter和setter方法

- (CGFloat)width
{
    return self.frame.size.width;
}
- (void)setWidth:(CGFloat)width
{
    CGRect frame = self.frame;
    frame.size.width = width;
    self.frame = frame;
}
- (CGFloat)height
{
    return self.frame.size.height;
}
- (void)setHeight:(CGFloat)height
{
    CGRect frame = self.frame;
    frame.size.height = height;
    self.frame = frame;
}
- (CGFloat)x
{
    return self.frame.origin.x;
}
- (void)setX:(CGFloat)x
{
    CGRect frame = self.frame;
    frame.origin.x = x;
    self.frame = frame;
}
- (CGFloat)y
{
    return self.frame.origin.y;
}
- (void)setY:(CGFloat)y
{
    CGRect frame = self.frame;
    frame.origin.y = y;
    self.frame = frame;
}
- (CGSize)size
{
    return self.frame.size;
}
- (void)setSize:(CGSize)size
{
    CGRect frame = self.frame;
    frame.size = size;
    self.frame = frame;
}

转载于:https://www.cnblogs.com/YaoJinye/p/5841067.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园悬赏任务平台对字典管理、论坛管理、任务资讯任务资讯公告管理、接取用户管理、任务管理、任务咨询管理、任务收藏管理、任务评价管理、任务订单管理、发布用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行校园悬赏任务平台程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。校园悬赏任务平台的开发让用户查看任务信息变得容易,让管理员高效管理任务信息。 校园悬赏任务平台具有管理员角色,用户角色,这几个操作权限。 校园悬赏任务平台针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理任务信息,管理任务资讯公告信息等内容。 校园悬赏任务平台针对用户设置的功能有:查看并修改个人信息,查看任务信息,查看任务资讯公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看任务,删除任务操作,新增任务操作,修改任务操作。任务资讯公告信息管理页面提供的功能操作有:新增任务资讯公告,修改任务资讯公告,删除任务资讯公告操作。任务资讯公告类型管理页面显示所有任务资讯公告类型,在此页面既可以让管理员添加新的任务资讯公告信息类型,也能对已有的任务资讯公告类型信息执行编辑更新,失效的任务资讯公告类型信息也能让管理员快速删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值