구함 : 신뢰할 수있는 방법, mkmapview 주석을 지속적으로 선택하십시오.

StackOverflow https://stackoverflow.com/questions/1256875

  •  12-09-2019
  •  | 
  •  

문제

전화 후 mkmapview'에스 SetCenterCoordinate : 애니메이션 : 메소드 (애니메이션없이) SELECTANNOTATION : 애니메이션 : (애니메이션 포함) 새로 중심의 푸시 핀에서 주석이 튀어 나옵니다.

지금은 단순히 지켜 봅니다 mapViewDidFinishLoadingMap : 그런 다음 주석을 선택하십시오. 그러나 이것은 문제가됩니다. 예를 들어, 추가 맵 데이터를로드 할 필요가없는 경우이 메소드가 호출되지 않습니다. 이 경우 주석이 선택되지 않았습니다. :(

아주 잘. 중앙 좌표를 대신 설정 한 직후에 이것을 호출 할 수 있습니다. 아,하지만 그 경우에는 ~이다 데이터를로드 할 수 있습니다 (그러나 아직로드가 완료되지 않았습니다). 나는 애니메이션이 기껏해야 발견되면서 너무 빨리 전화 할 위험이 있습니다.

따라서, 내가 올바르게 이해한다면, 내 좌표가 보이는지 아는 것은 문제가되지 않습니다. 거의 스크린 거리를 잃고 새 맵 데이터를로드해야 할 수 있기 때문입니다. 꽤, 새로운 맵 데이터를로드 해야하는지 알고 그에 따라 작용하는 것이 문제입니다.

이를 달성하는 방법에 대한 아이디어 또는 그렇지 않으면 주석이 사는 곳의 좌표에서 맵보기를 다시 중심 한 후 주석을 선택하는 방법 (안정적으로)을 선택하십시오.

단서에 감사드립니다 - 감사합니다!

도움이 되었습니까?

해결책

나는 같은 문제를 겪었지만 신뢰할 수 있고 합리적인 솔루션처럼 보이는 것을 발견했습니다.

  1. 대의원 메소드 MAPVIEW : DIDADDANNOTATIONVIEWS를 구현하십시오. 대의원 메소드 내에서 주석을 직접 선택하려고하면 콜 아웃이 핀으로 떨어졌습니다! 그것은 이상하게 보였으므로 반 초의 약간의 지연을 추가합니다.

    -(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
        [self performSelector:@selector(selectInitialAnnotation)
              withObject:nil afterDelay:0.5];
    }
    
  2. 예상대로 초기 주석을 선택하지만 SelectAnnotation : 애니메이션;

    -(void)selectInitialAnnotation {
        [self.mapView selectAnnotation:self.initialAnnotation animated:YES];
    }
    

그것은 것 같습니다 selectAnnotation:animated: 일부 조건에서 호출되지 않습니다. 비교하십시오 mkmapview 문서:

지정된 주석이 화면에 있지 않으므로 관련 주석보기가없는 경우이 방법에는 영향을 미치지 않습니다.

다른 팁

고정 시간 초과를 사용하는 것보다 더 일관된 방법은 regionDidChange 콜백. 맵의 중심 좌표를 원하는 주석으로 설정하고 greaDidChange 메소드가 호출되면 중앙에 주석을 선택하여 콜 아웃을 엽니 다.

여기 조금 있습니다 동영상 나는 5 핀 사이에서 무작위로 실행되는 것을 가져 갔다.

먼저, 주석의 중심 좌표를 얻었습니다. 주석 개체의 이름이 지정되었다고 가정 해 봅시다 thePin.

- (void)someMethod {
    [map setCenterCoordinate:thePin.coordinate animated:YES];
}

그런 다음 regionDidChange 방법,이 주석을 선택하십시오.

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    [map selectAnnotation:thePin animated:YES];
}

그냥 참고로, 이것은 문서가 말하는 것입니다.

지정된 주석이 화면에 있지 않으므로 관련 주석보기가없는 경우이 방법에는 영향을 미치지 않습니다.

그래서 내가 전화하고 싶다면 setCenterCoordinate:animated: 또는 setRegion:animated: 그런 다음 전화하여 주석을 선택하고 싶습니다. selectAnnotation:animated: , 주석이 선택되지 않으며 콜 아웃은 문서에서 위에서 언급 한 것과 같은 이유의 Beacause가 나타나지 않으므로, 같은 것을 갖는 것이 좋을 것입니다. setCenterCoordinate:animated:ComletionBlock 하지만 거기에는 없습니다 ..! 나를 위해 일한 방식은 다음과 같습니다.

 [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState|UIViewAnimationOptionCurveEaseInOut animations:^{
        [self.mapView setCenterCoordinate:location.coordinate animated:YES];
    } completion:^(BOOL finished) {
        [self.mapView selectAnnotation:location animated:YES];
    }];

이렇게하면 완료 블록이 제공되며 U는이를 사용하여 주석을 선택할 수 있습니다.

저를 위해 일한 것은 전화였습니다 selectAnnotation:animated: ~로부터 mapView:didAddAnnotationViews: 방법:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;
{
    [mapView selectAnnotation:[[mapView annotations] lastObject] animated:YES];
}

동일한 Apple 문서 여기.

지도에 주석이 하나만 있으므로 [[mapView annotations] lastObject] 내 목적에 대해 괜찮 았습니다. 귀하의 마일리지가 다를 수 있습니다.

나는 비슷한 문제가 있었다. AnimatesDrop : 예. mkmapview에 주석을 추가 한 후 다음과 같이하고있었습니다.

[mapView selectAnnotation:[mapView.annotations objectAtIndex:1] animated:YES]

내 프로그램의 논리에서 가장 가까운 주석을 선택해야합니다. 이것은 작동하지 않았습니다. 나는 그 이유를 알아 냈습니다. 핀 드롭 애니메이션 때문에이 선택된 호출시 주석보기가 화면에 없었습니다. 그래서 내가 한 것은 두 번째 후에 주석을 선택하기 위해 타이머를 설정하는 것입니다. 해킹이지만 작동합니다. 예를 들어 3G 대 3G와 같은 모든 상황에서 작동하는지 확실하지 않습니다. 올바른 콜백 함수를 알아내는 것이 좋습니다.

selectTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self
               selector:@selector(selectClosestAnnotation) userInfo:nil
               repeats:NO];

- (void)selectClosestAnnotation {
    [mapView selectAnnotation:[mapView.annotations objectAtIndex:1]
             animated:YES];
}

내 문제에 대해 본 모든 솔루션에서 몇 가지 문제를 발견했습니다 (ViewDidAppear에서 추가 할 때 주석을 선택하고 싶습니다).

  1. 사용 mapView:didAddAnnotationViews: 대표 방법.

    지정된 주석이 화면에 있지 않으므로 관련 주석보기가 없으면이 메소드는 효과가 없기 때문에 이것은 효과가 없었습니다.

  2. 사용 mapViewDidFinishLoadingMap: 대표 방법.

    지도가 지금 캐시되어 있기 때문에 이것은 나에게도 효과가 없었으므로 메소드는 처음으로 한 번만 호출됩니다.

해결책:

John Blackburn은 매우 가깝지만 없었습니다 mapView:didAddAnnotationViews: 방법. 난 그냥 내 자신을 부릅니다 selectAnnotation: 주석을 추가하기 전에 지연된 방법 :

[self.mapView addAnnotation:ann];
[self performSelector:@selector(selectAnnotation:) withObject:ann afterDelay:0.5];

그리고 이것이 제가 내 일입니다 selectAnnotation: 방법:

- (void)selectAnnotation:(id < MKAnnotation >)annotation
{
   [self.mapView selectAnnotation:annotation animated:YES];
}

두 개의 iPhone 3G (iOS 5 및 6)와 iPhone 5에서 테스트되었습니다.

나는 비슷한 어려움을 겪었지만 실제로이 방법을 전혀 작동시킬 수 없었습니다.

여기에 내가 찾은 것이 있습니다. 어쩌면 그것은 당신에게도 효과가있을 것입니다 :핀을 터치하지 않고 mkannotationView의 콜 아웃보기를 트리거하는 방법은 무엇입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top