前段时候在简书看博客时,看到Monkey_ALin 分享的高仿花田小憩(Swift版),项目整体不是太复杂,并且展示效果确实挺不错的,就萌发了工作之余用OC仿写的念头。ps:主要是偷懒,不用再找UI,不用再找接口了,在这要非常感谢Monkey_ALin,节省了很多时间!
展示效果
项目整体的实现逻辑与思路与Swift版的差不多,大家可以参照文章。另外完善了一些Swift版的部分问题。
完善部分
1.点击导航栏左侧按钮出现下拉蒙版视图
Swift版的,蒙版的Top约束是与当前 tableView的偏移量为参考点,当 tableView滑动时偏移量一直在改变,蒙版frame也会随之改变,出现这种情况。所以解决这种情况,蒙版约束的参考物一定是固定的,刚开始我用navigationBar的底部为参照物,看似解决了这个问题,但是当点击蒙版上的cell,进入下一个控制器的时候,navigationBar的位置竟然会发生改变,正常情况下,navigationBar(44)上面有状态栏(20),当跳转的时候状态栏会消失,这就造成了,跳转后返回时,蒙版会上移20(状态栏高度)。为了解决这个问题想了很久,一直在钻牛角尖,想着怎么在顶部找到或者添加一个固定的控件当做蒙版参照物, 但是在TableViewController上找到固定控件太麻烦了,最后用了最直接的方法,为控制器换个爹(代码也拼爹。。)!把父类TableViewController换成 ViewController,以ViewControllerView的top为参考点。
总结:当遇到界面复杂的TableView时候,最好使用ViewController,方便扩展。
//设置blurView的约束
[self.blurView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.tableView);
make.top.equalTo(self.view.mas_top);
make.size.mas_equalTo(CGSizeMake(MY_WIHTE, MY_HEIGHT-49-64));
}];
2.详情页webview的高度
详情页用H5页面展示的,cell里面嵌套一个webview,然后根据webview的高度来确定cell 的高度。Swift版在webViewDidFinishLoad中使用webView.scrollView.contentSize.height取出高度,而我使用[[webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight;"] intValue];来拿到内容高度,通过打印用两种方法拿到的高度,可以看出直接使用webView.scrollView.contentSize.heigh第一次拿到的高度在网络不好时,有时候不准确,会造成cell内容展示不全。
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
//加载本地的JS文件
NSString *jsStr = [NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"image" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil];
[webView stringByEvaluatingJavaScriptFromString:jsStr];
//为每个图片添加点击事件
[webView stringByEvaluatingJavaScriptFromString:@"setImageClick()"];
NSInteger height = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight;"] intValue];
//避免浪费性能,所以计算一次高度即可
if (!self.isFinishLoad && webView.scrollView.contentSize.height > 0) {
self.isFinishLoad = YES ;
self.cellHeigth = height;
//#warning 使用这个方法算出的高度不准
// self.cellHeigth = webView.scrollView.contentSize.height;
}
}
3.商城模块的容错处理
在商城模块中,第一个自定义cell是一个轮播图,后台轮播数据非常不稳定,有时候请求结果为空,原版做了容错处理,在请求数据为空的时候,不显示第一个轮播cell.OC版完善了容错处理。
4.完善了订单页 增加添加发票地址
后记:
用OC仿写后,与swift相对比。swift这门语言及其精简优雅,代码量以及文件量只有OC的一半左右。所以,兄弟们,闲暇之余不要忘了swift,swift才是以后的主流.另外项目中有一个bug,没有解决,有兴趣的可以下载项目后,找到带有警告的那个标注(唯一的警告处),解决后私信交流交流,感觉项目对自己技术有帮助的,欢迎start,鼓励一下。**github:OC版 swift版 **