山寨“饿了么”应用中添加菜品数量按钮效果
本人视频教程系类 iOS中CALayer的使用
最终效果:
山寨源头:
源码:(此源码解决了重用问题,可以放心的放在cell中使用)
AddAndDeleteButton.h 与 AddAndDeleteButton.m
//
// AddAndDeleteButton.h
// LabelControll
//
// Created by YouXianMing on 14/12/11.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
//
#import <UIKit/UIKit.h>
typedef enum : NSUInteger {
CNY, // 人民币
GBP, // 英镑
JPY, // 日元
USD, // 美元
} EnumMoneyType;
@protocol AddAndDeleteButtonDelegate <NSObject>
@optional
- (void)currentCount:(NSNumber *)count;
@end
@interface AddAndDeleteButton : UIView
@property (nonatomic, weak) id<AddAndDeleteButtonDelegate> delegate;
/**
* 数目(数目为0就会隐藏)
*/
@property (nonatomic, strong) NSNumber *count;
/**
* 单价(商品单价)
*/
@property (nonatomic, strong) NSNumber *price;
/**
* 设置数目
*
* @param count 数目
* @param animted 时候执行动画
*/
- (void)setCount:(NSNumber *)count animated:(BOOL)animted;
/**
* 起始值
*
* @param count 值
*/
- (void)startValue:(NSNumber *)count;
@end
//
// AddAndDeleteButton.m
// LabelControll
//
// Created by YouXianMing on 14/12/11.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
//
#import "AddAndDeleteButton.h"
typedef enum : NSUInteger {
UIBUTTON_ADD = 10,
UIBUTTON_DELETE,
} EnumAddAndDeleteButton;
// 控件总体的宽度
static CGFloat width = 150;
// 控件总体的高度
static CGFloat height = 28;
// 添加按钮的宽度
static CGFloat addButtonWidth = 60;
// 控件之间的间隙
static CGFloat gap = 7;
static CGFloat label_10_99 = 5;
static CGFloat label_100_999 = 10;
// 隐藏位置的frame值(后面要用)
static CGRect hidenRect; // 0
static CGRect labelRect; // 1 - 9
static CGRect deleteRect; // 1 - 9
static CGRect labelRect_10_99; // 10 - 99
static CGRect deleteRect_10_99; // 10 - 99
static CGRect labelRect_100_999; // 100 - 999
static CGRect deleteRect_100_999; // 100 - 999
@interface AddAndDeleteButton ()
@property (nonatomic, strong) UIView *backedView;
@property (nonatomic, strong) UIButton *addButton; // 添加的按钮
@property (nonatomic, strong) UILabel *countLabel; // 计数的标签
@property (nonatomic, strong) UIButton *deleteButton; // 删除的按钮
@end
@implementation AddAndDeleteButton
+ (void)initialize {
if (self == [AddAndDeleteButton class]) {
// 0时候的frame值
hidenRect = CGRectMake(width - height, 0, height, height);
// 1到9的frame值
labelRect = CGRectMake(width - addButtonWidth - gap - height, 0, height, height);
deleteRect = CGRectMake(width - addButtonWidth - (gap + height)*2, 0, height, height);
// 10到99的frame值
labelRect_10_99 = CGRectMake(width - addButtonWidth - gap - (height + label_10_99), 0,
height + label_10_99, height);
deleteRect_10_99 = CGRectMake(width - addButtonWidth - (gap + height) - (gap + height + label_10_99), 0,
height, height);
// 100到999的frame值
labelRect_100_999 = CGRectMake(width - addButtonWidth - gap - (height + label_100_999), 0,
height + label_100_999, height);
deleteRect_100_999 = CGRectMake(width - addButtonWidth - (gap + height) - (gap + height + label_100_999), 0,
height, height);
}
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// 添加背景图层
_backedView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
[self addSubview:_backedView];
// 计数的标签
_countLabel = [[UILabel alloc] initWithFrame:CGRectMake(width - addButtonWidth - gap - height, 0, height, height)];
_countLabel.backgroundColor = [UIColor whiteColor];
_countLabel.layer.backgroundColor = [UIColor whiteColor].CGColor;
_countLabel.layer.borderWidth = 1.f;
_countLabel.layer.cornerRadius = 4.f;
_countLabel.layer.masksToBounds = YES;
_countLabel.layer.borderColor = [UIColor colorWithRed:0.898 green:0.898 blue:0.902 alpha:1].CGColor;
_countLabel.text = @"0";
_countLabel.textAlignment = NSTextAlignmentCenter;
_countLabel.textColor = [UIColor colorWithRed:0.945 green:0.102 blue:0.325 alpha:1];
[self addSubview:_countLabel];
// 删除按钮
_deleteButton = [[UIButton alloc] initWithFrame:CGRectMake(width - addButtonWidth - (gap + height)*2, 0, height, height)];
_deleteButton.backgroundColor = [UIColor colorWithRed:0.792 green:0.796 blue:0.800 alpha:1];
_deleteButton.tag = UIBUTTON_DELETE;
[_deleteButton addTarget:self
action:@selector(buttonsEvent:)
forControlEvents:UIControlEventTouchUpInside];
_deleteButton.layer.cornerRadius = 4.f;
_deleteButton.layer.masksToBounds = YES;
[self addSubview:_deleteButton];
// 添加按钮
_addButton = [[UIButton alloc] initWithFrame:CGRectMake(width - addButtonWidth, 0, addButtonWidth, height)];
[_addButton setTitle:@"$10.00" forState:UIControlStateNormal];
[_addButton addTarget:self
action:@selector(buttonsEvent:)
forControlEvents:UIControlEventTouchUpInside];
_addButton.tag = UIBUTTON_ADD;
[_addButton setTitleColor:[UIColor colorWithRed:0.957 green:0.984 blue:0.949 alpha:1]
forState:UIControlStateNormal];
_addButton.titleLabel.font = [UIFont systemFontOfSize:16.f];
_addButton.layer.cornerRadius = 4.f;
_addButton.backgroundColor = [UIColor colorWithRed:0.475 green:0.796 blue:0.329 alpha:1];
[self addSubview:_addButton];
}
return self;
}
- (void)buttonsEvent:(UIButton *)button {
if (button.tag == UIBUTTON_ADD) {
[self setCount:@(self.count.intValue + 1) animated:YES];
} else if (button.tag == UIBUTTON_DELETE) {
[self setCount:@(self.count.intValue - 1) animated:YES];
}
if (_delegate && [_delegate respondsToSelector:@selector(currentCount:)]) {
[_delegate currentCount:self.count];
}
}
- (void)startValue:(NSNumber *)count {
if (count.integerValue == 0) {
self.count = count;
_countLabel.frame = hidenRect;
_countLabel.alpha = 0.f;
_countLabel.text = @"0";
_deleteButton.frame = hidenRect;
_deleteButton.alpha = 0.f;
return;
}
if (count.integerValue >= 1 && count.integerValue <= 9) {
self.count = count;
_countLabel.frame = labelRect;
_countLabel.alpha = 1.f;
_countLabel.text = count.stringValue;
_deleteButton.frame = deleteRect;
_deleteButton.alpha = 1.f;
return;
}
if (count.integerValue >= 10 && count.integerValue <= 99) {
self.count = count;
_countLabel.frame = labelRect_10_99;
_countLabel.alpha = 1.f;
_countLabel.text = count.stringValue;
_deleteButton.frame = deleteRect_10_99;
_deleteButton.alpha = 1.f;
return;
}
if (count.integerValue >= 100 && count.integerValue <= 999) {
self.count = count;
_countLabel.frame = labelRect_100_999;
_countLabel.alpha = 1.f;
_countLabel.text = count.stringValue;
_deleteButton.frame = deleteRect_100_999;
_deleteButton.alpha = 1.f;
return;
}
}
- (void)setCount:(NSNumber *)count animated:(BOOL)animted {
if (count.intValue == 1000) {
return;
}
_count = count;
// 设置数为0而且标签上的值为1时(从1减到0的情况) 1 --> 0
if (count.intValue == 0 && _countLabel.text.intValue == 1) {
if (animted) {
[UIView animateWithDuration:0.35f animations:^{
_countLabel.frame = hidenRect;
_countLabel.alpha = 0.f;
_countLabel.text = @"0";
_deleteButton.frame = hidenRect;
_deleteButton.alpha = 0.f;
}];
} else {
_countLabel.frame = hidenRect;
_countLabel.alpha = 0.f;
_countLabel.text = @"0";
_deleteButton.frame = hidenRect;
_deleteButton.alpha = 0.f;
}
return;
}
// 设置数目为1而且标签上的值为0时(从0加到1的情况) 0 --> 1
if (count.intValue == 1 && _countLabel.text.intValue == 0) {
if (animted) {
[UIView animateWithDuration:0.35f animations:^{
_countLabel.frame = labelRect;
_countLabel.alpha = 1.f;
_countLabel.text = @"1";
_deleteButton.frame = deleteRect;
_deleteButton.alpha = 1.f;
}];
} else {
_countLabel.frame = labelRect;
_countLabel.alpha = 1.f;
_countLabel.text = @"1";
_deleteButton.frame = deleteRect;
_deleteButton.alpha = 1.f;
}
return;
}
// 设置数目从9到10时候的动画 9 --> 10
if (count.intValue == 10 && _countLabel.text.intValue == 9) {
if (animted) {
[UIView animateWithDuration:0.35f animations:^{
_countLabel.frame = labelRect_10_99;
_countLabel.alpha = 1.f;
_countLabel.text = @"10";
_deleteButton.frame = deleteRect_10_99;
_deleteButton.alpha = 1.f;
}];
} else {
_countLabel.frame = labelRect_10_99;
_countLabel.alpha = 1.f;
_countLabel.text = @"10";
_deleteButton.frame = deleteRect_10_99;
_deleteButton.alpha = 1.f;
}
return;
}
// 设置数目从9到10时候的动画 10 --> 9
if (count.intValue == 9 && _countLabel.text.intValue == 10) {
if (animted) {
[UIView animateWithDuration:0.35f animations:^{
_countLabel.frame = labelRect;
_countLabel.alpha = 1.f;
_countLabel.text = @"9";
_deleteButton.frame = deleteRect;
_deleteButton.alpha = 1.f;
}];
} else {
_countLabel.frame = labelRect;
_countLabel.alpha = 1.f;
_countLabel.text = @"9";
_deleteButton.frame = deleteRect;
_deleteButton.alpha = 1.f;
}
return;
}
// 99 --> 100
if (count.intValue == 100 && _countLabel.text.intValue == 99) {
if (animted) {
[UIView animateWithDuration:0.35f animations:^{
_countLabel.frame = labelRect_100_999;
_countLabel.alpha = 1.f;
_countLabel.text = @"100";
_deleteButton.frame = deleteRect_100_999;
_deleteButton.alpha = 1.f;
}];
} else {
_countLabel.frame = labelRect_100_999;
_countLabel.alpha = 1.f;
_countLabel.text = @"100";
_deleteButton.frame = deleteRect_100_999;
_deleteButton.alpha = 1.f;
}
return;
}
// 100 --> 99
if (count.intValue == 99 && _countLabel.text.intValue == 100) {
if (animted) {
[UIView animateWithDuration:0.35f animations:^{
_countLabel.frame = labelRect_10_99;
_countLabel.alpha = 1.f;
_countLabel.text = @"99";
_deleteButton.frame = deleteRect_10_99;
_deleteButton.alpha = 1.f;
}];
} else {
_countLabel.frame = labelRect_10_99;
_countLabel.alpha = 1.f;
_countLabel.text = @"99";
_deleteButton.frame = deleteRect_10_99;
_deleteButton.alpha = 1.f;
}
return;
}
// 11 - 98
if (count.intValue >= 10 && count.intValue <= 99) {
_countLabel.frame = labelRect_10_99;
_countLabel.text = count.stringValue;
_deleteButton.frame = deleteRect_10_99;
return;
}
// 2 --> 8
if (count.intValue >= 1 && count.intValue <= 9) {
_countLabel.frame = labelRect;
_countLabel.text = count.stringValue;
_deleteButton.frame = deleteRect;
return;
}
if (count.intValue >= 100 && count.intValue <= 999) {
_countLabel.frame = labelRect_100_999;
_countLabel.text = count.stringValue;
_deleteButton.frame = deleteRect_100_999;
return;
}
}
@end
使用源码:
AddAndDeleteButton *button = [[AddAndDeleteButton alloc] initWithFrame:CGRectMake(100, 0, 150, 28)];
[button startValue:@(0)];
button.transform = CGAffineTransformScale(button.transform, 1.5, 1.5);
button.center = self.view.center;
[self.view addSubview:button];
控制器源码:
//
// ViewController.m
// LabelControll
//
// Created by YouXianMing on 14/12/11.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
//
#import "ViewController.h"
#import "AddAndDeleteButton.h"
#import "YXCell.h"
static NSString *test = @"YouXianMing";
@interface ViewController ()<UITableViewDataSource, UITableViewDelegate, YXCellDelegate>
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) NSMutableArray *dataArray;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_dataArray = [[NSMutableArray alloc] init];
for (int i = 0; i < 20; i++) {
[_dataArray addObject:@(i)];
}
_tableView = [[UITableView alloc] initWithFrame:self.view.bounds
style:UITableViewStylePlain];
_tableView.delegate = self;
_tableView.dataSource = self;
[self.view addSubview:_tableView];
[_tableView registerClass:[YXCell class] forCellReuseIdentifier:test];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 20;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
YXCell *cell = [tableView dequeueReusableCellWithIdentifier:test];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.delegate = self;
[cell.button startValue:_dataArray[indexPath.row]];
return cell;
}
- (void)currentCount:(NSNumber *)count cell:(YXCell *)cell {
NSIndexPath *path = [_tableView indexPathForCell:cell];
[_dataArray replaceObjectAtIndex:path.row withObject:count];
}
@end
//
// YXCell.h
// LabelControll
//
// Created by YouXianMing on 14/12/11.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "AddAndDeleteButton.h"
@class YXCell;
@protocol YXCellDelegate <NSObject>
@optional
- (void)currentCount:(NSNumber *)count cell:(YXCell *)cell;
@end
@interface YXCell : UITableViewCell
@property (nonatomic, weak) id<YXCellDelegate> delegate;
@property (nonatomic, strong) AddAndDeleteButton *button;
@end
//
// YXCell.m
// LabelControll
//
// Created by YouXianMing on 14/12/11.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
//
#import "YXCell.h"
@interface YXCell ()<AddAndDeleteButtonDelegate>
@end
@implementation YXCell
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
_button = [[AddAndDeleteButton alloc] initWithFrame:CGRectMake(100, 0, 150, 28)];
_button.delegate = self;
[_button startValue:@(0)];
[self addSubview:_button];
}
return self;
}
- (void)currentCount:(NSNumber *)count {
if (_delegate && [_delegate respondsToSelector:@selector(currentCount:cell:)]) {
[_delegate currentCount:count cell:self];
}
}
@end