UIView宽度和宽度高度不适应约束

时间:2015-03-17 20:58:30

标签: ios objective-c xcode autolayout

这是关于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) - 即使我没有固定宽度也没有限制的高度。

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

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

威尔

1 个答案:

答案 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}}

希望这可以解决您的问题。