13

我是 iOS 编程新手,我已经下载了适用于 iOS 的 google maps sdk,并按照他们网站上的说明进行操作(如此链接所示 https://developers.google.com/maps/documentation/ios/start )并且能够在我的应用程序中获取地图。

现在我正在尝试在谷歌地图底部的屏幕上添加一个按钮,以便为用户提供返回上一个屏幕的选项。

我只知道 UIButton 是 UIView 的子类,我们可以通过使其成为该类的子视图来使按钮出现在视图上。以前 iOS 过去默认通过 MKMapView 使用 Google 地图,我在 Internet 上的书籍中看到示例显示应用程序的屏幕截图,其中按钮或文本框会出现在地图上。但是现在只是在界面生成器中拖动按钮对谷歌地图的 SDK 没有帮助。

这是我的代码:

视图控制器.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <GoogleMaps/GoogleMaps.h>


@interface ViewController : UIViewController 

@property (weak, nonatomic) IBOutlet UIButton *btn;


@end

视图控制器.m

#import "ViewController.h"
#import <MapKit/MapKit.h>
#import <GoogleMaps/GoogleMaps.h>
#import <CoreLocation/CoreLocation.h>


@interface ViewController ()

@end

@implementation ViewController
{
    GMSMapView *mapView_;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)loadView
{
    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    locationManager.distanceFilter = kCLDistanceFilterNone;

    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
    [locationManager startUpdatingLocation];

    //Latitude and longitude of the current location of the device.
    double lati = locationManager.location.coordinate.latitude;
    double longi = locationManager.location.coordinate.longitude;
    NSLog(@"Latitude = %f", lati);
    NSLog(@"Longitude = %f", longi);

    CLLocation *myLocation = [[CLLocation alloc] initWithLatitude:lati longitude:longi];

    // Create a GMSCameraPosition that tells the map to display the coordinate

    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:lati
                                                            longitude:longi
                                                                 zoom:11.5];

    mapView_ = [GMSMapView mapWithFrame:[[UIScreen mainScreen] bounds] camera:camera];
    mapView_.myLocationEnabled = YES;
    self.view = mapView_;

    // Creates a marker in the center of the map.
    GMSMarker *marker = [[GMSMarker alloc] init];
    marker.position = CLLocationCoordinate2DMake(lati, longi);
    marker.title = @"It's Me";
    marker.snippet = @"My Location";
    marker.map = mapView_;

    [mapView_ addSubview:_btn];
    [mapView_ bringSubviewToFront:_btn];

}
@end

您可以看到,在最后两行中,我将按钮设置为 mapview 的子视图并尝试将其放在前面。但这没有帮助。请让我知道我缺少什么,或者是否有其他方法可以通过使用其他功能来做到这一点。

还请检查我创建的故事板的屏幕截图,以便您更好地理解我在这里尝试做的事情。

故事板截图

谢谢。

4

5 回答 5

15

GMSMapView是的子类,UIView因此您可以将子视图添加到任何其他视图

试试这个代码

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(mapView_.bounds.size.width - 110, mapView_.bounds.size.height - 30, 100, 20);
button.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin;
[button setTitle:@"Button" forState:UIControlStateNormal];
[mapView_ addSubview:button];

它将100x20按钮添加为 的子视图GMSMapView,位于右下角。我已经对其进行了测试,并且可以像在任何其他视图中一样触摸该按钮

-loadView编辑:还将您的所有代码从-viewDidLoad. -loadView使用 IB 创建 UI 时从不调用方法。文档-loadView说:

如果您使用 Interface Builder 创建视图并初始化视图控制器,则不得覆盖此方法。

编辑 2:我相信当你使用 Interface Builder 创建视图层次结构时,你不能self.view像你正在做的那样重置属性。

在你的-viewDidLoad

[self.view addSubview: mapView_];

代替

self.view = mapView_;

如果您要传递GMSMapViewself.view属性,则地图只是从此时开始在控制器中的视图。我相信这就是你看不到 IB 创建的按钮的原因。

于 2013-05-20T07:45:35.523 回答
3

使用 InterfaceBuilder 使您的视图正常,并将 mapView 放在 0 index subview :

mapView_ = [GMSMapView mapWithFrame:self.view.bounds camera:camera];
mapView_.myLocationEnabled = YES;
[self.view insertSubview:mapView_ atIndex:0];

感谢来自这个线程的劳尔克劳斯

您可以自定义mapView的大小,更改:

mapView_ = [GMSMapView mapWithFrame:_mapHolder.bounds camera:camera];
mapView_.myLocationEnabled = YES;
[_mapHolder insertSubview:mapView_ atIndex:0];

其中mapHolder是IB内部制作的UIView。

于 2013-11-30T20:31:57.010 回答
3

我遇到了同样的问题,修复非常简单,只需覆盖此UIViewController方法:
-(void) viewWillAppear:(BOOL)animated并将您的UIButton创建逻辑放入该方法中。

例子:

-(void) viewWillAppear:(BOOL)animated
{
 locationButton = [UIButton buttonWithType:UIButtonTypeCustom];
 locationButton.frame = CGRectMake(0, 30, self.view.frame.size.width/6, self.view.frame.size.height/6);
 [locationButton setImage:[UIImage imageNamed:@"location_enabled.png"] forState:UIControlStateNormal];
 [self.view addSubview:locationButton];
}
于 2015-04-19T16:48:58.197 回答
2

出现此问题是因为您尝试使用代码添加地图视图,之前您在界面生成器的帮助下添加了按钮。当您添加 mapView 时,它会添加到视图的顶部,这就是您的按钮未显示的原因。

您有两种选择。

第一种方法

  • 从界面构建器中拖放 UIButton 并相应地设置约束 在此处输入图像描述

  • 然后在对应的viewController中创建那个按钮的outlet

    @IBOutlet weak var bottonToAdd: UIButton!

  • 将地图视图添加到视图后,粘贴打击代码以将按钮置于顶部 mapViewForScreen.addSubview(self.bottonToAdd) mapViewForScreen.bringSubviewToFront(self.bottonToAdd)

完成上述三步后,您可以发现您在 mapview 上有按钮

在此处输入图像描述

第二种方法

如果您不想使用界面生成器,您可以使用下面的代码。

    var bottonToAdd:UIButton = UIButton()
    bottonToAdd.setTitle("Button To Add", for: .normal)
    bottonToAdd.sizeToFit()
    bottonToAdd.center = mapViewForScreen.center
    bottonToAdd.tintColor = UIColor.blue
    mapViewForScreen.addSubview(bottonToAdd)
    mapViewForScreen.bringSubviewToFront(bottonToAdd)
于 2019-05-17T17:25:24.523 回答
0
 let mapButton:UIButton = UIButton(frame: CGRect(x:self.view.bounds.width-50, y: 20, width: 40, height: 40)) //Swfit 5
    mapButton.backgroundColor = UIColor.clear
    mapButton.setImage(UIImage(named: "list"), for: UIControl.State.normal)
    mapButton.setImage(UIImage(named: "map"), for: UIControl.State.selected)
    mapButton.addTarget(self, action:#selector(self.mapListClicked), for: .touchUpInside)
    self.view.addSubview(mapButton)
于 2019-05-17T05:14:57.367 回答