iOS,如何模仿一个App

本文提供了一位iOS开发者在模仿高仿半糖App时的经验分享,包括设计思路、素材获取、数据抓包及编程注意事项。通过案例分析,详细介绍了如何解决在开发过程中遇到的问题,如不知道如何入手、素材获取、数据处理等,旨在帮助开发者快速提升技能。

来源: ManoBoo   

链接:http://www.jianshu.com/p/a634b66cb180


前言


作为一个IOS程序员,闲的时候也想自己做一个app练练手,又苦于没有UI设计,也没有好的idea,所以只能先模仿别人的App了,但是也会遇到以下问题


①不知道怎么入手?怎么设计

②app中的素材、图标要自己找吗、没有UI妹子给你切图怎么办,

③没有数据怎么办?假数据也不会做怎么办

④编写程序中该注意些什么


以下就从上面的三点开始介绍


Tips:以下均为我个人的见解,有疑问或者建议请告诉我

以我的高仿项目半糖App为例


一、不知道怎么入手?怎么设计

首先,整体浏览一下官方的半糖App,





上面几张图片分别对应的是 首页、广场、消息中心、个人中心(下方的四个菜单项),rootViewController是 UITabBarController,以首页为例


Tips:

1 整体上分为 两大部分 headerView 和UICollectionView

2 每次点击标签 “最新” “热门”等,collectionView 都会滚动到对应标签的tableView中


collectionView结构上来看就是这样:



也就是 tableview 添加到collectionViewCell.contentView中显示出来


*headerView的结构如下




这一部分组合的自由度较大,然后每个按钮都设置不同tag,然后所有按钮添加相同的方法,比如


-(void)clickCenterWithTag:(UIButton *)sender

{

  if(sender.tag == 按钮tag)

{

 }

}


当然也可以设置一个block回调,参数为按钮tag值,在ViewController中 给block赋值的时候,比如


headerView.clickCenterBlock = ^(Inttag)

{

  //在这里进行判断,tag等于多少,进行什么操作

}


还有通知、delegate(或者建立button数组,然后从数组中取出button)等方法都可以,就不一一细说了。。


之后的页面没有太过于复杂的结构,对照首页,也可以一一将View剥离出来


二、app中的素材、图标要自己找吗、没有UI妹子给你切图怎么办

① app中好多按钮的图标、背景图片哪里找

大招:电脑上在iTunes中下载你要模仿的app,找到它的存储目录(具体方法百度。)

参考:

教你如何查看一款App里面所包含的图片

网址: http://www.cnblogs.com/imzzk/archive/2013/11/13/appincludepic.html


接着,把 后缀.ipa 改为.zip ,然后把 zip文件打开



显示包内容后,可以看到大部分你所需要的素材图片了


② 切图标注问题(切图我就不说了,我只会截图,ps什么的都不会)


手机安装你要模仿的app,然后截屏,把图片发到电脑上,然后安装Mark Man工具,


然后将图片拖到Mark Man中



然后就可以随心所欲地标注,取色等等


三、没有数据怎么办?该怎么去抓包


没有数据有两个方法:

① 做假数据,数据写死,这个不是很现实,因为你要模仿的app肯定有图片,这么做假数据得到猴年马月。。。

② 抓包,其实过程不是很繁琐

下面讲一下抓包的过程:


* 1 工具



Charles 百度上很多可以下载,试用版即可,不需要破解


使用过程:


①将手机和电脑连上同一个wifi,打开抓包工具


②打开半糖app



抓到半糖app的数据,点进去如下:



这就是半糖app的数据,如果没有你想要的,别急,你先浏览你要抓数据的页面,这时候会发现这个目录有新的数据返回,点进去可以看到



点击 JavaScript按钮可以看到原始的json数据



将json数据 拷贝到文件中存储起来,这就是本地数据


②下面说一下 如何解析数据,以swift为例,OC类似参考一下。

比如我们将刚刚的json存为 test.rtf(别问我为什么是rtf,因为mac上记事本只有这么一个,当然你也可以存为txt格式等),然后把test.rtf拖到项目中来



Tips: 在这里,我们首先要明白一点,字典即为对象的一种表现形式。

先把模型写好:


