ProductDetailsViewController.m 14.6 KB
Newer Older
曹云霄's avatar
曹云霄 committed
1 2 3 4 5 6 7 8 9
//
//  ProductDetailsViewController.m
//  Lighting
//
//  Created by 曹云霄 on 16/5/4.
//  Copyright © 2016年 上海勾芒科技有限公司. All rights reserved.
//

#import "ProductDetailsViewController.h"
曹云霄's avatar
曹云霄 committed
10 11
#import "ProductDetailsTableViewCell.h"
#import "ProductDetailsHeaderView.h"
曹云霄's avatar
曹云霄 committed
12
#import "goodsDetailsSectionview.h"
勾芒's avatar
勾芒 committed
13 14
#import "goodsDetailsTableViewCell.h"
#import "FullScreenViewController.h"
曹云霄's avatar
曹云霄 committed
15

16 17


曹云霄's avatar
曹云霄 committed
18
@interface ProductDetailsViewController ()<UITableViewDelegate,UITableViewDataSource,UITextFieldDelegate,CAAnimationDelegate>
曹云霄's avatar
曹云霄 committed
19 20

@property (nonatomic,strong) ProductDetailsHeaderView *headerView;
曹云霄's avatar
曹云霄 committed
21

曹云霄's avatar
曹云霄 committed
22 23 24 25 26
/**
 *  商品详情数据
 */
@property (nonatomic,strong )TOGoodsEntity *entity;

勾芒's avatar
勾芒 committed
27 28 29 30 31 32 33 34 35 36
/**
 *  图文详情数据源
 */
@property (nonatomic,strong) NSMutableArray *goodsDetailsArray;

/**
 *  商品小图数据源
 */
@property (nonatomic,strong) NSMutableArray *imagesArray;

勾芒's avatar
勾芒 committed
37 38 39 40 41
/**
 *  点击小图的下标 默认0
 */
@property (nonatomic,assign) NSInteger imageIndex;

曹云霄's avatar
曹云霄 committed
42 43 44 45
@end

@implementation ProductDetailsViewController

勾芒's avatar
勾芒 committed
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

/**
 *  初始化图文详情
 */
- (NSMutableArray *)goodsDetailsArray
{
    if (_goodsDetailsArray == nil) {
        _goodsDetailsArray = [NSMutableArray array];
    }
    return _goodsDetailsArray;
}

/**
 *  商品小图数据源
 */
- (NSMutableArray *)imagesArray
{
    if (_imagesArray == nil) {
        _imagesArray = [NSMutableArray array];
    }
    return _imagesArray;
}


曹云霄's avatar
曹云霄 committed
70 71
- (void)viewDidLoad {
    [super viewDidLoad];
曹云霄's avatar
曹云霄 committed
72 73
    
    [self uiConfigAction];
曹云霄's avatar
曹云霄 committed
74
    [self getGoodsListDetails];
曹云霄's avatar
曹云霄 committed
75 76 77 78 79
}

#pragma mark -UI
- (void)uiConfigAction
{
勾芒's avatar
勾芒 committed
80
    self.imageIndex = 0;
曹云霄's avatar
曹云霄 committed
81 82
    self.productDetilsTableview.dataSource = self;
    self.productDetilsTableview.delegate = self;
勾芒's avatar
勾芒 committed
83
    [self.productDetilsTableview registerNib:[UINib nibWithNibName:@"goodsDetailsTableViewCell" bundle:nil] forCellReuseIdentifier:@"goodsdetailscell"];
曹云霄's avatar
曹云霄 committed
84
    [self createHeaderView];
曹云霄's avatar
曹云霄 committed
85 86
}

曹云霄's avatar
曹云霄 committed
87

曹云霄's avatar
曹云霄 committed
88 89 90
#pragma mark -获取商品详情
- (void)getGoodsListDetails
{
91
    WS(weakSelf);
曹云霄's avatar
曹云霄 committed
92
    [XBLoadingView showHUDViewWithDefault];
93
    NSString *url = [NSString stringWithFormat:@"%@%@",SERVERREQUESTURL(GOODSDETAILS),_goodsID];
曹云霄's avatar
曹云霄 committed
94
    [HTTP networkWithDictionaryRequestWithURL:url  withRequestType:ONE withParameter:nil withReturnValueBlock:^(id returnValue) {
曹云霄's avatar
曹云霄 committed
95
        
曹云霄's avatar
曹云霄 committed
96
        [XBLoadingView hideHUDViewWithDefault];
曹云霄's avatar
曹云霄 committed
97
        if (RESULT(returnValue)) {
曹云霄's avatar
曹云霄 committed
98
           weakSelf.entity = [[TOGoodsEntity alloc]initWithDictionary:RESPONSE(returnValue) error:nil];
99 100
            [weakSelf.productDetilsTableview reloadData];
            [weakSelf HeaderViewAssignment];
曹云霄's avatar
曹云霄 committed
101 102 103
        }
        else
        {
104
            [XBLoadingView showHUDViewWithText:MESSAGE(returnValue)];
曹云霄's avatar
曹云霄 committed
105
        }
106
    }withFailureBlock:^(NSError *error) {
曹云霄's avatar
曹云霄 committed
107
        [XBLoadingView showHUDViewWithText:error.localizedDescription];
曹云霄's avatar
曹云霄 committed
108 109 110 111
    }];
}


曹云霄's avatar
曹云霄 committed
112
#pragma mark -头部视图
曹云霄's avatar
曹云霄 committed
113
- (void)createHeaderView
曹云霄's avatar
曹云霄 committed
114 115
{
    self.headerView = [[[NSBundle mainBundle] loadNibNamed:@"ProductDetailsHeaderView" owner:self options:nil] lastObject];
曹云霄's avatar
曹云霄 committed
116 117 118 119
    self.headerView.goodsNumber.delegate = self;
    //增加,减少商品
    [self.headerView.reduceButton addTarget:self action:@selector(reduceGoodsButtonClick:) forControlEvents:UIControlEventTouchUpInside];
    [self.headerView.addButton addTarget:self action:@selector(reduceGoodsButtonClick:) forControlEvents:UIControlEventTouchUpInside];
勾芒's avatar
勾芒 committed
120 121
    //放大
    [self.headerView.amplificationButton addTarget:self action:@selector(amplificationButtonClick) forControlEvents:UIControlEventTouchUpInside];
曹云霄's avatar
曹云霄 committed
122
    self.productDetilsTableview.tableHeaderView = self.headerView;
曹云霄's avatar
曹云霄 committed
123
    //添加至购物车
勾芒's avatar
勾芒 committed
124
    [self.headerView.addGoodsShoppingbagsButton addTarget:self action:@selector(addGoodsShoppingbags:) forControlEvents:UIControlEventTouchUpInside];
曹云霄's avatar
曹云霄 committed
125 126 127 128 129
}

