app商店五图 ios
2017-09-28 14:36:00 weixin_34149796 阅读数 97
2462926-cc9ccc20308e2ea0.png
APP icon.png
2462926-a29e7551f03e642d.png
预览视频.png
2462926-761336e88babb608.png
预览视频要求
2462926-7018b73e76705215.png
机型尺寸

屏幕快照规范

您必须为所有设备类型提供一组屏幕快照。对于 iOS App,必须提供最高分辨率 iOS 设备的屏幕快照。对于 iPhone,您需要一组针对 5.5 英寸显示屏的屏幕快照,而对于 iPad,您需要一组针对 12.9 英寸显示屏的屏幕快照。屏幕快照必须为 JPEG 或 PNG 图像文件格式、72 dpi、RGB、拼合图层,且不透明。

2462926-d23c0b9f1e2fe2b7.png
image.png
2462926-e0f284d6a73f8cc9.png
image.png
2016-01-10 18:07:04 u012723810 阅读数 237

本次主要讲分类控制器ClassViewController

在我编写的ClassViewController里分成三个部分,

第一个顶上的scrollview,总共有七个类型(其实就是按钮),可以向右向左滑动,当然点击里面的一个类型后,它还会自动判断,如果它是靠右的类型,右边还有其它类型,它会向左移动,如果点击靠左的类型,左边如果还有其它的类型,他会自动向右移动


定义一个ScrollTabBar继承UIView,它有一个ScrollView,以及一个数组,再ClassViewController获得类型数组(例如

 _scrollTabBar.itemArray=@[@"热血",@"运动",@"言情",@"搞笑",@"魔幻",@"科幻",@"悬疑"];

然后根据类型数组的长度,以及定义好的类型按钮默认宽度,生成TabBar

-(void)createTabBarItem:(NSArray *)array{
    CGFloat width=0;
    for (int i=0; i<array.count; i++) {
        UIButton *tabBarItem=[[UIButton alloc] initWithFrame:CGRectMake(self.TabItemwidth*i,0 , self.TabItemwidth, 40)];
        tabBarItem.tag=i;
        [tabBarItem setTitle:array[i] forState:UIControlStateNormal];
        [tabBarItem setTitle:array[i] forState:UIControlStateSelected];
        [tabBarItem setTitleColor:_itemSelectColor forState:UIControlStateSelected];
        [tabBarItem addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
        [_scrollView addSubview:tabBarItem];
        width +=self.TabItemwidth;
        if (i==0) {
            tabBarItem.selected=YES;
            _lastbutton=tabBarItem;
        }
    }
    _scrollView.contentSize=CGSizeMake(width,0);
    if (!_delegate) {
        NSLog(@"delegate is nil");
    }

    if ([_delegate respondsToSelector:@selector(xml_data:)]) {
        NSLog(@"xml_data");
        [_delegate xml_data:0];
    }else{
        NSLog(@"fail");
    }
}
点击类型按钮后需要做两件事,一:是否把自己偏移,二:根据自己的TAG使tableview显示这一类型的数据

<span style="font-size:14px;">-(void)buttonClick:(UIButton *)button{
    if (_lastbutton!=button) {
        NSLog(@"%f,%f,%f",button.frame.origin.x,_scrollView.contentSize.width,self.frame.size.width);
        CGFloat offsetX = button.frame.origin.x - self.frame.size.width / 2;
        offsetX = offsetX > 0 ? (offsetX + _TabItemwidth / 2) : 0;
        offsetX = offsetX > _scrollView.contentSize.width - _scrollView.frame.size.width ? _scrollView.contentSize.width - _scrollView.frame.size.width : offsetX;
        
        [_scrollView setContentOffset:CGPointMake(offsetX, 0) animated:YES];
        _lastbutton.selected=NO;
        button.selected=YES;
        _lastbutton=button;
        
        //根据button的tag获取网络地址
        
        if ([_delegate respondsToSelector:@selector(xml_data:)]) {
            NSLog(@"xml_data");
            [_delegate xml_data:button.tag];
        }else{
            NSLog(@"fail");
        }
        //根据网络地址xml解析获取数据,然后reload table        
    }
}</span>

</pre><p></p><p>第二个AFNetworking</p><p>根据button的TAG值,由php语句返回对应的数据</p><p></p><pre name="code" class="objc">-(void)xml_data:(NSInteger)but_tag{
    
    NSString *url=[NSString stringWithFormat:@"http://ashuai.6655.la/Classview.php?case=%d",but_tag];
    NSLog(@"%@",url);
    [AFNetworkTool xmlRequestWithUrl:url success:^(NSXMLParser *xmlParser) {
        self.xmldata=[NSMutableDictionary dictionary];
        xmlParser.delegate = self;
        [xmlParser setShouldProcessNamespaces:YES];
        [xmlParser parse];
        NSLog(@"chenggong");
    } fail:^{
        NSLog(@"xml请求失败");
        UIAlertView *warn=[[UIAlertView alloc]initWithTitle:@"Error!" message:@"网络链接失败!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [warn show];
    }];
    
}

Classview.php会根据得到case值,去判断是哪一个类型,热血or运动or other然后用sql语句查找

function select_comic_type($type) //根据类型搜索动画
{
	$sql="select * from `comic` where `type`='$type'";
	return $this->Search($sql);	
}


<?php  

include("xml/sql_dll.php");
$dll=new sql_dll();

switch($_GET['case']){
		case 0:
		 $type="热血";
		 break;
		case 1:
		 $type="运动";
		 break;
		case 2:
		 $type="言情";
		 break;
		case 3:
		 $type="搞笑";
		 break;
		case 4:
		 $type="魔幻";
		 break;
		case 5:
		 $type="科幻";
		  break;
		case 6:
		 $type="悬疑";
		 break;
		default:
		 $type=0;
		 break;
	}
	if($type){
	$comic_data=$dll->select_comic_type($type); 
    foreach($comic_data as $each_comic_data){  
        $return .="<comic>  
                        <video_name>
							<value>$each_comic_data[0]</value>
						</video_name>
						<video_image>
							<value>$each_comic_data[1]</value>
						</video_image>
						<video_intro>
							<value>$each_comic_data[2]</value>
						</video_intro>
						<video_url>
							<value>$each_comic_data[3]</value>
						</video_url> 
                  </comic>";  
    }    
	header("Content-type:text/xml"); 
	echo '<?xml version="1.0" encoding="UTF-8"?>
	<data>
	'.$return.'
	</data>';
	exit;

}
else
{
	print("no data");
}
?> 

返回XML数据,然后XML的代理协议(这里就不贴了,之前有)



第三个tableview和tableViewCell

和之前的tableView还有tableViewCell异曲同工

<span style="font-size:14px;">//返回tableView的分组数
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}

//通过indexPath 来设定每一行行高
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    if (indexPath.section==0) {
        return 100;
    }
    return 0;
}

//返回每一组行数
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    if (section==0) {
        NSLog(@"number:%d",[self.data comic].count);
        return [self.data comic].count;
    }
    NSLog(@"tableview");
    return 0;
    
}



//设置TableView中每一行显示的内容和格式的
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    if (indexPath.section==0) {
        
        NSDictionary *cell_tableview_data;
        HomepageViewcell *cell=[HomepageViewcell cellWithTableView:tableView];
        cell.delegate=self;
        NSArray *cell_data=[self.data comic];
        cell_tableview_data=[cell_data objectAtIndex:indexPath.row];
        
        cell.block_name=[cell_tableview_data video_name];
        cell.block_picture=[cell_tableview_data video_image];
        NSLog(@"%@",[cell_tableview_data video_intro]);
        cell.block_intro=[cell_tableview_data video_intro];
        cell.block_section=indexPath.section;
        return cell;
    }
    
    return nil;
}
- (void)didClickcomic:(HomepageViewcell *)view atindex:(NSInteger)index atsection:(NSInteger)section
{
    NSDictionary *data;
    NSString *image_url;
    NSArray *comic_data;
    if (section==0) {
        if (comic_data==nil) {
            comic_data=[self.data comic];
        }
        data=[comic_data objectAtIndex:index];
        image_url=[data video_url];
        
        KxMovieViewController *comicVC = [KxMovieViewController movieViewControllerWithContentPath:image_url parameters:nil];
        [self.navigationController pushViewController:comicVC animated:YES];
    }
    
}</span>


我觉得很多东西都可以举一反三,主页用到了scrollView,tableView,tableViewCell,代理,AFNetworking,xml解析,分类这个控制器写代码时基本都是从主页那边copy代码了


2017-07-20 15:05:00 weixin_34100227 阅读数 31

