iOS_21团购_地图功能

最终效果图:

bet36365注册送奖金 1

< 喎?http://www.Bkjia.com/kf/ware/vc/” target=”_blank”
class=”keylink”>vcD4KPHA+09LPwr3HtcS72LW908O7p8671sOwtMWlOjwvcD4KPHA+PGltZyBzcmM9″http://www.2cto.com/uploadfile/Collfiles/20140826/2014082608540575.png
alt=”\”>

MapController控制器,

是主控制器左侧dock上面的【地图】按钮对应的控制器,

继承自ShowDealDetailController,

因此,自动拥有了展示团购详情控制器的功能

//
//  MapController.h
//  帅哥_团购
//
//  Created by beyond on 14-8-14.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  dock上面的【地图】按钮对应的控制器,继承自ShowDealDetailController.h控制器,自动拥有了展示团购详情控制器的功能了

#import "ShowDealDetailController.h"

@interface MapController : ShowDealDetailController

@end




//
//  MapController.m
//  帅哥_团购
//
//  Created by beyond on 14-8-14.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  dock上面的【地图】按钮对应的控制器,继承自ShowDealDetailController.h控制器,自动拥有了展示团购详情控制器的功能了

#import "MapController.h"
#import 
#import "DealRequestTool.h"
#import "MetaDataTool.h"
#import "LocationTool.h"
// 成员有经纬度坐标
#import "City.h"
// 一个商户模型
#import "Business.h"
#import "Deal.h"
// 一个大头针模型,为大头针View提供数据源的
#import "MyAnnotation.h"
// 跨的经度和纬度
#define kSpan MKCoordinateSpanMake(0.018404, 0.031468)

@interface MapController ()
{
    MKMapView *_mapView;
    NSMutableArray *_showingDeals;
}
@end

@implementation MapController

- (void)viewDidLoad
{
    [super viewDidLoad];


    self.title = @"地图";
    // 0.监听定位完成的通知.....这里面有问题
    kAddAllNotes(dataChange)

    // 1.添加地图
    MKMapView *mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
    mapView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    // 显示用户的位置点
    mapView.showsUserLocation = YES;
    // 设置代理
    mapView.delegate = self;
    [self.view addSubview:mapView];

    // 2.初始化数组
    _showingDeals = [NSMutableArray array];


    // 3.添加回到用户位置的按钮
    [self addBackToUserLocationBtn];

}

- (void)addBackToUserLocationBtn
{
    // 3.添加回到用户位置的按钮
    UIButton *backUserBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    CGSize imgSize = [backUserBtn setBtnBgImgForNormal:@"btn_map_locate.png" highlightedName:@"btn_map_locate_hl.png"];
    CGFloat w = imgSize.width;
    CGFloat h = imgSize.height;
    CGFloat margin = 20;
    CGFloat x = self.view.frame.size.width - w - margin;
    CGFloat y = self.view.frame.size.height - h - margin;
    // 按钮处于右下角所以左边距和上边距自动伸缩
    backUserBtn.frame = CGRectMake(x, y, w, h);
    backUserBtn.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin;
    [backUserBtn addTarget:self action:@selector(backToUserLocationBtnClicked) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:backUserBtn];
}

// 返回到用户中心点按钮被点击
- (void)backToUserLocationBtnClicked
{
    // mapView里面保存着用户的位置信息(The annotation representing the user's location)
    CLLocationCoordinate2D center = _mapView.userLocation.location.coordinate;
    MKCoordinateRegion region = MKCoordinateRegionMake(center, kSpan);
    // 设置中心点
    [_mapView setRegion:region animated:YES];
}

