簡體   English   中英

UIView的寬度和高度未適應約束

[英]UIView width & height not adjusting to constraints

這是有關iOS,XCode,自動版式和Objective-C的問題。 我覺得它有一個簡單的答案,但我在SO中搜索過高而又低,因此找不到解決方案。

我想在Google地圖的中心放置一個較小的十字線圖像,以便在用戶平移地圖時,圖像保持固定。 為此,我只需將UIImageView作為子視圖添加到Google Map視圖中,該視圖就是我創建的IBOutlet的GMSMapView self.mapView。

我使用以下方法計算放置圖像的位置:

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

同時,我在地圖視圖上設置了約束,以使其前導和尾隨空間與超級視圖掛鈎。 那應該使它的寬度和高度成為液體-或我想。

實際上,當我在運行時使用NSLog記錄地圖視圖的寬度和高度時,它們會反映Xcode的大小檢查器中指定的寬度(600)和高度(384)-即使我沒有用限制。

結果是圖像不是居中放置在屏幕上,而是居中放置在地圖視圖的錯誤的寬度和高度(它們延伸到屏幕之外)的中心。

我知道我忽略了一些愚蠢的事情,或者我錯過了自動版式的基本概念。 無論哪種方式,我都會感謝您的指導。

使用自動布局時,重要的是您不再需要手動更改框架(在您的情況下使用setCenter: 您應該使用約束來布局所有內容。

您可以使用約束將UIImage添加到mapView頂部的情節提要中,並在其中居中。

如果這不可能,那么您還可以使用以下類似的方法在代碼中添加約束:

[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 ,則應該在viewWillLayoutSubviews: [super viewWillLayoutSubviews]; 呼叫。

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

如果您在自定義UIView類中擁有它,則應檢查layoutSubviews:的框架layoutSubviews:

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

希望這可以解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM