1. 程式人生 > 其它 >OC 技術 商品詳情(計算Picture高度)(商品詳情(程式碼+視訊講解)

OC 技術 商品詳情(計算Picture高度)(商品詳情(程式碼+視訊講解)

一直覺得自己寫的不是技術,而是情懷,一個個的教程是自己這一路走來的痕跡。靠專業技能的成功是最具可複製性的,希望我的這條路能讓你們少走彎路,希望我能幫你們抹去知識的蒙塵,希望我能幫你們理清知識的脈絡,希望未來技術之巔上有你們也有我。

說明:商品詳情輸根據公司返回的資料來去用不同的方法寫的,在我的部落格裡面還有另外一種寫法的。當前的這種寫法顯示圖片詳情是把每張圖片獲取回來計算 好它的高度,跟圖片存到字典數組裡面的。然後顯示的時候再從字典資料取出來顯示。
這個tableview顯示不是用自適應的,而是計算好高度顯示的

效果

在這裡插入圖片描述

連結
商品詳情(計算Picture高度)(商品詳情(程式碼+視訊講解)

主要程式碼

//獲取資料   本地資料來的
-(void)buildData{
  self.viewModel = [ProductDetailViewModel new];
  dispatch_async(dispatch_get_global_queue(0, 0), ^{
    NSData *productData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"ProductDetail" ofType:@"json"]];
    NSDictionary *
productJson = [NSJSONSerialization JSONObjectWithData:productData options:NSJSONReadingMutableContainers error:nil]; self.viewModel.model = [POPShopDetailModel yy_modelWithJSON:productJson[@"data"]]; //預設選中第一個規格 if (self.viewModel.model.specPrice != nil && ![self.viewModel.
model.specPrice isKindOfClass:[NSNull class]] && self.viewModel.model.specPrice.count != 0) { self.viewModel.model.specPrice.firstObject.isSelected = YES; } //合併圖片詳情陣列 [self.viewModel mergeArr:self.viewModel.model.goodsInfo]; //初始化佔位圖 [self.viewModel getNormalIconList:self.viewModel.model.iconUrlList]; //計算樓層 [self.viewModel dataModel]; dispatch_async(dispatch_get_main_queue(), ^{ if (!self.icon) { if (self.viewModel.model.goodsInfo.showcase_img_url != nil || [self.viewModel.model.goodsInfo.showcase_img_url isEqualToString:[NSString new]]) { NSString *requestURLString=[NSString stringWithFormat:@"%@%@",@"https://v3.nahuomall.com",self.viewModel.model.goodsInfo.showcase_img_url]; [self.shopDetailIcon sd_setImageWithURL:[NSURL URLWithString:requestURLString] placeholderImage:[UIImage imageNamed:@"spellgroup_nopic_normal"]]; } } [UIView animateWithDuration:0.8 animations:^{ self.buyView.frame = [ScreenObject isNotchScreen]?CGRectMake(0, Phone_Height-50-positivesafeHeight, Phone_Width, 50):CGRectMake(0, Phone_Height-50, Phone_Width, 50); }]; self.buyView.model = self.viewModel.model.customer_info; self.buyView.collectionBtn.selected = self.viewModel.model.goodsInfo.isFav; //顯示詳情引導頁 // [GuideObject guideDetailAction]; [self.tableview reloadEmptyDataSet]; [self.tableview reloadData]; dispatch_async(dispatch_get_global_queue(0, 0), ^{ //獲取詳情圖顯示 高度 儲存到字典數組裡面 [self.viewModel getIconAndIconSize:self.viewModel.model.iconUrlList]; dispatch_async(dispatch_get_main_queue(), ^{ [self.tableview reloadData]; }); }); }); }); } //合併圖片詳情陣列 -(void)mergeArr:(GoodsInfoModel*)model{ NSMutableArray *arr = [NSMutableArray new]; if (model.content_img_list != nil && ![model.content_img_list isKindOfClass:[NSNull class]] && model.content_img_list.count != 0) { [arr addObjectsFromArray:model.content_img_list]; } if (model.feature_img_list != nil && ![model.feature_img_list isKindOfClass:[NSNull class]] && model.feature_img_list.count != 0) { [arr addObjectsFromArray:model.feature_img_list]; } if (model.ship_desc_img_list != nil && ![model.ship_desc_img_list isKindOfClass:[NSNull class]] && model.ship_desc_img_list.count != 0) { [arr addObjectsFromArray:model.ship_desc_img_list]; } if (model.spec_desc_img_list != nil && ![model.spec_desc_img_list isKindOfClass:[NSNull class]] && model.spec_desc_img_list.count != 0) { [arr addObjectsFromArray:model.spec_desc_img_list]; } //去重 NSMutableArray *cancelArr = [NSMutableArray new]; for (NSString *url in arr) { if (![url isEqualToString:[NSString new]]) { [cancelArr addObject:url]; } } self.model.iconUrlList = cancelArr; } //建立預設圖片陣列 -(void)getNormalIconList:(NSArray<NSString*> *)list{ for (int i = 0; i < list.count; i++) { NSMutableDictionary *dict = [NSMutableDictionary new]; [dict setObject:[UIImage imageNamed:@"spellgroup_nopic_normal"] forKey:@"image"]; NSNumber *numberObject = [[NSNumber alloc] initWithFloat:Phone_Width]; [dict setObject:numberObject forKey:@"imageHeight"]; [dict setObject:list[i] forKey:@"name"]; [self.model.detailDicList addObject:dict]; } } //獲取所有圖片跟計算圖片大小 存到數組裡面 -(void)getIconAndIconSize:(NSArray<NSString*> *)list{ for (NSString* url in list) { NSMutableDictionary *currentDict = [self getHeightByImageByURLStr:url]; if (currentDict[@"imageHeight"] != nil && currentDict[@"image"] != nil) { for (NSMutableDictionary *dic in self.model.detailDicList) { if (dic[@"name"] == currentDict[@"name"]) { dic[@"imageHeight"] = currentDict[@"imageHeight"]; dic[@"image"] = currentDict[@"image"]; break; } } } } } //通過URL從快取或者網路獲取新的圖片高度 -(NSMutableDictionary *)getHeightByImageByURLStr:(NSString*)imageUrlStr{ NSMutableDictionary *resultDict = [[NSMutableDictionary alloc]initWithCapacity:0]; NSString *MyURL = [imageUrlStr containsString:@"http"] ? imageUrlStr : [NSString stringWithFormat:@"%@%@",@"https://v3.nahuomall.com",imageUrlStr==nil?@"":imageUrlStr]; NSURL * url = [NSURL URLWithString:MyURL]; NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *image = [UIImage imageWithData:data]; if (image) { //此方法會先從memory中取。 //通過URL檢測快取是否有圖片 CGFloat itemW = Phone_Width; CGFloat itemH = 0; if (image.size.width) { itemH = image.size.height / image.size.width * itemW; if (itemH >= itemW) { itemW = Phone_Width; itemH = image.size.height / image.size.width * itemW; } } [resultDict setObject:image forKey:@"image"]; NSNumber *numberObject = [[NSNumber alloc] initWithFloat:itemH]; [resultDict setObject:numberObject forKey:@"imageHeight"]; [resultDict setObject:imageUrlStr forKey:@"name"]; } return resultDict; }

賦值圖片高度去字典陣列儲存的高度

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
  
   ProductDetailDataModel *value = self.viewModel.cellMessageList[indexPath.section];
  switch (value.type) {
    case ShowProductDetailIconList:{
      if (indexPath.item > self.viewModel.model.detailDicList.count-1) {return 0;}
      NSDictionary *dic = self.viewModel.model.detailDicList[indexPath.item];
      NSString *height = dic[@"imageHeight"];
      return [height floatValue];
      break;
    }
    default:{
      return self.viewModel.cellMessageList[indexPath.section].rowsHegiht;
      break;
    }
  }
}

賦值高度去字典陣列儲存的圖片

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  ProductDetailDataModel *value = self.viewModel.cellMessageList[indexPath.section];
  switch (value.type) {
      //還有其他的樓層這裡沒有貼出來
     case ShowProductDetailIconList:{
      ProductDetailIconCell *cell = [ProductDetailIconCell cellWithTableView:tableView];
      if (indexPath.item > self.viewModel.model.detailDicList.count-1) {return cell;}
      NSMutableDictionary *dic = self.viewModel.model.detailDicList[indexPath.item];
      cell.icon.image = dic[@"image"];
      return cell;
      break;
    }
    default:{
      UITableViewCell *cell = [UITableViewCell new];
      cell.backgroundColor = [Color randomColor];
      return cell;
      break;
    }
  }
  
}