새소식

iOS/UIKit

[코드베이스] Custom PopUp Modal Animation

  • -

[참고 영상]

https://youtu.be/u6TpJrZNuPU


[학습 목표]

모달뷰를 사용할때 해당 뷰의 애니메이션 효과를 조정해보자.


[구현 방법]

1. 팝업을 하기 위해서 뷰를 작성해보자.

import Foundation import UIKit class Popup: UIView { fileprivate let titleLabel: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.font = UIFont.systemFont(ofSize: 28, weight: .bold) //font 크기를 28로 변환 및 bold체 label.text = "1 credit" label.textAlignment = .center //text 가운데 정렬 return label }() fileprivate let subtitleLabel: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.font = UIFont.systemFont(ofSize: 24, weight: .bold) label.text = "in app purchase for one book credet" label.textAlignment = .center //text 가운데 정렬 label.numberOfLines = 3 return label }() fileprivate let container: UIView = { let v = UIView() v.translatesAutoresizingMaskIntoConstraints = false v.backgroundColor = .white v.layer.cornerRadius = 24 return v }() fileprivate lazy var stack: UIStackView = { let stack = UIStackView(arrangedSubviews: [titleLabel, subtitleLabel]) // stack에 subview들을 추가. stack.translatesAutoresizingMaskIntoConstraints = false stack.axis = .vertical // stack을 vertical로 바꿔주는 코드 return stack }() override init(frame: CGRect) { super.init(frame: frame) self.backgroundColor = UIColor.gray.withAlphaComponent(0.6) self.frame = UIScreen.main.bounds self.addSubview(container) container.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true container.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true container.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 0.7).isActive = true container.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.45).isActive = true container.addSubview(stack) stack.leadingAnchor.constraint(equalTo: container.leadingAnchor).isActive = true stack.centerYAnchor.constraint(equalTo: container.centerYAnchor).isActive = true stack.trailingAnchor.constraint(equalTo: container.trailingAnchor).isActive = true stack.bottomAnchor.constraint(equalTo: container.bottomAnchor).isActive = true } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } }

 

 

2. 해당 화면에 이제 애니메이션 효과를 더할 함수를 만들어 주자.

@objc fileprivate func animateOut() { UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 1, options: .curveEaseIn, animations: { self.container.transform = CGAffineTransform(translationX: 0, y: -self.frame.height) }) {(complete) in if complete { self.isHidden = true //영상에서는 remove subview로 되어 있지만 재사용 가능성이 있는 뷰에는 ishidden을 쓰는 것이 좋기에 ishidden을 사용하였다. } } } @objc fileprivate func animateIn() { self.container.transform = CGAffineTransform(translationX: 0, y: -self.frame.height) self.alpha = 1 UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 1) { self.container.transform = .identity self.alpha = 1 } }

해당 함수들은 해당 팝업창이 만들어질때와 끝날때 애니메이션 효과를 더해줄 것이다.

이제 해당 함수들을 popup 클래스의 init에 넣어주도록 하자.

self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(animateOut))) animateIn()

 


* 해당 방법을 사용해 이제 modal view에서 애니메이션 효과를 입히는 방법에 대해서 알아 보았다. 앞으로 modal view를 쓸 때 디자이너가 애니메이션 효과를 원할 때 조금 더 능동적으로 대처하도록 하자.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.