UIView.animate: nó là gì, hoạt ảnh thuộc tính UIView trong iOS

Tác giả: IT Sectr Đã đăng: 2026-03-01 Thời gian đọc: 8 phút

UIView.animate là phương thức chính để tạo hoạt ảnh cho các thuộc tính UIView trong iOS, được triển khai trong UIKit thông qua các khối với duration, delay và options. Phương thức này tạo hoạt ảnh cho frame, alpha, transform, backgroundColor và các thuộc tính có thể tạo hoạt ảnh khác. Bài viết này mô tả cú pháp, tham số, ví dụ thực tế và cấu trúc bên trong của hoạt ảnh UIKit.

Những điểm chính

  • UIView.animate — phương thức dựa trên khối để tạo hoạt ảnh cho thuộc tính UIView: frame, alpha, transform, backgroundColor
  • Tham số — duration (giây), delay (giây), options (đường cong, lặp lại, tự động đảo ngược), completion (bao đóng)
  • Hoạt ảnh Spring — UIView.animate(withDuration:delay:usingSpringWithDamping:) với độ nảy vật lý
  • Hoạt ảnh Keyframe — UIView.animateKeyframes cho các chuỗi nhiều bước với thời gian tương đối
  • Core Animation — bên trong, UIView.animate sử dụng CABasicAnimation ở cấp CALayer

UIView.animate là gì?

UIView.animate là một phương thức tĩnh của lớp UIView, được giới thiệu trong iOS 4 (2010). Nó cung cấp một API khai báo để tạo hoạt ảnh cho các thuộc tính có thể tạo hoạt ảnh của UIView: frame, bounds, center, alpha, transform, backgroundColor. Phương thức này chấp nhận một khối (bao đóng) với các thay đổi thuộc tính — hệ thống tự động tạo CABasicAnimation cho mỗi thuộc tính được thay đổi.

Cú pháp khối đã thay thế beginAnimations/commitAnimations cũ (iOS 2-3) và trở thành tiêu chuẩn hoạt ảnh trong UIKit. Các hoạt ảnh UIView.animate chạy trên luồng chính và không chặn giao diện người dùng. Theo mặc định, thời lượng hoạt ảnh là 0.25 giây với đường cong easeInOut.

Theo Apple WWDC 2023, cách tiếp cận hoạt ảnh được khuyến nghị trong các dự án mới là SwiftUI với các bộ điều chỉnh .animation() và .transition(), nhưng UIView.animate vẫn là công cụ chính để hỗ trợ iOS 16 trở xuống, cũng như cho các chuyển tiếp tùy chỉnh phức tạp.

Tham số và tùy chọn hoạt ảnh

UIView.animate cung cấp ba tham số chính: duration (thời lượng tính bằng giây), delay (độ trễ trước khi bắt đầu) và options (tập hợp các mặt nạ bit UIView.AnimationOptions). Options bao gồm curve (easeInOut, easeIn, easeOut, linear), repeat, autoreverse, allowUserInteraction, beginFromCurrentState và overrideInheritedDuration.

Tham sốLoạiMô tả
durationTimeIntervalThời lượng hoạt ảnh tính bằng giây (loại Double)
delayTimeIntervalĐộ trễ trước khi bắt đầu hoạt ảnh
optionsUIView.AnimationOptionsMặt nạ bit: curve, repeat, autoreverse, layoutSubviews
animations() -> VoidKhối với các thay đổi thuộc tính có thể tạo hoạt ảnh
completion(Bool) -> VoidBao đóng sau khi hoàn thành hoạt ảnh

Tham số options được kết hợp qua một mảng: [.curveEaseOut, .repeat, .autoreverse]. Hoạt ảnh với repeat và autoreverse đưa View trở về trạng thái ban đầu một cách mượt mà và lặp lại vô thời hạn. Để có số lần lặp hữu hạn, hãy sử dụng animateKeyframes.

Hoạt ảnh Spring qua UIView.animate

Hoạt ảnh Spring thêm hiệu ứng lò xo vật lý: vật thể không chỉ di chuyển từ điểm A đến B, mà còn vượt quá mục tiêu với dao động tắt dần. Tham số: usingSpringWithDamping (độ giảm chấn 0-1, trong đó 0 là dao động tối đa) và initialSpringVelocity (vận tốc lò xo ban đầu).

Apple khuyến nghị usingSpringWithDamping trong khoảng 0.4-0.8 cho các hoạt ảnh UI tự nhiên. Giá trị 0.5 tạo ra độ nảy đáng chú ý mà không có cảm giác "cao su". initialSpringVelocity = 1.0 tương ứng với tốc độ 1 pt/giây. Ở 0, hoạt ảnh bắt đầu từ trạng thái nghỉ.

swift
// Ví dụ hoạt ảnh spring và keyframe
import UIKit

class AnimatedView: UIView {

    func springBounce() {
        // Hoạt ảnh spring với giảm chấn
        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
        }
    }
}

Hoạt ảnh Keyframe

UIView.animateKeyframes cho phép bạn chia một hoạt ảnh thành nhiều bước (keyframe), mỗi bước có thời gian và thời lượng tương đối riêng. Phương thức addKeyframe(withRelativeStartTime:relativeDuration:) chấp nhận các giá trị thời gian từ 0 đến 1 so với tổng thời lượng hoạt ảnh.

