親愛的粉友們,高仿美團<三>終于和大家見面了
首先感謝你們的一直關注仑氛。同時也感謝我自己乙埃。
曾經(jīng)c++掛科,java接近掛科锯岖,英語掛科等等介袜。大學里四年每年都掛科〕龃担看到代碼就頭疼就回避遇伞,但是我很自信的。從來都沒覺得自己不行捶牢。我堅信我想要做的事鸠珠,只要就動手去做,并堅持下去一定會有成果的秋麸。哪怕是一點點也會有無限的成就感渐排。或許現(xiàn)在的我們距大牛還很遠灸蟆。so what驯耻?
這篇博文最想和你們分享的不是怎么實現(xiàn)這些功能 而是一句話:
相信自己, 別人可以做到炒考,你也可以吓歇。
這里也要謝謝iOS讓我覺得原來代碼可以這么玩,這么有趣票腰。
接下里跟你們說說美三的主要功能的實現(xiàn)城看,一個一個來:如下選選擇地址
如上界面截圖一眼望上去實現(xiàn)方案如下:
1.創(chuàng)建N個button,或者xib拉N個button
2.UICollectionView
3.for循環(huán)九宮格創(chuàng)建button
第一種SB才這么干,第二種吃飽了撐著(殺雞焉用宰牛刀杏慰?)
所以我用第三種代碼如下:
//三列
int totalloc = 3;
CGFloat buttonw = 70;
CGFloat buttonh = 30;
//算出間距 self.frame.size.width
CGFloat margin=(self.frame.size.width - totalloc * buttonw) / (totalloc + 1);
//int count=11;
for (int i = 0; i < areaArray.count; i++) {
NSDictionary *dict = areaArray[i];
NSString *titleStr = dict[@"areaName"];
int row = i / totalloc;//行號
//0/3=0,1/3=0,2/3=1; (i 從0到2都是第一行) i= 3的時候第二行
int loc = i % totalloc;//列號
//橫坐標
CGFloat buttonx = margin + (margin + buttonw) * loc;
//縱坐標
CGFloat buttony = margin + (margin + buttonh) * row;
//創(chuàng)建uiview控件
UIButton *areaButton=[[UIButton alloc]initWithFrame:CGRectMake(buttonx, buttony, buttonw, buttonh)];
[areaButton setTitle:titleStr forState:UIControlStateNormal];
[areaButton setBackgroundColor: navigationBarColor];
[areaButton addTarget:self action:@selector(areaButtonClick:) forControlEvents:UIControlEventTouchUpInside];
[self.scrollView addSubview:areaButton];
這個界面的熱門實現(xiàn)也是用的九宮格創(chuàng)建右邊的“熱ABCD测柠。炼鞠。『湫玻”
用的如下方法:
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
return _keys;
}
點擊之后回到主界面的傳值谒主,用的是block傳值
定義一個block 聲明該block對象
typedef void(^JFSendCityNameBlock)(NSString *cityNameStr);
@property (nonatomic , copy)JFSendCityNameBlock sendCityBlock;
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
if (indexPath.section >0) {
NSString *key = _keys[indexPath.section] ;
NSString *cityName = [_cities objectForKey:key][indexPath.row];
JFLog(@"%@", cityName);
##這個地方調(diào)用block用來傳值
self.sendCityBlock (cityName);
[self dismissViewControllerAnimated:YES completion:^{
}];
}
}
#pragma mark -changeCityButtonClickDelegate
-(void)changCityButtonClick:(UIButton *)sender{
JFShowAllCityViewController *showAllCityVC = [[JFShowAllCityViewController alloc]init];
###再要跳轉得倒這個控制器對象的時候給他用block回調(diào)傳值
showAllCityVC.sendCityBlock = ^(NSString *str){
[self.leftButton setTitle:str forState:UIControlStateNormal];
JFLog(@"主界面%@,",str);
};
[self presentViewController:showAllCityVC animated:YES completion:^{
}];
// [self.navigationController pushViewController:showAllCityVC animated:YES];
}
接下里說說下面這個界面這個界面用webView做的沒啥技術含量
說下隱藏底部導航按鈕
/**
* 隱藏底部導航條
*/
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.hidesBottomBarWhenPushed = YES;
}
return self;
}
webView代理方法給給當前的控制器title賦值
-(void)webViewDidFinishLoad:(UIWebView *)webView{
JFLog(@"加載webview完成");
NSString *theTitle=[webView stringByEvaluatingJavaScriptFromString:@"document.title"];
_titleLabel.text = theTitle;
[_activityView stopAnimating];
}
我要重點說下上面這個界面,是我困惑了很久的一個鬼東西百度地圖自定義氣泡,記得之前問一個簡友赃阀,讓我很郁悶霎肯。問他一個問題什么都解釋不清楚。
我會獨立一篇出來講解這個東東
主要思路如下:
1.創(chuàng)建一個數(shù)據(jù)模型(里面友經(jīng)緯度榛斯,氣泡上的數(shù)據(jù))
項目中用:JFDataModel類
2.繼承BMKPointAnnotation(里面聲明一個數(shù)據(jù)模型屬性用來傳遞模型數(shù)據(jù))
項目中用:JFAnnotation類
3.畫氣泡圖:(所謂自定義氣泡观游,就是根據(jù)需求來自 定義)
項目中用:JFCalloutView類
代碼如下:
//畫氣泡
-(void)drawRect:(CGRect)rect{
[self drawInContext:UIGraphicsGetCurrentContext()];
self.layer.shadowColor = [[UIColor blackColor] CGColor];
self.layer.shadowOpacity = 1.0;
self.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
}
-(void)drawInContext:(CGContextRef)context{
CGContextSetLineWidth(context, 2.0);
CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.3 green:0.3 blue:0.3 alpha:0.8].CGColor);
//
[self getDrawPath:context];
CGContextFillPath(context);
}
-(void)getDrawPath:(CGContextRef)context{
CGRect rrect = self.bounds;
CGFloat radius = 6.0;
CGFloat minx = CGRectGetMinX(rrect),
midx = CGRectGetMidX(rrect),
maxx = CGRectGetMaxX(rrect);
CGFloat miny = CGRectGetMinY(rrect),
maxy = CGRectGetMaxY(rrect)-kArrorHeight;
//畫向下的三角形
CGContextMoveToPoint(context, midx+kArrorHeight, maxy);
CGContextAddLineToPoint(context, midx, maxy+kArrorHeight);//畫直線
CGContextAddLineToPoint(context, midx-kArrorHeight, maxy);
//畫4個圓弧
CGContextAddArcToPoint(context, minx, maxy, minx, miny, radius);//畫完后 current point不在minx,miny,而是在圓弧結束的地方
CGContextAddArcToPoint(context, minx, miny, maxx, miny, radius);
CGContextAddArcToPoint(context, maxx, miny, maxx, maxy, radius);
CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
CGContextClosePath(context);
}
4.創(chuàng)建標注(就是創(chuàng)建大頭針)
項目中用 JFAnnotationView
關鍵代碼如下
/**
* 通過mapView快速創(chuàng)建一個annotationView
*/
+(instancetype)annotationViewWithMapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation
{
if ([annotation isKindOfClass:[BMKPointAnnotation class]])
{
static NSString *reuseIndetifier = @"annotationReuseIndetifier";
JFAnnotationView *annotationView = (JFAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseIndetifier];
if (annotationView == nil)
{
annotationView = [[JFAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseIndetifier];
}
if ([annotation isKindOfClass:[JFAnnotation class]]){
annotationView.jfannotation = (JFAnnotation *)annotation;
}
annotationView.canShowCallout = NO;
annotationView.image = [UIImage imageNamed:@"icon_map_cateid_1"];
// 設置中?心點偏移,使得標注底部中間點成為經(jīng)緯度對應點
// annotationView.centerOffset = CGPointMake(0, -18);
return annotationView;
}
return nil;
}
這個界面的點擊事件也是 用的webview做的沒啥好講的
這個界面只是預留了界面供下一個版本的控制器
接下里說說這個界面的功能
代碼如下:
#pragma mark -UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
if (textField.text.length) {
for (NSString *text in self.hisDatas) {
if ([text isEqualToString:textField.text]) {
return YES;
}
}
//輸入之后立馬插到數(shù)組 然后寫入文件
[self.hisDatas insertObject:textField.text atIndex:0];
[self.hisDatas writeToFile:JFSearchHistoryPath atomically:YES];
[self.searchTableView reloadData];
textField.text = @"";
}
return YES;
}
沒搜索一個我就把他插到文件里面驮俗,也是數(shù)據(jù)持久化的一個應用了
然后每次打開這個界面的時候就從新讀取這個文件轉為數(shù)組懂缕,再加載到tableView上這個功能有點像一個簡友:尼維的小熊的高仿城覓,搜索功能王凑,是的這個功能是看他的搪柑,但是我做了另一些封裝。
詳細源碼我已經(jīng)放到github上面了里面已經(jīng)解釋的很清楚了