2011-08-08 3 views

답변

13

한 가지 방법은 펜촉에서 뷰를로드 한 다음 뷰를 하위 뷰로 MKAnnotationView에 추가하는 것입니다. 새 컨트롤러를 만들 필요는 없습니다.

먼저, NIB의 사용자 정의보기로드거야되는 속성과의 MKAnnotationView 서브 클래스 생성 :이 클래스의 초기화 방법, 그리고

@interface MapAnnotationView : MKAnnotationView 

@property (nonatomic, retain) IBOutlet UIView* loadedView; 

을 펜촉을로드하고 하위 뷰로 추가를 :

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString*)reuseIdentifier 
{ 
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]; 
    if (self != nil) 
    { 
     [[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil]; 
     if (loadedView){ 
      [self addSubview:loadedView]; 
     } 
    } 
    return self; 
} 

마지막으로 MyCustomView NIB를 UIView로 만듭니다. 파일 소유자에게 위의 MapAnnotationView 클래스를 만들고 위에 정의 된 IBOutlet에 뷰를 첨부합니다.

그게 전부입니다.

+0

안녕하세요, Aidan! 귀하의 코드를 시도하고 내가 얻은 것은 _loadedView_와 같은 핀 주석입니다. nib 파일에서로드 된 주석 뷰 (핀에 접촉 할 때 나타나는 주석 뷰)를 가질 수 있습니까 ?? 감사합니다. – Frade

+0

예, 저의 예는이를 지원합니다. 기본 연결 핀이 NIB의 UIView에 정의 된 것보다 표시되도록 잘못 연결 한 것으로 의심됩니다. –

+0

죄송합니다. 실수입니다. 나는 그것을 적절하게 설명하지 않았다. 내가 뭘하려고하는지 Nib에서 사용자 정의 콜 아웃을로드하는 것입니다. 괜찮다면 [이 질문] (http://stackoverflow.com/questions/8945376/how-to-add-a-custom-calloutview-loaded-from-nib-file)을 확인하십시오. 감사합니다 – Frade

3

Aidan 솔루션의 한 가지 문제점은 펜촉에서 뷰를로드 한 다음 사용자 지정 AnnotationView의 하위 뷰로 추가한다는 것입니다. 이렇게하면 맵보기에서 작성한 모든 보이는 주석에 대한 추가보기가 메모리에 저장됩니다. 주석이 하나만있는 경우 문제가되지 않을 수도 있습니다. 그러나지도에 수십 개의 주석이 동시에있는 경우 해당 솔루션은 메모리와 GPU 렌더링 리소스가 약간 낭비됩니다.

단순하고 효율적인 솔루션과 같이, 사용자 정의 MapAnnotationViewreuseIdentifier getter 메소드를 오버라이드 (override)하는 것입니다

class MapAnnotationView: MKAnnotationView { 
    override var reuseIdentifier: String? { 
     get { return "MapAnnotationView" } 
    } 
} 

그리고 그것을이며, 뷰가 제대로 다시 얻을 것이다. 하위보기 등으로 뷰를 추가하는 트릭을 수행 할 필요가 없습니다.

+0

이 @Yuchen에 대해 자세히 설명해 주시겠습니까? xib에서 뷰를로드하는 것을 어떻게 피합니까? MKAnnotationView를 사용하여 xib에서 만든보기를 사용하려고합니다. – KMLong

+0

헤이 @KMLong, 미안하다. 귀하의 질문에 대답하기 위해 : 나는 xib에서 주석보기를로드하는 것을 피하지 않았다. 필자가 제안한 것은 Adian의 대답이 xib에서 별도의 하위 뷰를로드하는 것을 피하는 것입니다 : [[[NSBundle mainBundle] loadNibNamed : @ "MyCustomView"owner : self options : nil]'. –

관련 문제