2013-07-06 2 views
0

textbubble 및 pin 요소가 여러 개있는 주석을 만듭니다. 내가 어노테이션을 보여줄 때 나는 버블을 켠다. 그러나 나중에 버블을 끄고 어노테이션을 남기고 싶다.mkmap에 주석을 추가하고 있지만 주석의 일부를 제거하려고하지만 제거하지는 않겠습니다.

다음은 두 가지 방법입니다. add 하위 뷰는 작동하지만 하위 뷰는 제거하지 않습니다.

-(void)hideETACountdown { 
self.etaView.hidden = YES; 
[self.etaView removeFromSuperview]; 
} 

-(void)showETACountdown { 

self.etaView = [[UIView alloc] initWithFrame:CGRectMake(-34, -97, 89, 59)]; 
UIImageView *bg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"WaitBubble_backgroundandshadow.png"]]; 
[self.etaView addSubview:bg]; 
UILabel *minLabel = [[UILabel alloc] initWithFrame:CGRectMake(7, 24, 42, 21)]; 
minLabel.text = @"min"; 
minLabel.textAlignment = UITextAlignmentCenter; 
minLabel.font = [UIFont systemFontOfSize:10]; 

self.etaLabel = [[UILabel alloc] initWithFrame:CGRectMake(13, 4, 30, 27)]; 
self.etaLabel.font = [UIFont boldSystemFontOfSize:22]; 
self.etaLabel.textAlignment = UITextAlignmentCenter; 
self.etaLabel.text = @""; 

[self.etaView addSubview:minLabel]; 
[self.etaView addSubview:self.etaLabel]; 

[self addSubview:self.etaView]; 

self.etaView.hidden = NO; 
} 

- (id) initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier 
{ 
if (self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]) { 


    self.canShowCallout = YES; 
    self.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 

    self.innerImage = [[UIImageView alloc] initWithImage:nil]; 
    self.innerImage.frame = CGRectMake(-15, -38, 32, 39); 

    [self addSubview:self.innerImage]; 

    if(self.showETA) { 

     [NSNotificationCenter addUniqueObserver:self 
             selector:@selector(handleEtaTimeUpdate:) 
              name:kEtaUpdate 
             object:nil]; 
     [self showETACountdown]; 

    } 

} 
return self; 
} 

는 // UPDATE는 /////

는 약간의 혼동이있는 것 같습니다. 위의 코드는 내 mkmap을 보유하고있는 viewController가 아니라 사용자 정의 주석 내부의 코드입니다. 또한 선택 또는 선택 취소를 기반으로 전체 주석을 숨기거나 표시하고 싶지 않습니다. self.etaView는 주석의 일부인 사용자 정의보기입니다. 내 특수 효과는 맞춤지도 핀과 ÉT 거품으로 구성됩니다. ETA가 0으로 계산되면 버블 (일명 self.etaView)을 삭제하려고하지만 주석 (지도 핀)은 전체 시간 동안지도에 있어야합니다. ETA 버블을 숨기고 싶습니다.

내 mkmap을 보유하고있는 내 viewController에서 적절한 addAnnotation 메서드를 사용하고 있습니다. 다시 위의 코드는 내 사용자 정의 주석 안에 있으며 사용자 정의 주석에 자체 요소를 제거하고 맵에서 자체를 제거하지 않아야합니다.

답변

2

왜이 이상한 논리를 addSubView 및 removeFromSuperView와 함께 사용하십시오. MKMapView는 핀을위한 "데이터 소스"를 지원하도록 구축되었습니다. 나는 어떤 종류의 견해를 당신이 습득하려고 노력하고 있는지 모르지만이 CGRectMake(-34, -97, 89, 59)은 끔찍한 것처럼 보입니다. 얻고 있었다

[mapView deselectAnnotation:[mapView.selectedAnnotations objectAtIndex:0] animated:YES]; 
+0

예, 여기서 직접보기 계층 구조를 혼란스럽게하지 마십시오. 제공된 프레임 워크 메소드 –

+0

을 사용하여 주석을 추가/제거 addAnotation/removeAnnotation –

+0

정착하십시오. 위의 코드는지도를 관리하는 내 컨트롤러에 없습니다. 이것은 내 주석의 코드입니다. 따라서 - (id) initWithAnnotation : (id ) 주석 reuseIdentifier : (NSString *) reuseIdentifier 클래스를 실행하는 뷰 컨트롤러에서 viewForAnnotation 메서드를 사용하고 있습니다. 또한 주석의 하위 뷰를 제거하려는 경우 deselectAnnotation이라고 가정하지 마십시오. 한 번 표시된 주석을 제거하고 싶지 않습니다. 나 또한 화면을 터치하지 않고 코드를 통해 self.etaView를 숨기고 표시합니다. 그리고 self.etaView는 전체 주석이 아니라 하나의 뷰 요소입니다. – jdog

0

방법을 거품을 제거하기 위해 : 더 어려움 예를 들어 방법

- (void)deselectAnnotation:(id <MKAnnotation>)annotation animated:(BOOL)animated 

사용하여 주석 관리가 없습니다

-(MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id<MKAnnotation>)annotation 

이 방법을 : 그래서, 방법을 사용하시기 바랍니다 불렀지 만, 그냥 제거되지 않았습니까? 그래서 내가 한 것은 내 주석에 알림 수신기를 만들고 제거하고 제거하려고 할 때 알림을 게시하는 것입니다. 왜 그것이 인스턴스 메서드를 호출하여 작동하지 않는지 확실하지 않습니까?

어쨌든, 알림을 통해 해결했습니다. 계속해서 앱을 시작할 수 있습니다.

관련 문제