- 最近开发了一个行车服务项目,iOS客户端采用
Objective-C
编写, 后端采用PHP
搭建,部署在阿里云
,操做系统为Linux CentOS 7.3
,数据库MySQL
,服务器为Apache
,是比较基础的LAMP
组合。- iOS端代码部分我会讲述总体的开发思路,一些有意思的功能点也会详细说说。
- 后端代码比较简单,想要本身尝试开发
API
的iOS开发者能够参考。- 发这篇文的主要目的是对最近的开发作一个总体回顾,同时但愿对有须要的同窗提供到一些帮助,有不少不尽合理和完善的地方,也请求各位同窗不吝赐教,感谢你们!
首先上总体的效果图:
ios
在POI检索结果页面,地图控件显示为空白,是由于模拟器运行的缘由,真机效果良好git
Star
以示鼓励,感谢~这里是后端代码简析的文章后端代码简析github
「Tips」:对于发现代码运行报错的同窗,项目使用CocoaPods
进行第三方库的集成。以前为了方便我对Pods
文件夹作了ignore
操做。刚刚已经更新,你们能够直接打开后缀为xcworkspace
的项目文件运行。不过这样Github
上面的项目体积会比较大。web
简单介绍:项目UI总体尽可能保持了饿了么
的蓝色风格,其中某些页面参考了高德地图
、饿了么
、Max+
的设计风格。sql
饿了么
UI的定位、天气模块高德地图API
开发的POI
检索,同时界面也加入了一些和高德地图
app相似的特性Max+
app的资讯模块高德地图API
和风天气API
本身搭建的后端相关接口
AFNetworking 3.0
SDWebImage
MBProgressHUD
Icon
大量使用阿里巴巴的iconfont
图标,极力推荐高德地图API
的相关使用。包括地图
、POI检索
、导航
等功能。GCD
的使用示例。包括耗时操做的后台执行、UI更新相关操做等。NSUserDefaults
维护帐户信息。这里是为使用方便,仅供参考。Core Animation
的使用。因为TableView
加载时采用HUD
的用户体验不是很友善,我本身封装了Loading
页面。Tabbar VC
做为rootController
,若是此时没有帐户信息,则采用模态弹出方式弹出登陆页面。 TextField
的点击空白和Return
回收键盘以及呼出键盘时控件移位防止遮挡的代码能够注意一下。Tabbar VC
初始化时,第一个tab栏的VC会进行定位操做,若是此时为已登陆状态,则直接调用发送历史足迹的接口。在未登陆状态下,用户点击登陆按钮,登陆成功时,会向第一个tab栏VC发送一个调用历史足迹接口的通知
。View
,UI参考了饿了么
。地理位置和通知列表按钮的点击事件采用代理
交由当前VC实现。北京市海淀区北京理工大学
。从新定位
按钮的点击事件使用代理交由主界面VC实现,避免在此界面再次实例化定位相关的对象。UICollectionView
展现。各个Cell
的Icon
使用阿里巴巴的iconfont
图标,将以往的图片素材转为字体来使用,对于素材整理、高清保真、代码方便来讲有极大的效率提高。在Web
、移动客户端
开发领域已经很是普遍地在使用。高德地图
的附近
界面UI以及部分特性。导航栏隐去,最上面是一个地图控件,以及透明的返回按钮。下面是POI
信息的tableview
。在tableview
向下滑动时,地图隐去,tableview
的frame
上移,导航栏出现。向上滑动到顶部时,tableview
下移,地图出现,导航栏隐去。tableview
滑动时特性的实现:经过scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
代理方法,判断滑动的方向,从而对tableview
的frame
以及导航栏等元素进行操做。
代码以下:数据库
//判断滑动手势方向,决定tableview的frame改变
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView.superview];
if (translation.y>0) {
NSLog(@"ssssss");
{
NSIndexPath *dic = self.poiList.indexPathsForVisibleRows.firstObject;
if (self.poiList.frame.origin.y == 64 && dic.row == 0){
[UIView animateWithDuration:0.2 animations:^{
NSLog(@"visible:::%@",dic);
showMap = YES;
self.navigationController.navigationBar.hidden = YES;
self.poiList.frame = listFrame;
}];
}
}
}else if(translation.y<0){
NSLog(@"tttt");
if (self.poiList.frame.origin.y == 300){
[UIView animateWithDuration:0.2 animations:^{
showMap = NO;
self.navigationController.navigationBar.hidden = NO;
self.poiList.frame = listFullFrame;
}];
}
}
}复制代码
在界面加载时,使用了本身封装的loading
页面:
后端
tableview
的reload
方法,然后将loading
页移除。loading
页使用basicAnimation
制做了简单的呼吸动画,keyPath
为logo图标的透明度。第一个cell的POI
地点默承认预定,显示预定图标,点击进入预定界面。
api
http
协议进行通讯。因此个人实现方式是后端收到预定请求后,直接采用随机数方式模拟店家的接受或拒绝。必定时间后,客户端调用结果查询的接口来获取预定结果。预定中
,钟表icon开始转动,而且按钮变为不可点击状态。与此同时,使用performSelector
方式延时调用获取预定结果的接口。在此网络请求的成功回调中,向主界面发送通知,然后主界面通知按钮右侧显示通知数量的红色图标。如图。UserDefaults
中的,不一样设备之间没法同步。其中涉及到一些userDefaults
中数据要求的知识,具体能够参考代码。这里是由于需求是临时想出,若是常规实现方式须要开发获取通知数据
的接口。我为了节省开发时间因此采用这种方式来模拟实现了。这个地方在之后能够完善~Max+
iOS客户端的资讯功能。第一个Cell以全图为背景,能够用来突出显示重点内容。webView
。一样使用了本身封装的Loading
图。移除时机就简单放在了webView
的finishLoad
回调方法中。其实对于Webview
真正加载完成时机的判断还有不少能够聊的东西,往后补充。section
的tableview
实现。在页面的viewWillAppear
方法中,须要调用获取缓存数据大小的方法,单独更新清除缓存
cell的内容。由于在每次切换tab的过程当中,缓存数据都有可能发生变化。tableview
实现。在信息编辑页面,仿照了微信
信息更改页面的逻辑。页面出现时,当即弹出键盘。关于使textField
在页面加载完成时即成为第一响应者的问题,须要重写- (BOOL)becomeFirstResponder
方法。代码以下:- (BOOL)becomeFirstResponder
{
[super becomeFirstResponder];
return [self.textInput becomeFirstResponder];
}复制代码
loading
页面。若是数据条目为空,则不显示tableview
,提示暂无相关信息
,如图。SDImageCache
的相关方法。咱们还能够清除本app的缓存数据所在目录来达到真正清除缓存的目的,往后讨论。B
,咱们须要除以1024
1次、2次来判断当前数据是在KB
级别仍是MB
级别,并做正确显示。userDefaults
中相关数据,而后模态弹出登陆页面。selected index
进行设置。代码以下:DELoginViewController *loginVC = [[DELoginViewController alloc] init];
[self presentViewController:loginVC animated:YES completion:^{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 耗时的操做
dispatch_async(dispatch_get_main_queue(), ^{
// 更新界面
AppDelegate * appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
appDelegate.tabbarVC.selectedIndex = 0;
});
});
}];复制代码
代码的主要开发思路基本讲述完,具体的细节你们能够和我继续交流~项目中有许多不尽合理的实现方式,小部分是考虑到时间因素。欢迎你们进行讨论、指教。
有相关的问题,欢迎你们进行留言。项目中使用的自有接口,部署在个人阿里云服务器中,可外网访问。请求你们合理使用。缓存
后端项目数据库相关的sql
代码,我已上传至后端项目。bash
若是你们有兴趣,之后我能够再讲述一下server
端的代码,固然,后端我也是初学者的水平,仅供想要入门的同窗参考。
个人我的博客网站地址: Halo的我的博客 ,欢迎你们访问。
代码已开源,地址在文章首部。若是点一下star
,我真的会很是感谢~
halo