如何在 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】: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_;
如果您将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 地图上添加按钮?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Google地图上自定义myLocationEnabled按钮?
Android - 如何在 Google 地图上为 Google 徽标设置底部填充