iphone - سوريا - تفعيل خط السيرف سيريتل



كيفية تشغيل طريقة عرض المكالمة من MKAnnotationView دون لمس الدبوس؟ (9)

أعمل على MKMapView مع دبوس الملونة المعتادة كنقاط الموقع. أود أن أكون قادراً على عرض وسيلة الشرح دون لمس الدبوس.

كيف أفعل ذلك؟ مجموعة الاتصال المحددة setSelected:YES لم يفعل setSelected:YES في التعليق التوضيحي أي شيء. أفكر في محاكاة لمسة على دبوس ولكن لست متأكدا من كيفية الذهاب حول هذا الموضوع.

https://ffff65535.com


إذا افترضنا أنك تريد تحديد آخر مشاهدة توضيحية ، فيمكنك وضع الشفرة أدناه:

[mapView selectAnnotation:[[mapView annotations] lastObject] animated:YES];

في المفوض أدناه:

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

إذا كنت تريد فقط فتح وسيلة الشرح للاطلاع على التعليق التوضيحي الأخير الذي أضفته ، فجرِّب ذلك ، ويعمل لي.

[mapView selectAnnotation:[[mapView annotations] lastObject] animated:YES];


بسبب شيء مثل الكود الظاهر من قبل benvolioT ، الذي أظن أنه موجود في النظام ، عندما استخدمت SelectAnnotation: animation: method ، فإنه لم يظهر المكالمة ، خمنت أن السبب كان بسبب اختياره بالفعل وأنه كان يتجنب طلب MapView لإعادة رسم المكالمة على الخريطة باستخدام عنوان التعليق التوضيحي والعنوان الفرعي.

لذا ، كان الحل ببساطة هو إلغاء تحديده أولاً وإعادة تحديده.

على سبيل المثال: أولا ، كنت بحاجة إلى القيام بذلك في طريقة أبل touchMoved (أي كيفية سحب AnnotationView) لإخفاء callOut. (ببساطة استخدام التعليق التوضيحي. canShowAnnotation = لا يعمل ذلك وحده ، حيث أظن أنه يحتاج إلى إعادة الرسم. يؤدي إلغاء التحديد إلى عدم اتخاذ الإجراء اللازم. كما أن إلغاء التحديد وحده لم يفلح في القيام بذلك ، فاختفي المكالمة مرة واحدة فقط وأعيد رسمها على الفور. كان التلميح أنه تم إعادة تحديده تلقائيًا).

annotationView.canShowAnnotation = NO;
[mapView deselectAnnotation:annotation animated:YES];

بعد ذلك ، ما عليك سوى استخدام الرمز أدناه في طريقة touchEnded لم يعيد استدعاء callOut (تم تحديد التعليق التوضيحي تلقائيًا بواسطة النظام في ذلك الوقت ، ويفترض أنه إعادة رسم المكالمة من عدم الظهور أبدًا):

annotationView.canShowAnnotation = YES;
[mapView selectAnnotation:annotation animated:YES];

الحل كان:

annotationView.canShowAnnotation = YES;
[mapView deselectAnnotation:annotation animated:YES];
[mapView selectAnnotation:annotation animated:YES];

هذا ببساطة اشترى مرة أخرى callOut ، ويفترض أنه إعادة بدء عملية إعادة رسم استدعاء من mapView.

بالمعنى الدقيق للكلمة ، يجب أن أكتشف ما إذا كان التعليق التوضيحي هو التعليق الحالي أم لا (المحدد ، الذي أعرفه) وما إذا كان callOut يظهر أم لا (وهو ما لا أعرفه) وقرّر إعادة رسمه وفقًا لذلك ، كن افضل. أنا ، ومع ذلك ، لم يتم العثور على طريقة الكشف المكالمة المكالمة بعد ومحاولة القيام بذلك هو مجرد نفسي غير ضروري في هذه المرحلة.


بعد تجربة مجموعة متنوعة من الإجابات على هذا الموضوع ، أخيراً توصلت إلى هذا. وهو يعمل بشكل موثوق به للغاية ، ولا زلت أرى أنه يفشل:

- (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views;
{
    for(id<MKAnnotation> currentAnnotation in aMapView.annotations) 
    {       
        if([currentAnnotation isEqual:annotationToSelect]) 
        {
            NSLog(@"Yay!");
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.3 * NSEC_PER_SEC), dispatch_get_current_queue(), ^
            {
                [aMapView selectAnnotation:currentAnnotation animated:YES];
            });
        }
    }
}

يتم استخدام القالب للتأخير قليلاً ، لأنه بدونه قد لا يتم عرض وسيلة الشرح بشكل صحيح.


حسنًا ، إليكم الحل لهذه المشكلة.

لعرض وسيلة الشرح استخدم MKMapView selectAnnotation:animated .


حسنًا ، لإضافة وسيلة شرح بنجاح ، يلزمك استدعاء selectAnnotation: متحركة بعد إضافة جميع مشاهدات التعليقات التوضيحية ، باستخدام didAddAnnotationViews للمفوض:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views{
    for (id<MKAnnotation> currentAnnotation in mapView.annotations) {       
        if ([currentAnnotation isEqual: annotationToSelect]) {
            [mapView selectAnnotation:currentAnnotation animated:YES];
        }
    }
}

قرأت API بعناية ، وأخيرا وجدت المشكلة:

إذا لم يكن التعليق التوضيحي المحدد ظاهرًا على الشاشة ، وبالتالي لا يتضمن عرضًا توضيحيًا مرتبطًا ، فلن يكون لهذه الطريقة أي تأثير.

لذلك يمكنك الانتظار بعض الوقت (على سبيل المثال ، 3 ثوان) ثم تنفيذ هذا الإجراء. ثم يعمل.


ما عليك سوى إضافة [mapView selectAnnotation: point animated: YES]؛


ولكن هناك ما يكفي للحصول على حل benvolioT للعمل ، والرمز

for (id<MKAnnotation> currentAnnotation in mapView.annotations) {       
    if ([currentAnnotation isEqual:annotationToSelect]) {
        [mapView selectAnnotation:currentAnnotation animated:FALSE];
    }
}

يجب استدعاء من - (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView ، وليس في أي مكان آخر.

التسلسل الذي تكون فيه الطرق المتنوعة مثل viewWillAppear ، و viewDidAppear of viewDidAppear و - (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView يُسمى بشكل مختلف بين المرة الأولى التي يتم فيها تحميل الخريطة مع موقع معين والأوقات اللاحقة يتم عرض الخريطة. مع نفس الموقع. هذا هو صعبة بعض الشيء.





iphone