将地图滚动到用户位置或单击地图上的注释会导致容器视图移回情节提要中设置的位置
Scrolling the map to user's location or clicking on an annotation on the map causes the container view move back to the place set in the storyboard
我有
- 名为 MyMapViewController 的视图控制器,它是故事板中地图视图的委托,
- 一个名为 MyListViewController 的视图控制器(即情节提要中的容器视图“myContainerView”),它是子视图控制器MyMapViewController.
所以,我在情节提要中有以下内容:http://pasteboard.co/1YAmM2ZU.png
在 MyMapViewController 中,我最初将 myContainerView 的框架设置如下,这样唯一显示的部分就是它的导航栏MyMapViewController 底部:
CGRect destFrame = self.myContainerView.frame;
CGFloat navBarHeight = 44;
destFrame.origin.y = self.view.frame.size.height - navBarHeight;//to bottom of the screen; navigation bar yields 44 points
[UIView animateWithDuration:0
animations:^{
self.myContainerView.frame = destFrame;
}
];
在MyMapViewController中,我在地图上设置了一些注解,委托方法如下:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{
NSLog(@"welcome into the map view annotation");
// if it's the user location, just return nil.
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
// try to dequeue an existing pin view first
static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
MKPinAnnotationView* pinView = [[MKPinAnnotationView alloc]
initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier];
pinView.animatesDrop=YES;
pinView.canShowCallout=YES;
pinView.pinColor=MKPinAnnotationColorPurple;
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton setTitle:annotation.title forState:UIControlStateNormal];
[rightButton addTarget:self
action:@selector(showDetails:)
forControlEvents:UIControlEventTouchUpInside];
pinView.rightCalloutAccessoryView = rightButton;
UIImageView *profileIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"annotationProfile.png"]];
pinView.leftCalloutAccessoryView = profileIconView;
return pinView;
}
问题是,当我将地图滚动到用户自己的位置或地图上最初未显示的注释位置或单击其中一个注释时,myContainerView突然出现。 (它移回情节提要中设置的位置。)但是,我希望 myContainerView 保持原位。
我想出了一些可能的解释,但我不太确定如何克服这个问题。有什么建议吗?
提前致谢。
当您遇到问题中的用户界面异常时,您肯定会错过设计的某些地方。如果是这种情况,请检查您是否通过操作您在 storyboard
中定义的 constraint
来解决问题。您只需按 ctrl
并将其拖动到您的代码中,就可以将 constraint
引入代码中,从而创建一个 property
。然后您可以轻松地在代码中更改约束的 constant
值,例如将相关视图移动到您希望在超级视图中的位置。
如果这不起作用,请尝试实施另一种 UI 设计方法。例如,您可以为视图创建一个 .xib
文件。这样,您只需更改父视图内的框架,就可以轻松地在其父视图内操纵视图的每一个动作。这种方法比故事板中的方法更具弹性,但更难实现。
我有
- 名为 MyMapViewController 的视图控制器,它是故事板中地图视图的委托,
- 一个名为 MyListViewController 的视图控制器(即情节提要中的容器视图“myContainerView”),它是子视图控制器MyMapViewController.
所以,我在情节提要中有以下内容:http://pasteboard.co/1YAmM2ZU.png
在 MyMapViewController 中,我最初将 myContainerView 的框架设置如下,这样唯一显示的部分就是它的导航栏MyMapViewController 底部:
CGRect destFrame = self.myContainerView.frame;
CGFloat navBarHeight = 44;
destFrame.origin.y = self.view.frame.size.height - navBarHeight;//to bottom of the screen; navigation bar yields 44 points
[UIView animateWithDuration:0
animations:^{
self.myContainerView.frame = destFrame;
}
];
在MyMapViewController中,我在地图上设置了一些注解,委托方法如下:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{
NSLog(@"welcome into the map view annotation");
// if it's the user location, just return nil.
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
// try to dequeue an existing pin view first
static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
MKPinAnnotationView* pinView = [[MKPinAnnotationView alloc]
initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier];
pinView.animatesDrop=YES;
pinView.canShowCallout=YES;
pinView.pinColor=MKPinAnnotationColorPurple;
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton setTitle:annotation.title forState:UIControlStateNormal];
[rightButton addTarget:self
action:@selector(showDetails:)
forControlEvents:UIControlEventTouchUpInside];
pinView.rightCalloutAccessoryView = rightButton;
UIImageView *profileIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"annotationProfile.png"]];
pinView.leftCalloutAccessoryView = profileIconView;
return pinView;
}
问题是,当我将地图滚动到用户自己的位置或地图上最初未显示的注释位置或单击其中一个注释时,myContainerView突然出现。 (它移回情节提要中设置的位置。)但是,我希望 myContainerView 保持原位。
我想出了一些可能的解释,但我不太确定如何克服这个问题。有什么建议吗?
提前致谢。
当您遇到问题中的用户界面异常时,您肯定会错过设计的某些地方。如果是这种情况,请检查您是否通过操作您在 storyboard
中定义的 constraint
来解决问题。您只需按 ctrl
并将其拖动到您的代码中,就可以将 constraint
引入代码中,从而创建一个 property
。然后您可以轻松地在代码中更改约束的 constant
值,例如将相关视图移动到您希望在超级视图中的位置。
如果这不起作用,请尝试实施另一种 UI 设计方法。例如,您可以为视图创建一个 .xib
文件。这样,您只需更改父视图内的框架,就可以轻松地在其父视图内操纵视图的每一个动作。这种方法比故事板中的方法更具弹性,但更难实现。