OC 技術 商品詳情(計算Picture高度)(商品詳情(程式碼+視訊講解)
阿新 • • 發佈:2021-05-25
一直覺得自己寫的不是技術,而是情懷,一個個的教程是自己這一路走來的痕跡。靠專業技能的成功是最具可複製性的,希望我的這條路能讓你們少走彎路,希望我能幫你們抹去知識的蒙塵,希望我能幫你們理清知識的脈絡,希望未來技術之巔上有你們也有我。
說明:商品詳情輸根據公司返回的資料來去用不同的方法寫的,在我的部落格裡面還有另外一種寫法的。當前的這種寫法顯示圖片詳情是把每張圖片獲取回來計算 好它的高度,跟圖片存到字典數組裡面的。然後顯示的時候再從字典資料取出來顯示。
這個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;
}
}
}