Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- clean architecture
- Clean Code
- 애니메이션
- combine
- UITextView
- Protocol
- swift documentation
- 리팩토링
- RxCocoa
- UICollectionView
- Refactoring
- swiftUI
- 리펙토링
- HIG
- tableView
- 스위프트
- map
- SWIFT
- Xcode
- uitableview
- Observable
- ribs
- ios
- MVVM
- rxswift
- 클린 코드
- uiscrollview
- 리펙터링
- collectionview
- Human interface guide
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] CATransaction 개념(트랜잭션), CALayer, CAGradientLayer 애니메이션 본문
iOS 기본 (swift)
[iOS - swift] CATransaction 개념(트랜잭션), CALayer, CAGradientLayer 애니메이션
jake-kim 2022. 4. 9. 23:28트랜잭션의 의미
- 트랜잭션: 원자성, 일관성, 독립성, 지속성을 갖춘 Operation
- 원자성(atomic): 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력
- ex) A사람이 B사람에게 돈을 보내는 작업을 한 경우, A사람은 돈이 빠져나갔지만 B사람한테 돈이 전달되지 않은 경우, 원자성 위배
- 일관성(Consistency): n번 Operation을 했을 때 기대하는 값이 모두 일관적으로 동일해야함
- 독립성(Isolation): Operation 수행 시 다른 작업이 끼어들지 못하게 하는 것
- 지속성(Durability): 성공적으로 수행된 Operation은 영원히 반영
애플의 CATransaction
- 트랜잭션에서 atomic (부분적으로 실행되다가 중단되지 않는 것을 보장) 특성을 따르며, layer에 관한 렌더링 관리에 사용되는 개념
- CATransaction은 트랜잭션의 성격을 가지고 있기 때문에 type method로 되어있어서, CATransction.begin()과 같이 사용
- 기능: 애니매이션되는 속성(트리거 여부, 타이밍, 기간 등)을 설정
- 내부적으로는 Core Animation 방법 그대로 따르고 있는 형태
CATransaction의 implicit, Explicit 트랜잭션
- implicit transaction: thread의 runloop마다 자동으로 생성
- explicit transaction: 직접 호출하는 형태이며, begin()과 commit()으로 layer에 관한 변경사항을 호출하면 CALayer 속성에 관한 커스텀 애니메이션 구현이 가능
- begin(): 현재 스레드에 대한 새로운 트랜잭션 시작
- commit(): 현재 트랜잭션 동안 이루어지는 모든 변경사항을 시행
- setAnimationDuration(_:): 애니메이션의 duration 설정 (디폴트는 2.5초)
CATransaction의 활용
- CATransaction에는 특정 애니메이션이 끝난 후 completionBlock 처리가 가능
- CATransaction을 이용하여, pushViewController에 completion block 기능 넣기
import UIKit
extension UINavigationController {
public func pushViewController(viewController: UIViewController, animated: Bool, completion: @escaping () -> Void = {}) {
CATransaction.begin()
CATransaction.setCompletionBlock(completion)
self.pushViewController(viewController, animated: animated)
CATransaction.commit()
}
}
// 사용하는 쪽
self.navigationController?.pushViewController(viewController: vc, animated: true, completion: {
print("completion!")
})
- CABasicAnimation 끝난 후 completion을 넣고 싶은 경우 사용
@objc private func didTapButton() {
CATransaction.begin()
CATransaction.setCompletionBlock {
self.button.setTitle("애니메이션 완료!", for: .normal)
}
let animation = CABasicAnimation(keyPath: "backgroundColor")
animation.fromValue = self.randomColor.cgColor
animation.toValue = self.randomColor.cgColor
animation.duration = 3
animation.repeatCount = 1
self.myView.layer.add(animation, forKey: "myAnimation")
CATransaction.commit() // Commits outer transaction
}
* 전체 코드: https://github.com/JK0369/ExTransaction
* 참고
https://developer.apple.com/documentation/quartzcore/catransaction
'iOS 기본 (swift)' 카테고리의 다른 글
Comments