تحريك العرض مع لوحة المفاتيح في Swift: التحسين والأداء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

تحريك العرض مع لوحة المفاتيح باستخدام Swift: التحسين والأداء

\n\n

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

\n\n

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

\n\n

لماذا تعمل الحلول القياسية بشكل سيء غالبًا؟

\n\n

على Stack Overflow، سؤال "تحريك العرض مع لوحة المفاتيح باستخدام Swift" حصل على آلاف المشاهدات. وهذا ليس من قبيل الصدفة. العديد من المبتدئين ينسخون أول حل يصادفونه من عام 2015، والذي يستخدم UIKeyboardWillShowNotification ويغير إطار UIView بشكل صارم. النتيجة: رسوم متحركة متقطعة، تسرب للذاكرة، وأخطاء على موديلات iPhone المختلفة.

\n\n

المشاكل الرئيسية للأساليب القديمة:

\n
    \n
  • تغيير frame مباشرة دون مراعاة safe area;
  • \n
  • تجاهل مدة ومنحنيات الرسوم المتحركة للوحة المفاتيح;
  • \n
  • عدم معالجة تدوير الشاشة وتعدد المهام;
  • \n
  • النسيان: لا يتم إزالة الإشعارات، ولا يتم تنظيف الكائنات.
  • \n
\n\n

Swift الحديث (5.0+) و UIKit يسمحان بفعل كل شيء بأناقة وسرعة. دعنا نستعرض النمط الأمثل.

\n\n

التحضير: ما سنحتاجه

\n\n

لتنفيذ تحريك العرض مع لوحة المفاتيح باستخدام Swift سنستخدم:

\n
    \n
  • NotificationCenter لتتبع أحداث لوحة المفاتيح;
  • \n
  • UIView.animate مع معلمات من الإشعار;
  • \n
  • UIScrollView كحاوية أساسية (لكن يمكن الاستغناء عنها);
  • \n
  • إدارة صحيحة للذاكرة (weak self, removeObserver).
  • \n
\n\n

سنكتب كل الكود في UIViewController. إذا كنت تستخدم SwiftUI — المبادئ نفسها، لكن API مختلف (حول ذلك في نهاية المقالة).

\n\n

الخطوة 1: تسجيل إشعارات لوحة المفاتيح

\n\n

أول ما يجب فعله هو الاشتراك في إشعارين رئيسيين: UIResponder.keyboardWillShowNotification و UIResponder.keyboardWillHideNotification. هما اللذان يعطياننا الحجم والمدة ومنحنى الرسوم المتحركة.

\n\n
override func viewDidLoad() {\n    super.viewDidLoad()\n    \n    NotificationCenter.default.addObserver(\n        self,\n        selector: #selector(keyboardWillShow),\n        name: UIResponder.keyboardWillShowNotification,\n        object: nil\n    )\n    \n    NotificationCenter.default.addObserver(\n        self,\n        selector: #selector(keyboardWillHide),\n        name: UIResponder.keyboardWillHideNotification,\n        object: nil\n    )\n}\n
\n\n

لاحظ: object: nil يعني أننا نستمع لإشعارات من أي لوحة مفاتيح. هذا صحيح لمعظم الحالات.

\n\n

الخطوة 2: معالج keyboardWillShow

\n\n

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

\n\n
@objc private func keyboardWillShow(_ notification: Notification) {\n    guard let userInfo = notification.userInfo,\n          let keyboardFrame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect,\n          let duration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double,\n          let curve = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt else {\n        return\n    }\n    \n    let keyboardHeight = keyboardFrame.height\n    let animation                

المدونات

توصيات الكتب