UIView.animate: ما هو، رسوم خصائص UIView المتحركة في iOS

المؤلف: IT Sectr نُشر: 2026-03-01 وقت القراءة: 8 دق

UIView.animate هو الطريقة الأساسية لتحريك خصائص UIView في iOS، مطبقة في UIKit من خلال كتل مع duration وdelay وoptions. تقوم الطريقة بتحريك frame وalpha وtransform وbackgroundColor وخصائص أخرى قابلة للتحريك. تصف هذه المقالة بناء الجملة والمعلمات والأمثلة العملية والبنية الداخلية لرسوم UIKit المتحركة.

النقاط الرئيسية

  • UIView.animate — طريقة قائمة على الكتل لتحريك خصائص UIView: frame وalpha وtransform وbackgroundColor
  • المعلمات — duration (ثوانٍ)، delay (ثوانٍ)، options (منحنى، تكرار، عكس تلقائي)، completion (إغلاق)
  • الحركة النابضية — UIView.animate(withDuration:delay:usingSpringWithDamping:) مع ارتداد فيزيائي
  • الحركة الإطارية — UIView.animateKeyframes لتسلسلات متعددة الخطوات بتوقيت نسبي
  • Core Animation — تحت الغطاء، يستخدم UIView.animate CABasicAnimation على مستوى CALayer

ما هو UIView.animate؟

UIView.animate هو طريقة ثابتة من فئة UIView، ظهرت في iOS 4 (2010). توفر واجهة برمجة تطبيقات تصريحية لتحريك الخصائص القابلة للتحريك لـ UIView: frame وbounds وcenter وalpha وtransform وbackgroundColor. تقبل الطريقة كتلة (إغلاق) مع تغييرات الخصائص — يقوم النظام تلقائياً بإنشاء CABasicAnimation لكل خاصية تم تغييرها.

حلت بناء جملة الكتل محل beginAnimations/commitAnimations القديمة (iOS 2-3) وأصبحت معيار الحركة في UIKit. يتم تنفيذ حركات UIView.animate على الخيط الرئيسي ولا تمنع واجهة المستخدم. افتراضياً، مدة الحركة هي 0.25 ثانية مع منحنى easeInOut.

وفقاً لـ Apple WWDC 2023، النهج الموصى به للحركة في المشاريع الجديدة هو SwiftUI مع معدّلات .animation() و.transition()، لكن UIView.animate يظل الأداة الرئيسية لدعم iOS 16 والإصدارات الأقدم، وكذلك للانتقالات المخصصة المعقدة.

معلمات وخيارات الحركة

UIView.animate يوفر ثلاث معلمات رئيسية: duration (المدة بالثواني)، delay (التأخير قبل البداية)، وoptions (مجموعة من أقنعة البت UIView.AnimationOptions). تتضمن options curve (easeInOut وeaseIn وeaseOut وlinear) وrepeat وautoreverse وallowUserInteraction وbeginFromCurrentState وoverrideInheritedDuration.

المعلمةالنوعالوصف
durationTimeIntervalمدة الحركة بالثواني (نوع Double)
delayTimeIntervalالتأخير قبل بدء الحركة
optionsUIView.AnimationOptionsقناع بت: curve وrepeat وautoreverse وlayoutSubviews
animations() -> Voidكتلة مع تغييرات الخصائص القابلة للتحريك
completion(Bool) -> Voidإغلاق بعد اكتمال الحركة

يتم دمج المعلمة options عبر مصفوفة: [.curveEaseOut, .repeat, .autoreverse]. الحركة مع repeat وautoreverse تعيد العرض إلى حالته الأولية بسلاسة وتتكرر إلى أجل غير مسمى. لعدد محدود من التكرارات، استخدم animateKeyframes.

الحركة النابضية عبر UIView.animate

الحركة النابضية تضيف تأثير نابض فيزيائي: لا يتحرك الكائن فقط من النقطة A إلى B، بل يتجاوز الهدف مع تذبذبات مخمدة. المعلمات: usingSpringWithDamping (التخميد 0-1، حيث 0 أقصى تذبذب) وinitialSpringVelocity (السرعة الأولية للنابض).

توصي Apple باستخدام usingSpringWithDamping في نطاق 0.4-0.8 لحركات واجهة المستخدم الطبيعية. القيمة 0.5 تنشئ ارتداداً ملحوظاً دون الشعور بـ "المطاطية". initialSpringVelocity = 1.0 تقابل سرعة 1 نقطة/ثانية. عند 0، تبدأ الحركة من السكون.

swift
// مثال للحركة النابضية والإطارية
import UIKit

class AnimatedView: UIView {

    func springBounce() {
        // حركة نابضية مع تخميد
        UIView.animate(
            withDuration: 0.8,
            delay: 0,
            usingSpringWithDamping: 0.5,
            initialSpringVelocity: 1.0,
            options: [.allowUserInteraction],
            animations: {
                self.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
                self.alpha = 0.7
            },
            completion: { _ in
                UIView.animate(withDuration: 0.3) {
                    self.transform = .identity
                    self.alpha = 1.0
                }
            }
        )
    }

    func slideIn(from offset: CGFloat) {
        self.transform = CGAffineTransform(translationX: offset, y: 0)
        self.alpha = 0.0

        UIView.animate(
            withDuration: 0.6,
            delay: 0.1,
            options: [.curveEaseOut]
        ) {
            self.transform = .identity
            self.alpha = 1.0
        }
    }
}

الحركة الإطارية

UIView.animateKeyframes تسمح بتقسيم حركة إلى عدة خطوات (keyframes)، لكل منها وقتها ومدتها النسبيان. تقبل طريقة addKeyframe(withRelativeStartTime:relativeDuration:) قيماً زمنية من 0 إلى 1 نسبة إلى المدة الإجمالية للحركة.

