Core Animation: asoslar, CALayer va iOS-da animatsiya

Muallif: IT Sectr Nashr etilgan: 2026-03-01 O'qish vaqti: 8 daq

Core Animation Apple-ning past darajadagi animatsiya freymvorki bo'lib, CALayer darajasida ishlaydi va kontentni GPU-da renderlashni ta'minlaydi. Core Animation iOS va macOS-dagi barcha animatsiyalarning asosidir: UIKit, AppKit, SceneKit va SpriteKit uning ustiga qurilgan. Maqola CALayer, CABasicAnimation, CATransaction arxitekturasini va amaliy texnikalarni tushuntiradi.

Asosiy nuqtalar

  • CALayer kontentni GPU-da ko'rsatishni boshqarish uchun Core Animation-ning asosiy klassi
  • CABasicAnimation CALayer xususiyatini fromValue dan toValue gacha oddiy animatsiyasi
  • CATransaction animatsiyalarni umumiy duration va completion bilan bitta transaksiyada guruhlash
  • CAAnimation CABasicAnimation, CAKeyframeAnimation, CAAnimationGroup meros oladigan mavhum asosiy klass
  • Render server GPU-da animatsiya kadrlarini interpolyatsiya qiluvchi alohida jarayon (backboardd)

Core Animation nima?

Core Animation Mac OS X 10.5 Leopard (2007) da paydo bo'lgan va iPhone OS (2007) ning birinchi versiyasidan iOS-ga ko'chirilgan Apple-ning grafik freymvorkidir. Core Animation qatlamlar (CALayer) kompozitsiyasi, animatsiyasi va renderini GPU-da boshqaradi. iOS dagi har bir UIView o'rnatilgan CALayer (view.layer) ga ega bo'lib, barcha render shu orqali amalga oshiriladi.

Core Animation implicit animation tamoyili bo'yicha ishlaydi: CALayer xususiyatlaridagi ba'zi o'zgarishlar avtomatik ravishda animatsiya qilinadi (position, bounds, opacity, backgroundColor uchun CABasicAnimation ni animatsiya qiladi). Implicit-animatsiyalar sukut bo'yicha 0.25 soniya davomiylik va easeInOut egri chizig'i bilan CATransaction dan foydalanadi.

Apple WWDC 2024 ma'lumotlariga ko'ra, Core Animation ProMotion qurilmalarida Metal dan GPU renderi uchun foydalanib, 120 FPS gacha ishlaydi. Xotiradagi odatdagi qatlam hajmi piksel boshiga 4 bayt (RGBA) + qatlam boshiga ~100 bayt qo'shimcha yuk. Barqaror 60 FPS uchun ekranda 1000 dan ortiq qatlam bo'lmasligi tavsiya etiladi.

CALayer arxitekturasi

CALayer Core Animation asosidir. Har bir CALayer bitmap kontentni (yoki GPU teksturasiga havolani) o'z ichiga oladi va geometriyani (bounds, position, anchorPoint, transform, cornerRadius, borderWidth, shadow) belgilaydi. Qatlam teginish hodisalarini qayta ishlamaydi buning uchun UIView/UIScrollView javobgardir. Qatlamlar view ierarxiyasini aks ettiruvchi ierarxiya (layer tree) hosil qiladi.

