iOS订单折扣视图应用于购物车界面(支持添加/删除/选择折扣)

简介: iOS订单折扣视图应用于购物车界面(支持添加/删除/选择折扣)

前言

应用场景

  1. 购物车界面选择整单折扣

image.png

  1. 无品收银台界面选择订单折扣

image.png

支持的视图类型

typedef enum : NSUInteger {
/**
 下拉选择折扣,支持删除和添加 (最大列数4个)
*/
    QCTDiscountViewType4col,
    /**
     从侧边划出选择折扣视图 (最大列数3个)
    */
    QCTDiscountViewType3col,
} QCTDiscountViewType;

iOS开发交流,欢迎关注公众号:iOS逆向

I 、用法

折扣视图由表格的cell组成

1.1   cell的初始化

case QCTDropDownMenuViewSection4delete:
        {
            QCTDiscountTableViewCell *cell = [QCTDiscountTableViewCell tableViewCellWithTableView:tableView block:^(QCTDiscountModel * sender) {
                if (sender == nil) {
                    return ;
                }
                if (sender.isADDorDelete) {
                    if ([sender.name isEqualToString:@"+"]) {
                        UIView *view = weakSelf.modal.contentView;
                        if ([view isMemberOfClass:[DiscountPickerView class]]) {
                            [weakSelf.modal show:YES];
                        }else{
                            [weakSelf.modal showContentView:self.discountPickerV animated:YES];
                            weakSelf.modal.positionMode = STModelPositionCenterBottom;
                        }
                    }else if([sender.name isEqualToString:@"-"]){
                        [weakSelf showpromptDeleteView];
                    }
                }else{
#pragma mark - ******** 处理折扣的点击事件
                    [weakSelf setupClickDiscount:sender];
                }
                //
            } models:nil];
            [cell setType:QCTDiscountViewType4col];
            [cell setModels:[self getdiscountModelsWithArray:self.viewModel.discountContainAddDeleteModels index:indexPath.row clos:4 ]];
            return cell;
            //
            //
        }
            break;

获取每一行的数据模型

#pragma mark - ******** 获取每一行的数据模型
- (NSMutableArray*)getdiscountModelsWithArray:(NSMutableArray*)discountModels index:(NSInteger)row  clos:(NSInteger)clos{
    // 获取总行
    NSInteger all = (discountModels.count -1) /clos +1;//4
    if (row> all) {
        return nil;
    }
    NSInteger startIndex = (row)*(clos);//0 4
    NSInteger endIndex = startIndex+(clos-1);//3,7
    NSMutableArray* tmp = [NSMutableArray array];
    NSInteger realendIndex = endIndex > (discountModels.count-1) ?  discountModels.count-1 :  endIndex;
    for (NSInteger i =startIndex ; i<= realendIndex ; i++) {
        [tmp addObject:discountModels[i]];
    }
    return tmp;
}

1.2 视图的初始化

- (void)setModels:( id)models{
    _models =models;
        self.cellView.model = models;
}
- (QCTDiscountView *)cellView{
    if (nil == _cellView) {
        QCTDiscountView *tmpView = [[QCTDiscountView alloc]init];
        _cellView = tmpView;
        [tmpView setBackgroundColor:kcellColor];
        [self.contentView addSubview:_cellView];
        __weak __typeof__(self) weakSelf = self;
        [_cellView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.equalTo(weakSelf.contentView).offset( kAdjustRatio(kSideMargin+4));
            make.right.equalTo(weakSelf.contentView).offset(- kAdjustRatio(kSideMargin+4));
            make.top.equalTo(weakSelf.contentView).offset(kAdjustRatio(0));
            make.bottom.equalTo(weakSelf.contentView).offset(kAdjustRatio(0));
        }];
        [_cellView setBlock:^(id  _Nonnull sender) {
            if (weakSelf.block) {
                weakSelf.block(sender);
            }
        }];
    }
    return _cellView;
}

II、 DiscountView核心代码

2.1  QCTDiscountView.h

#import "QCTDiscountBtn.h"
NS_ASSUME_NONNULL_BEGIN
typedef enum : NSUInteger {
    QCTDiscountViewType4col,
    QCTDiscountViewType3col,
} QCTDiscountViewType;
@interface QCTDiscountView : UIView
@property (nonatomic, copy) void (^block)(id sender);
@property (nonatomic, strong) id model;
@property (nonatomic, assign) QCTDiscountViewType type;
@end

2.2   QCTDiscountView.m