الحركات الإطارية مفيدة للتأثيرات متعددة المراحل: نبض الزر (زيادة → توقف → عودة)، ظهور متسلسل للعناصر، تشوهات معقدة بحالات وسيطة. يمكن أن يكون لكل keyframe منحنى حركته الخاص عبر options.

swift
// حركة إطارية بتسلسل معقد
func complexPulse() {
    UIView.animateKeyframes(withDuration: 2.0, delay: 0, options: [.repeat]) {
        UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 0.25) {
            self.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
            self.alpha = 0.5
        }
        UIView.addKeyframe(withRelativeStartTime: 0.25, relativeDuration: 0.25) {
            self.transform = CGAffineTransform(scaleX: 0.8, y: 0.8)
            self.alpha = 0.8
        }
        UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5) {
            self.transform = .identity
            self.alpha = 1.0
        }
    }
}

// حركة بإغلاقات متداخلة
func animateCardTransition() {
    UIView.animate(withDuration: 0.4, delay: 0, options: [.curveEaseOut]) {
        self.transform = CGAffineTransform(scaleX: 0.95, y: 0.95)
    } completion: { _ in
        UIView.animate(withDuration: 0.3, delay: 0, options: [.curveEaseIn]) {
            self.transform = .identity
        }
    }
}

البنية الداخلية: Core Animation تحت الغطاء

تحت الغطاء، UIView.animate يفوض الحركة إلى CALayer لكل UIView عبر Core Animation (CAAnimation). عندما تغير frame داخل كتلة الحركة، ينشئ النظام CABasicAnimation لخصائص position وbounds للطبقة المقابلة. إذا تم تغيير alpha — CABasicAnimation لخاصية opacity للطبقة.

يستخدم Core Animation عملية خادم عرض منفصلة (backboardd في iOS) تعالج الحركات بتردد 120 هرتز (ProMotion). لا يمنع UIView.animate الخيط الرئيسي — يتم إرسال تغييرات الخصائص إلى خادم العرض، الذي يقوم باستيفاء الإطارات دون مشاركة التطبيق.

وفقاً لـ Apple، الحركات عبر UIView.animate لها حمل زائد ~2-3% من المعالج لكل طبقة تم تغييرها عند 60 FPS. للحركات الجماعية (20+ كائناً في وقت واحد)، يُوصى باستخدام CATransaction والإدارة اليدوية للطبقات.

لتصحيح وتصور حركات UIKit، استخدم Xcode Debug View Hierarchy — يُظهر CAAnimations النشطة على كل طبقة، ومدتها، ومنحناها، وحالتها الحالية. فهم البنية الداخلية لـ Core Animation يساعد في تجنب مشاكل الأداء مع الحركات المعقدة واختيار النهج الأمثل بين UIView.animate والاستخدام المباشر لـ CABasicAnimation.

لتصحيح وتصور حركات UIKit، استخدم Xcode Debug View Hierarchy — يُظهر CAAnimations النشطة على كل طبقة، ومدتها، ومنحناها، وحالتها الحالية. فهم البنية الداخلية لـ Core Animation يساعد في تجنب مشاكل الأداء مع الحركات المعقدة واختيار النهج الأمثل بين UIView.animate والاستخدام المباشر لـ CABasicAnimation.

الأسئلة الشائعة

ما خصائص UIView التي يمكن تحريكها؟

الخصائص القابلة للتحريك لـ UIView: frame وbounds وcenter وalpha وtransform (CGAffineTransform) وbackgroundColor. كما يتم تحريك تغييرات layoutIfNeeded() عند تعديل قيود Auto Layout. لا يمكن تحريك الخصائص الأخرى عبر UIView.animate — استخدم CALayer أو CADisplayLink لتلك.

كيف يختلف UIView.animate عن UIView.animateKeyframes؟

UIView.animate ينفذ حركة واحدة من الحالة الحالية إلى الحالة الهدف. UIView.animateKeyframes يقسم المدة الإجمالية إلى عدة خطوات (keyframes) بأوقات بداية ومدد نسبية مختلفة. keyframes مناسبة للتسلسلات متعددة المراحل.

لماذا لا يمنع UIView.animate واجهة المستخدم؟

تتم معالجة حركات UIView.animate في خادم العرض (backboardd) — عملية iOS منفصلة. يرسل الخيط الرئيسي فقط القيم الأولية والنهائية للخصائص. يتم استيفاء الإطارات على GPU عبر Core Animation بتردد يصل إلى 120 FPS.

كيف توقف UIView.animate قبل الاكتمال؟

استدعِ layer.removeAllAnimations() على UIView — هذا يزيل كل CAAnimations المنشأة تحت الغطاء. للتحكم الأكثر دقة، استخدم CATransaction ومعرفات الحركة عبر CAAnimation.keyPath.

الملخص

  • UIView.animate — طريقة قائمة على الكتل لتحريك خصائص UIView مع duration وdelay وoptions وcompletion
  • الحركة النابضية — usingSpringWithDamping + initialSpringVelocity للارتداد الفيزيائي
  • الحركة الإطارية — UIView.animateKeyframes مع addKeyframe لتسلسلات متعددة الخطوات
  • الخصائص القابلة للتحريك — frame وbounds وcenter وalpha وtransform وbackgroundColor
  • Core Animation — تحت الغطاء، UIView.animate ينشئ CABasicAnimation لـ CALayer
  • خادم العرض — تتم معالجة الحركات بتردد 120 هرتز دون حظر الخيط الرئيسي
  • SwiftUI — الأداة الموصى بها للمشاريع الجديدة، UIView.animate لدعم iOS 16-

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا