2013-01-10 74 views
4

在我viewDidLoad方法中,我有一些代碼來創建的MKMapView,一些制約因素和UIToolbar:NSLayoutConstraint和的MKMapView

我有一個的MKMapView:

MKMapView *mapView = [[MKMapView alloc] init]; 
[mapView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
mapView.userInteractionEnabled = TRUE; 
mapView.showsUserLocation = TRUE; 
mapView.mapType = MKMapTypeHybrid; 
mapView.delegate = self; 

[mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES]; 

[self.view addSubview:mapView]; 

我創建2個約束,使其充分屏幕:

NSMutableArray *constraints = [NSMutableArray array]; 

[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[mapView]|" 
                     options:0 
                     metrics:nil 
                      views:NSDictionaryOfVariableBindings(mapView)]]; 

[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"|[mapView]|" 
                     options:0 
                     metrics:nil 
                      views:NSDictionaryOfVariableBindings(mapView)]]; 

[self.view addConstraints:constraints]; 

工程很好。但是,當我嘗試任何東西添加到地圖視圖:

UIToolbar *topBar = [[UIToolbar alloc ]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)]; 
[topBar setTranslatesAutoresizingMaskIntoConstraints:NO]; 
topBar.barStyle = UIBarStyleBlackTranslucent; 

[mapView addSubview:topBar]; 

它拋出一個錯誤:

*** Assertion failure in -[MKMapView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2372/UIView.m:5776 
2013-01-10 10:24:17.503 Landscout 2[2001:14003] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. MKMapView's implementation of -layoutSubviews needs to call super.' 

從我的理解,因爲我加入了一個新的視圖地圖視圖,地圖視圖需要重新計算所有的約束嗎?基本上是一個約束的drawRect方法。

我該如何解決這個問題?

+0

你在哪種方法創建'UIToolbar * topBar'並將其添加爲子視圖? –

+0

代碼全部在viewDidLoad方法內。 – Padin215

回答

6

我解決了這個問題,只需使用內容視圖來填充所有東西。而不是將工具欄添加到myMapView,我將它添加到myContentView。

我很確定MKMapView未設置爲使用約束。 MapView不會調用[super layoutSubviews],最終導致[UIView layoutSubviews]

另一種可能的解決方案我想像是添加類別的MKMapView將覆蓋-layoutSubview打電話[super layoutSubview],但我不知道如何找出在​​,我需要補充什麼。

+0

是 - 無法添加一個約束MKMapView要麼 – Ian

+0

發現這篇文章與你一樣,認爲你可能會對讀取感興趣。 http://www.karlmonaghan.com/2013/09/03/ios-6-auto-layout-and-mkmapview/ – bennythemink