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

标签 ios objective-c xcode autolayout

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

我想在 Google map 的中心放置一个小十字线图像,以便当用户在 map 上平移时,图像保持固定。为此,我只需将 UIImageView 作为 subview 添加到 Google map View ,该 View 是我制作的 IBOutlet self.mapView 的 GMSMapView。

我使用以下方法计算放置图像的位置:

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

同时,我对 map View 设置了约束,以便其前导和尾随空格与 super View Hook 。这应该使它的宽度和高度具有流动性——至少我是这么认为的。

事实上,当我在运行时 NSLog map View 的宽度和高度时,它们反射(reflect)了 Xcode 中的尺寸检查器中指定的宽度 (600) 和高度 (384)——即使我没有固定宽度高度也不受限制。

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

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

最佳答案

使用自动布局时最重要的是,您不应该再手动更改框架(在您的情况下使用 setCenter:)。您应该使用约束来布局所有内容。

您可以在 mapView 顶部的 Storyboard中添加 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 类中有它,您应该检查 layoutSubviews: 中的框架

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

希望这能解决您的问题。

关于ios - UIView 宽度和高度不适应约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29109541/

相关文章:

ios - 订阅 sharedDB cloudkit 中的记录更改

ios - 界面生成器 : automatically set aspect ratio for UIImageView when using "Aspect Fit"?

iphone - 检查 NSNumber 是否为空

ios - 自定义 Segue 中的 UIKit 动态

iphone - Xib Size - 似乎认为它比实际长

iphone - 内存泄漏导致应用崩溃

ios - 动态更改程序/VFL 约束

ios - UINavigationBar 底部边框消失

objective-c - 自动化 dealloc/viewDidUnload Objective-C

添加 UINavigationBar 时 Swift 约束错误