Hoạt ảnh keyframe hữu ích cho các hiệu ứng nhiều giai đoạn: xung nút (tăng → tạm dừng → trở lại), xuất hiện tuần tự phần tử, biến dạng phức tạp với trạng thái trung gian. Mỗi keyframe có thể có đường cong hoạt ảnh riêng qua options.

swift
// Hoạt ảnh keyframe với chuỗi phức tạp
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
        }
    }
}

// Hoạt ảnh với bao đóng lồng nhau
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
        }
    }
}

Cấu trúc bên trong: Core Animation bên dưới

Bên dưới, UIView.animate ủy quyền hoạt ảnh cho CALayer của mỗi UIView thông qua Core Animation (CAAnimation). Khi bạn thay đổi frame bên trong khối hoạt ảnh, hệ thống tạo CABasicAnimation cho các thuộc tính position và bounds của lớp tương ứng. Nếu alpha được thay đổi — CABasicAnimation cho thuộc tính opacity của lớp.

Core Animation sử dụng một tiến trình máy chủ kết xuất riêng biệt (backboardd trên iOS) để xử lý hoạt ảnh ở tần số 120 Hz (ProMotion). UIView.animate không chặn luồng chính — các thay đổi thuộc tính được gửi đến máy chủ kết xuất, máy chủ này nội suy các khung hình mà không cần sự tham gia của ứng dụng.

Theo Apple, hoạt ảnh qua UIView.animate có chi phí CPU khoảng 2-3% cho mỗi lớp được thay đổi ở 60 FPS. Đối với hoạt ảnh hàng loạt (20+ đối tượng cùng lúc), nên sử dụng CATransaction và quản lý lớp thủ công.

Để gỡ lỗi và trực quan hóa hoạt ảnh UIKit, hãy sử dụng Xcode Debug View Hierarchy — nó hiển thị các CAAnimation đang hoạt động trên mỗi lớp, thời lượng, đường cong và trạng thái hiện tại. Hiểu cấu trúc bên trong của Core Animation giúp tránh các vấn đề hiệu suất với hoạt ảnh phức tạp và chọn phương pháp tối ưu giữa UIView.animate và sử dụng trực tiếp CABasicAnimation.

Để gỡ lỗi và trực quan hóa hoạt ảnh UIKit, hãy sử dụng Xcode Debug View Hierarchy — nó hiển thị các CAAnimation đang hoạt động trên mỗi lớp, thời lượng, đường cong và trạng thái hiện tại. Hiểu cấu trúc bên trong của Core Animation giúp tránh các vấn đề hiệu suất với hoạt ảnh phức tạp và chọn phương pháp tối ưu giữa UIView.animate và sử dụng trực tiếp CABasicAnimation.

Câu hỏi thường gặp

Có thể tạo hoạt ảnh cho những thuộc tính UIView nào?

Các thuộc tính có thể tạo hoạt ảnh của UIView: frame, bounds, center, alpha, transform (CGAffineTransform), backgroundColor. Các thay đổi đối với layoutIfNeeded() khi sửa đổi ràng buộc Auto Layout cũng được tạo hoạt ảnh. Các thuộc tính khác không thể tạo hoạt ảnh qua UIView.animate — hãy sử dụng CALayer hoặc CADisplayLink cho chúng.

UIView.animate khác UIView.animateKeyframes như thế nào?

UIView.animate thực hiện một hoạt ảnh từ trạng thái hiện tại đến trạng thái mục tiêu. UIView.animateKeyframes chia tổng thời lượng thành nhiều bước (keyframe) với thời gian bắt đầu và thời lượng tương đối khác nhau. Keyframe phù hợp cho các chuỗi nhiều giai đoạn.

Tại sao UIView.animate không chặn giao diện người dùng?

Các hoạt ảnh UIView.animate được xử lý trong máy chủ kết xuất (backboardd) — một tiến trình iOS riêng biệt. Luồng chính chỉ gửi các giá trị thuộc tính ban đầu và cuối cùng. Nội suy khung hình được thực hiện trên GPU qua Core Animation với tốc độ lên đến 120 FPS.

Làm thế nào để dừng UIView.animate trước khi hoàn thành?

Gọi layer.removeAllAnimations() trên UIView — điều này sẽ xóa tất cả CAAnimation được tạo bên dưới. Để kiểm soát chính xác hơn, hãy sử dụng CATransaction và định danh hoạt ảnh qua CAAnimation.keyPath.

Tổng kết

  • UIView.animate — phương thức dựa trên khối để tạo hoạt ảnh thuộc tính UIView với duration, delay, options và completion
  • Hoạt ảnh Spring — usingSpringWithDamping + initialSpringVelocity cho độ nảy vật lý
  • Hoạt ảnh Keyframe — UIView.animateKeyframes với addKeyframe cho chuỗi nhiều bước
  • Các thuộc tính có thể tạo hoạt ảnh — frame, bounds, center, alpha, transform, backgroundColor
  • Core Animation — bên trong, UIView.animate tạo CABasicAnimation cho CALayer
  • Máy chủ kết xuất — hoạt ảnh được xử lý ở 120 Hz mà không chặn luồng chính
  • SwiftUI — công cụ được khuyến nghị cho dự án mới, UIView.animate cho hỗ trợ iOS 16-

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm