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 的错误框架,这取决于您在哪里记录它。如果您的 IBOutlet
在 UIViewController
中,您应该在 [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));
}
希望这能解决您的问题。
这是关于 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 的错误框架,这取决于您在哪里记录它。如果您的 IBOutlet
在 UIViewController
中,您应该在 [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));
}
希望这能解决您的问题。