【发布时间】:2013-05-28 14:20:47
【问题描述】:
使用 Google Maps for iOS SDK,“我的位置”按钮默认位于右下角:
我想把它放在左下角(是的,我意识到我需要小心不要遮挡那里的“Google”徽标)。我不相信 SDK 有这样做的“官方”方式,但基于this answer,我已经想出了如何获取“我的位置”按钮子视图以便我可以定位它。
让我感到困惑的部分是我应该为“我的位置”视图的框架和/或边界赋予什么值,才能将它放在我想要的位置。对于初学者来说,当前的“我的位置”按钮有 frame.origin.x = -74 和 frame.origin.y = -54。这是我第一次看到 frame.origin.x 或 frame.origin.y 的负坐标,我什至不确定 iOS 如何处理负坐标。我的第一个想法是,例如frame.origin.x = -74 等价于[view superview].frame.size.width - 74,即从父视图的宽度或高度中减去负值。但后来我查看了超级视图的宽度和高度,它们都是0.0。这是我的代码,它输出有关地图和我的位置按钮框架和边界的一些信息:
- (void)loadView {
GMSCameraPosition *cam = [GMSCameraPosition cameraWithLatitude:jcuTownsvilleCenterCampusLat longitude:jcuTownsvilleCenterCampusLon zoom:17];
self.campusMap = [GMSMapView mapWithFrame:CGRectZero camera:cam];
self.campusMap.myLocationEnabled = YES;
self.campusMap.settings.myLocationButton = YES;
self.view = self.campusMap;
for (UIView *view in self.campusMap.subviews) {
NSLog(@"view.description: %@",view.description);
if ([view isKindOfClass:[UIButton class]]) {
// these four values in the conditional below are just what happen to
// be the values corresponding to the "my location button" in Google Maps
// for iOS SDK version 1.3.0.3430. They might change over time, so this
// code is somewhat fragile.
if (view.frame.size.width == 76 && view.frame.size.height == 54 &&
view.frame.origin.x == -76 && view.frame.origin.y == -54) {
NSLog(@"we may have found the 'my location' button");
NSLog(@"self.campusMap coord stats:");
NSLog(@"bounds.origin.x: %f", self.campusMap.bounds.origin.x);
NSLog(@"bounds.origin.y: %f", self.campusMap.bounds.origin.y);
NSLog(@"bounds.size.width: %f", self.campusMap.bounds.size.width);
NSLog(@"bounds.size.height: %f", self.campusMap.bounds.size.height);
NSLog(@"frame.origin.x: %f", self.campusMap.frame.origin.x);
NSLog(@"frame.origin.y: %f", self.campusMap.frame.origin.y);
NSLog(@"frame.size.width: %f", self.campusMap.frame.size.width);
NSLog(@"frame.size.height: %f", self.campusMap.frame.size.height);
NSLog(@"view coord stats:");
NSLog(@"bounds.origin.x: %f", view.bounds.origin.x);
NSLog(@"bounds.origin.y: %f", view.bounds.origin.y);
NSLog(@"bounds.size.width: %f", view.bounds.size.width);
NSLog(@"bounds.size.height: %f", view.bounds.size.height);
NSLog(@"frame.origin.x: %f", view.frame.origin.x);
NSLog(@"frame.origin.y: %f", view.frame.origin.y);
NSLog(@"frame.size.width: %f", view.frame.size.width);
NSLog(@"frame.size.height: %f", view.frame.size.height);
}
}
}
}
这是输出:
self.campusMap coord stats:
bounds.origin.x: 0.000000
bounds.origin.y: 0.000000
bounds.size.width: 0.000000
bounds.size.height: 0.000000
frame.origin.x: 0.000000
frame.origin.y: 0.000000
frame.size.width: 0.000000
frame.size.height: 0.000000
view coord stats:
bounds.origin.x: 0.000000
bounds.origin.y: 0.000000
bounds.size.width: 76.000000
bounds.size.height: 54.000000
frame.origin.x: -76.000000
frame.origin.y: -54.000000
frame.size.width: 76.000000
frame.size.height: 54.000000
我尝试将“我的位置”按钮放置在顶部左上角作为一个简单的测试:
CGRect frame = view.frame;
frame.origin.x = 0;
frame.origin.y = 0;
frame.size.width = 76;
frame.size.height = 54;
[view setFrame:frame];
但是我的位置按钮根本没有显示。
我还尝试对现有值进行小幅修改(例如,将 frame.origin.x 从 -76.0 更改为 -66.0 并且可以看到位置的差异,所以至少我确信我正在修改正确的视图。我仍然不明白 i)负坐标是如何工作的,以及 ii)如何在这个特定场景中正确定位视图。在阅读了this question 的答案后,我认为我对视图框架和边界有一个合理的掌握,但鉴于我还没有让它工作,显然没有。
【问题讨论】:
-
在
loadView中,您刚刚分配了大小为零的地图视图(这会导致它被调整大小以填充屏幕)。在稍后的某个时间点检查所有值可能是值得的 - 例如在viewDidLoad或viewDidAppear或类似的东西? -
检查按钮的
transform属性的值可能也是值得的,以查看转换是否设置为异常值。
标签: ios objective-c google-maps-sdk-ios