#pragma mark -header赋值
- (void)HeaderViewAssignment
{
勾芒's avatar
勾芒 committed
130
    self.headerView.serialNumber.text = self.entity.code;
曹云霄's avatar
曹云霄 committed
131
    self.headerView.nameLabe.text = self.entity.name;
勾芒's avatar
勾芒 committed
132
    self.headerView.brandName.text = self.entity.company;
曹云霄's avatar
曹云霄 committed
133
    self.headerView.inventoryNumber.text = [NSString stringWithFormat:@"%ld",self.entity.inv];
勾芒's avatar
勾芒 committed
134
    self.headerView.dorpPriceLabe.text = [NSString stringWithFormat:@"¥%.2f",[self.entity.tagPrice floatValue]];
勾芒's avatar
勾芒 committed
135 136 137 138 139
    self.imagesArray = [NSMutableArray arrayWithArray:[self.entity.pictures componentsSeparatedByString:@","]];
    [self.headerView.goodsImageview sd_setImageWithURL:[self.imagesArray firstObject] placeholderImage:REPLACEIMAGE];
    //商品小图
    self.imagesArray = [NSMutableArray arrayWithArray:[self.entity.pictures componentsSeparatedByString:@","]];
    for (int i=0; i<self.imagesArray.count; i++) {
勾芒's avatar
勾芒 committed
140
        UIImageView *subImageview = [[UIImageView alloc]initWithFrame:CGRectMake(0, i*100, 80, 60)];
勾芒's avatar
勾芒 committed
141
        subImageview.tag = 100+i;
勾芒's avatar
勾芒 committed
142
        subImageview.userInteractionEnabled = YES;
勾芒's avatar
勾芒 committed
143 144 145 146 147 148 149 150 151 152
        [subImageview sd_setImageWithURL:[NSURL URLWithString:[self.imagesArray objectAtIndex_opple:i]] placeholderImage:REPLACEIMAGE];
        [subImageview addGestureRecognizer:[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(SubimageViewClickAction:)]];
        [self.headerView.goodsBrotherScrollview addSubview:subImageview];
    }
    self.headerView.goodsBrotherScrollview.contentSize = CGSizeMake(0, self.imagesArray.count*100);
    self.headerView.goodsBrotherScrollview.showsVerticalScrollIndicator = NO;
    self.headerView.goodsBrotherScrollview.pagingEnabled = YES;
    self.headerView.goodsBrotherScrollview.userInteractionEnabled = YES;
    
    //图文大图
153 154 155
    self.goodsDetailsArray = [NSMutableArray array];
    WS(weakSelf);
    NSArray *imagesArray = [self.entity.detailedIntro componentsSeparatedByString:@","];
156 157 158 159 160 161 162
    NSMutableArray *array = [NSMutableArray array];
    for (NSString *imageString in imagesArray) {
        NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@","];
        NSString *string = [imageString stringByTrimmingCharactersInSet:set];
        [array addObject:string];
        [[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:string] options:SDWebImageProgressiveDownload progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
            NSDictionary *dict = @{@"image":string,@"height":@(image.size.height)};
163 164 165 166 167
            [weakSelf.goodsDetailsArray addObject:dict];
            if (weakSelf.goodsDetailsArray.count == imagesArray.count) {
                [weakSelf.productDetilsTableview reloadData];
            }
        }];
168
    }
曹云霄's avatar
曹云霄 committed
169 170
}

勾芒's avatar
勾芒 committed
171
#pragma mark -小图点击手势、切换图片显示
勾芒's avatar
勾芒 committed
172 173
- (void)SubimageViewClickAction:(UITapGestureRecognizer *)tap
{
勾芒's avatar
勾芒 committed
174
    self.imageIndex = tap.view.tag-100;
勾芒's avatar
勾芒 committed
175
    [self.headerView.goodsImageview sd_setImageWithURL:[self.imagesArray objectAtIndex_opple:tap.view.tag-100] placeholderImage:REPLACEIMAGE];
勾芒's avatar
勾芒 committed
176
}
曹云霄's avatar
曹云霄 committed
177

勾芒's avatar
勾芒 committed
178 179 180 181
#pragma mark -图片放大点击
- (void)amplificationButtonClick
{
    FullScreenViewController *fullScreenVC = [[FullScreenViewController alloc]init];
勾芒's avatar
勾芒 committed
182
    fullScreenVC.datasArray = self.imagesArray;
勾芒's avatar
勾芒 committed
183
    fullScreenVC.isProductLibrary = YES;
勾芒's avatar
勾芒 committed
184 185
    fullScreenVC.currentindex = self.imageIndex;
    [self presentViewController:fullScreenVC animated:YES completion:nil];
勾芒's avatar
勾芒 committed
186
}
勾芒's avatar
勾芒 committed
187 188


曹云霄's avatar
曹云霄 committed
189 190
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
勾芒's avatar
勾芒 committed
191 192 193 194 195 196 197
    if (indexPath.section == 0) {
        ProductDetailsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"productDetailscell" forIndexPath:indexPath];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.datas = self.entity;
        return cell;
        
    }
曹云霄's avatar
曹云霄 committed
198 199 200
    goodsDetailsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"goodsdetailscell" forIndexPath:indexPath];
    [cell.detailsImageView sd_setImageWithURL:[NSURL URLWithString:[self.goodsDetailsArray objectAtIndex_opple:indexPath.row][@"image"]] placeholderImage:TCImage(@"bg-big")];
    return cell;
曹云霄's avatar
曹云霄 committed
201 202
}

曹云霄's avatar
曹云霄 committed
203

曹云霄's avatar
曹云霄 committed
204 205
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
勾芒's avatar
勾芒 committed
206 207 208 209
    if (section == 0) {
        return 1;
    }
    return self.goodsDetailsArray.count;
曹云霄's avatar
曹云霄 committed
210 211
}

曹云霄's avatar
曹云霄 committed
212

曹云霄's avatar
曹云霄 committed
213 214
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
勾芒's avatar
勾芒 committed
215
    if (indexPath.section == 0) {
曹云霄's avatar
曹云霄 committed
216
        return 182;
勾芒's avatar
勾芒 committed
217
    }
218 219
    NSDictionary *dict = [self.goodsDetailsArray objectAtIndex_opple:indexPath.row];
    return [dict[@"height"] floatValue];
220 221
}

曹云霄's avatar
曹云霄 committed
222 223 224 225 226
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 0.01;
}

曹云霄's avatar
曹云霄 committed
227 228
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
勾芒's avatar
勾芒 committed
229
    return 2;
曹云霄's avatar
曹云霄 committed
230 231 232 233 234 235 236 237 238
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 50;
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
曹云霄's avatar
曹云霄 committed
239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
    goodsDetailsSectionview *sectionView = [[[NSBundle mainBundle] loadNibNamed:@"goodsDetailsSectionview" owner:self options:nil] firstObject];
    sectionView.goodSectionLabe.text = section?@"图文详情":@"商品参数";
    return sectionView;
}


#pragma mark -减少商品----增加商品
- (void)reduceGoodsButtonClick:(UIButton *)sender {
    
    NSInteger goodsNumber = [self.headerView.goodsNumber.text integerValue];
    switch (sender.tag) {
        case 100://减少
        {
            if (goodsNumber <= 1) {
                
                //不能小于1
曹云霄's avatar
曹云霄 committed
255
                [XBLoadingView showHUDViewWithText:@"不能小于1"];
曹云霄's avatar
曹云霄 committed
256 257 258
                return;
            }
            goodsNumber --;
勾芒's avatar
勾芒 committed
259
            self.headerView.goodsNumber.text = [NSString stringWithFormat:@"%ld",(long)goodsNumber];
曹云霄's avatar
曹云霄 committed
260 261 262 263
        }
            break;
        case 101://增加
        {
264
            if (goodsNumber >= self.entity.inv) {
曹云霄's avatar
曹云霄 committed
265 266
                
                //不能大于库存
曹云霄's avatar
曹云霄 committed
267
                [XBLoadingView showHUDViewWithText:@"超过库存"];
曹云霄's avatar
曹云霄 committed
268 269 270
                return;
            }
            goodsNumber ++;
勾芒's avatar
勾芒 committed
271
            self.headerView.goodsNumber.text = [NSString stringWithFormat:@"%ld",(long)goodsNumber];
曹云霄's avatar
曹云霄 committed
272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
        }
            break;
            
        default:
            break;
    }
}


