iOS 商品倒计时 限时特价 限时优惠 功能的封装

最近项目中多个页面用到了 商品特价倒计时的功能  为了偷懒 于是自己封装了一个限时抢购 倒计时的view 代码实现如下:

定向价 限时特价 模型代码实现:

#pragma mark 商品定向价模型
@interface STGoodsOrientationPrice : STBaseModel

/**定向价**/
@property (nonatomic, copy) NSString *price;

/**定向价开始时间**/
@property (nonatomic, copy) NSString *started_at;

/***定向价结束时间*/
@property (nonatomic, copy) NSString *expired_at;

/**商品分润**/
@property (nonatomic, copy) NSString *rebate;

/***  特价提前曝光中需要的字段 推荐价*/
@property (nonatomic,copy)NSString *  promotion_price;

/** *特价提前曝光中需要的字段 原价*/
@property (nonatomic,copy)NSString *  origin_price;

/***  特价提前曝光需要的背景图片字段*/
@property (nonatomic,copy)NSString * image;

/***自定义属性 判断活动是否已经结束 在sku里面会用到*/
@property (nonatomic,assign,getter=isActivityEnd)BOOL activityEnd;

@end

@implementation STGoodsOrientationPrice

@end

 

限时特价 view实现代码

#import <UIKit/UIKit.h>
/**
 *  定向价格的view
*/

//定义活动进行中的回调
typedef void (^orientationPriceViewStartBlock)();

//定义活动结束的回调
typedef void (^orientationPriceViewEndBlock)();

@class STGoodsOrientationPrice; //定向价模型

@interface STOrientationPriceView : UIView

/**定向价模型**/
@property(nonatomic,strong)STGoodsOrientationPrice *orientation;

/**活动进行中的回调**/
@property(nonatomic,strong)orientationPriceViewStartBlock orientationPriceViewStart;

/**活动结束的回调**/
@property(nonatomic,strong)orientationPriceViewEndBlock orientationPriceViewEndBlock;

/***创建定时器*/
@property(nonatomic,strong)NSTimer *timer;

/***创建定时器*/
@property(nonatomic,strong)NSTimer *timer1;

/***是否需要右侧展示原价view*/
@property(nonatomic,assign)BOOL showOldPrice;

/**重新开启定时器**/
- (void)startTimer;

@end
#import "STOrientationPriceView.h"
#import "STGoodsOrientationPrice.h"#import "NSDate+SY.h"
#define orientationItemW 18

@interface STOrientationPriceView()

/***  底色图*/
@property(nonatomic,strong)UIImageView *bgImageView;

/***  限时优惠label*/
@property(nonatomic,strong)UIButton *saleButton ;

/* *  价格的图 */
@property(nonatomic,strong)UIImageView *moneyLabel;

/** *  价格的label*/
@property(nonatomic,strong)UILabel *priceLabel;

/** *  原价label*/
@property(nonatomic,strong)UILabel *oldPriceLabel;

/** *  右侧时间提示label*/
@property(nonatomic,strong) UILabel*rightLabel;

/***  右侧时间提示label上面正式开始的label*/
@property(nonatomic,strong) UILabel*startLabel;

/***活动结束的label*/
@property(nonatomic,strong) UILabel*endLabel;

/*** 小时*/
@property(nonatomic,strong)UIButton *hourLabel;

/*** 点 左 */
@property(nonatomic,strong)UIImageView *pointLeft;

/*** 分钟*/
@property(nonatomic,strong)UIButton *minuteLabel;

/*** 点 右 */
@property(nonatomic,strong)UIImageView *pointRight;

/*** 秒*/
@property(nonatomic,strong)UIButton *secondLabel;

@end

@implementation STOrientationPriceView

#pragma mark lazy
- (NSTimer *)timer
{
    if (!_timer) {
        _timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(modifyDate) userInfo:nil repeats:YES];
        [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
    }
    return _timer;
}

#pragma mark lazy
- (NSTimer *)timer1
{
    if (!_timer1) {
        _timer1 = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(modifEndDate) userInfo:nil repeats:YES];
        [[NSRunLoop currentRunLoop] addTimer:_timer1 forMode:NSRunLoopCommonModes];
    }
    return _timer1;
}

#pragma mark /**重新开启定时器**/
- (void)startTimer
{
    [self setOrientation:_orientation];
}

- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        [self setUpView];
    }

    return self;
}

#pragma mark init
- (void)awakeFromNib
{
    [super awakeFromNib];

    [self setUpView];

}

- (void)setUpView
{
    self.userInteractionEnabled = NO;

    _bgImageView = [[UIImageView alloc] init];
    [self addSubview:_bgImageView];

    _saleButton = [[UIButton alloc] init];
    _saleButton.titleLabel.font  = [UIFont systemFontOfSize:15];
    [_saleButton setTitle:@"限时优惠" forState:UIControlStateNormal];
    [self addSubview:_saleButton];

    _moneyLabel = [[UIImageView alloc] init];
    _moneyLabel.image = [UIImage imageNamed:@"goods_orientation_money"];
    [self addSubview:_moneyLabel];

    _priceLabel = [[UILabel alloc] init];
    _priceLabel.text = @"0.00";
    _priceLabel.font = [UIFont systemFontOfSize:29];
    _priceLabel.textColor = [UIColor whiteColor];
    [self addSubview:_priceLabel];

    _oldPriceLabel = [[UILabel alloc] init];
    _oldPriceLabel.text = @"0.00";
    _oldPriceLabel.hidden = YES;
    _oldPriceLabel.font = [UIFont systemFontOfSize:14];
    _oldPriceLabel.textColor = [UIColor colorWithHexString:@"fbe47a"];
    [self addSubview:_oldPriceLabel];
    NSString *oldPrice = @"¥ 12345";
    NSUInteger length = [oldPrice length];
    NSMutableAttributedString *attri = [[NSMutableAttributedString alloc] initWithString:oldPrice];
    [attri addAttribute:NSStrikethroughStyleAttributeName value:@(NSUnderlinePatternSolid | NSUnderlineStyleSingle) range:NSMakeRange(0, length)];
    [attri addAttribute:NSStrikethroughColorAttributeName value:[UIColor colorWithHexString:@"fbe47a"] range:NSMakeRange(0, length)];
    [_oldPriceLabel setAttributedText:attri];

    _rightLabel = [[UILabel alloc] init];
    _rightLabel.font = [UIFont systemFontOfSize:10];
    _rightLabel.textColor = [UIColor colorWithHexString:@"373737"];
    [self addSubview:_rightLabel];

    _startLabel = [[UILabel alloc] init];
    _startLabel.font = [UIFont systemFontOfSize:17];
    _startLabel.textColor = [UIColor colorWithHexString:@"373737"];
    [self addSubview:_startLabel];

    _endLabel = [[UILabel alloc] init];
    _endLabel.font = [UIFont systemFontOfSize:17];
    _endLabel.textColor = [UIColor colorWithHexString:@"b3b3b3"];
    [self addSubview:_endLabel];

    _hourLabel = [[UIButton alloc] init];
    _hourLabel.titleLabel.font  = [UIFont systemFontOfSize:11];
    [_hourLabel setTitle:@"00" forState:UIControlStateNormal];
    [_hourLabel setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [_hourLabel setBackgroundImage:[UIImage imageNamed:@"goods_orientation_blackRectangle"] forState:UIControlStateNormal];
    [self addSubview:_hourLabel];

    _pointLeft = [[UIImageView alloc] init];
    _pointLeft.image = [UIImage imageNamed:@"goods_orientation_point"];
    [self addSubview:_pointLeft];

    _minuteLabel = [[UIButton alloc] init];
    _minuteLabel.titleLabel.font =[UIFont systemFontOfSize:11];
    [_minuteLabel setTitle:@"00" forState:UIControlStateNormal];
    [_minuteLabel setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [_minuteLabel setBackgroundImage:[UIImage imageNamed:@"goods_orientation_blackRectangle"] forState:UIControlStateNormal];
    [self addSubview:_minuteLabel];

    _pointRight = [[UIImageView alloc] init];
    _pointRight.image = [UIImage imageNamed:@"goods_orientation_point"];
    [self addSubview:_pointRight];

    _secondLabel = [[UIButton alloc] init];
    _secondLabel.titleLabel.font =[UIFont systemFontOfSize:11];
    [_secondLabel setTitle:@"00" forState:UIControlStateNormal];
    [_secondLabel setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [_secondLabel setBackgroundImage:[UIImage imageNamed:@"goods_orientation_blackRectangle"] forState:UIControlStateNormal];
    [self addSubview:_secondLabel];

    [self hideTime];

    //布局
    [self layout];
}

#pragma mark layout
- (void)layout
{

    CGFloat margin = 10;

    [_bgImageView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.width.equalTo(self.mas_width);
        make.height.equalTo(self.mas_height);
        make.left.equalTo(self.mas_left);
        make.top.equalTo(self.mas_top);
    }];

    [_saleButton mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.mas_left).offset(margin);
        make.centerY.equalTo(self.mas_centerY);
        make.width.mas_equalTo(86);
        make.height.mas_equalTo(24);
    }];

    [_moneyLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.width.mas_equalTo(11);
        make.height.mas_equalTo(15);
        make.left.equalTo(_saleButton.mas_right).offset(margin);
        make.centerY.equalTo(self.mas_centerY);
    }];

    CGFloat priceMargin = 3;
    [_priceLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(_moneyLabel.mas_right).offset(priceMargin);
        make.centerY.equalTo(self.mas_centerY);
    }];

    CGFloat rigthMargin = 16;
    [_rightLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(self.mas_right).offset(-rigthMargin);
        make.top.equalTo(self.mas_top).offset(6);

    }];

    [_startLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(self.mas_right).offset(-rigthMargin);
        make.top.equalTo(_rightLabel.mas_bottom).offset(5);
    }];

    [_endLabel mas_makeConstraints:^(MASConstraintMaker *make) {

        make.right.equalTo(self.mas_right).offset(-rigthMargin);
        make.centerY.equalTo(self.mas_centerY);
    }];

    CGFloat timeW = orientationItemW;
    CGFloat timeMargin =5;
    CGFloat timeTopMargin = 5;
    [_secondLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(self.mas_right).offset(-16);
        make.top.equalTo(_rightLabel.mas_bottom).offset(timeTopMargin);
        make.width.mas_equalTo(timeW);
    }];

    [_pointRight mas_makeConstraints:^(MASConstraintMaker *make) {
        make.width.mas_equalTo(2);
        make.height.mas_equalTo(8);
        make.right.equalTo(_secondLabel.mas_left).offset(-timeMargin);
        make.centerY.equalTo(_secondLabel.mas_centerY);
    }];

    [_minuteLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(_pointRight.mas_left).offset(-timeMargin);
        make.top.equalTo(_rightLabel.mas_bottom).offset(timeTopMargin);
        make.width.mas_equalTo(timeW);
    }];

    [_pointLeft mas_makeConstraints:^(MASConstraintMaker *make) {
        make.width.mas_equalTo(2);
        make.height.mas_equalTo(8);
        make.right.equalTo(_minuteLabel.mas_left).offset(-timeMargin);
        make.centerY.equalTo(_minuteLabel.mas_centerY);
    }];

    [_hourLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(_pointLeft.mas_left).offset(-timeMargin);
        make.top.equalTo(_rightLabel.mas_bottom).offset(timeTopMargin);
        make.width.mas_equalTo(timeW);
    }];

    [_oldPriceLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(_hourLabel.mas_left).offset(-12);
        make.centerY.equalTo(self.mas_centerY);
    }];

}

#pragma mark 是否需要展示原价 显示原价 说明是首页的卡片cell
- (void)setShowOldPrice:(BOOL)showOldPrice
{

    _showOldPrice = showOldPrice;

    if (showOldPrice) {

        self.priceLabel.font = [UIFont boldSystemFontOfSize:15];

        if (IS_IPHONE_4_OR_LESS || IS_IPHONE_5) {
            self.oldPriceLabel.hidden = YES;
        }else{
            self.oldPriceLabel.hidden = NO;
        }

        [_saleButton setTitle:@"特价预告" forState:UIControlStateNormal];

    }else{

        self.oldPriceLabel.hidden = YES;
        [_saleButton setTitle:@"限时优惠" forState:UIControlStateNormal];

    }
}

#pragma mark 设置数据 在这里判断当前定向价展示的状态
- (void)setOrientation:(STGoodsOrientationPrice *)orientation
{
    _orientation = orientation;

    _priceLabel.text = orientation.price?orientation.price:@"0.00";

    _rightLabel.text = orientation.started_at;

    //判断活动是否已经结束
    if ([self validEndDate]) {

        //活动结束
        [self setupOrientationEnd];

        //活动已经结束
        self.orientation.activityEnd = YES;

        return;
    }

    //判断活动开始时间
    [self validStartate];

}

#pragma mark 判断活动结束时间
- (BOOL)validEndDate
{
    // 日期格式化类
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    // 设置日期格式(y:年,M:月,d:日,H:时,m:分,s:秒)
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";

    // 活动结束时间
    NSDate *create = [fmt dateFromString:_orientation.expired_at];

    NSTimeZone *zone = [NSTimeZone systemTimeZone]; //获得系统的时区

    NSTimeInterval time = [zone secondsFromGMTForDate:create];//以秒为单位返回当前时间与系统格林尼治时间的差

    NSDate *createDate =  [create dateByAddingTimeInterval:time];//然后把差的时间加上,就是当前系统准确的时间

    // 截止时间data格式
    NSDate *expireDate = [fmt dateFromString:[fmt stringFromDate:createDate]];
    // 当前时间data格式
    NSDate *nowDate = [fmt dateFromString:[fmt stringFromDate:[self getCurrentDate]]];
    // 当前日历
    NSCalendar *calendar = [NSCalendar currentCalendar];
    // 需要对比的时间数据
    NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth
    | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    // 对比时间差
    NSDateComponents *dateCom = [calendar components:unit fromDate:nowDate toDate:expireDate options:0];

    if (dateCom.day>1) {

        return  NO;

    }else{

        if (dateCom.month>1) {

            return NO;

        }else{

            if (dateCom.second>0) {
                return NO;
            }else{

                if (dateCom.minute>0) {

                    return NO;

                }else if (dateCom.second>0){

                    return NO;
                }

                return YES;
            }

        }

    }

    return NO;

}

#pragma mark 判断活动开始时间差距
- (void)validStartate
{
    // 日期格式化类
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";

    // 活动开始时间
    NSDate *create = [fmt dateFromString:_orientation.started_at];

    NSTimeZone *zone = [NSTimeZone systemTimeZone]; //获得系统的时区

    NSTimeInterval time = [zone secondsFromGMTForDate:create];//以秒为单位返回当前时间与系统格林尼治时间的差

    NSDate *createDate =  [create dateByAddingTimeInterval:time];//然后把差的时间加上,就是当前系统准确的时间

    //获取当前时间
    NSDate *nowDate = [fmt dateFromString:[fmt stringFromDate:[self getCurrentDate]]];

    // 当前日历
    NSCalendar *calendar = [NSCalendar currentCalendar];

    if (createDate.isThisYear) { // 今年

        // 需要对比的时间数据
        NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth
        | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
        // 对比时间差
        NSDateComponents *dateCom = [calendar components:unit fromDate:nowDate toDate:createDate options:0];

        if (dateCom.day>0) {

            [self setupOrientation12Out];

        }else{

            if (dateCom.month>0) {

                [self setupOrientation12Out];

            }else{

                if (dateCom.hour>12) { //12小时之外

                    [self setupOrientation12Out];

                }else if (dateCom.hour<=12 && dateCom.hour>0){ //12小时之内

                    if (dateCom.hour==12) {

                        if (dateCom.second>0) {
                            [self setupOrientation12Out];

                        }else{

                            if (dateCom.minute>0) {
                                [self setupOrientation12Out];
                            }else{

                                [self setupOrientation12In];
                            }
                        }

                    }else{

                        [self setupOrientation12In];

                    }

                }else{ //小于0 表示活动已经开始

                    if (dateCom.minute<=0 && dateCom.second<=0) {

                        [self setupActiveStart];

                    }else{
                        [self setupOrientation12In];
                    }

                }

            }

        }

    }else{

        [self setupOrientation12Out];

    }

}

#pragma mark 设置活动开始信息
- (void)setupActiveStart
{
    //设置不能添加到购物车
    weakifySelf
    if(self.orientationPriceViewStart){
        weakSelf.orientationPriceViewStart();
    }
    [self setupOrientationStart];
}

- (void)dealloc
{
    [self.timer invalidate];
    self.timer  = nil;
}

#pragma mark 设置12小时内开购的信息
- (void)setupOrientation12In
{
    _endLabel.hidden = YES;

    if (self.showOldPrice) {

        _bgImageView.image = [UIImage imageNamed:@"homeRrientationGreenbg"];

    }else{

        _bgImageView.image = [UIImage imageNamed:@"goods_orientation_greenbg"];

    }
    _rightLabel.text = @"距离开始仅剩";
    [_saleButton setTitleColor:[UIColor colorWithHexString:@"76a505"] forState:UIControlStateNormal];
    [_saleButton setBackgroundImage:[UIImage imageNamed:@"goods_orientation_yellowRectang"] forState:UIControlStateNormal];

    [self showTime];

    //开启定时器
    [self.timer fire];

}

#pragma mark 获取当前的准确时间
- (NSDate*)getCurrentDate
{
    NSDate *date = [NSDate date]; //获得时间对象

    NSTimeZone *zone = [NSTimeZone systemTimeZone]; //获得系统的时区

    NSTimeInterval time = [zone secondsFromGMTForDate:date];//以秒为单位返回当前时间与系统格林尼治时间的差

    return [date dateByAddingTimeInterval:time];//然后把差的时间加上,就是当前系统准确的时间
}

#pragma mark 修改日期 每一秒掉用一次  修改开始时间
- (void)modifyDate
{

    // 日期格式化类
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    // 设置日期格式(y:年,M:月,d:日,H:时,m:分,s:秒)
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";

    // 活动开始时间
    NSDate *create = [fmt dateFromString:_orientation.started_at];

    NSTimeZone *zone = [NSTimeZone systemTimeZone]; //获得系统的时区

    NSTimeInterval time = [zone secondsFromGMTForDate:create];//以秒为单位返回当前时间与系统格林尼治时间的差

    NSDate *createDate =  [create dateByAddingTimeInterval:time];//然后把差的时间加上,就是当前系统准确的时间

    //获取当前时间
    NSDate *nowDate = [self getCurrentDate];

    //判断开始时间和 当前时间的差值
    NSDateComponents *cmps = [nowDate deltaFrom:createDate];

    //设置十分秒 信息
    NSInteger hour = 0;
    NSInteger minute = 0;
    NSInteger second = 0;

    if (cmps.hour<=0 || cmps.minute<=0 || cmps.second<=0) {

        //判断开始时间和 当前时间的差值
        NSDateComponents *cmps = [createDate deltaFrom:nowDate];

        //设置十分秒 信息
        hour = cmps.hour;
        minute = cmps.minute;
        second = cmps.second;

    }else{

        //设置十分秒 信息
        hour = cmps.hour;
        minute = cmps.minute;
        second = cmps.second;

    }

    if (hour==0 && minute==0 && second==0) {

            //掉用活动开始
            [self setupOrientationStart];

            [self.timer invalidate];
            self.timer = nil;

    }

    NSString *houreT = [NSString stringWithFormat:@"%02zd",hour>0?hour:0];
    NSString *minuteT = [NSString stringWithFormat:@"%02zd",minute>0?minute:0];
    NSString *secondT = [NSString stringWithFormat:@"%02zd",second>0?second:0];

    CGFloat houreW = [houreT boundingRectWithSize:CGSizeMake(MAXFLOAT, orientationItemW) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:11]} context:nil].size.width;

    if (houreW>=orientationItemW) {
        [_hourLabel mas_updateConstraints:^(MASConstraintMaker *make) {
            make.width.mas_equalTo(houreW+5);
        }];
    }

    [self.hourLabel setTitle:houreT forState:UIControlStateNormal];
    [self.minuteLabel setTitle:minuteT forState:UIControlStateNormal];
    [self.secondLabel setTitle:secondT forState:UIControlStateNormal];

}

#pragma mark 修改日期 每一秒掉用一次 修改结束时间
- (void)modifEndDate
{

    // 日期格式化类
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    // 设置日期格式(y:年,M:月,d:日,H:时,m:分,s:秒)
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";

    // 活动开始时间
    NSDate *create = [fmt dateFromString:_orientation.expired_at];

    NSTimeZone *zone = [NSTimeZone systemTimeZone]; //获得系统的时区

    NSTimeInterval time = [zone secondsFromGMTForDate:create];//以秒为单位返回当前时间与系统格林尼治时间的差

    NSDate *createDate =  [create dateByAddingTimeInterval:time];//然后把差的时间加上,就是当前系统准确的时间

    //获取当前时间
    NSDate *nowDate = [self getCurrentDate];

    //判断开始时间和 当前时间的差值
    NSDateComponents *cmps = [nowDate deltaFrom:createDate];

    //设置十分秒 信息
    NSInteger hour = 0;
    NSInteger minute = 0;
    NSInteger second = 0;

    if (cmps.hour<=0 || cmps.minute<=0 || cmps.second<=0) {

        //判断开始时间和 当前时间的差值
        NSDateComponents *cmps = [createDate deltaFrom:nowDate];

        if (cmps.day>0) {

            //设置十分秒 信息
            hour = cmps.hour+(cmps.day*24);

        }else{
            //设置十分秒 信息
            hour = cmps.hour;
        }

        minute = cmps.minute;
        second = cmps.second;

    }else{

        //设置十分秒 信息
        hour = cmps.hour;
        minute = cmps.minute;
        second = cmps.second;

    }

    if (hour==0 && minute==0 && second==0) {

        //掉用活动结束
        [self setupOrientationEnd];

        [self.timer1 invalidate];
        self.timer1 = nil;

    }

    NSString *houreT = [NSString stringWithFormat:@"%02zd",hour>0?hour:0];
    NSString *minuteT = [NSString stringWithFormat:@"%02zd",minute>0?minute:0];
    NSString *secondT = [NSString stringWithFormat:@"%02zd",second>0?second:0];

    CGFloat houreW = [houreT boundingRectWithSize:CGSizeMake(MAXFLOAT, orientationItemW) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:11]} context:nil].size.width;

    if (houreW>orientationItemW) {
        [_hourLabel mas_updateConstraints:^(MASConstraintMaker *make) {
            make.width.mas_equalTo(houreW+10);
        }];
    }

    [self.hourLabel setTitle:houreT forState:UIControlStateNormal];
    [self.minuteLabel setTitle:minuteT forState:UIControlStateNormal];
    [self.secondLabel setTitle:secondT forState:UIControlStateNormal];

}

#pragma mark 设置12小时外开购的信息
- (void)setupOrientation12Out
{
    if (self.showOldPrice) {

        _bgImageView.image = [UIImage imageNamed:@"homeRrientationGreenbg"];

    }else{

        _bgImageView.image = [UIImage imageNamed:@"goods_orientation_greenbg"];

    }
    [_saleButton setTitleColor:[UIColor colorWithHexString:@"76a505"] forState:UIControlStateNormal];
    [_saleButton setBackgroundImage:[UIImage imageNamed:@"goods_orientation_yellowRectang"] forState:UIControlStateNormal];

    [self hideTime];

    _endLabel.hidden = YES;
    _rightLabel.hidden = NO;
    _rightLabel.text =[self formatterStartTime];
    _startLabel.text = @"正式开始";

}

#pragma mark 格式化开始时间字符串
- (NSString*)formatterStartTime
{

    // 日期格式化类
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    // 设置日期格式(y:年,M:月,d:日,H:时,m:分,s:秒)
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";

    NSTimeZone* GTMzone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    [fmt setTimeZone:GTMzone];

    // 活动开始时间
    NSDate *create = [fmt dateFromString:_orientation.started_at];

    if (create.isThisYear) { // 今年

        // 日期格式化类
        NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
        // 设置日期格式(y:年,M:月,d:日,H:时,m:分,s:秒)
        fmt.dateFormat = @"MM-dd HH:mm:ss";

        NSTimeZone* GTMzone = [NSTimeZone timeZoneForSecondsFromGMT:0];
        [fmt setTimeZone:GTMzone];

        return [fmt stringFromDate:create];

    }else{

        return _orientation.started_at;
    }

}

#pragma mark 设置1活动开始的信息
- (void)setupOrientationStart
{
    _endLabel.hidden = YES;

    [self showTime];

    if (self.showOldPrice) {

        _bgImageView.image = [UIImage imageNamed:@"homeRrientationRedbg"];

    }else{

        _bgImageView.image = [UIImage imageNamed:@"goods_orientation_redbg"];

    }

    [_saleButton setTitleColor:[UIColor colorWithHexString:@"e72646"] forState:UIControlStateNormal];
    [_saleButton setBackgroundImage:[UIImage imageNamed:@"goods_orientation_yellowRectang"] forState:UIControlStateNormal];

    _rightLabel.text = @"距离结束仅剩";

    //掉用定时器
    [self.timer1 fire];
}

