كيفية جعل السحب تتحرك إلى الأبد: رسوم متحركة متكررة بسيطة في iOS
في تطوير iOS، يمكن للرسوم المتحركة أن تضفي الحيوية على التطبيق، وتضيف عنصرًا ديناميكيًا وجذابًا يحبه المستخدمون. 🌥️ أحد الرسوم المتحركة الشائعة التي قد ترغب في إنشائها هو التأثير السلس والمتكرر، مثل تحريك السحب عبر الشاشة. غالبًا ما يتم استخدام هذه الرسوم المتحركة البسيطة والجذابة بصريًا في الألعاب وتطبيقات الطقس وحتى في المشاريع الشخصية لخلق جو هادئ. إذا كنت جديدًا في مجال الرسوم المتحركة على نظام التشغيل iOS، فربما تتساءل عن كيفية جعلها سلسة وتجنب الأخطاء.
تخيل أنك تفتح أحد التطبيقات وترى على الفور السحب تنجرف بلطف عبر الشاشة، مما يخلق خلفية هادئة مثالية. يمكن تحقيق هذا النوع من التأثير باستخدام الرسوم المتحركة `UIImageView` و`UIView` في Swift. الفكرة الأساسية هي تحريك الصورة نفسها (السحابة في هذه الحالة) عدة مرات بحيث تبدو وكأنها تتحرك بشكل مستمر. ومع ذلك، فالأمر ليس سهلاً دائمًا كما يبدو. هناك بعض المخاطر التي يواجهها المطورون غالبًا عند محاولتهم جعل الرسوم المتحركة سلسة، خاصة عند التعامل مع الصور المتكررة.
إذا حاولت إعداد هذا التأثير وواجهت مشكلات مثل تحرك السحب في الاتجاه الخاطئ أو اختفاءها، فأنت لست وحدك. هذه مشكلات شائعة تنبع من المعالجة غير الصحيحة للإطار أو تكوين الرسوم المتحركة. لكن لا تقلق، سيرشدك هذا الدليل عبر الخطوات اللازمة لإصلاح هذه المشكلات، مما يضمن عمل الرسوم المتحركة الخاصة بك بسلاسة. تمامًا مثل محاولتي الأولى لتحريك السحب، قد تحتاج إلى تعديل بعض الأشياء قبل أن تحصل على النتيجة المثالية. 😅
الآن، دعونا نتعمق في الحل لتحريك تلك السحب في حلقة مثالية. باستخدام طريقتي عرض للصور والقليل من سحر الرسوم المتحركة، ستتمكن من إنشاء حركة سلسة لا نهاية لها من شأنها أن تجعل تطبيقك يبدو سلسًا ومصقولًا. هل أنت مستعد لإصلاح الرسوم المتحركة وجعل تلك السحب تنجرف بشكل صحيح؟ دعنا نذهب!
يأمر | مثال للاستخدام |
---|---|
UIView.animate | يتم استخدام هذا الأمر لتحريك طرق العرض خلال مدة محددة. في هذه الحالة، يقوم بتحريك الصور السحابية، مما يؤدي إلى إنشاء تأثير التكرار. مثال: UIView.animate(withDuration: TotalDuration، التأخير: 0.0، الخيارات: [.repeat، .curveLinear]، الرسوم المتحركة: { ... }) |
frame.origin.x | تمثل خاصية الإطار موضع العرض وحجمه. يقوم Origin.x بتعيين الموضع الأفقي على وجه التحديد. مثال: cloudsImageView1.frame.origin.x -= self.screenSize لتحريك الصورة إلى اليسار. |
CGRect | يتم استخدام بنية CGRect لتحديد مساحة مستطيلة في مساحة ثنائية الأبعاد. يتم استخدامه هنا لتعيين الموضع الأولي وحجم UIImageView. مثال: cloudsImageView1.frame = CGRect(x: 0, y: 100, width: screenSize, height: 100) |
UIView.AnimationOptions | يحدد هذا الخيار كيفية التصرف في الرسوم المتحركة. تعمل خيارات مثل .repeat على إنشاء حلقة الرسوم المتحركة، ويحدد .curveLinear منحنى السرعة. مثال: UIView.animate(withDuration: TotalDuration، التأخير: 0.0، الخيارات: [.repeat، .curveLinear]، ...) |
weak self | في عمليات الإغلاق، يتم استخدام الذات الضعيفة لمنع دورات الاحتفاظ، والتي يمكن أن تسبب تسرب الذاكرة. إنه يضمن أن وحدة التحكم في العرض لا تشير إلى نفسها بقوة أثناء الرسوم المتحركة. مثال: الإكمال: { [النفس الضعيفة] _ في الذات؟.optimizeMemory() } |
recycleClouds() | يتم استخدام هذه الوظيفة المخصصة لإعادة تعيين موضع الصور بمجرد خروجها من حدود الشاشة، مما يضمن إعادة استخدام الصور السحابية وتكرارها بسلاسة. مثال: self?.recycleClouds() |
UIImageView | يتم استخدام فئة UIImageView لعرض الصور في التطبيق. إنه أمر بالغ الأهمية لعرض الصورة السحابية في هذه الرسوم المتحركة. مثال: cloudsImageView1 = UIImageView(الصورة: cloudImage) |
UIScreen.main.bounds | يستخدم هذا الأمر للحصول على أبعاد شاشة الجهاز، وهو أمر ضروري لوضع الصور بشكل صحيح. مثال: دع حجم الشاشة = UIScreen.main.bounds.width |
totalDuration | يتحكم هذا المتغير في مدة الرسوم المتحركة. يمكن أن يؤدي ضبطه إلى تغيير مدى سرعة أو بطء تشغيل الرسوم المتحركة. مثال: دع TotalDuration = 20.0 |
كيف يعمل البرنامج النصي للرسوم المتحركة السحابية في iOS
في مثال البرنامج النصي الموضح أعلاه، الهدف هو إنشاء رسوم متحركة سحابية سلسة ومستمرة تتكرر بلا حدود في تطبيق iOS. الفكرة الرئيسية هي تحريك اثنين UIImageView مثيلات بنفس الصورة السحابية، ونقلها أفقيًا عبر الشاشة. ويتم ذلك عن طريق ضبط مواضعها باستخدام الإطار Origin.x الملكية وتطبيق الرسوم المتحركة على هذه المواقف. يتم استخدام عرضي الصورة بحيث عندما يتحرك أحدهما خارج الشاشة، يكون الآخر جاهزًا ليأخذ مكانه، مما يخلق تأثير حلقة سلسة. من خلال تحريك حركة عروض الصور، يمكنك إعطاء وهم بأن السحب تنجرف باستمرار عبر السماء. 🚀
دعونا نحلل المكونات الرئيسية للكود. الخطوة الأولى هي إنشاء عرضين للصور، يحمل كل منهما نفس صورة السحب. يتم وضع عروض الصور هذه جنبًا إلى جنب على الشاشة، حيث يبدأ عرض الصورة الثانية حيث تنتهي الصورة الأولى، مما يؤدي إلى إنشاء أفق مستمر. يعد هذا الإعداد أمرًا بالغ الأهمية لضمان أنه عندما يصل عرض الصورة الأول إلى حافة الشاشة، فإن عرض الصورة الثاني جاهز لتولي المهمة. يتم التحكم في مواضع عروض الصور باستخدام إطار الخاصية، والتي تحدد حجم وموضع طرق العرض داخل طريقة العرض الأصلية. يبدأ كل عرض للصورة من موضع x مختلف: يبدأ أحدهما عند 0، ويبدأ الآخر عند عرض الشاشة.
بمجرد إعداد عروض الصور، فإن الخطوة التالية هي تحريكها. ويتم ذلك مع UIView.animate الوظيفة، وهي المسؤولة عن تحريك وجهات النظر مع مرور الوقت. ال UIView.animate تأخذ الوظيفة عدة معلمات: مدة الرسوم المتحركة، وأي تأخير قبل بدء الرسوم المتحركة، وخيارات الرسوم المتحركة (مثل تكرار الرسوم المتحركة)، وكتلة الرسوم المتحركة التي سيتم تطبيقها. في هذه الحالة، يتم تعيين مدة الرسوم المتحركة على 20 ثانية، ويتم ضبط الرسوم المتحركة على التكرار إلى الأبد باستخدام .يكرر خيار. ال .منحني الأضلاع يضمن الخيار تشغيل الرسوم المتحركة بسرعة ثابتة، مما يؤدي إلى إنشاء حركة خطية سلسة. يتم نقل الصور أفقيًا عن طريق موازنة صورها Origin.x من خلال عرض الشاشة.
ومع ذلك، يمكن أن يؤدي الرمز إلى نتائج غير مرغوب فيها، مثل اختفاء الصور أو تحركها في الاتجاه الخاطئ. وذلك لأن إطار يتم تعديل الخاصية مباشرة دون إعادة ضبط الصور عندما تتحرك خارج الشاشة. الحل هو استخدام طريقة مثل com.recycleClouds، الذي يعيد تعيين موضع عروض الصور عندما تتجاوز حدود الشاشة. وهذا يضمن تكرار الصور بسلاسة، دون أن تختفي. تتحقق هذه الطريقة من الموضع x لعروض الصور، وعندما يتحرك أحدها خارج الشاشة، تتم إعادة ضبطه على الجانب الآخر، مما يسمح للحلقة بالاستمرار. بالإضافة إلى ذلك، باستخدام النفس الضعيفة داخل كتلة الإكمال يضمن عدم وجود تسرب للذاكرة بسبب الدورات المرجعية القوية، مما يحسن أداء التطبيق.
إنشاء رسوم متحركة سحابية متكررة في iOS باستخدام UIImageView
يستخدم هذا الحل Swift مع إطار عمل UIKit لتحريك كائنين UIImageView لإنشاء حلقة رسوم متحركة سحابية سلسة.
import UIKit
class ViewController: UIViewController {
var cloudsImageView1: UIImageView!
var cloudsImageView2: UIImageView!
let screenSize = UIScreen.main.bounds.width
let cloudImage = UIImage(named: "cloud.png")
override func viewDidLoad() {
super.viewDidLoad()
setupClouds()
animateClouds()
}
func setupClouds() {
cloudsImageView1 = UIImageView(image: cloudImage)
cloudsImageView2 = UIImageView(image: cloudImage)
cloudsImageView1.frame = CGRect(x: 0, y: 100, width: screenSize, height: 100)
cloudsImageView2.frame = CGRect(x: screenSize, y: 100, width: screenSize, height: 100)
view.addSubview(cloudsImageView1)
view.addSubview(cloudsImageView2)
}
func animateClouds() {
UIView.animate(withDuration: 20.0, delay: 0.0, options: [.repeat, .curveLinear], animations: {
self.cloudsImageView1.frame.origin.x -= self.screenSize
self.cloudsImageView2.frame.origin.x -= self.screenSize
}, completion: nil)
}
}
إصلاح الرسوم المتحركة السحابية من خلال تحسين إعادة تدوير الصور ومعالجة الاتجاه
تستخدم هذه الطريقة Swift وUIKit للتعامل مع تكرار الصور السحابية بأسلوب أكثر تطورًا، وذلك باستخدام إعادة تدوير عرض الصور لمنع اختفاء الصور وضمان الرسوم المتحركة المستمرة والسلسة.
import UIKit
class ViewController: UIViewController {
var cloudsImageView1: UIImageView!
var cloudsImageView2: UIImageView!
let screenSize = UIScreen.main.bounds.width
let cloudImage = UIImage(named: "cloud.png")
override func viewDidLoad() {
super.viewDidLoad()
setupClouds()
animateClouds()
}
func setupClouds() {
cloudsImageView1 = UIImageView(image: cloudImage)
cloudsImageView2 = UIImageView(image: cloudImage)
cloudsImageView1.frame = CGRect(x: 0, y: 100, width: screenSize, height: 100)
cloudsImageView2.frame = CGRect(x: screenSize, y: 100, width: screenSize, height: 100)
view.addSubview(cloudsImageView1)
view.addSubview(cloudsImageView2)
}
func animateClouds() {
let totalDuration = 20.0
let animationOptions: UIView.AnimationOptions = [.repeat, .curveLinear]
UIView.animate(withDuration: totalDuration, delay: 0.0, options: animationOptions, animations: {
self.cloudsImageView1.frame.origin.x -= self.screenSize
self.cloudsImageView2.frame.origin.x -= self.screenSize
}) { [weak self] _ in
self?.recycleClouds()
}
}
func recycleClouds() {
if cloudsImageView1.frame.origin.x <= -screenSize {
cloudsImageView1.frame.origin.x = screenSize
}
if cloudsImageView2.frame.origin.x <= -screenSize {
cloudsImageView2.frame.origin.x = screenSize
}
}
}
الرسوم المتحركة السحابية المحسنة مع الاستخدام الفعال للذاكرة
يعمل هذا الحل على تحسين المثال السابق باستخدام إستراتيجية رسوم متحركة أكثر كفاءة مع تقنيات تحسين الذاكرة، وهي مفيدة بشكل خاص للتطبيقات المعقدة أو واسعة النطاق.
import UIKit
class ViewController: UIViewController {
var cloudsImageView1: UIImageView!
var cloudsImageView2: UIImageView!
let screenSize = UIScreen.main.bounds.width
let cloudImage = UIImage(named: "cloud.png")
var totalDuration = 20.0
override func viewDidLoad() {
super.viewDidLoad()
setupClouds()
animateClouds()
}
func setupClouds() {
cloudsImageView1 = UIImageView(image: cloudImage)
cloudsImageView2 = UIImageView(image: cloudImage)
cloudsImageView1.frame = CGRect(x: 0, y: 100, width: screenSize, height: 100)
cloudsImageView2.frame = CGRect(x: screenSize, y: 100, width: screenSize, height: 100)
view.addSubview(cloudsImageView1)
view.addSubview(cloudsImageView2)
}
func animateClouds() {
UIView.animate(withDuration: totalDuration, delay: 0.0, options: [.repeat, .curveLinear], animations: {
self.cloudsImageView1.frame.origin.x -= self.screenSize
self.cloudsImageView2.frame.origin.x -= self.screenSize
}, completion: { [weak self] _ in
self?.optimizeMemory()
})
}
func optimizeMemory() {
if cloudsImageView1.frame.origin.x <= -screenSize {
cloudsImageView1.frame.origin.x = screenSize
}
if cloudsImageView2.frame.origin.x <= -screenSize {
cloudsImageView2.frame.origin.x = screenSize
}
}
}
إنشاء رسوم متحركة سحابية سلسة في iOS
يتطلب تحريك صورة متكررة، مثل الانجراف السحابي في تطبيق iOS، دراسة متأنية لكل من التأثيرات المرئية والأداء. عندما تحاول تحقيق حلقة لا نهاية لها من السحب المتحركة عبر الشاشة، هناك بعض العناصر الأساسية التي يجب معالجتها: التوقيت، والاتجاه، وكيفية إدارة العروض. أحد أهم العوامل في جعل الرسوم المتحركة الخاصة بك سلسة هو التعامل مع عروض الصور بكفاءة حتى لا تختفي أو تتعطل. باستخدام اثنين UIImageView تساعد مثيلات الرسوم المتحركة على ضمان ظهور السحب وكأنها تتحرك باستمرار، حتى عندما تتحرك صورة خارج الشاشة وتحل الأخرى مكانها. من الضروري التأكد من إعادة ضبط الصور بمجرد تجاوزها حافة الشاشة. بدون إعادة التعيين هذه، يمكن أن تنقطع الرسوم المتحركة، مما يتسبب في اختفاء السحب أو ترك فجوات في الحلقة.
جانب آخر مهم من الرسوم المتحركة يتضمن frame.origin.x الخاصية، والتي تستخدم للتحكم في موضع الصور السحابية. من خلال ضبط الوضع الأفقي للصور عند نقاط بداية مختلفة، يمكنك إنشاء وهم الحركة اللانهائية. ومع ذلك، تنشأ مشكلة شائعة عندما تتحرك صورة واحدة خارج الشاشة ولا تتم إعادة تعيينها إلى الموضع الصحيح. الطريقة الصحيحة هي اكتشاف الوقت الذي تجاوزت فيه الصورة حافة الشاشة، ثم إعادة وضعها لتبدأ مرة أخرى على الجانب الآخر. باستخدام كتلة الرسوم المتحركة، يمكنك تحديد رسم متحرك متكرر ومستمر يضمن التدفق المستمر. للتأكد من أن الحركة سلسة، استخدم UIView.animate طريقة مع خيارات مثل .يكرر للحلقات و .curveLinear لسرعة متساوية.
وأخيرًا، فإن تحسين التعليمات البرمجية الخاصة بك من أجل الأداء والسلاسة لا يقل أهمية عن تحقيق التأثير المرئي. يجب عليك تقليل استخدام الذاكرة وتجنب الحسابات غير الضرورية أثناء الرسوم المتحركة. استخدام weak self تساعد المراجع في الرسوم المتحركة المستندة إلى الإغلاق على منع تسرب الذاكرة عن طريق تجنب دورات الاحتفاظ. بالإضافة إلى ذلك، إذا كانت الرسوم المتحركة معقدة أو إذا كنت بحاجة إلى تقنيات أكثر تقدمًا، ففكر في استخدامها CADisplayLink لتحديثات الإطار في الوقت الفعلي، مما يوفر تحكمًا أكبر في توقيت الرسوم المتحركة وسلاسةها. يعد اختبار الرسوم المتحركة على أحجام واتجاهات مختلفة للشاشة أمرًا بالغ الأهمية أيضًا، لأنه يساعد على ضمان عمل الرسوم المتحركة كما هو متوقع عبر جميع الأجهزة. 📱
الأسئلة والأجوبة الشائعة
- كيف أتأكد من تكرار الرسوم المتحركة السحابية بشكل صحيح؟
- لإنشاء حلقة الرسوم المتحركة السحابية، يجب عليك استخدام UIView.animate مع .repeat خيار. سيؤدي هذا إلى التأكد من تكرار الرسوم المتحركة إلى أجل غير مسمى. تأكد من تغيير موضع عرض الصورة الثانية بمجرد انتقال الصورة الأولى خارج الشاشة لمنع أي فجوات.
- لماذا تختفي صوري السحابية أثناء الرسوم المتحركة؟
- تنشأ المشكلة غالبًا عندما لا تتم إعادة ضبط الصور بشكل صحيح بعد نقلها خارج الشاشة. تحتاج إلى إعادة وضع عروض الصور على الجانب الآخر من الشاشة بمجرد تجاوزها الحافة، باستخدام frame.origin.x.
- ما هي أفضل طريقة لتحسين الرسوم المتحركة السحابية؟
- لتحسين الرسوم المتحركة السحابية، استخدم weak self في عمليات الإغلاق لتجنب تسرب الذاكرة. بالإضافة إلى ذلك، تأكد من أن الرسوم المتحركة سلسة باستخدام UIView.animate مع .curveLinear حتى للسرعة و .repeat للرسوم المتحركة المستمرة.
- كيف أضمن بقاء الصور السحابية متزامنة؟
- باستخدام طريقتي عرض للصور وتحريكهما في وقت واحد وبنفس السرعة والمدة، يمكنك الاحتفاظ بهما متزامنين. يمكنك أيضًا استخدام offsetBy طريقة للتأكد من أن الصورتين تتحركان في نفس الاتجاه والسرعة.
- هل يمكنني التحكم في سرعة حركة السحابة؟
- نعم يمكنك التحكم في سرعة حركة السحابة من خلال ضبط duration المعلمة في UIView.animate طريقة. تؤدي المدة الأطول إلى حركة أبطأ، بينما تؤدي المدة الأقصر إلى زيادة السرعة.
- ماذا لو كنت أرغب في تشغيل الرسوم المتحركة السحابية بشكل أسرع أو أبطأ بناءً على إدخال المستخدم؟
- لجعل الرسوم المتحركة ديناميكية بناءً على إدخال المستخدم، يمكنك ربط ملف duration من الرسوم المتحركة إلى متغير يتغير عندما يتفاعل المستخدم مع التطبيق. يتيح لك ذلك ضبط السرعة في الوقت الفعلي.
- كيف أجعل الرسوم المتحركة السحابية تعمل على أحجام مختلفة للشاشات؟
- لجعل الرسوم المتحركة السحابية تعمل عبر أحجام مختلفة للشاشات، استخدم UIScreen.main.bounds لحساب عرض الشاشة ديناميكيًا. وهذا يضمن أن الصور السحابية تضبط مواضعها وفقًا لحجم شاشة الجهاز.
- ما هو الفرق بين UIView.animate و CADisplayLink؟
- UIView.animate أكثر وضوحًا ومناسبًا للرسوم المتحركة البسيطة. CADisplayLinkومع ذلك، فهو أكثر ملاءمة للتحديثات في الوقت الفعلي ويوفر تحكمًا أفضل في تحديثات الإطارات، مما يجعله مثاليًا للرسوم المتحركة أو الألعاب الأكثر تعقيدًا.
- كيف يمكنني منع تداخل الصور أثناء الرسوم المتحركة؟
- لمنع تداخل الصور، تأكد من عرض كل منها UIImageView تم ضبطه بشكل صحيح بحيث تبدأ الصور عند الحواف المقابلة للشاشة. قم بتغيير موضع الصورة عندما تصل إلى حافة الشاشة للحفاظ على التدفق السلس.
إصلاحات الرسوم المتحركة لحركة السحابة السلسة
يعد إنشاء رسوم متحركة سلسة في نظام التشغيل iOS مهارة أساسية للتطبيقات التي تتطلب تأثيرات حركة سلسة. المفتاح لجعل الرسوم المتحركة السحابية تعمل بسلاسة هو فهم كيفية إدارة عروض الصور الخاصة بك بشكل صحيح. عندما تتحرك صورة واحدة خارج الشاشة، فإنك تحتاج إلى إعادة ضبط موضعها دون مقاطعة الحلقة. الحل البسيط يتضمن استخدام UIView.animate الطريقة مع .يكرر و .منحني الأضلاع خيارات للحفاظ على الرسوم المتحركة مستمرة وسلسة. 🏞️
هناك جانب آخر مهم لإنشاء الحلقة وهو التعامل مع مواضع الصور ديناميكيًا. يعد تغيير موضع الصورة السحابية الثانية بعد تحركها خارج الشاشة أمرًا بالغ الأهمية للحفاظ على وهم الحركة التي لا نهاية لها. بالإضافة إلى ذلك، يضمن تحسين الأداء باستخدام ممارسات الترميز الفعالة تشغيل الرسوم المتحركة بسلاسة عبر مختلف الأجهزة وأحجام الشاشات، مما يوفر تجربة سلسة للمستخدمين.
المصادر والمراجع
- يوفر دليلاً متعمقًا حول إنشاء رسوم متحركة متكررة في نظام التشغيل iOS باستخدام UIView.animate. تعلم المزيد في وثائق مطور أبل .
- تفاصيل حول المتقدمة UIImageView يمكن العثور على استراتيجيات التعامل مع الرسوم المتحركة الفعالة لتطبيقات iOS على الموقع راي ويندرليش .
- لاستكشاف أخطاء الرسوم المتحركة وإصلاحها مثل اختفاء الصور، راجع هذا البرنامج التعليمي على متوسطة - برمجة سويفت .