#pragma mark -UITextFieldDelegate
- (void)textFieldDidEndEditing:(UITextField *)textField
{
    NSString *inputString = textField.text;
    if (![self isPureInt:inputString]) {
        
曹云霄's avatar
曹云霄 committed
287
        [XBLoadingView showHUDViewWithText:@"输入格式错误"];
曹云霄's avatar
曹云霄 committed
288 289 290
        textField.text = @"1";
        return;
    }
291
    if ([inputString integerValue] > self.entity.inv) {
曹云霄's avatar
曹云霄 committed
292
        
曹云霄's avatar
曹云霄 committed
293
        [XBLoadingView showHUDViewWithText:@"超过库存数量"];
294
        textField.text = [NSString stringWithFormat:@"%ld",(long)self.entity.inv];
曹云霄's avatar
曹云霄 committed
295 296 297 298 299
        return;
    }
}


勾芒's avatar
勾芒 committed
300
#pragma mark -开发加入购物车动画
301
- (void)StartAddShoppingCarAnimationWithimage:(UIImage *)image withStartpoint:(CGPoint)point withSize:(CGSize)size
勾芒's avatar
勾芒 committed
302
{
曹云霄's avatar
曹云霄 committed
303
    //起点
勾芒's avatar
勾芒 committed
304
    CGPoint startPoint = point;
曹云霄's avatar
曹云霄 committed
305
    //终点
勾芒's avatar
勾芒 committed
306
    CGPoint endPoint = SHARED_APPDELEGATE.shoppingCarPoint;
曹云霄's avatar
曹云霄 committed
307
    //控点
勾芒's avatar
勾芒 committed
308 309 310
    CGPoint controlPoint = CGPointMake(endPoint.x, startPoint.x);
    
    
311
    UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, size.width, size.height)];
曹云霄's avatar
曹云霄 committed
312
    imageView.backgroundColor = RGB(252, 248, 239,1);
勾芒's avatar
勾芒 committed
313
    imageView.image = image;
314
    imageView.center = point;
勾芒's avatar
勾芒 committed
315
    
316
    [self.view.window.layer addSublayer:imageView.layer];
勾芒's avatar
勾芒 committed
317
    
318 319 320 321 322 323 324
    //路径曲线
    UIBezierPath *movePath = [UIBezierPath bezierPath];
    [movePath moveToPoint:imageView.center];
    [movePath addQuadCurveToPoint:endPoint
                     controlPoint:controlPoint];
    //关键帧
    CAKeyframeAnimation *moveAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
勾芒's avatar
勾芒 committed
325 326
    
    
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341
    moveAnim.path = movePath.CGPath;
    moveAnim.removedOnCompletion = YES;
    
    //旋转变化
    CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@"transform"];
    scaleAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
    //x,y轴缩小到0.1,Z 轴不变
    scaleAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)];
    scaleAnim.removedOnCompletion = YES;
    
    //透明度变化
    CABasicAnimation *opacityAnim = [CABasicAnimation animationWithKeyPath:@"alpha"];
    opacityAnim.fromValue = [NSNumber numberWithFloat:1.0];
    opacityAnim.toValue = [NSNumber numberWithFloat:0.1];
    opacityAnim.removedOnCompletion = YES;
勾芒's avatar
勾芒 committed
342
    
343 344 345 346 347 348 349 350 351 352 353 354 355 356
    //关键帧,旋转,透明度组合起来执行
    CAAnimationGroup *animGroup = [CAAnimationGroup animation];
    //当动画完成,停留到结束位置
    animGroup.removedOnCompletion = NO;
    animGroup.fillMode = kCAFillModeForwards;
    animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim,opacityAnim, nil];
    animGroup.duration = 1;
    animGroup.delegate = self;
    [imageView.layer addAnimation:animGroup forKey:nil];
    [self performSelector:@selector(removeFromLayer:) withObject:imageView.layer afterDelay:1];
}

#pragma mark -动画完成后移除
- (void)removeFromLayer:(CALayer *)layerAnimation{
勾芒's avatar
勾芒 committed
357
    
358
    [layerAnimation removeFromSuperlayer];
勾芒's avatar
勾芒 committed
359 360 361 362 363
}

#pragma mark -完成加入购物车动画完成后回调
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
364
   [self queryShoppingCarNumber];
勾芒's avatar
勾芒 committed
365 366 367
}


曹云霄's avatar
曹云霄 committed
368
#pragma mark -添加至购物车
勾芒's avatar
勾芒 committed
369
- (void)addGoodsShoppingbags:(UIButton *)button
曹云霄's avatar
曹云霄 committed
370
{
勾芒's avatar
勾芒 committed
371 372 373
    //判断是否有当前客户
    if (![Shoppersmanager manager].currentCustomer) {
        
曹云霄's avatar
曹云霄 committed
374
        [XBLoadingView showHUDViewWithText:@"必须设置当前客户"];
勾芒's avatar
勾芒 committed
375 376
        return;
    }
377
    if ([self.headerView.goodsNumber.text integerValue] > self.entity.inv) {
曹云霄's avatar
曹云霄 committed
378
        [XBLoadingView showHUDViewWithText:@"超过库存"];
曹云霄's avatar
曹云霄 committed
379 380
        return;
    }
勾芒's avatar
勾芒 committed
381
    SaveShoppingCartRequest *shopCar = [[SaveShoppingCartRequest alloc]init];
勾芒's avatar
勾芒 committed
382
    shopCar.consumerId = [Customermanager manager].model.fid;
勾芒's avatar
勾芒 committed
383
    shopCar.goodsId = _goodsID;
384
    shopCar.count = self.headerView.goodsNumber.text;
曹云霄's avatar
曹云霄 committed
385
    WS(weakSelf);
曹云霄's avatar
曹云霄 committed
386
    [XBLoadingView showHUDViewWithDefault];
曹云霄's avatar
曹云霄 committed
387
    [HTTP networkRequestWithURL:SERVERREQUESTURL(ADDSHOPPINGBAG)  withRequestType:ZERO withParameter:shopCar withReturnValueBlock:^(id returnValue) {
曹云霄's avatar
曹云霄 committed
388
    
曹云霄's avatar
曹云霄 committed
389
        [XBLoadingView hideHUDViewWithDefault];
曹云霄's avatar
曹云霄 committed
390
        if (RESULT(returnValue)) {
勾芒's avatar
勾芒 committed
391
            NSLog(@"添加购物车成功");
曹云霄's avatar
曹云霄 committed
392
            [weakSelf StartAddShoppingCarAnimationWithimage:weakSelf.headerView.goodsImageview.image withStartpoint:[weakSelf.headerView convertPoint:[weakSelf.headerView.goodsImageview center] toView:weakSelf.view.window] withSize:weakSelf.headerView.goodsImageview.frame.size];
勾芒's avatar
勾芒 committed
393 394
        }else
        {
395
            [XBLoadingView showHUDViewWithText:MESSAGE(returnValue)];
勾芒's avatar
勾芒 committed
396
        }
397
    }withFailureBlock:^(id error) {
曹云霄's avatar
曹云霄 committed
398
        [XBLoadingView showHUDViewWithText:@"添加购物车失败"];
曹云霄's avatar
曹云霄 committed
399
    }];
曹云霄's avatar
曹云霄 committed
400 401
}

曹云霄's avatar
曹云霄 committed
402

曹云霄's avatar
曹云霄 committed
403 404 405 406 407 408 409
#pragma mark -判断是否为纯数字
- (BOOL)isPureInt:(NSString*)string{
    NSScanner* scan = [NSScanner scannerWithString:string];
    int val;
    return[scan scanInt:&val] && [scan isAtEnd];
}

勾芒's avatar
勾芒 committed
410 411
- (void)dealloc
{
412
    [Notification removeObserver:self];
勾芒's avatar
勾芒 committed
413 414 415
}


曹云霄's avatar
曹云霄 committed
416
@end