Core Animation uchta qatlam daraxtini qo'llab-quvvatlaydi: model layer tree (haqiqiy xususiyatlar), presentation layer tree (animatsiya paytidagi joriy ko'rinish) va render tree (GPU uchun ma'lumotlar). Presentation layer real vaqtda animatsiyaning oraliq qiymatlarini o'qish uchun ishlatiladi.

CALayer turlari

CALayer ixtisoslashgan pastki klasslarga ega: CAShapeLayer (vektor grafikasi), CAGradientLayer (gradient), CATextLayer (matn), CATiledLayer (plitkalarga bo'lingan katta tasvirlar), CAEAGLLayer/MetalLayer (OpenGL/Metal). CAShapeLayer CGPath qo'llab-quvvatlashi va strokeStart/strokeEnd animatsiyasi tufayli moslashtirilgan animatsiya uchun eng mashhurdir.

CABasicAnimation xususiyatlarning asosiy animatsiyasi

CABasicAnimation CAAnimation ning pastki klassi bo'lib, CALayer ning bitta xususiyatini boshlang'ich qiymatdan (fromValue) yakuniy qiymatgacha (toValue) yoki nisbiy o'zgarishgacha (byValue) animatsiya qiladi. Animatsiya layer.add(animation, forKey:) metodi orqali qatlamga qo'shiladi va har bir kadrda ilova ishtirokisiz render server-da bajariladi.

Kalit (keyPath) xususiyatni ko'rsatuvchi satr: opacity, position, bounds, transform.rotation.z, cornerRadius, shadowOpacity va boshqalar. Core Animation 60+ animatsiya qilinadigan keyPath ni qo'llab-quvvatlaydi. Moslashtirilgan xususiyatlar uchun CATransaction va presentation layer ishlatiladi.

swift
import QuartzCore

// CABasicAnimation opacity va cornerRadius uchun
func animateLayer() {
    let layer = CALayer()
    layer.frame = CGRect(x: 50, y: 50, width: 100, height: 100)
    layer.backgroundColor = UIColor.systemBlue.cgColor
    view.layer.addSublayer(layer)

    // 1. Shaffoflik animatsiyasi
    let fadeAnim = CABasicAnimation(keyPath: "opacity")
    fadeAnim.fromValue = 1.0
    fadeAnim.toValue = 0.2
    fadeAnim.duration = 2.0
    fadeAnim.autoreverses = true
    fadeAnim.repeatCount = .infinity

    // 2. Burchaklarni yumaloqlash animatsiyasi
    let cornerAnim = CABasicAnimation(keyPath: "cornerRadius")
    cornerAnim.fromValue = 0
    cornerAnim.toValue = 50
    cornerAnim.duration = 2.0
    cornerAnim.autoreverses = true
    cornerAnim.repeatCount = .infinity

    layer.add(fadeAnim, forKey: "fade")
    layer.add(cornerAnim, forKey: "corner")
}

// ease-in-out bilan position animatsiyasi
func moveLayer(_ layer: CALayer, to point: CGPoint) {
    let anim = CABasicAnimation(keyPath: "position")
    anim.fromValue = NSValue(cgPoint: layer.position)
    anim.toValue = NSValue(cgPoint: point)
    anim.duration = 0.6
    anim.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
    anim.isRemovedOnCompletion = false
    anim.fillMode = .forwards
    layer.add(anim, forKey: "move")
    layer.position = point // model layer ni yangilaymiz
}

Muhim: CABasicAnimation vaqtinchalik ko'rinishdir (presentation layer). Animatsiya tugagach, qatlam model layer ning boshlang'ich qiymatlariga qaytadi. Yakuniy holatni saqlash uchun isRemovedOnCompletion = false, fillMode = .forwards ni o'rnating va model layer ni yakuniy qiymatlarga yangilang.

CATransaction animatsiyalarni guruhlash

CATransaction Core Animation animatsiyalarini bitta transaksiyada guruhlash mexanizmidir. CATransaction.begin() va CATransaction.commit() transaksiya chegaralarini belgilaydi. Transaksiya ichida umumiy parametrlar o'rnatilishi mumkin: duration, timingFunction, completionBlock, disableActions. CATransaction CALayer ning implicit-animatsiyalari asosidir.

Implicit animation CALayer xususiyati animatsiya blokidan tashqarida o'zgartirilganda ishlaydi: layer.opacity = 0.5. Core Animation avtomatik ravishda joriy CATransaction dan duration bilan CABasicAnimation yaratadi (sukut bo'yicha 0.25 s). Implicit-animatsiyani o'chirish uchun CATransaction.setDisableActions(true) dan foydalaning.

swift
// CATransaction guruhlash va tugatish
func groupedAnimation() {
    CATransaction.begin()
    CATransaction.setAnimationDuration(1.5)
    CATransaction.setAnimationTimingFunction(
        CAMediaTimingFunction(name: .easeOut)
    )
    CATransaction.setCompletionBlock {
        print("All animations completed")
    }

    // Transaksiya ichidagi barcha o'zgarishlar 1.5 davomiylik bilan animatsiya qilinadi
    layer1.opacity = 0.3
    layer2.position = CGPoint(x: 200, y: 300)
    layer3.backgroundColor = UIColor.systemRed.cgColor

    CATransaction.commit()
}

// Implicit-animatsiyani o'chirish
func updateWithoutAnimation() {
    CATransaction.begin()
    CATransaction.setDisableActions(true)
    layer.frame = newFrame // animatsiyasiz
    CATransaction.commit()
}

// CAShapeLayer xususiyatlarining animatsiyasi
func animateProgress(percentage: CGFloat) {
    CATransaction.begin()
    CATransaction.setAnimationDuration(0.8)
    CATransaction.setCompletionBlock {
        print("Progress updated to (percentage)%")
    }
    progressLayer.strokeEnd = percentage / 100.0
    CATransaction.commit()
}

Swift-da kod misollari

Core Animation UIView qatlami orqali UIKit bilan integratsiyalanadi. Quyidagi misol CAShapeLayer animatsiyasini ko'rsatadi yoy uzunligi animatsiyasi va CABasicAnimation orqali qatlam aylanishi bilan dumaloq taraqqiyot chizig'i.

swift
import UIKit
import QuartzCore

class CircularProgressView: UIView {

    private let progressLayer = CAShapeLayer()

    override func layoutSubviews() {
        super.layoutSubviews()

        let path = UIBezierPath(
            arcCenter: CGPoint(x: bounds.midX, y: bounds.midY),
            radius: bounds.width / 2 - 10,
            startAngle: -.pi / 2,
            endAngle: 3 * .pi / 2,
            clockwise: true
        )

        progressLayer.path = path.cgPath
        progressLayer.strokeColor = UIColor.systemBlue.cgColor
        progressLayer.lineWidth = 8
        progressLayer.fillColor = nil
        progressLayer.strokeEnd = 0
        progressLayer.lineCap = .round
        layer.addSublayer(progressLayer)
    }

    func setProgress(_ value: CGFloat, animated: Bool = true) {
        if animated {
            CATransaction.begin()
            CATransaction.setAnimationDuration(0.6)
            CATransaction.setAnimationTimingFunction(
                CAMediaTimingFunction(name: .easeOut)
            )
            progressLayer.strokeEnd = min(max(value, 0), 1)
            CATransaction.commit()
        } else {
            progressLayer.strokeEnd = value
        }
    }
}

CAShapeLayer strokeEnd xususiyatini 0 dan 1 gacha animatsiya qilib, dumaloq taraqqiyot chizig'ining “to'ldirish” effektini yaratadi. 0.6 davomiylik va easeOut bilan CATransaction animatsiyani silliq qiladi. layer.lineCap = .round chiroyli ko'rinish uchun chiziqning yumaloq uchlarini qo'shadi.

Tez-tez so'raladigan savollar

Core Animation va UIView.animate o'rtasidagi farq nima?

Core Animation CALayer darajasida ishlaydi va CABasicAnimation, CATransaction orqali boshqariladi. UIView.animate Core Animation ustidagi yuqori darajadagi o'ram bo'lib, UIView xususiyatlari uchun avtomatik CABasicAnimation yaratadi. Core Animation ko'proq nazorat beradi: keyPath, timingFunction, fillMode, CATransaction orqali guruhlash.

Core Animation-da implicit animation nima?

Implicit animation CALayer ning animatsiya qilinadigan xususiyati animatsiya blokidan tashqarida o'zgartirilganda avtomatik animatsiyadir. Masalan, layer.opacity = 0.5 0.25 s davomiylik bilan CABasicAnimation yaratadi. Implicit-animatsiyalar CATransaction orqali boshqariladi va setDisableActions(true) bilan o'chiriladi.

CALayer ning moslashtirilgan xususiyatini qanday animatsiya qilish mumkin?

Moslashtirilgan xususiyatlar uchun CALayer da action(forKey:) ni amalga oshiring va CAAnimation qaytaring. Yoki CADisplayLink orqali animatsiya bilan qo'lda render qilish uchun CALayer.display() dan foydalaning. CABasicAnimation ni qo'llab-quvvatlaydigan xususiyatlar uchun keyPath ni satr sifatida ko'rsatish kifoya.

Nega CALayer animatsiya uchun UIView dan samaraliroq?

CALayer UIView dan yengilroq: hodisa boshqaruvchilari (touches, imo-ishoralar) yo'q, Auto Layout da ishtirok etmaydi va accessibility ni qo'llab-quvvatlamaydi. Odatdagi CALayer ~100 bayt, UIView esa ~300+ bayt egallaydi. Core Animation qatlamlarni render server da GPU da main thread ni bloklamasdan qayta ishlaydi.

Xulosa

  • Core Animation GPU da render bilan CALayer animatsiyasi uchun Apple-ning past darajadagi freymvorki
  • CALayer 60+ animatsiya qilinadigan xususiyatga ega asosiy klass, CAShapeLayer, CAGradientLayer, CATextLayer ni qo'llab-quvvatlaydi
  • CABasicAnimation fromValue/toValue bilan bitta xususiyat animatsiyasi, layer.add(animation, forKey:) orqali qo'shiladi
  • CATransaction umumiy duration, timingFunction, completionBlock bilan animatsiyalarni guruhlash
  • Implicit animation CALayer xususiyatlari o'zgartirilganda avtomatik animatsiya (davomiylik 0.25 s)
  • Presentation layer animatsiya paytidagi qatlamning joriy holati, oraliq qiymatlarni o'qish uchun ishlatiladi
  • Samaradorlik ProMotion da 120 FPS gacha, 60 FPS da 1000 qatlamgacha, 4 bayt/piksel

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing