هل تحتاج إلى إنشاء مخطط جانت مثل التحكم في iOS، للرسم أو للعرض الفرعي؟

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

سؤال

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

أرى مسارين أساسيين لتنفيذ هذه الفئة الفرعية المخصصة لـ UIView:

  1. تنفيذ ببساطة drawRect: والذهاب إلى المدينة باستخدام CoreGraphics المكالمات.على الأرجح منقسمون حول مجموعة من الأساليب الخاصة التي تقوم بجميع أعمال الرسم.من الممكن تخزين بعض المعلومات مؤقتًا حسب الحاجة، للمساعدة في اكتشاف أي منطقة فرعية.

  2. بدلاً من "رسم" الرسومات، قم بإضافة مجموعة من واجهات المستخدم التي يستخدمها الأطفال addSubview: والتلاعب بهم layer خصائص لحملهم على إظهار القطع الرسومية المختلفة، و bounds\frame لوضعهم في المكان المناسب.ومن ثم دع "الرسم" يعتني بنفسه.

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

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

تحديث

ذهبت مع UICollectionView يقترب.مما جعلني أقوم بالاختيار والتمرير مجانًا (بعد بعض المفاجآت).لقد كنت سعيدًا جدًا بالنتائج حتى الآن.

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

المحلول

إن استخدام CoreGraphics سيجبرك على كتابة العديد من أسطر التعليمات البرمجية أكثر من البناء باستخدام UIViews، على الرغم من أنها أكثر أداءً وأفضل على الذاكرة.ومع ذلك، من المحتمل أنك ستحتاج إلى حل أكثر قوة لإدارة كل هذا المحتوى.أ UICollectionView يبدو أنه الحل المناسب لتعيين بياناتك إلى طريقة عرض ذات تخصيص UICollectionViewCell فئة فرعية.سيكون تطوير هذا أسرع بكثير من تطويره بنفسك، ويأتي بمرونة كبيرة UICollectionViewLayout فئات فرعية.لا يتم دعم ميزة "القرص للتكبير/التصغير" خارج الصندوق، ولكنها موجودة طرق للقيام بذلك.يعد هذا أيضًا أفضل للذاكرة من استخدام مجموعة من واجهات المستخدم بسبب إعادة استخدام الخلايا، ولكن يمكن أن تصبح إعادة التحميل بطيئة مع بضع مئات من العناصر التي لها أحجام مختلفة ليتم حسابها.

نصائح أخرى

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

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

على الأجهزة الأحدث، يكون أداء عرض الرسم مرتفعًا جدًا في الواقع.ولكن إذا كنت تريد أجهزة iPhone 4 و4S هذه، وإذا كنت تريد أجهزة iPad 3 هذه، التي تفتقر إلى الكثير من أداء وحدة معالجة الرسومات، أود أن أقول، اعتمادًا على الأحجام المحتملة لرسوماتك البيانية، قد تضطر إلى اتباع طريق CG.

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

إذا كنت تخطط للسماح للمستخدم بتحريك أجزاء من المخطط، فإنني أقترح بالتأكيد اتباع طرق العرض.

لمعلوماتك، سوف تكون قادرًا على التعامل مع القرص للتكبير/التصغير باستخدام drawRect بشكل جيد.

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

إذا كان مخططك كبيرًا جدًا وتريد استخدام drawRect:ربما ترغب في النظر في استخدام CATileLayer للدعم حتى لا يكون لديك الطبقة بأكملها في الذاكرة.يمكن أن يضيف هذا تحديات إضافية إذا كنت تريد فقط عرض المربعات المطلوبة وليس المنطقة بأكملها.

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