هل تريد إضافة عرض فرعي إلى MKMapView الموجود أعلى الخريطة ولكن أسفل طرق عرض التعليقات التوضيحية؟

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

سؤال

بالنسبة إلى التطبيق الذي أقوم بإنشائه، لدي تأثير PNG مخصص لـ "الخريطة القديمة" وأرغب في تراكبه على طريقة العرض MKMapView.لسوء الحظ، لم تكن أي من الطرق التي حاولت القيام بها صحيحة تمامًا:

  1. إضافة عرض فرعي إلى MKMapView (المشكلة:يتم وضع UIImageView لملف PNG فوق دبابيس التعليقات التوضيحية، والتي تبدو غريبة
  2. اجعل الصورة عبارة عن عرض توضيحي بنفسها وضعها أسفل الصور الأخرى (المشكلة:أثناء التمرير، لا بد لي من نقل صورة عرض التعليقات التوضيحية، ولفترة من الوقت لا توجد سوى الخريطة العادية بدلاً من التأثير القديم).

ما أريد تحقيقه بشكل أساسي هو الحصول على عرض فرعي يتم وضعه فوق Maptiles ولكن أسفل طرق عرض التعليقات التوضيحية، وسيظل ثابتًا أثناء قيام المستخدم بالتمرير - هل لديك أي أفكار؟

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

المحلول

لاحظ أن كل شيء MKMapView يتم عرض التسلسل الهرمي والشروح والسلوك وما إلى ذلك في القطاع الداخلي الخاص MKMapViewInternal class لذا فإن تغيير أي شيء (بطريقة أقترحها أو بأخرى) في هذه البنية قد يؤدي إلى رفض طلبك من Appstore.

ليس لدي الحل الكامل، مجرد فكرة.فكرتي هي جعل عرض التراكب له نفس العرض مثل طرق عرض التعليقات التوضيحية والتأكد من وضع التعليقات التوضيحية فوق التراكب الخاص بنا.في MKMapViewDelegate نقوم بتنفيذ:

- (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views{
    if (views.count > 0){
        UIView* tView = [views objectAtIndex:0];

        UIView* parView = [tView superview];
        UIView* overlay = [tView viewWithTag:2000];
        if (overlay == nil){
            overlay = [[UIImageView alloc] initWithImage:[UIImage imageNamed:MY_IMAGE_NAME]];
            overlay.frame = parView.frame; //frame equals to (0,0,16384,16384)
            overlay.tag = 2000;
            overlay.alpha = 0.7;
            [parView addSubview:overlay];
            [overlay release];
        }

        for (UIView* view in views)
            [parView bringSubviewToFront:view];
    }
}

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

نصائح أخرى

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

CLLocationCoordinate2D pt1, pt2, pt3, pt4;
pt1 = CLLocationCoordinate2DMake(85, 0);
pt2 = CLLocationCoordinate2DMake(85, 180);
pt3 = CLLocationCoordinate2DMake(-85, 180);
pt4 = CLLocationCoordinate2DMake(-85, 0);
CLLocationCoordinate2D coords[] = {pt1, pt2, pt3, pt4};
MKPolygon *p = [MKPolygon polygonWithCoordinates:coords count:4];
[self.mapView addOverlay:p];

pt1 = CLLocationCoordinate2DMake(85, 0);
pt2 = CLLocationCoordinate2DMake(85, -180);
pt3 = CLLocationCoordinate2DMake(-85, -180);
pt4 = CLLocationCoordinate2DMake(-85, 0);
CLLocationCoordinate2D coords2[] = {pt1, pt2, pt3, pt4};
MKPolygon *p2 = [MKPolygon polygonWithCoordinates:coords2 count:4];
[self.mapView addOverlay:p2];

ثم تحتاج إلى إضافة مندوب الخريطة لرسمها:

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {
    if ([overlay isKindOfClass:MKPolygon.class]) {
        MKPolygonRenderer *polygonView = [[MKPolygonRenderer alloc] initWithOverlay:overlay];
        polygonView.fillColor = [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:0.4];
        return polygonView;
    }
    return nil;
}

إنها قديمة جدًا، ولكنها ربما لا تزال ذات صلة بالبعض منكم.

كنت أرغب في جعل الخريطة أكثر قتامة، ولكن ليس طرق عرض التعليقات التوضيحية.

ما فعلته كان بسيطًا جدًا ولا أعرف حتى الآن ما إذا كان له بعض التراجع ...

أضع أ UIView بخلفية سوداء شفافة فوق MKMapView, ، ثم أضف الكود التالي:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray<MKAnnotationView *> *)views
{
    for (MKAnnotationView *view in views) {
        view.center = [self.mapView convertCoordinate:view.annotation.coordinate toPointToView:self.viewDark];
        [self.viewDark addSubview:view];
    }
}

نأمل أن يساعد ..وبالطبع - إذا وجدت أي مشاكل حول هذا الحل فيرجى إبلاغي بذلك :)

التعديل رقم 1:نسيت أن أذكر ذلك self.viewDark يجب ان userInteraction عاجز.

التعديل رقم 2:الشيء الآخر الذي ساعدني هو الإعداد self.viewDarkautoresizesSubviews ل NO.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top