تحية طيبة
لقد قمت مؤخرًا بنشر مقال مشبع حرفيًا بحب Yandex.Maps. القصيدة. قصيدة. هنا ، في الواقع ، هي
habr.com/en/post/479102بعد التأكد من وجود عدد قليل من عشاق الشعر بين المبرمجين ، قررت مع ذلك إلقاء الضوء على الوضع بطريقة "هابروفسكي". قبض على مجموعة من التعليمات البرمجية والأفكار واللقطات. دعنا نذهب.

لنبدأ من جديد.
المهمة تافهة:
عندما تدخل وحدة التحكم بالبطاقات ، تحتاج إلى "الضغط" فورًا على نقطة المستخدم (المكافأة: ستحتاج أيضًا إلى الحصول على العنوان في نموذج مقروء مع جميع الأذواق المتاحة).لقد قطعنا المحلل: "فرق تسد".لتحقيق هذا الهدف ، من الضروري حل عدد من المشكلات الفنية والتجارية ، وهي:
0. انتقل إلى وحدة التحكم باستخدام وحدة محتملة للعمل مع تحديد الموقع الجغرافي (MRSG) ، وعمليات الاسترجاعات ، وما إلى ذلك.
1. IWG
1.1 تطبيق IWG
1.2 إطلاق IWG
1.2.1 الحصول على إحداثيات المستخدم
1.2.2 نلقي نظرة عليه
2 *. الحصول على عنوان الموقع بتنسيق قابل للقراءة.
التبديل إلى وحدة التحكم (VIPER + Configurator)
extension AddPresenter: AddPresentationLogic {
المفوض لديه وظيفة واحدة فقط بحيث يمكنك عند تحديد النقطة المطلوبة ، إعادته عبر بروتوكول لوحدة التحكم التي تستدعي وحدة التحكم بالبطاقة:
protocol YandexMapSetPointViewControllerProtocol { func didSelectPoint(_ place: Place) }
إلى المفوض ، نرسل جزء التحكم من رمز الاتصال. يبدو أن كل شيء واضح هنا.
هذه هي الطريقة البسيطة التي نذهب بها إلى وحدة التحكم ...

يقع التقاطع الموجود في المركز في وسط وحدة التحكم وفي وسط خرائط UIView تمامًا. الافتراض بأن التكبير داخل الخرائط سيعمل افتراضيًا في وسط النافذة. وهكذا اتضح.
إلى اليسار وأسفل التقاطع - UILabel. من المخطط عرض عنوان قابل للقراءة هناك. الزر الأيمن مع UIActivityIndicator. النقطة المهمة هي أنه حتى وصول إحداثيات المستخدم ، فإنه "يدور" ويكون الزر مظلماً ومعطلاً. من خلال النقر على الزر مع الإحداثيات المستلمة للمستخدم ، نعيد التقاطع له.
هذا هو مؤشر على الموقف ، بدءا من موقف المستخدم.في أسفل الزر "تحديد نقطة". من خلال النقر ، يحدث سحر منطق الأعمال:
@IBAction func selectButtonWasPressed(_ sender: Any) { let place = Place() place.name = " " place.point.latitude = "\(String(describing: selectedPoint!.latitude))" place.point.longitude = "\(String(describing: selectedPoint!.longitude))" place.addressText = selectedPointGeocoderedAddress delegate?.didSelectPoint(place) navigationController?.popViewController(animated: true) }
الصيحة! ناقشنا المرحلة التحضيرية!ننتقل إلى MRSG.
في ما يلي نص منسق على جدول يعكس
شخصيًا تقديراتي (مع عناصر من الغموض) لأشهر (في ذلك الوقت لم أكن أعرفها عن
www.openstreetmap.org ، شكرًا ،
daglob ) وحدات الخريطة المضمنة.

"نظرًا لأن المهمة بسيطة ، فأنا أستخدم Yandex.Maps. فهي جميلة ، ذكيا ... "- اعتقدت.
إذا كنت مهتمًا بكيفية تكوين هذا ، فاكتب مشروعًا
صغيرًا ، ولكن إذا كنت كسولًا جدًا -
tech.yandex.ru/maps/mapkit/؟from=mapsapi ،
فتابع المسار. البدء سهل.
الحقيقة هي أن الوثائق مقدمة في هذا النموذج:

انتبه إلى الوصف الضئيل وقائمة الأشياء الضخمة الموجودة على اليسار. لعنة ساقك.
"ربما يجيب مشروع الاختبار على أسئلتي." حسنا حسنا.
هنا هذا الوحش.
github.com/yandex/mapkit-ios-demoلم أر حلولاً لمهمتي التافهة هناك.
- حسنًا ، - أعتقد - لدي خبرة كافية ، إذا لم أكن مطورًا.

قمت بتجميع مشروع اختبار ونظرت إلى ميزة تخصيص علامة المستخدم لفترة طويلة.
النقاط الرئيسية:
هناك كائن:
@IBOutlet weak var mapView: YMKMapView!
"يبدو أن كل شيء منطقي" ، كما تقول. لكن لا. طرق بديلة:
func onObjectAdded(with view: YMKUserLocationView) {} func onObjectRemoved(with view: YMKUserLocationView) {} func onObjectUpdated(with view: YMKUserLocationView, event: YMKObjectEvent) {}
نحصل على فرصة للوصول إلى point.lat و point.long بطرق صعبة للغاية.
على سبيل المثال ، مثل هذا:
userLocation = YMKPoint(latitude: view.pin.geometry.latitude, longitude: view.pin.geometry.longitude)
يختلف وقت انتظار إحداثيات التحميل باختلاف هذه الطريقة من 2 إلى 50 ثانية.
"أنت مخطئ ، يجب أن يكون هناك مدير موقع مُركز ،" قلت لنفسي. كما اتضح فيما بعد - في الواقع ، فإن هذا "الصديق" موجود في الوثائق ... ولكن أين يوجد مثال له؟!؟
في مشروع العينة ، لا يوجد مثال لتطبيق هذا المدير:

- حسنا ، الوثائق ، فقط أنت وأنا بقي.
- نعم ، لا توجد مشاكل ، "المبتكرة" ، استمتع:

نحن نشترك في UIViewController في البروتوكول (آمل ألا تكون هناك حاجة لمزيد من شرح أي شيء هنا ، حسنًا ، يا شباب):
و ...

1-15 ثانية ، كارل! 15! في بعض الأحيان يعمل الخيار السابق بشكل أسرع! كيف ذلك؟
ياندكس ، يا لها من مزحة؟ الكثير من الوقت لقضيه في تجربة كل شيء ، وللحصول على مثل هذه النتيجة - حسنًا ، إنه أمر محزن عمومًا.
فكرت ، فكرت ... حسنًا ، ليست هي نفسها. امنح الشخص وحدة تحكم بها بطاقات ووضعه في ذهول عند التبديل إليه لأكثر من 4 ثوان - وهذا انتحار للتطبيق. لن ينتظر أحد أكثر من 5 ثوان بثقة تامة في أن هذا مريح (إذا كنت لا تصدقني ، فاستمع إلى تقارير فيتالي فريدمان حول UI / UX).
اعتقدت أكثر ... والعاطفة التالية كانت هذه:
من يريد بصوت - www.youtube.com/watch؟v=pTZaNHZGsQoوصفة النجاح هي:
تأخذ
كيلو ... CLLocationManager و YMKLocationManager و ... جعلها تعمل معا.

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

نتيجة العمل بصريا هي كما يلي:

تلخيص ما ورد أعلاه:
أيها الزملاء ، تتم كتابة المقالة بحيث لا تقضي وقتًا طويلاً كما قضيت عند حل مثل هذه المشكلة واختيار مسار مختلف أو السير بسرعة.
أود أن أرى النقد البناء و / أو الحلول
الصحيحة البديلة.
إذا كانت المقالة مفيدة لك ، فقم بتصحيحي بتصنيف Lois ، ويفضل أن تحقق من
الإصدار الأصلي لهذه القصة بطريقة جديدة.
كل النجاح الإبداعي والمزاج الإيجابي!