#pragma mark - mapView的代理方法
#pragma mark 当定位到用户的位置就会调用(调用频率相当高)---2
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    // 只让它首次定位到用户坐标
    if (_mapView) return;

    // 1.用户位置的(中心点)
    CLLocationCoordinate2D center = userLocation.location.coordinate;

    // 2.确定好中心点之后,再确定跨度(范围)
    //    MKCoordinateSpan span = MKCoordinateSpanMake(0.018404, 0.031468);

    // 3.根据中心点和跨度之后,就确定好了区域
    MKCoordinateRegion region = MKCoordinateRegionMake(center, kSpan);

    // 4.让mapView显示到指定的区域
    [mapView setRegion:region animated:YES];
    _mapView = mapView;




    // 设置中心点坐标 为用户的坐标...
    // [mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];

}

#pragma mark 拖动地图(地图展示的区域改变了)就会调用
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{

    // 1.地图当前展示区域的中心位置
    CLLocationCoordinate2D pos = mapView.region.center;

    // 根据中心点位置坐标,反算出城市名,

    // 2.利用工具类向服务器发送请求
    [[DealRequestTool sharedDealRequestTool] dealsRequestWithPos:pos success:^(NSArray *deals, int total_count) {

        // 遍历返回的deals数组,并与当前控制器保存的已经显示过的deals数组比较,如果,已经显示过该deal,则continue跳过,
        for (Deal *d in deals) {
            // 已经显示过,跳过,避免 大头针 影子加深
            if ([_showingDeals containsObject:d]) continue;

            // 如果返回的deal,从未显示过,先加到成员数组中,然后,将该团购的成员:商区,一一用大头针进行显示到mapView上面
            [_showingDeals addObject:d];

            // 遍历 该团购的商户对象数组
            for (Business *b in d.businesses) {
                //  一个商户对应一个大头针模型,也就是数据源,为Annotation View提供数据
                //  Annotation 是 模型,用来在map上标记 坐标
                //  实现代理的 mapView:viewForAnnotation: 方法,返回每一个Annotation对应的Annotation View
                MyAnnotation *anno = [[MyAnnotation alloc] init];
                anno.business = b;
                anno.deal = d;
                anno.coordinate = CLLocationCoordinate2DMake(b.latitude, b.longitude);
                // 重要~~~ 为mapView提供数据,接着会来到方法mapView:viewForAnnotation:
                [mapView addAnnotation:anno];
            }
        }

    } error:^(NSError *error) {
        log(@"error---%@",error);
    }];




}
#pragma mark - mapView的代理方法
// 类似于 cell For Row,为每一个annotation 提供view,这里使用了自定义的Annotation模型
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(MyAnnotation *)annotation
{
    if (![annotation isKindOfClass:[MyAnnotation class]]) return nil;

    // 1.从缓存池中取出大头针view
    static NSString *ID = @"MKAnnotationView";
    MKAnnotationView *annoView = [mapView dequeueReusableAnnotationViewWithIdentifier:ID];

    // 2.缓存池没有可循环利用的大头针view
    if (annoView == nil) {
        // 这里应该用MKPinAnnotationView这个子类,一个在构造annotationView时,必须提供数据源模型annotation
        annoView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID];
    }

    // 3.设置view的大头针信息,提供独一无二的数据源模型
    annoView.annotation = annotation;

    // 4.设置图片
    annoView.image = [UIImage imageNamed:annotation.icon];

    return annoView;
}

#pragma mark 点击了大头针
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    // 0.如果是系统自带的大头针,则直接返回...
    if (![view.annotation isKindOfClass:[MyAnnotation class]]) {
        return;
    }

    // 1.调用父类的方法,展示详情控制器,并提供数据源
    MyAnnotation *anno = view.annotation;
    [self showDetail:anno.deal];

    // 2.让选中的大头针居中(成为中心点)
    [mapView setCenterCoordinate:anno.coordinate animated:YES];

    // 3.让view周边产生一些阴影效果
    view.layer.shadowColor = [UIColor blueColor].CGColor;
    view.layer.shadowOpacity = 1;
    view.layer.shadowRadius = 10;
}