#import "QCTDiscountView.h"
/**
 iOS 自定义折扣处理视图:支持添加/删除/选择折扣 【 应用场景:购物车界面选择整单折扣,无品收银台界面选择订单折扣】
 */
@interface QCTDiscountView ()
@end
@implementation QCTDiscountView
- (instancetype)init
{
    self = [super init];
    if (self) {
        UITapGestureRecognizer *cutTap = [[UITapGestureRecognizer alloc] init];
        cutTap.cancelsTouchesInView = NO;// 设置tableView的点击事件优先级,低于cell的选中事件
        [[cutTap rac_gestureSignal] subscribeNext:^(id x) {
            NSLog(@"QCTDiscountView");
        }];
        [self  addGestureRecognizer:cutTap];
    }
    return self;
}
- (void)setType:(QCTDiscountViewType)type{
    switch (type) {
        case QCTDiscountViewType4col:
        {
            [self setupSubView:4];
        }
            break;
        case QCTDiscountViewType3col:
        {
            [self setupSubView:3];
        }
            break;
        default:
            break;
    }
}
- (void)setupSubView:(NSInteger)col{
    QCTDiscountBtn * lasttmp;
    for (int i = 0; i<col; i++) {
        QCTDiscountBtn * tmp = [QCTDiscountBtn new];
        tmp.tag = i+1000;
        [self addSubview:tmp];
        __weak __typeof__(self) weakSelf = self;
        [tmp mas_makeConstraints:^(MASConstraintMaker *make) {
            make.centerY.equalTo(weakSelf);
            make.width.equalTo(weakSelf).offset(-kAdjustRatio(15*(col-1)*0.25)).dividedBy(col);
            if (i%col == 0) {
                make.left.equalTo(weakSelf);
            }else{
                make.left.equalTo(lasttmp.mas_right).offset(kAdjustRatio(15));
            }
            make.bottom.equalTo(weakSelf).offset(kAdjustRatio(-20));
            make.top.equalTo(weakSelf).offset(kAdjustRatio(0));
        }];
        lasttmp = tmp;
        tmp.hidden = YES;
        UITapGestureRecognizer *cutTap = [[UITapGestureRecognizer alloc] init];
        [[cutTap rac_gestureSignal] subscribeNext:^(id x) {
            NSLog(@"model: %@",tmp.models.name);
            if (weakSelf.block) {
                weakSelf.block(tmp.models);
            }
        }];
        [tmp addGestureRecognizer:cutTap];
    }
}
/**
 Masonry比例用法
 */
- (void)setModel:(NSMutableArray *)model{
    _model = model;
    // 构建子试图
    for (int i = 0; i<model.count; i++) {
        id obj = model[i];
        QCTDiscountBtn * tmp = (QCTDiscountBtn *)[self viewWithTag:i + 1000];;
        tmp.models = obj;        
    }
}
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    CGPoint redBtnPoint = [self convertPoint:point toView:self];
    for (UIView *obj in self.subviews) {
        if ( CGRectContainsPoint(obj.frame, redBtnPoint) ) {
            return obj;
        }
    }
        if (redBtnPoint.y <= CGRectGetMaxY(self.frame)) {
            return self;
        }
  return  [super hitTest:point withEvent:event];
}
@end

III、数据模型DiscountModel

@interface QCTDiscountModel : NSObject
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) BOOL isSlelected;
@property (nonatomic,assign) BOOL isdeleted;
@property (nonatomic,copy) NSString *imageName;
@property (nonatomic,assign) BOOL isADDorDelete;
+ (instancetype)getQCTDiscountModelWithname:(NSString*)name;
+ (NSMutableArray*)getQCTDiscountModels:(NSMutableArray*)arr;
@property (nonatomic,assign) BOOL isfirstModel;

see also

git 代码分支管理教程

目录
相关文章
|
开发工具 iOS开发 git
iOS订单折扣视图应用于购物车界面(支持添加/删除/选择折扣)
iOS订单折扣视图应用于购物车界面(支持添加/删除/选择折扣)
307 0
iOS订单折扣视图应用于购物车界面(支持添加/删除/选择折扣)
|
iOS开发
iOS 添加商品到购物车的动画实现
iOS 添加商品到购物车的动画实现
606 0
iOS 添加商品到购物车的动画实现
|
iOS开发
iOS手机淘宝加入购物车动画分析
1、最终效果 仿淘宝动画 2、核心代码 _cartAnimView=[[UIImageView alloc] initWithFrame:CGRectMake(_propView.
1179 0
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
iOS开发 开发者
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
1203 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
651 66