我在自动布局和约束方面遇到问题,可以使用一些帮助。
我在 iPad 上运行这个应用程序。我有一个包含两个视图的窗口,一个 UIWebView 和一个 MKMapView。这两个视图都是在 IB 中设置的,并且 Auto Layout 是打开的。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。
加载窗口时,实际上移除了 MKMapView,因为我希望 UIWebView 占据整个屏幕,因为地图视图中没有要显示的数据。这是在我的 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,覆盖了太多的显示。
知道我做错了什么吗?提前感谢您的帮助!!!