#pragma mark - 监听到定位城市发生改变时,重新刷新webView
// 0.监听定位完成的通知
- (void)dataChange
{
    // 1.城市对象
    City *city = [MetaDataTool sharedMetaDataTool].currentCity;
    CLGeocoder *geo = [[CLGeocoder alloc] init];
    // 全球搜索 某某城市
    [geo geocodeAddressString:city.name completionHandler:^(NSArray *placemarks, NSError *error) {

        // 定位,解析完毕之后,就可以提供经纬度
        CLPlacemark *place = placemarks[0];
        // 1.用户位置的(中心点)
        CLLocationCoordinate2D center = place.location.coordinate;
        city.position = place.location.coordinate;
        // 重要,将城市用工具记住,因为发送请求时,还用到了城市 名和 经纬度
        [LocationTool sharedLocationTool].locationCity = city;
        // 2.确定好中心点之后,再确定跨度(范围)
        // 3.根据中心点和跨度之后,就确定好了区域
        MKCoordinateRegion region = MKCoordinateRegionMake(center, kSpan);
        // 4.让mapView显示到指定的区域
        [_mapView setRegion:region animated:YES];
    }];
}
@end

http://www.bkjia.com/IOSjc/869652.htmlwww.bkjia.comtruehttp://www.bkjia.com/IOSjc/869652.htmlTechArticleiOS\_21团购\_地图功能 最终效果图:
vcD4KPHA+09LPwr3HtcS72LW908O7p8671sOwtMWlOjwvcD4KPHA+PGltZyBzcmM9″http://www.2cto.com/uploadfile/Collfiles/20140826/2014082608540575.png“…

iOS_18_控制器切换_NavigationController_push方式_传递数据

最终效果图:

bet36365注册送奖金 2

storyboard示意图:< 喎?http://www.Bkjia.com/kf/ware/vc/
target=”_blank”
class=”keylink”>vcD4KPHA+PGltZyBzcmM9″http://www.2cto.com/uploadfile/Collfiles/20140801/201408010846099.png
alt=”\”>

BeyondViewController.h

//
//  BeyondViewController.h
//  18_控制器切换_navigation_push_通过storyboard方式
//
//  Created by beyond on 14-7-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import 

@interface BeyondViewController : UIViewController

// NavigationItem左侧的按钮
@property (weak, nonatomic) IBOutlet UIBarButtonItem *refreshBtn;
// NavigationItem右侧的按钮
@property (weak, nonatomic) IBOutlet UIBarButtonItem *wantToLoginBtn;

// NavigationItem左侧的按钮 点击事件 刷新至初始状态
- (IBAction)refresh:(UIBarButtonItem *)sender;

@end

BeyondViewController.m

//
//  BeyondViewController.m
//  18_控制器切换_navigation_push_通过storyboard方式
//
//  Created by beyond on 14-7-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "BeyondViewController.h"

@interface BeyondViewController ()

@end

@implementation BeyondViewController


// 刷新至初始状态
- (IBAction)refresh:(UIBarButtonItem *)sender
{
    self.navigationItem.title = @"首页";
    self.wantToLoginBtn.enabled = YES;
    self.refreshBtn.enabled = NO;
}
@end

LoginViewController.h

//
//  LoginViewController.h
//  18_控制器切换_navigation_push_通过storyboard方式
//
//  Created by beyond on 14-7-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import 

@interface LoginViewController : UIViewController

// 用户名输入框
@property (weak, nonatomic) IBOutlet UITextField *username;
// 密码输入框
@property (weak, nonatomic) IBOutlet UITextField *password;

// 输入用户名和密码之后,点击 登录按钮
- (IBAction)loginBtnClick:(UIButton *)sender;

// NavigationItem左侧的按钮 点击事件  返回前一个控制器
- (IBAction)backToHome:(UIBarButtonItem *)sender;

@end

LoginViewController.m

//
//  LoginViewController.m
//  18_控制器切换_navigation_push_通过storyboard方式
//
//  Created by beyond on 14-7-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "LoginViewController.h"
#import "NanaViewController.h"
@interface LoginViewController ()

@end

@implementation LoginViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    _password.secureTextEntry = YES;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}




#pragma mark - Navigation

// 在通过segue跳转至下一个导航子控制器前,做准备工作!这儿是传递数据给目的控制器
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)username
{
    // 要得到目的控制器,请使用 [segue destinationViewController].
    // 在这里,可以传递数据给下一个控制器

    // 这个参数是要传递的数据
    NSLog(@"prepare for segue----%@",username);

    // 通过segue的destinationViewController得到即将要跳转的目的控制器,传递数据给它
    NanaViewController *nanaVC = [segue destinationViewController];
    NSString *oldTitle = nanaVC.item_nanaSay.title;
    nanaVC.username = username;
    NSString *newStr = [NSString stringWithFormat:@"%@你好呀~%@      ",username,oldTitle];
    nanaVC.item_nanaSay.title = newStr;

}



// 输入用户名和密码之后,点击 登录按钮
- (IBAction)loginBtnClick:(UIButton *)sender
{
    // robust判断
    if (_username.text.length == 0 || _password.text.length == 0) {
        UIActionSheet *sheet = [[UIActionSheet alloc]initWithTitle:@"请输入帐号和密码" delegate:nil cancelButtonTitle:@"取消" destructiveButtonTitle:@"明白" otherButtonTitles:@"other", nil];
        [sheet showInView:self.view];
        [_username becomeFirstResponder];
        return;
    }

    // 输入正确的密码和账号之后,跳转至第3个控制器
//    self.navigationController pushViewController: animated:



    // 通过segue连线,跳至self.navigationController容器里面的下一个 子控制器,并且传递参数(用户名),参数会被传递到self的 prepareForSegue方法中,然后才会传递到 下一下控制器(destination)
    [self performSegueWithIdentifier:@"segue_loginSuccess" sender:_username.text];

}


// NavigationItem左侧的按钮 点击事件  返回前一个控制器,即首页
- (IBAction)backToHome:(UIBarButtonItem *)sender
{
    [self.navigationController popViewControllerAnimated:YES];

}
@end

NanaViewController.h

//
//  NanaViewController.h
//  18_控制器切换_navigation_push_通过storyboard方式
//
//  Created by beyond on 14-7-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import 

@interface NanaViewController : UIViewController
// NavigationItem右侧的按钮   欢迎 标语
@property (weak, nonatomic) IBOutlet UIBarButtonItem *item_nanaSay;

// 点击NavigationItem左侧的按钮  回到首页,即第一个控制器,并且将数据带过去
- (IBAction)backToHome:(UIBarButtonItem *)sender;

// 仅用来接收传递过来的数据用~
@property (nonatomic,copy) NSString * username;
@end

NanaViewController.m

//
//  NanaViewController.m
//  18_控制器切换_navigation_push_通过storyboard方式
//
//  Created by beyond on 14-7-31.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "NanaViewController.h"
#import "BeyondViewController.h"
@interface NanaViewController ()

@end

@implementation NanaViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}




// 回到首页,即第一个控制器,并且将数据带过去
- (IBAction)backToHome:(UIBarButtonItem *)sender {
    // 拿到第一个控制器

    BeyondViewController *firstVC = [self.navigationController.viewControllers firstObject];

    // [self.navigationController.viewControllers objectAtIndex:n-2];  //n為最頂的index


    //加入要传递的数据
    NSString *str = [NSString stringWithFormat:@"欢迎%@回来",_username];
    firstVC.navigationItem.title = str;
    firstVC.wantToLoginBtn.enabled = NO;
    firstVC.refreshBtn.enabled = YES;
    // pop至第一个控制器
    [self.navigationController popToViewController:firstVC animated:YES];
}
@end

http://www.bkjia.com/IOSjc/856287.htmlwww.bkjia.comtruehttp://www.bkjia.com/IOSjc/856287.htmlTechArticleiOS\_18\_控制器切换\_NavigationController\_push方式\_传递数据
最终效果图: storyboard示意图:
vcD4KPHA+PGltZyBzcmM9″http://www.2cto.com/uploadfile/Collfiles/20140801/20

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图