如何在 iOS 中的 Google 地图上添加按钮?

Posted

技术标签:

【中文标题】如何在 iOS 中的 Google 地图上添加按钮?【英文标题】:How to add a button on the Google maps in iOS? 【发布时间】:2013-05-14 16:22:07 【问题描述】:

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

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

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

这是我的代码:

ViewController.h

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


@interface ViewController : UIViewController 

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


@end

ViewController.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 的子视图,并尝试将其放在前面。但这没有帮助。请让我知道我错过了什么,或者是否有其他方法可以通过使用其他功能来做到这一点。

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

谢谢。

【问题讨论】:

将此作为新问题发布有什么意义?here 【参考方案1】:

GMSMapViewUIView 的子类,因此您可以像添加任何其他视图一样添加子视图

试试这个代码

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_;

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

【讨论】:

感谢它的工作。但是,如果您能告诉我哪里出错了,我将非常感谢您。我不能像您以编程方式那样通过界面构建​​器制作 UIButton 吗? 我必须在最后一行进行更改才能使其正常工作我将 [_mapView addSubview:button]; 更改为 [mapView_ addSubview:button]; 对不起,我帮不了你,因为我不再使用 Interface builder UI。也许您可以尝试将代码从 -loadView 移动到 -viewDidLoad 对不起,我已经根据你的评论修复了上面的代码。 我现在面临的另一个问题是,如果我无法在故事板上设置按钮,那么如何设置 segue 的标识符以转到上一个视图?【参考方案2】:

使用 InterfaceBuilder 使您的视图正常,并将 mapView 放在 0 索引子视图:

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

感谢thread的劳尔克劳斯

而且你可以自定义mapView的大小,改变:

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

mapHolder 是在 IB 内部制作的 UIView。

【讨论】:

【参考方案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];

【讨论】:

【参考方案4】:

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

您有两种选择。

第一种方法

从界面中拖放 UIButton builder 并相应地设置约束

然后在对应的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)

【讨论】:

【参考方案5】:
 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)

【讨论】:

以上是关于如何在 iOS 中的 Google 地图上添加按钮?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 上的 Google 地图标记中添加附加信息

iOS将按钮添加到小部件扩展

如何在Google地图上自定义myLocationEnabled按钮?

Android - 如何在 Google 地图上为 Google 徽标设置底部填充

如何在 Ti.map 上的苹果地图上添加“当前位置按钮”(导航标记)

如何像优步一样在 Google 地图上添加 3d 对象作为标记