lu *_*uan 5 mkannotationview ios ios7
一个UIButton被设置为rightCalloutAccessoryView的MKPinAnnotationView,并且它触发btnClicked:方法.在iOS6中,MKAnnotationView它之间的布局关系rightCalloutAccessoryView可以很容易地用于查找MKPinAnnotationView直通 MKPinAnnotationView *pin = (MKPinAnnotationView *)[[button superview] superview];.但在iOS7中,布局关系不再存在.
- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation{
...
MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:tripStartAddrAnnotationIdentifier];
if (!pinView)
{
MKPinAnnotationView *customPinView = [[MKPinAnnotationView alloc]
initWithAnnotation:annotation reuseIdentifier:tripStartAddrAnnotationIdentifier];
customPinView.animatesDrop = NO;
customPinView.canShowCallout = YES;
UIButton* rightButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 32, 32)];
[rightButton setImage:[UIImage imageNamed:@"disclosureUpMap.png"] forState:UIControlStateNormal];
[rightButton setImage:[UIImage imageNamed:@"disclosureDownMap.png"] forState:UIControlStateNormal];
[rightButton addTarget:self
action:@selector(btnClicked:)
forControlEvents:UIControlEventTouchUpInside];
customPinView.rightCalloutAccessoryView = rightButton;
return customPinView;
}
else
{
pinView.annotation = annotation;
}
return pinView;
...
}
-(void)btnClicked:(id)sender{
NSLog(@"superview 1 :%@",[sender superview]);
NSLog(@"superview 2 :%@",[[sender superview] superview]);
NSLog(@"superview 3 :%@",[[[sender superview] superview] superview]);
NSLog(@"superview 4 :%@",[[[[sender superview] superview] superview] superview]);
MKPinAnnotationView *pin = (MKPinAnnotationView *)[[sender superview] superview];
// the information contains in pin.annotation is necessary for the pushed view controller
...
}
Run Code Online (Sandbox Code Playgroud)
登录iOS6:
2013-09-30 01:21:11.851 MyApp[6113:c07] superview 1 :<UICalloutView: 0x1e3df250; frame = (-246 -60; 320 70); clipsToBounds = YES; layer = <CALayer: 0x1e3e0140>>
2013-09-30 01:21:11.851 MyApp[6113:c07] superview 2 :<MKPinAnnotationView: 0x1b649510; frame = (526 223; 32 39); layer = <MKLayer: 0x1b649570>> visible:1 +33.19910200, +120.45132100
2013-09-30 01:21:11.852 MyApp[6113:c07] superview 3 :<MKAnnotationContainerView: 0xb68b380; frame = (0 0; 640 640); autoresizesSubviews = NO; layer = <CALayer: 0xb68b410>>
2013-09-30 01:21:11.852 MyApp[6113:c07] superview 4 :<MKScrollContainerView: 0xb68c8f0; frame = (-280 -72.5; 640 640); autoresizesSubviews = NO; layer = <CALayer: 0xb68c980>>
Run Code Online (Sandbox Code Playgroud)
登录iOS7:
2013-09-30 01:44:22.835 MyApp[6226:a0b] superview 1 :<_MKSmallCalloutContainerView: 0xdbe5120; frame = (0 0; 222 44); clipsToBounds = YES; layer = <CALayer: 0xdbe1f30>>
2013-09-30 01:44:22.836 MyApp[6226:a0b] superview 2 :<MKSmallCalloutView: 0x1c53a380; frame = (0 0; 222 57); layer = <CALayer: 0x1c546440>>
2013-09-30 01:44:22.837 MyApp[6226:a0b] superview 3 :<UIView: 0xdb14770; frame = (0 0; 222 57); clipsToBounds = YES; layer = <CALayer: 0xdb147d0>>
2013-09-30 01:44:22.837 MyApp[6226:a0b] superview 4 :<_UIPopoverView: 0xdbfa4c0; frame = (-27 -57; 222 57); layer = <CALayer: 0xdbfa5a0>>
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.
小智 4
这是使用地图视图自己的委托方法calloutAccessoryControlTapped而不是自定义方法的一个重要原因。
即使超级视图方法在 iOS 6 或更早版本中有效,依赖特定视图层次结构通常也是一个坏主意。
委托方法方便地提供对注释视图的引用,您可以从中获取注释view.annotation(无需猜测、希望或假设)。
删除 addTarget 并将自定义方法替换为委托方法。
如果您必须使用自定义方法而不是委托方法,那么从地图视图的属性获取选定的注释selectedAnnotations而不是寻找超级视图要可靠得多。
| 归档时间: |
|
| 查看次数: |
1204 次 |
| 最近记录: |