سؤال

أرغب في تحميل الصور المتزامنة للحصول على مخصص MkannotationView؛ أنا أستخدم بالفعل إطار EgoImageView (جيد جدا مع القيميتين)، لكنني فشلت في جعلها تعمل على mkmapview. يبدو أن الصور محملة، لكنني لا أستطيع تحديثها على الخريطة - [myMap setNeedsDisplay] لا يفعل شيئا.

هل كانت مفيدة؟

المحلول

لم أحاول ذلك بنفسي، لكنها قد تعمل:
الحصول على عرض للتعليق باستخدام mkmapview - (MKAnnotationView *)viewForAnnotation:(id <MKAnnotation>)annotation طريقة وتعيين صورة جديدة لذلك.

يحرر: حاول أن تفعل ذلك بنفسي وعمل هذا النهج غرامة بالنسبة لي:

//  Function where you got new image and want to set it to annotation view
for (MyAnnotationType* myAnnot in myAnnotationContainer){
    MKAnnotationView* aView = [mapView viewForAnnotation: myAnnot];
    aView.image = [UIImage imageNamed:@"myJustDownloadedImage.png"];
}

بعد استدعاء هذه الطريقة تم تحديث جميع الصور التوضيحية.

نصائح أخرى

لقد وجدت طريقة واحدة موثوقة واحدة فقط لتحديث التوضيحية، وطرق أخرى لم تنجح بالنسبة لي: مجرد إزالة وإضافة شرح مرة أخرى:

id <MKAnnotation> annotation;

// ...

[mapView removeAnnotation:annotation];
[mapView addAnnotation:annotation];

سيجعل هذا الرمز - [mapview: viewforannotation:] ليتم استدعاؤها مرة أخرى، وسيتم إنشاء طريقة العرض التوضيحية الخاصة بك مرة أخرى (أو ربما تم إعادة استخدامها إذا كنت تستخدم DequeuereusableannotationViewwithidifidifient) مع البيانات الصحيحة.

هذه هي الطريقة الوحيدة التي عثرت عليها لإعادة تشديد Redraw of MkannotationViews:

// تحديث القوة لعرض الخريطة (وإلا فلن إعادة توجيه طرق العرض التوضيحية)

cllocationcoordinate2d center = mapview.centercoordinate؛

mapview.centercoordinate = مركز؛

يبدو عديم الفائدة، لكنها تعمل.

هذا عملت بالنسبة لي

#import "EGOImageView.h"

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    //ENTER_METHOD;    
    if([annotation isKindOfClass:[MKUserLocation class]]) return nil;  
    MKPinAnnotationView *annView;

    static NSString *reuseIdentifier = @"reusedAnnView";
    annView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
    annView.canShowCallout = YES;
    annView.calloutOffset = CGPointMake(-5.0f, 0.0f);
    annView.opaque = NO;
    annView.image = [[UIImage imageNamed:@"tempImage.png"] retain];

    YourModel *p = annotation; // make this conform to <MKAnnotation>
    EGOImageView *egoIV = [[EGOImageView alloc] initWithPlaceholderImage:[UIImage imageNamed:@"tempImage.png"]];
    [egoIV setDelegate:self];
    egoIV.imageURL = [NSURL URLWithString:p.theUrlToDownloadFrom];
    [annView addSubview:egoIV];
    [egoIV release];


    return [annView autorelease];
}

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

CLLocationCoordinate2D center = mapView.centerCoordinate; 
CLLocationCoordinate2D forceChg;
forceChg.latitude = 0;
forceChg.longitude = curLongNum;

mapView.centerCoordinate = forceChg;
mapView.centerCoordinate = center;

أردت تحديث موقع تعريف موقع المستخدم مع الصورة الرمزية المحددة الجديدة. لقد وجدت حل سريع آخر لهذه الحالة. لدي 2 شاشات. أول واحد هو اختيار الصورة الرمزية والثاني هو عرض المستخدم على الخريطة.

SWIFT 5.يمكنك تغيير صورة موقع المستخدم عن طريق إنشاء mkannotationView.

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

    if annotation is MKUserLocation {
        let userIdentifier = "UserLocation"
        var userView = mapView.dequeueReusableAnnotationView(withIdentifier: userIdentifier)
        if userView == nil {
            userView = MKAnnotationView(annotation: annotation, reuseIdentifier: userIdentifier)
        } else {
            userView?.annotation = annotation
        }

        userView!.image = UIImage(named: "avatar1") //your image

        return userView
    }

    return nil
 }

لذلك إذا سيقوم المستخدم بتغيير الصورة الرمزية إلى شيء آخر، على سبيل المثال "Avatar2" لن يتم تحديثها.

من أجل تحديث موقع موقع المستخدم أضفت هذا الرمز Viewwillappear ()

 self.mapView.showsUserLocation = false
 self.mapView.showsUserLocation = true
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top