UIView 宽度和高度不适应约束

UIView width & height not adjusting to constraints

这是关于 iOS、XCode、自动布局和 Objective-C 的问题。我觉得它有一个简单的答案,但我在 SO 中搜索了高低,但找不到解决方案。

我想在 Google 地图的中心放置一个小的十字准线图像,以便当用户在地图上平移时,图像保持不动。我这样做是通过简单地将 UIImageView 作为子视图添加到 Google 地图视图,这是我制作了 IBOutlet 的 GMSMapView,self.mapView.

我计算放置图像的位置如下:

crosshairs.center = CGPointMake(self.mapView.bounds.size.width / 2, self.mapView.bounds.size.height / 2);

与此同时,我对地图的视图设置了约束,以便其前导和尾随空格与超级视图挂钩。这应该使它的宽度和高度成为液体——或者我是这么认为的。

事实上,当我在运行时 NSLog 地图视图的宽度和高度时,它们反映了 Xcode 中尺寸检查器中指定的宽度 (600) 和高度 (384) -- 即使我没有用约束固定宽度和高度。

结果是图像不是以屏幕为中心,而是以地图视图的错误宽度和高度(超出屏幕)为中心。

我知道我忽略了一些愚蠢的东西,或者我错过了自动布局的基本概念。无论哪种方式,我将不胜感激任何指导。

使用自动布局时重要的是,您不应该再手动更改框架(在您的情况下使用 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 的错误框架,这取决于您在哪里记录它。如果您的 IBOutletUIViewController 中,您应该在 [super viewWillLayoutSubviews]; 调用之后在 viewWillLayoutSubviews: 中进行。

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    NSLog(@"Map View frame %@", NSStringFromCGRect(self.mapView.frame));
}

如果您在自定义 UIView class 中有它,您应该检查 layoutSubviews:

中的框架
- (void)layoutSubviews {
    [super layoutSubviews];
    NSLog(@"Map View frame %@", NSStringFromCGRect(self.mapView.frame));
}

希望这能解决您的问题。