#pragma mark 设置1活动结束的信息
- (void)setupOrientationEnd
{

    //设置可以添加到购物车
    weakifySelf
    if(self.orientationPriceViewEndBlock){
        weakSelf.orientationPriceViewEndBlock();
    }

    _bgImageView.image = [UIImage imageNamed:@"goods_orientation_graybg"];
    [_saleButton setTitleColor:[UIColor colorWithHexString:@"b3b3b3"] forState:UIControlStateNormal];
    [_saleButton setBackgroundImage:[UIImage imageNamed:@"goods_orientation_grayRectang"] forState:UIControlStateNormal];
    _endLabel.text = @"活动已结束";

    _rightLabel.hidden = YES;
    _startLabel.hidden = YES;

    [self hideTime];

    _endLabel.hidden = NO;

}

#pragma mark 显示时间控件
- (void)showTime
{
    _rightLabel.hidden = NO;
    _hourLabel.hidden = NO;
    _pointLeft.hidden = NO;
    _pointRight.hidden = NO;
    _minuteLabel.hidden = NO;
    _secondLabel.hidden = NO;
}

#pragma mark 隐藏时间控件
- (void)hideTime
{
    _rightLabel.hidden = YES;
    _hourLabel.hidden = YES;
    _pointLeft.hidden = YES;
    _pointRight.hidden = YES;
    _minuteLabel.hidden = YES;
    _secondLabel.hidden = YES;
}

@end

NSDate+SY 分类代码实现如下:

#import <Foundation/Foundation.h>

@interface NSDate (SY)

/**
 * 获取当前区域的当前时间
 */
+ (NSDate *)getCurrentDate;

/**
 * 比较from和self的时间差值
 */
- (NSDateComponents *)deltaFrom:(NSDate *)from;

/**
 * 是否为今年
 */
- (BOOL)isThisYear;

/**
 * 是否为今天
 */
- (BOOL)isToday;

/**
 * 是否为昨天
 */
- (BOOL)isYesterday;

@end
#import "NSDate+SY.h"

@implementation NSDate (SY)

/**
 * 获取当前区域的当前时间
 */
+ (NSDate *)getCurrentDate
{
    NSDate *date = [NSDate date]; //获得时间对象

    NSTimeZone *zone = [NSTimeZone systemTimeZone]; //获得系统的时区

    NSTimeInterval time = [zone secondsFromGMTForDate:date];//以秒为单位返回当前时间与系统格林尼治时间的差

    return [date dateByAddingTimeInterval:time];//然后把差的时间加上,就是当前系统准确的时间
}

- (NSDateComponents *)deltaFrom:(NSDate *)from
{
    // 日历
    NSCalendar *calendar = [NSCalendar currentCalendar];

    // 比较时间
    NSCalendarUnit unit = NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;

    return [calendar components:unit fromDate:from toDate:self options:0];
}

- (BOOL)isThisYear
{
    // 日历
    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSInteger nowYear = [calendar component:NSCalendarUnitYear fromDate:[NSDate date]];
    NSInteger selfYear = [calendar component:NSCalendarUnitYear fromDate:self];

    return nowYear == selfYear;
}

- (BOOL)isToday
{
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd";

    NSString *nowString = [fmt stringFromDate:[NSDate date]];
    NSString *selfString = [fmt stringFromDate:self];

    return [nowString isEqualToString:selfString];
}

- (BOOL)isYesterday
{
    // 日期格式化类
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd";

    NSDate *nowDate = [fmt dateFromString:[fmt stringFromDate:[NSDate date]]];
    NSDate *selfDate = [fmt dateFromString:[fmt stringFromDate:self]];

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *cmps = [calendar components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:selfDate toDate:nowDate options:0];

    return cmps.year == 0
    && cmps.month == 0
    && cmps.day == 1;
}

@end

到这里限时特价的一个自定义view就封装好了  我这里集成到项目中的 效果图如下:

时间: 2024-10-12 21:47:14

iOS 商品倒计时 限时特价 限时优惠 功能的封装的相关文章

iOS 按钮倒计时功能

iOS 按钮倒计时功能, 建议把按钮换成label,这样会避免读秒时闪烁 1 __block int time = 60; 2 __block UIButton *verifybutton = _GetverificationBtn; 3 verifybutton.enabled = NO; 4 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 5 dispatch_so

