自動レイアウトと制約に問題があり、助けが必要です。
このアプリケーションを iPad で実行しています。UIWebView と MKMapView の 2 つのビューを含むウィンドウがあります。これらのビューは両方とも IB で設定され、自動レイアウトがオンになっています。UIWebView はウィンドウの上部に配置され、MKMapView は下部に配置されます。各ビューは、ウィンドウのほぼ半分を占めます。UIWebView には、IB で次の制約が設定されています: NSLayoutAttributeTop から Superview に等しい 0、Leading Edge から Superview に等しい 0、Trailing Edge から Superview に等しい 0、および NSLayoutAttributeBottom から Superview に等しい 480. MKMapView には、次の制約が設定されています。 IB: NSLayoutAttributeTop から Superview への値は 480、Leading Edge から Superview への値は 0、Trailing Edge から Superview への値は 0、NSLayoutAttributeBottom から Superview への値は 0 です。
ウィンドウが読み込まれると、マップビューに表示するデータがないため、UIWebView が画面全体を占めるようにするため、MKMapView は実際に削除されます。これは私の updateDetailViews 関数で行われます:
- (void)updateDetailViews
{
displayHeight = self.maximumUsableFrame.size.height;
viewDistance=displayHeight/2+centerMapButton.frame.size.height/2+16;
[detailMapView setTranslatesAutoresizingMaskIntoConstraints:NO];
[directoryWebView setTranslatesAutoresizingMaskIntoConstraints:NO];
if (mapViewVisible==true) {
webViewDistFromBottomDefault=viewDistance;
webViewDistFromBottom.constant=viewDistance;
mapViewDistFromTopDefault=viewDistance;
mapViewDistFromTop.constant=viewDistance;
}
else {
[detailMapView removeFromSuperview];
webViewDistFromBottomDefault=0;
webViewDistFromBottom.constant=0;
mapViewDistFromTopDefault=viewDistance;
mapViewDistFromTop.constant=viewDistance;
}
[detailMapView setNeedsUpdateConstraints];
[UIView animateWithDuration:0.25f animations:^{
[self.detailMapView layoutIfNeeded];
}];
}
MKMapView が削除された後、UIWebview の NSLayoutAttributeBottom 属性が 0 に設定され、画面全体に表示されます。マップに表示する実際のデータがあると、MKMapView が追加され、displayMapView 関数で必要な制約と共に UIWebView が再配置されます。
- (void)displayMapView
{
double dblLatitude;
double dblLongitude;
[detailMapView setTranslatesAutoresizingMaskIntoConstraints:NO];
if ([self isMapViewDisplayed]==FALSE) {
[detailView addSubview:detailMapView];
NSLayoutConstraint *myConstraint =[NSLayoutConstraint
constraintWithItem:detailMapView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:detailView
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:mapViewDistFromTopDefault];
[detailView addConstraint:myConstraint];
//mapViewDistFromTop.constant = mapViewDistFromTopDefault;
myConstraint =[NSLayoutConstraint
constraintWithItem:detailMapView
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:detailView
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:0];
[detailView addConstraint:myConstraint];
myConstraint =[NSLayoutConstraint
constraintWithItem:detailMapView
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:detailView
attribute:NSLayoutAttributeLeading
multiplier:1.0
constant:0];
[detailView addConstraint:myConstraint];
myConstraint =[NSLayoutConstraint
constraintWithItem:detailMapView
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:detailView
attribute:NSLayoutAttributeTrailing
multiplier:1.0
constant:0];
[detailView addConstraint:myConstraint];
[detailMapView setNeedsUpdateConstraints];
}
[UIView animateWithDuration:.5
animations:^{
webViewDistFromBottom.constant=webViewDistFromBottomDefault;
mapViewDistFromTop.constant=mapViewDistFromTopDefault;
[self.directoryWebView layoutIfNeeded];
[self.detailMapView layoutIfNeeded];
}];
[self updateDetailViews];
...
if ((dblLatitude != 0) && (dblLongitude != 0)) {
zoomLocation.latitude = dblLatitude;
zoomLocation.longitude = dblLongitude;
MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, METERS_PER_MILE, METERS_PER_MILE);
MKCoordinateRegion adjustedRegion = [detailMapView regionThatFits:viewRegion];
[detailMapView setRegion:adjustedRegion animated:YES];
}
CLLocationCoordinate2D coordinate;
coordinate.latitude = dblLatitude;
coordinate.longitude = dblLongitude;
...
[detailMapView addAnnotation:annotation];
}
これはすべて、意図したとおりに機能します。この問題は、デバイスを回転させたときに発生します。iPad を縦向きモードで開始すると、webViewDistFromBottom および mapViewDistFromTop 制約は 490 に設定されます。これは、上記の updateDetailViews 関数が次の計算を行うためです。
displayHeight = self.maximumUsableFrame.size.height;
viewDistance=displayHeight/2+centerMapButton.frame.size.height/2+16;
iPad が横向きに回転している場合、willAnimateRotationToInterfaceOrientation 関数が呼び出され、updateDetailViews が呼び出され、viewDistance が 367 に設定されます (これに対応して、webViewDistFromBottom.constant および mapViewDistFromTop.constant)。上部の UIWebView は正常に見えますが、下部の MKMapView はそうではありません。mapViewDistFromTop 制約は 367 に設定されていますが (値をログに出力した場合)、まだ 490 に設定されているようです。私の updateDetailViews 関数は [self.view layoutIfNeeded] を呼び出します ([detailMapView layoutIfNeeded] も試しましたが、 [detailMapView setNeedsLayout])、しかしそのビューは正しく表示されません。頂上からの距離が大きすぎます。iPad を回転させて縦向きに戻すと、見栄えがよくなります。
iPad を横向きモードで起動し、縦向きに回転させた場合にも同じ問題が発生します。横向きモードでは、mapViewDistFromTop と webViewDistFromBottom の値は 367 で、縦向きに回転すると 490 に設定されます。ただし、下部の MKMapView は、上部からの距離がまだ 367 であるように見え、ディスプレイを覆いすぎています。
私が間違っていることは何か分かりますか?よろしくお願いします。