开篇

之前写了几篇商城相关的,规格选择,小控件什么的,今天放一个购物车的代码和实现逻辑,也算对商城系列有个结尾吧。

商城系列文章:

iOS走近商城APP(一)
iOS走近商城APP(二 购物车常用控件)
iOS走近商城APP(三 WKWebView 商品规格选择框架封装)
iOS走近商城APP(四 runloop应用 获取通讯录并处理)

本篇文章主要内容

购物车的数据结构的分析
购物车的选中处理逻辑
购物车的数量变化与价格计算
购物车的商品删除与数据刷新
购物车的状态、价格刷新的公共方法


2362441-c87855c3800c079c.png
效果图.png
购物车的数据结构的分析
2362441-55d85f1875caff12.png
数据结构.png

由图可以看到,所有的数据是包含在一个大的数组内的,大的数组内又包含根据不同的商家区分的不同一级数组,每级数组里对应的是包含各个商品的数据。为了方便做处理,对一个商品数据加入

        [dict setObject:@NO forKey:@"checked"];
        [dict setObject:@NO forKey:@"checkedSection"];

checked表示商品的是否选中的标识,checkedSection标识组是否选中的标识,默认置为NO。构造一个新的数据源来进行操作。

购物车的选中处理逻辑

首先是cell左侧按钮的选择,同时设置一个临时参数,遍历当前组的时候做自加运算,如果最后数字等于组内数据条数证明全部被选中,设置组选中标识的属性。如果点击的是组上的按钮,遍历数据,把所有的行选中状态置为和组选中相同。同时走价格和选中状态检查的公共方法。全选也是同理,主要的是每次做完操作都要走公共的价格和状态更新方法。

#pragma mark -点击cell上的按钮
-(void)singleClickWithCell:(UITableViewCell *)cell{

    NSIndexPath * indexPath = [self.shopCartTableView indexPathForCell:cell];
    ShopCartAllDataModel *goodsModel = transformDataArray[indexPath.section][indexPath.row];
    goodsModel.checked = !goodsModel.checked;
    NSArray *sectionArray = transformDataArray[indexPath.section];//获取当前组内的数组
    NSInteger totalCount = 0;
    for (int i = 0; i < sectionArray.count; i++) {
        ShopCartAllDataModel *goodsModel = transformDataArray[indexPath.section][i];
        if (goodsModel.checked) {
            totalCount++;
        }
    }
    BOOL sectionSelect = (totalCount == sectionArray.count);
    if (sectionSelect) {
        ShopCartAllDataModel *model = transformDataArray[indexPath.section][0];
        model.checkedSection = YES;
    }else{
        ShopCartAllDataModel *model = transformDataArray[indexPath.section][0];
        model.checkedSection = NO;
    };
    [self.shopCartTableView reloadData];
    
    [self checkSelcetState];
    [self CalculatedPrice];

}
#pragma mark -点击组头试图
-(void)goto_supplier_action:(UIButton *)sectionBtn{
    ShopCartAllDataModel *model = transformDataArray[sectionBtn.tag][0];
    model.checkedSection =!model.checkedSection;
    NSArray *sectionArray = transformDataArray[sectionBtn.tag];
    for (int i = 0; i < sectionArray.count; i++) {
        ShopCartAllDataModel *goodsModel = transformDataArray[sectionBtn.tag][i];
        goodsModel.checked = model.checkedSection;
    }
    [self.shopCartTableView reloadData];
    [self checkSelcetState];
    [self CalculatedPrice];
}
#pragma mark -全选按钮
-(void)clickAllSelctBtn{
    self.allSelectBtn.selected = !self.allSelectBtn.selected;

    if (self.allSelectBtn.selected) {
        for (int i= 0; i< transformDataArray.count; i++) {
            NSMutableArray *temptArray =[[NSMutableArray alloc]initWithArray:transformDataArray[i]];
            for (int j= 0; j <temptArray.count; j++) {
                ShopCartAllDataModel *goodsModel = temptArray[j];
                goodsModel.checked =YES;
                goodsModel.checkedSection =YES;
            }
        }
        [self.shopCartTableView reloadData];
        [self CalculatedPrice];
        
    }else{
        for (int i= 0; i< transformDataArray.count; i++) {
            NSMutableArray *temptArray =[[NSMutableArray alloc]initWithArray:transformDataArray[i]];
            for (int j= 0; j <temptArray.count; j++) {
                ShopCartAllDataModel *goodsModel = temptArray[j];
                goodsModel.checked =NO;
                goodsModel.checkedSection =NO;
            }
        }
        [self.shopCartTableView reloadData];
        [self CalculatedPrice];
        
    }
}

实现的效果如下:


2362441-0437c8046f946581.gif
选中.gif
购物车的数量变化与价格计算

数量的变化控件是单独封装的一个View,加到cell通过cell上的代理处理相关的点击操作,判断当数字小于1的时候不允许继续减少。在每次加减的时候控制中间的数量控件变化的同时要改变model中对应价格的字段的数值,以便能够重新计算价格。

#pragma mark -加减按钮 协议方法
//加
-(void)clickCountViewAddBtnWithCell:(UITableViewCell *)cell WithCountView:(countNumView *)countView{
    NSIndexPath * indexPath = [self.shopCartTableView indexPathForCell:cell];
    ShopCartAllDataModel *goodsModel = transformDataArray[indexPath.section][indexPath.row];
     countView.reduceBtn.enabled =YES;
    NSInteger addNum =[countView.countTextfiled.text integerValue];
    addNum ++;
    countView.countTextfiled.text = [NSString stringWithFormat:@"%ld",addNum];
    
    NSDictionary *rowDic =originalArray[indexPath.section][indexPath.row];
    goodsModel.market_price = [NSString stringWithFormat:@"%.2f",[[rowDic objectForKey:@"market_price" ] floatValue]*addNum];
    [self.shopCartTableView reloadData];
    [self checkSelcetState];
    [self CalculatedPrice];
}
//减
-(void)clickCountViewReduceBtnWithCell:(UITableViewCell *)cell WithCountView:(countNumView *)countView{
    
    NSIndexPath * indexPath = [self.shopCartTableView indexPathForCell:cell];
    ShopCartAllDataModel *goodsModel = transformDataArray[indexPath.section][indexPath.row];
    NSInteger reduceNum =[countView.countTextfiled.text integerValue];
    NSDictionary *rowDic =originalArray[indexPath.section][indexPath.row];
    if ( reduceNum <= 1) {
        countView.reduceBtn.enabled =NO;
        goodsModel.market_price = [NSString stringWithFormat:@"%.2f",[[rowDic objectForKey:@"market_price" ] floatValue]*1];
        
    }else{
        countView.reduceBtn.enabled =YES;
        reduceNum --;
        countView.countTextfiled.text = [NSString stringWithFormat:@"%ld",reduceNum];
        goodsModel.market_price = [NSString stringWithFormat:@"%.2f",[[rowDic objectForKey:@"market_price" ] floatValue]*reduceNum];
        
    }
    [self.shopCartTableView reloadData];
    [self checkSelcetState];
    [self CalculatedPrice];
    
}

实现效果如下:


2362441-631e01d754207dc4.gif
价格变化.gif
购物车的商品删除与数据刷新

商品的删除首先要存储到想要删除的数据,同时符合选中状态切是右上角按钮状态是编辑状态的信息存储到一个数组内。比如我们存储一个商品的订单号id来作为删选标识。

#pragma mark -结算按钮
-(void)clickMakeSureBtn{
    if (self.rightTopBtn.selected) {//删除相关选中商品
        for (int i= 0; i< transformDataArray.count; i++) {
            NSMutableArray *temptArray =[[NSMutableArray alloc]initWithArray:transformDataArray[i]];
            for (int j= 0; j <temptArray.count; j++) {
                ShopCartAllDataModel *goodsModel = temptArray[j];
                if (goodsModel.checked && self.rightTopBtn.selected) {
                   //把要删除的数据存进一个数组
                    [deleteGoodsArray addObject:goodsModel.goods_sn];

                    [self deletaGoods];//删除数据
                }else{
                    [self deletaGoods];
                }
            }
        }
    }else{//结算相关选中商品
        for (int i= 0; i< transformDataArray.count; i++) {
            NSMutableArray *temptArray =[[NSMutableArray alloc]initWithArray:transformDataArray[i]];
            for (int j= 0; j <temptArray.count; j++) {
                ShopCartAllDataModel *goodsModel = temptArray[j];
                if (goodsModel.checked) {
                    
                    //得到选中的数据信息
                }
            }
        }
    }
}

商品信息的删除,这里采用的不是删除二维数组的对应坐标,而是遍历整个数据源,判断如果我们用以保存删除数据的数组deleteGoodsArray内部是否包含当前遍历数据的id,如果不包含,就把他添加到一个新的数据源中,这样,遍历结束,我们得到的一个新的数据源就是所有不包含删除数据的数据源数组,这是用它来替换原来的数据源数据,刷新列表,实现数据的删除。

#pragma mark -处理删除数据  排除要删除信息后新造一个数据源
-(void)deletaGoods{
    NSMutableArray *backDetailArray = [[NSMutableArray alloc]init];
    for (int i= 0; i< transformDataArray.count; i++) {
        NSMutableArray *temptArray =[[NSMutableArray alloc]initWithArray:transformDataArray[i]];
        NSMutableArray *sectionDetailArray = [[NSMutableArray alloc]init];
        for (int j= 0; j <temptArray.count; j++) {
            ShopCartAllDataModel *goodsModel = temptArray[j];
            if (![deleteGoodsArray containsObject:goodsModel.goods_sn]) {
                [sectionDetailArray addObject:transformDataArray[i][j]];
            }
         }
        if (sectionDetailArray.count) {
            [backDetailArray addObject:sectionDetailArray];
        }
    }
    [transformDataArray removeAllObjects];
    [transformDataArray addObjectsFromArray:backDetailArray];
    [self.shopCartTableView reloadData];
    [self CalculatedPrice];
}

实现效果如下:


2362441-9b97f58fb1b25fa2.gif
删除.gif
购物车的状态、价格刷新的公共方法

公共方法主要是两个,用以遍历选中状态和每次操作后的价格数据刷新。

#pragma mark -每次选中都走的方法检查是否全部选中
-(void)checkSelcetState{
    NSInteger totalSelected = 0;
    NSInteger realRowNum = 0;
    for (int i= 0; i< transformDataArray.count; i++) {
        NSMutableArray *temptArray =[[NSMutableArray alloc]initWithArray:transformDataArray[i]];
        for (int j= 0; j <temptArray.count; j++) {
            ShopCartAllDataModel *goodsModel = temptArray[j];
            realRowNum ++;
            if (goodsModel.checked) {
                totalSelected ++;
            }
        }
    }
    if (totalSelected == realRowNum) {    
        self.allSelectBtn.selected =YES;
    }else{
        self.allSelectBtn.selected =NO;
    }
}
#pragma mark - 价格的计算
-(void)CalculatedPrice{
    float price = 0;
    for (int i= 0; i< transformDataArray.count; i++) {
        NSMutableArray *temptArray =[[NSMutableArray alloc]initWithArray:transformDataArray[i]];
        for (int j= 0; j <temptArray.count; j++) {
            ShopCartAllDataModel *goodsModel = temptArray[j];
            if (goodsModel.checked) {
                price = price+ [goodsModel.market_price floatValue];
            }
        }
    }
    self.priceLabel.text = [NSString stringWithFormat:@"%.2f元",price];
}

核心基本就是这些了,这样我们就简单实现了一个简单的小购物车的逻辑。至于一些加入购物车的过期商品,下架商品的处理逻辑,以后有机会了再慢慢更新到git上吧。只是为了实现一个简单的功能,有些地方可能写的不够简洁和规范,主要是希望总结下思路练练手。有不好的地方多包涵,下面里面放上git地址,千万别说故意不放代码,哈哈


2362441-dcd5bd85c2b055e6.jpg
否认三连.jpg

git地址,喜欢的star一下😜

代码在这里,看这里:
购物车项目代码ShopCartTest

后记

搞了一年多的商城,也写了几篇多多少少和项目有关的文章,最后还是补上了购物车,毕竟没有购物车的商城不叫真正的商城,哈哈。接下来估计要转入新项目,看看有没有机会写一个别的系列吧,这些文章算是自己的一个小小的总结吧,也希望对有需要的同学有所帮助。

2016-07-12 15:31:00 weixin_34355559 阅读数 311

iPhone 4S:640x960

5 Series:1136x640

iPhone 6:1334x750

iPhone 6 Plus:2208x1242


icon尺寸为1024x1024 有时提示Alpha不对 打开图片


2462926-a9dcdf6d2f3b5059.png
2462926-df632b948cc699be.png


2462926-db20214c6c9662c5.png
没有更多推荐了,返回首页