买企业邮箱有什么活动?TOM企邮限时优惠到底

放眼现在的企业邮箱市场,腾讯.网易.TOM企业邮箱等比比皆是,并且都是老牌电子邮箱厂商.企业邮箱是指按照企业自有域名开通的邮箱:[email protected]企业域名.企业可自行管理.自由分配.命名的邮箱.企业邮箱可以帮助企业树立统一的企业形象,方便企业形象推广,邮箱用户名可以采用员工姓名,便于记忆.同时又能确保企业信息的安全,员工离职,企业邮箱可以顺利收回,或者继续由公司使用该邮箱,从而将所有业务联系保留和延续下来.TOM企业邮箱系统,通过简单易懂的管理界面和提供完整详细的管理员手册,一个

iOS开发 -文件下载(5 下载功能的封装)

iOS开发网络篇—文件下载(五·下载功能的封装) 一.简单说明 在前面几篇文章介绍下载代码的基础上,此文分析对下载功能进行封装. 通过之前的代码,我们发现仅仅是下载一个文件就需要写很长的代码,那么如果要下载多个文件,就需要写多份代码.在这里,我们把下载一个文件的代码进行封装.控制器只需要知道,下载哪个文件,下载到哪个路径就可以了. 在对下载的功能进行封装后,添加一个文件下载器,一个文件下载器只下载一个文件,封装后如果要下载多个文件的话,那么只需要创建多个文件下载器对象就可以进行控制和下载了. 二

IOS UIScrollView详解 & 图片缩放功能

一 UIScrollView 简介 UIScrollView是能滚动的视图控件,可以通过滚动的方式来展示类容. 二 UIScrollView常见属性 //设置UIScrollView滚动的位置 @property(nonatomic) CGPoint contentOffset;  //设置UIScrollView内容的尺寸,滚动范围 @property(nonatomic) CGSize contentSize;  //设置UIScrollView的4周增加额外的滚动区域 @property(

iOS 7的手势滑动返回功能

现在使用默认模板创建的iOS App都支持手势返回功能,如果导航栏的返回按钮是自定义的那么则会失效,也可以参考这里手动设置无效. if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enabled = NO; } 如果是因为自定义导航按钮而导

iOS开发- 自定义遮罩视图(引导, 功能说明)源码+解析

iOS开发- 自定义遮罩视图(引导, 功能说明)源码+解析 我们平时使用App的时候, 经常在第一次使用的时候, 会有类似"新手教程"之类的东西, 来引导我们应该如何使用这个App. 但是这个"新手教程"不同于常规的引导页(引导页指第一次打开App时候, 弹出的那种介绍视图. 他是静态的, 不需要与用户交互, 可以直接一页页翻, 或者直接跳过.)所谓的"新手教程", 就是按照App的提示, 一步步跟着完成. 那这个"新手教程"

iOS实现tableView下拉搜索功能

iOS实现tableView下拉搜索功能 地址:github地址 效果展示 JRSearchBar /// 搜索 -> array - (NSMutableArray *)searchTest:(NSString *)searchText InArray:(NSArray *)array;

iOS开发网络篇—文件下载(五&#183;下载功能的封装)

iOS开发网络篇—文件下载(五·下载功能的封装) 一.简单说明 在前面几篇文章介绍下载代码的基础上,此文分析对下载功能进行封装. 通过之前的代码,我们发现仅仅是下载一个文件就需要写很长的代码,那么如果要下载多个文件,就需要写多份代码.在这里,我们把下载一个文件的代码进行封装.控制器只需要知道,下载哪个文件,下载到哪个路径就可以了. 在对下载的功能进行封装后,添加一个文件下载器,一个文件下载器只下载一个文件,封装后如果要下载多个文件的话,那么只需要创建多个文件下载器对象就可以进行控制和下载了. 二

Vue实现仿淘宝商品详情属性选择的功能

Vue实现仿淘宝商品详情属性选择的功能 2018年09月07日 17:13:35 yx_cos 阅读数:278 先看下效果图:(同个属性内部单选,属性与属性之间可以多选) 主要实现过程: 所使用到的数据类型是(一个大数组里面嵌套了另一个数组)具体格式如下: attrAndValuees: [   {   'attrId': 1,   'attrName': '味道',   'valuees': [   {   'attrId': 1,   'value': '橘子味'   },   {   'a