我在iOS 8中遇到过MKMapview的一些奇怪行为。 我有自定义视图(UIView的子类),其中包含MKMapview。
NMView -> MKMapView
NMView代码
#import "NMView.h"
@implementation NMView
@synthesize mapView;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
frame=self.bounds;
self.translatesAutoresizingMaskIntoConstraints=NO;
mapView=[[MKMapView alloc]initWithFrame:frame];
mapView.showsUserLocation=YES;
[mapView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];
[self setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];
mapView.delegate=self;
[self addSubview:mapView];
self.backgroundColor=[UIColor grayColor];
}
return self;
}
-(void)addCustomAnnotaion:(id<MKAnnotation>)annot{
MKCoordinateRegion region=MKCoordinateRegionMake(annot.coordinate, MKCoordinateSpanMake(10.0f, 10.0f));
[mapView setRegion:region];
[mapView addAnnotation:annot];
// [mapView selectAnnotation:annot animated:YES];
}
- (MKAnnotationView *)mapView:(MKMapView *)mapViews viewForAnnotation:(id <MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKUserLocation class]]){
return nil;
}
static NSString * const identifier = @"MyCustomAnnotation";
MKAnnotationView* annotationView = (MKAnnotationView*)[mapViews dequeueReusableAnnotationViewWithIdentifier:identifier];
if (annotationView){
annotationView.annotation = annotation;
}
else{
annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
annotationView.canShowCallout = YES;
UIView *rightView=[[UIView alloc]initWithFrame:CGRectMake(5, 0, 80,50)];
rightView.backgroundColor=[UIColor clearColor];
UIButton* edit = [UIButton buttonWithType:UIButtonTypeCustom];
[edit setImage:[UIImage imageNamed:@"editPOI"] forState:UIControlStateNormal];
[edit addTarget:self action:@selector(editPoi:) forControlEvents:UIControlEventTouchUpInside];
edit.backgroundColor=[UIColor clearColor];
edit.frame=CGRectMake(15, 5, 30,30);
UIButton* delButton = [UIButton buttonWithType:UIButtonTypeCustom];
[delButton setImage:[UIImage imageNamed:@"deletePOI"] forState:UIControlStateNormal];
[delButton addTarget:self action:@selector(deletePoi:) forControlEvents:UIControlEventTouchUpInside];
delButton.backgroundColor=[UIColor clearColor];
delButton.frame=CGRectMake(55, 5, 30,30);
[rightView addSubview:delButton];
[rightView addSubview:edit];
UIImageView *imgviewIcon=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 30, 30)];
[imgviewIcon setImage:[UIImage imageNamed:@"pin.png"]];
[annotationView setImage:[UIImage imageNamed:@"pin.png"]];
[annotationView layoutIfNeeded];
annotationView.leftCalloutAccessoryView=imgviewIcon;
annotationView.rightCalloutAccessoryView=rightView;
}
return annotationView;
}
-(IBAction)editPoi:(id)sender{
//edit
}
-(IBAction)deletePoi:(id)sender{
//delete
}
我正在将NMView添加到我的视图控制器
NMView *nv=[[NMView alloc]initWithFrame:CGRectMake(5, 5, 300, 400)];
[self.view addSubview:nv];
现在我使用NMView的自定义方法向mapview添加注释,
MKPointAnnotation *point=[[MKPointAnnotation alloc]init];
point.coordinate=pinCoordinate;
point.title=@"test";
[nv addCustomAnnotaion:point];
我已经在iOS7中测试了它的工作正常:
但是在 iOS8 中选择注释整个 NMView变为空白。
是iOS 8的错误还是我做错了? 请帮助..
修改
如果我以编程方式选择注释,那么在iOS 8中也会出现同样的问题。
[mapView selectAnnotation:annot animated:YES];
其他人基本面临这个问题??
iOS8空白屏幕。 :
我已在以下网址上传了项目: https://drive.google.com/file/d/0BxkVP7smm8Z6SnM1UjBxcjc5aDg/view?usp=sharing
请检查一下让我知道..
答案 0 :(得分:2)
我不确定原因,但如果你删除这一行就行了:
self.translatesAutoresizingMaskIntoConstraints=NO;
参考: Views disappear when `translatesAutoresizingMaskIntoConstraints` set `NO`
答案 1 :(得分:0)
这不是完整的解决方案,而是诊断问题的一步。
1-将以下内容添加到NMView类
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {
NSLog(@"MapView: %@", mapView);
//so that I can check the view hierarchy after the user taps on the annotation view
[self performSelector:@selector(viewHierarchy) withObject:nil afterDelay:5];
}
- (void) viewHierarchy {
NSLog(@"Self: %@", self); //set a break point here
//inspect the view hierarchy by typing 'po [self recursiveDescription]' in the debugger
}
'[po recursiveDescription]'的输出。查看NMView“frame = ( - 65 -113; 0 0)”的框架,可能是自动布局问题。
NMView:0x7fa63bc95390; frame = ( - 65 -113; 0 0); autoresize = W + H; layer =&gt; | &GT; | | ; layer =&gt; | | | &GT; | | | | &lt; _MKMapLayerHostingView:0x7fa63bc9b0e0; frame =(0 0; 0 0); layer =&lt; _MKMapLayerHostingLayer:0x7fa63bc9bfe0&gt;&gt; | | | | | (层) | | | | | | (层) | | | &GT; | | | &GT; | | | | &GT; | | | | | &GT; | | | | | | &lt; _MKPopoverEmbeddingView:0x7fa63ef600f0; frame =(149.5 155; 0 0); layer =&gt; | | | | | | | &lt; _UIPopoverView:0x7fa63ef1e4e0; frame =(-84.5 -57; 170 57); layer =&gt; | | | | | | | | &GT; | | | | | | | | | &GT; | | | | | | | | | | &lt; _MKCalloutBackgroundMaskView:0x7fa63ef1f4e0; frame =(0 0; 170 57); layer =&gt; | | | | | | | | | | | &GT; | | | | | | | | | | | | &GT; | | | | | | | | | | | &GT; | | | | | | | | | | | | &GT; | | | | | | | | | | | | &GT; | | | | | | | | &GT; | | | | | | | | | &GT; | | | | | | | | | | &lt; _MKSmallCalloutPassthroughButton:0x7fa63ef60900; baseClass = UIControl; frame =(0 0; 170 57); layer =&gt; | | | | | | | | | | | &lt; _MKCalloutAccessoryWrapperView:0x7fa63d9f8c10; frame =(90 0; 80 50); clipsToBounds = YES; layer =&gt; | | | | | | | | | | | | &GT; | | | | | | | | | | | | | &GT; | | | | | | | | | | | | | | &GT; | | | | | | | | | | | | | &GT; | | | | | | | | | | | | | | &GT; | | | | | | | | | | &lt; _MKSmallCalloutContainerView:0x7fa63bcc4aa0; frame =(0 0; 170 44); clipsToBounds = YES; layer =&gt; | | | | | | | | | | | &lt; _MKCalloutAccessoryWrapperView:0x7fa63dc6d890; frame =(7 7; 30 30); clipsToBounds = YES; layer =&gt; | | | | | | | | | | | | &GT; | | | | | | | | | | &GT; | | | | | | | | | | &GT; | | | | | | | | | | &GT; | | &GT;