Advertisement
  1. Code
  2. iOS SDK

الرسم اليدوي الحر السلس في دائرة الرقابة الداخلية

Scroll to top
Read Time: 18 min

Arabic (العربية/عربي) translation by Aeni Amalia (you can also view the original English article)

سيعلمك هذا البرنامج التعليمي كيفية تنفيذ خوارزمية رسم متقدمة لرسم سلس وسهل على أجهزة iOS. واصل القراءة!

نظرة عامة حول النظرية

يعد اللمس الطريقة الأساسية التي يتفاعل بها المستخدم مع أجهزة iOS. واحدة من أكثر الوظائف الطبيعية والواضحة التي من المتوقع أن توفرها هذه الأجهزة هي السماح للمستخدم بالاستفادة من الشاشة بإصبعه. هناك العديد من تطبيقات الرسم والتذكير اليدوي الموجودة حاليًا في App Store ، وتطلب العديد من الشركات أيضًا من العملاء التوقيع على iDevice عند إجراء عمليات الشراء. كيف تعمل هذه التطبيقات فعلا؟ دعونا التوقف والتفكير لمدة دقيقة حول ما يجري تحت غطاء محرك السيارة ".

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

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


الشروع في العمل

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

ابدأ مشروع iPad Xcode الجديد استنادًا إلى نموذج "عرض التطبيق الفردي" واسمه "FreehandDrawingTut". تأكد من تمكين Automatic Reference Counting (ARC) ، ولكن لإلغاء تحديد اختبارات القصص المصورة والوحدات. يمكنك جعل هذا المشروع فون أو التطبيق العالمي، اعتماداً على ما هي الأجهزة لديك المتاحة للاختبار.

New ProjectNew ProjectNew Project

بعد ذلك ، قم بالانتقال وحدد مشروع "FreeHandDrawingTut" في Xcode Navigator وتأكد من أنه يتم دعم الاتجاه العمودي فقط:

Only Support PortraitOnly Support PortraitOnly Support Portrait

إذا كنت تريد النشر إلى iOS 5.x أو إصدار سابق ، فيمكنك تغيير دعم الاتجاه بهذه الطريقة:

وأنا أفعل ذلك الحفاظ على الأشياء البسيطة حتى يمكننا التركيز على المشكلة الرئيسية في متناول اليد.

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

  • لكل تكرار، نحن سوف يكون إنشاء فئة فرعية إيفو جديدة. سأقوم بعد انتهاء كافة التعليمات البرمجية التي في حاجة لذلك يمكنك ببساطة نسخ ولصق الملف.m من فئة فرعية إيفو جديدة تقوم بإنشائها. لن يكون هناك واجهة عامة للوظيفة الفرعية فئة العرض ، مما يعني أنك لن تحتاج إلى لمس ملف .h.
  • لاختبار كل إصدار جديد ، سنحتاج إلى تعيين الفئة الفرعية UIView التي أنشأناها لتكون الملف الشخصي الذي يشغل الشاشة حاليًا. سأوضح لك كيفية القيام بذلك باستخدام Interface Builder في المرة الأولى ، من خلال الخطوات بالتفصيل ، ثم أذكرك بهذه الخطوة في كل مرة نقوم فيها برسم نسخة جديدة.

أول محاولة في الرسم

في Xcode ، اختر File> New> File ... ، اختر Objective-C class كقالب ، و على الشاشة التالية اسم الملف LinearInterpView و اجعله فئة فرعية من UIView. احفظها. اسم "لينيرينتيرب" هي اختصار ل "الاستيفاء الخطي" هنا. من أجل البرنامج التعليمي، وسأكون أنا اسم كل فئة فرعية إيفو نخلق للتأكيد على بعض المفاهيم أو النهج وعرض إطار التعليمات البرمجية فئة.

وكما ذكر سابقا، يمكنك ترك ملف الرأس كما. حذف كافة التعليمات البرمجية الموجودة في الملف LinearInterpView.m، واستبداله بما يلي:

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

للتعامل مع هذه الرسائل ، ننفذ أساليب -أجهزة -Began: WithEvent: والشركة ، والتي يتم الإعلان عنها في فئة UIResponder التي يرثها UIView. يمكننا كتابة التعليمات البرمجية للتعامل مع أحداث اللمس بالطريقة التي نحبها. في التطبيق لدينا نريد الاستعلام عن الموقع على الشاشة من اللمسات ، والقيام ببعض المعالجة ، ومن ثم رسم الخطوط على الشاشة.

تشير النقاط إلى الأرقام المعلق عليها من الكود أعلاه:

  1. ونحن تجاوز-إينيتويثكودير: لأنه ولد العرض من زيب، كما أننا سنقوم بإعداد قريبا.
  2. نحن المعوقين متعددة اللمسات: نحن ذاهبون للتعامل مع تسلسل لمسة واحدة فقط، مما يعني أن المستخدم يمكن رسم فقط باستخدام إصبع واحد في وقت واحد؛ سيتم تجاهل أي إصبع أخرى موضوعة على الشاشة أثناء ذلك الوقت. هذا هو تبسيط ، ولكن ليس بالضرورة شخص واحد غير معقول لا يكتب عادة على الورق مع اثنين من الأقلام في وقت واحد! على أي حال ، سوف يمنعنا ذلك من الاستطراد ، لأن لدينا ما يكفي من العمل للقيام به بالفعل.
  3. UIBezierPath هو فئة UIKit التي تتيح لنا رسم أشكال على الشاشة تتألف من خطوط مستقيمة أو أنواع معينة من المنحنيات.
  4. نظرًا لأننا نقوم بالرسم المخصص ، نحتاج إلى إلغاء طريقة عرض -drawRect: العرض. نقوم بذلك عن طريق توسعة المسار في كل مرة تتم فيها إضافة جزء سطر جديد.
  5. لاحظ أيضا أن بينما عرض الخط خاصية للمسار، لون الخط نفسه خاصية من إطار الرسم. إذا كنت غير مألوف مع سياقات الرسومات، يمكنك أن تقرأ عنها في مستندات أبل. الآن ، فكر في سياق رسومات ك "قماش" ترسمه عند تجاوز طريقة -drawRect: ، ونتيجة لما تراه هو العرض على الشاشة. سنصادف نوعًا آخر من سياق الرسم بعد قليل.

قبل أن يمكن أن نبني التطبيق، نحن بحاجة إلى تعيين عرض فئة فرعية تم إنشاؤها فقط لعرض على الشاشة.

  1. في جزء المستكشف، انقر على ViewController.xib (في حال قمت بإنشائه على تطبيق عالمي، ببساطة القيام بهذه الخطوة لملفات كل من ViewController~iPhone.xib و ViewController~iPad.xib).
  2. عندما الرأي يظهر على لوحة الرسم القماشية منشئ واجهة، انقر فوقه لتحديده. في جزء الأدوات المساعدة، انقر على "المفتش الهويات" (الزر الثالث من اليسار في الجزء العلوي من الجزء). القسم الأعلى يقول "الفئة المخصصة" ، هذا هو المكان الذي ستقوم بتعيين فئة العرض الذي قمت بالنقر فوقه.
  3. الحق الآن فينبغي أن أقول "إيفو"، ولكن نحن بحاجة لتغييره إلى (أنت تفكر فيه) لينيرينتيربفيو. اكتب اسم الفئة (يجب أن يسبب ببساطة كتابة "L" الإكمال التلقائي تتناغم يدعو إلى الاطمئنان).
  4. مرة أخرى، إذا كنت تريد الذهاب ليكون هذا الاختبار كما تطبيق عالمي، كرر هذه الخطوة الدقيقة لكل من ملفات زيب أن القالب لك.
Changing the view controller's view's class to our custom UIView subclassChanging the view controller's view's class to our custom UIView subclassChanging the view controller's view's class to our custom UIView subclass

الآن بناء التطبيق. يجب أن تحصل على عرض أبيض لامعة يمكنك السحب عليه بإصبعك. وبالنظر إلى الأسطر القليلة من الشفرات التي كتبناها ، فإن النتائج ليست باهتة للغاية! بالطبع ، فهي ليست مذهلة كذلك. مظهر connect-the-dots ملحوظًا إلى حد ما (ونعم ، تمتص خطي أيضًا).

Our first attempt at freehand drawingOur first attempt at freehand drawingOur first attempt at freehand drawing

تأكد من تشغيل التطبيق ليس فقط على جهاز محاكاة ولكن على جهاز حقيقي كذلك.

إذا كنت تلعب بالتطبيق لفترة قصيرة على جهازك ، فستكون ملزما بملاحظة شيء ما: في نهاية المطاف يبدأ استجابة واجهة المستخدم بالتأخير ، وبدلاً من نقاط اللمس التي تم الحصول عليها في الثانية 60 ، لسبب ما عدد النقاط واجهة المستخدم قادرة على عينة قطرات أكثر وأكثر. بما أن النقاط أصبحت متباعدة ، فإن الاستقامة المستقيمة تجعل الرسم "أكثر انحداراً" من ذي قبل. هذا بالتأكيد غير مرغوب فيه. ماذا يحصل؟


المحافظة على الأداء والاستجابة

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

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

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

إنشاء فئة فرعية جديدة UIView كما فعلت من قبل ، تسمية CachedLIView (LI هو أن يذكرنا ما زلنا نفعل الاستيفاء الخطي). احذف كافة محتويات CachedLIView.m واستبدله بما يلي:

بعد الحفظ، تذكر لتغيير فئة كائن العرض في الخاص بك XIB(s) إلى كاتشيدليفيو!

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

مرة أخرى ، بالإشارة إلى الأرقام في التعليقات:

  1. نحافظ كذلك على ذاكرة صورة نقطية (offscreen) بنفس حجم لوح الرسم الخاص بنا (أي على شاشة العرض) ، حيث يمكننا تخزين ما قمنا برسمه حتى الآن.
  2. نحن رسم المحتويات الشاشة إلى هذا المخزن المؤقت كل مرة يرفع المستخدم إصبعه (أشار إلى جانب--توتشيسينديد: ويثيفينت).
  3. الأسلوب دراوبيتماب بإنشاء إطار الصورة نقطية--أساليب UIKit بحاجة إلى "سياق الحالي" (قماش) أن يوجه إلى. عندما نحن داخل-دراوريكت: هذا السياق متوفراً تلقائياً بالنسبة لنا، ويعكس ما نوجه في رأينا على الشاشة. وفي المقابل، سياق الصورة النقطية يحتاج إلى خلق وتدمير صراحة، ومحتويات تعادل الموجودة في الذاكرة.
  4. عن طريق التخزين المؤقت للرسم السابق بهذه الطريقة ، يمكننا التخلص من المحتويات السابقة للمسار ، وبهذه الطريقة ، حافظ على المسار من الحصول على وقت طويل.
  5. الآن كل مرة drawRect: هو طالب، نحن أولاً رسم محتويات المخزن المؤقت الذاكرة في رأينا لها بالضبط نفس الحجم (حسب التصميم)، وحتى للمستخدم نحافظ الرسم المتواصل، وهم فقط بطريقة مختلفة من قبل.

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


تحسين الجودة البصرية السكتة الدماغية

الآن دعنا نوجه اهتمامنا إلى جعل الرسم "تبدو أفضل". حتى الآن، ونحن لقد تم الانضمام إلى نقاط اللمس المتاخمة مع مقاطع خط مستقيم. ولكن عادة عندما نرسم بحرية ، فإن سكتنا الطبيعية لها مظهر متدفق ومنحدر (بدلاً من كونه ممتلئًا ومتصلبًا). من المنطقي أن نحاول استنباط نقاطنا بمنحنيات بدلاً من المقاطع الخطية. لحسن الحظ ، فإن صف UIBezierPath يسمح لنا برسم الاسم نفسه: منحنيات Bezier.

ما هي منحنيات بيزيير؟ بدون التعرّف على التعريف الرياضي ، يتم تعريف منحنى بيزير من خلال أربع نقاط: نقطتان نهائيتان يمر من خلالهما منحنى و "نقطتي تحكم" تساعدان على تحديد المظاهر التي يجب أن يلمسها المنحنى في نهاياتها النهائية (هذا تقنيًا بيزيريًا مكعبًا ، لكن للبساطة سوف أشير إليها ببساطة "منحنى بيزير").

A cubic Bezier curve A cubic Bezier curve A cubic Bezier curve

منحنيات بيزير تسمح لنا برسم جميع أنواع أشكال مثيرة للاهتمام.

Interesting shapes that cubic Beziers are capable of makingInteresting shapes that cubic Beziers are capable of makingInteresting shapes that cubic Beziers are capable of making

ما سنحاول القيام به الآن هو تجميع تسلسلات لأربع نقاط اتصال متجاورة وإجراء تسلسل للنقاط داخل مقطع منحنى بيزيير. سيتقاسم كل زوج من شرائح Bezier المجاورة نقطة نهاية مشتركة من أجل الحفاظ على استمرارية السكتة الدماغية.

أنت تعرف هذه التدريبات حتى الآن. إنشاء فئة فرعية UIView جديدة وتسميتها BezierInterpView. لصق التعليمة البرمجية التالية في ملف .m:

كما تشير إلى التعليقات مضمنة، التغيير الرئيسي هو إدخال زوجين من متغيرات جديدة لتعقب النقاط الواردة في الشرائح بيزيه لدينا، وتعديل من-touchesMoved:withEvent (بطلان): طريقة لرسم جزء Bezier لكل أربع نقاط ( في الواقع، كل ثلاث نقاط، من حيث اللمسات أن تقارير التطبيق بالنسبة لنا، لأننا نشترك في نقطة نهاية واحدة لكل زوج من المتاخمة لشرائح بيزيه).

كنت قد أشير هنا إلى أننا لقد أهملت حالة المستخدم رفع إصبعه وتنتهي بالتسلسل اللمس قبل أن لدينا ما يكفي من النقاط لإكمال لدينا الجزء الأخير بيزيه. إذا كان الأمر كذلك ، فستكون على حق! على الرغم من أن هذا لا يحدث فرقًا كبيرًا ، إلا أنه يحدث في بعض الحالات المهمة. على سبيل المثال ، جرّب رسم دائرة صغيرة. قد لا يتم إغلاقه تمامًا ، وفي التطبيق الحقيقي الذي تريد التعامل معه بشكل مناسب في أسلوب -TouchesEnded: WithEvent. بينما نحن في ذلك ، فإننا لم نمنح أي اعتبار خاص لحالة إلغاء الاتصال باللمس. the touchesCancelled: يعالج أسلوب مثيل WithEvent هذا. إلقاء نظرة على الوثائق الرسمية ومعرفة ما إذا كانت هناك أي حالات خاصة قد تحتاج إلى التعامل معها هنا.

لذا، كيف النتائج تبدو؟ ومرة أخرى، أن أذكر لك بتعيين الفئة الصحيحة في زيب قبل البناء.

Minor improvement, if anyMinor improvement, if anyMinor improvement, if any

هوه. لا يبدو أن هناك الكثير من التحسن ، أليس كذلك؟ أعتقد أنه قد يكون أفضل قليلاً من الاستيفاء بخط مستقيم ، أو ربما هذا مجرد تمني. في أي حال ، لا شيء يستحق المفاخرة.


مواصلة تحسين جودة السكتة الدماغية

إليك ما أعتقد أنه يحدث: في الوقت الذي نواجه فيه مشكلة استقراء كل تسلسل من أربع نقاط بجزء منحنى سلس ، فإننا لا نبذل أي جهد لجعل جزء منحنى للانتقال بسلاسة إلى المرحلة التالية ، لذلك نحن لا يزال لديك مشكلة مع النتيجة النهائية.

لذا، ماذا يمكن أن نفعل حيال ذلك؟ إذا نحن ذاهبون إلى التمسك بالنهج الذي بدأنا في الإصدار الأخير (أي باستخدام منحنيات بيزير)، نحن بحاجة إلى العناية باستمرارية والنعومة في "نقطة تقاطع" من جزأين Bezier المتاخمة. نقاط مراقبة الظلال اثنين في نقطة النهاية مع المناظرة (نقطة التحكم الثانية من الجزء الأول ونقطة التحكم الأولى للجزء الثاني) يبدو أن المفتاح؛ إذا كان كلا من هذه الظلال في نفس الاتجاه، ثم المنحنى سيكون أكثر سلاسة على مفترق الطرق.

Tangents are the junction of two Bezier segments are Tangents are the junction of two Bezier segments are Tangents are the junction of two Bezier segments are

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

Shifting the junction point to make the intersegment transition smoothShifting the junction point to make the intersegment transition smoothShifting the junction point to make the intersegment transition smooth

إنشاء فئة فرعية UIView (مرة أخرى) وتسمية SmoothedBIView. استبدال الرمز بأكمله في الملف .m مع ما يلي:

يتم تنفيذ جوهر الخوارزمية التي ناقشناها أعلاه في -touchesMoved: WithEvent: method. يجب أن تساعدك التعليقات المضمنة في ربط المناقشة بالرمز.

كيف هي النتائج، يتحدث بصريا؟ تذكر القيام بالشيء مع زيب.

Not bad at all!Not bad at all!Not bad at all!

لحسن الحظ ، هناك تحسن كبير هذه المرة. وبالنظر إلى بساطة تعديلنا ، فإنه يبدو جيداً إلى حد ما (إذا قلت ذلك بنفسي!). وقد تم التحقق من صحة تحليلنا للمشكلة مع التكرار السابقة ، والحل المقترح لدينا ، كذلك.


أين نذهب من هنا

آمل أن تكون قد وجدت هذا البرنامج التعليمي مفيدًا. نأمل أن تطور أفكارك الخاصة حول كيفية تحسين الرمز. واحدة من أهم التحسينات (ولكن السهل) التي يمكنك دمجها هي التعامل مع نهاية تسلسلات اللمس بشكل أكثر براعة ، كما تمت مناقشته سابقًا.

هو التعامل مع قضية أخرى أنا أهملت تسلسل لمس يتكون من المستخدم لمس وجهة النظر مع اصبعهم وثم رفعه دون وجود نقله-فعالية برنامج المشورة التقنية على الشاشة. ربما تتوقع المستخدم لرسم نقطة أو تمايل الصغيرة على طريقة العرض بهذه الطريقة، ولكن مع تنفيذنا الحالية لا يحدث شيء لأن لدينا رمز الرسم لا ركلة ما لم يستلم من وجهة نظرنا-توتشيسموفيد: ويثيفينت: رسالة. قد ترغب في إلقاء نظرة على وثائق فئة UIBezierPath لمعرفة أنواع المسارات الأخرى التي يمكنك إنشاؤها.

إذا كان التطبيق الخاص بك يعمل أكثر من تصميم ما قمنا به هنا (وفي مجال شحن بقيمة رسم تطبيق، سوف!)، أن تشغيل التعليمات البرمجية غير واجهة المستخدم (وبخاصة التخزين المؤقت خارج الشاشة) في مؤشر ترابط خلفية قد يحدث فارقا كبيرا على جهاز (أي باد 2 متعددة النواة فصاعدا). حتى على جهاز معالج واحد ، مثل جهاز iPhone 4 ، يجب أن يتحسن الأداء ، لأنني أتوقع أن يعمل المعالج على تفتيت أعمال التخزين المؤقت التي تحدث ، بعد كل شيء ، مرة واحدة فقط كل دورات قليلة من الحلقة الرئيسية.

أهيب بكم أن فليكس عضلات الترميز واللعب مع UIKit API من أجل تطوير وتحسين بناء على بعض الأفكار التي تنفذ في هذا البرنامج التعليمي. وقد متعة، وشكرا للقراءة!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.