这是关于iOS,XCode,自动布局和Objective-C的问题。我觉得它有一个简单的答案,但我在SO中搜索高低,无法找到解决方案。
我想在Google地图的中心放置一个小的十字准线图像,以便当用户在地图周围平移时,图像保持固定。我这样做只需将UIImageView作为子视图添加到Google Map视图中,这是一个GMSMapView,我已经制作了一个IBOutlet,self.mapView。
我使用以下内容计算放置图像的位置:
crosshairs.center = CGPointMake(self.mapView.bounds.size.width / 2, self.mapView.bounds.size.height / 2);
与此同时,我在地图的视图上设置了约束,使其前导空格和尾随空格与超视图挂钩。这应该使它的宽度和高度变得流动 - 或者我认为。
实际上,当我在运行时NSLog显示地图视图的宽度和高度时,它们反映了Xcode中尺寸检查器中指定的宽度(600)和高度(384) - 即使我没有固定宽度也没有限制的高度。
结果是图像不是以屏幕为中心,而是以地图视图的错误宽度和高度为中心(在屏幕外延伸)。
我知道我忽略了一些愚蠢的东西,或者我错过了自动布局的基本概念。无论哪种方式,我都很感激任何指导。
威尔
答案 0 :(得分:1)
使用自动布局时,重要的是你不应该再手动更改框架(在你的情况下使用setCenter:
)。您应该使用约束来布局所有内容。
您可以使用约束在mapView顶部的故事板中添加UIImage
并将其居中。
如果无法做到这一点,您还可以使用以下内容在代码中添加约束:
[self.mapView addSubview:crosshairs];
[crosshairs setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.mapView addConstraints:[NSLayoutConstraint constraintWithItem:self.mapView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:crosshairs attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0]];
[self.mapView addConstraints:[NSLayoutConstraint constraintWithItem:self.mapView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:crosshairs attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0]];
根据您添加这些约束的位置,您可能需要调用[self.mapView layoutIfNeeded];
。
使用约束,图像应始终位于mapView的顶部。
关于mapView的错误框架,它取决于您记录它的位置。如果您的IBOutlet
位于UIViewController
,则应在viewWillLayoutSubviews:
来电后[super viewWillLayoutSubviews];
内进行- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
NSLog(@"Map View frame %@", NSStringFromCGRect(self.mapView.frame));
}
。
UIView
如果您在自定义layoutSubviews:
课程中使用该课程,则应检查- (void)layoutSubviews {
[super layoutSubviews];
NSLog(@"Map View frame %@", NSStringFromCGRect(self.mapView.frame));
}
{{1}}
希望这可以解决您的问题。