classTopicModel:NSObject{

  //先写两个属性

  varid:String?

  vartitle:String?

 

  //从json中读取数据 并给model赋值(以下为Swift代码,OC请参考),封装成类方法更方便

  classfun readDataFromJSON() -> TopicModel{

    //创建返回的model

    lettopicModel = TopicModel()

    //读取JSON文件

    letpath = NSBundle.mainBundle().pathForResource("test",ofType:"rtf")

    letnsData = NSData(contentsOfFile:path!)

    /// json整体转换为字典

    letDict = (try!NSJSONSerialization.JSONObjectWithData(nsData!,options:.AllowFragments))as!NSDictionary

 

  //看上面的图片中,你要抓得数据处于 四层目录下,一步一步来

 

  //先把 "data"从json文件中 剥离出来

    letData = Dict.objectForKey("data")as!NSDictionary

 

  //从Data 中把 "topic"数组剥离出来,由图片可以看到 topic是一个数组 ,存了好多个相同类型的数据

    lettopicData = Data.objectForKey("topic")as!NSArray

 

  //topic数据已经获取,我们先将第一个元素剥离出来,

  // 定义一个object对象,并转换为字典类型

  letobj = topicData[0]as!NSDictionary

 

// 现在将obj字典的值 赋给 我们定义的topicModel

  topicModel.id = obj.objectForKey("id")as?String

  topicModel.title = obj.objectForKey("title")as?String

 

    //end: 到现在 给model赋值就可以了,返回model即可

 

  returntopicModel

  }

}


在需要用到model的地方,直接调用 Topic.readFromJSON 就会返回你要的model


现在看来,抓包并没有我们想象中的繁琐


四、编写程序应该注意什么


Tips: 这一部分只是参照我的经验来看,如有建议或者意见请与我交流,望不吝赐教


① 代码尽量要复用,封装控件前看看是否几个控件相似,可以放到一起,比如:


这个是 广场中的标签栏



这个是个人中心的标签栏



这个是清单详情的标签栏



三个控件有不相同的地方,比如标签中的分割线,上面的边框,字体大小,但是,控件中的所有逻辑都一样,这就够了,可以写一个控件,加一些参数,比如说 是否显示边框,frame大小,中间是否有分割线,这样做的话,封装一个控件就可以满足 整个app中类似的控件


② 方法,或者称之为函数,封装也尽量放到一起,比如


app中有很多对图片进行的操作,诸如 放大,裁剪,加边框,可以这样:


//将 这些方法都封装为 类方法 ,OC中也就是 "+"方法

classImageOperationCenter:NSObejct{

 

    classfunc ScaleToFize(image:UIImage) -> UIImage{

      //对图片进行裁剪处理,并返回

    }

    classfunc MakeScale(image:UIImage,scale:CGFloat) -> UIImage{

      //对图片进行放大处理,并返回

    }

}


Tips:如上,将对图片的处理方法,都放在 ImageOperationCenter 这个类中,调用的时候只需要像这样 let image = ImageOperationCenter.MakeScale(源照片,放大倍数)即可,用着也方便


③ 与第一点类似,很多相似的控件,Cell尽量复用


诸如



半糖精选的cell 与 用户推荐的cell 类似,但是有不同的地方,而且用到的model也不同,这样我们就要重写两种cell吗,不需要,只要 “用户推荐”的cell 继承 “半糖精选” 的cell,重写里面的方法即可,省了好多功夫,所以写程序一定要在不损失质量的前提下怎么省事怎么来


再来看一个例子。



这个通常会将它作为collectionView处理,其实,只有8个button的情况下,将button封装为一个View即可,这样,ViewController中会少了一堆代理方法和一堆初始化collectionView方法

这个也就因人而异吧,要灵活运用哦~


⑤ 其实看到一个页面要先把整个页面的结构确定好,不要写了一半才发现这样写好像太麻烦,或者这样写写不出来


我在我的高仿半糖app中 首页就遇到了这样的问题,开始想着 用UIScrollView当做容器,里面添加UITableView显示内容,这样做未尝不可,但是考虑到复用的问题,可以用三个tableView完成复用,但是这样做过于麻烦,所以后来就用collectionView当做容器,将tableView 添加到collectionViewCell中显示出来,这样复用的问题就解决了


写在后面的话


我的开发经验也不多,上面完全是我在做项目中自己的感悟和体会,有些可能会有问题,请参考即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值