스위프트에서 애니메이션에서 단순한 페이드를 만들라고요?
스위프트에서 간단한 애니메이션을 만들려고 합니다.그것은 희미해져 있습니다.
시도했습니다.
self.myFirstLabel.alpha = 0
self.myFirstButton.alpha = 0
self.mySecondButton.alpha = 0
그렇다면, 나는 다음과 같습니다.
self.view.addSubview(myFirstLabel)
self.view.addSubview(myFirstButton)
self.view.addSubview(mySecondButton)
그 다음은:
UIView.animateWithDuration(1.5, animations: {
self.myFirstLabel.alpha = 1.0
self.myFirstButton.alpha = 1.0
self.mySecondButton.alpha = 1.0
})
저는 이 모든 것을 DidLoad 함수로 보고 있습니다.
어떻게 하면 이 일을 해낼 수 있을까요?
문제는 뷰 컨트롤러의 라이프사이클에서 애니메이션을 너무 일찍 시작하려고 한다는 것입니다.viewDidLoad
, 뷰가 방금 생성되었으며 뷰 계층에 아직 추가되지 않았으므로 뷰 계층 중 하나를 애니메이션화하려고 시도합니다.subviews
이 시점에서 좋지 않은 결과가 나옵니다.
당신이 정말로 해야 할 일은 뷰의 알파를 계속 설정하는 것입니다.viewDidLoad
(또는 보기를 작성하는 위치)를 선택한 다음viewDidAppear
: 호출할 메서드입니다.이 시점에서 아무런 문제 없이 애니메이션을 시작할 수 있습니다.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
UIView.animate(withDuration: 1.5) {
self.myFirstLabel.alpha = 1.0
self.myFirstButton.alpha = 1.0
self.mySecondButton.alpha = 1.0
}
}
0x7fffff의 대답은 괜찮고 확실히 완전합니다.
또한 다음과 같은 방법으로 UIView를 확장할 것을 제안합니다.
public extension UIView {
/**
Fade in a view with a duration
- parameter duration: custom animation duration
*/
func fadeIn(duration duration: NSTimeInterval = 1.0) {
UIView.animateWithDuration(duration, animations: {
self.alpha = 1.0
})
}
/**
Fade out a view with a duration
- parameter duration: custom animation duration
*/
func fadeOut(duration duration: NSTimeInterval = 1.0) {
UIView.animateWithDuration(duration, animations: {
self.alpha = 0.0
})
}
}
스위프트-3
/// Fade in a view with a duration
///
/// Parameter duration: custom animation duration
func fadeIn(withDuration duration: TimeInterval = 1.0) {
UIView.animate(withDuration: duration, animations: {
self.alpha = 1.0
})
}
/// Fade out a view with a duration
///
/// - Parameter duration: custom animation duration
func fadeOut(withDuration duration: TimeInterval = 1.0) {
UIView.animate(withDuration: duration, animations: {
self.alpha = 0.0
})
}
스위프트-5
public extension UIView {
/**
Fade in a view with a duration
- parameter duration: custom animation duration
*/
func fadeIn(duration: TimeInterval = 1.0) {
UIView.animate(withDuration: duration, animations: {
self.alpha = 1.0
})
}
/**
Fade out a view with a duration
- parameter duration: custom animation duration
*/
func fadeOut(duration: TimeInterval = 1.0) {
UIView.animate(withDuration: duration, animations: {
self.alpha = 0.0
})
}
}
이와 같은 방법으로 코드의 어디에서나 이 작업을 수행할 수 있습니다.
let newImage = UIImage(named: "")
newImage.alpha = 0 // or newImage.fadeOut(duration: 0.0)
self.view.addSubview(newImage)
...
newImage.fadeIn()
코드 재사용이 중요합니다!
신속한 전용 솔루션
루카의 답변과 비슷하게, 저는.UIView
내선내가 사용하는 그의 솔루션과 비교해 볼 때DispatchQueue.main.async
메인 스레드에서 애니메이션이 완성되도록 하기 위해,alpha
특정 값으로 페이딩하기 위한 파라미터 및 옵션duration
클리너 코드에 대한 파라미터.
extension UIView {
func fadeTo(_ alpha: CGFloat, duration: TimeInterval = 0.3) {
DispatchQueue.main.async {
UIView.animate(withDuration: duration) {
self.alpha = alpha
}
}
}
func fadeIn(_ duration: TimeInterval = 0.3) {
fadeTo(1.0, duration: duration)
}
func fadeOut(_ duration: TimeInterval = 0.3) {
fadeTo(0.0, duration: duration)
}
}
사용방법:
// fadeIn() - always animates to alpha = 1.0
yourView.fadeIn() // uses default duration of 0.3
yourView.fadeIn(1.0) // uses custom duration (1.0 in this example)
// fadeOut() - always animates to alpha = 0.0
yourView.fadeOut() // uses default duration of 0.3
yourView.fadeOut(1.0) // uses custom duration (1.0 in this example)
// fadeTo() - used if you want a custom alpha value
yourView.fadeTo(0.5) // uses default duration of 0.3
yourView.fadeTo(0.5, duration: 1.0)
반복 가능한 페이드 애니메이션을 원한다면 다음을 사용하여 작업을 수행할 수 있습니다.CABasicAnimation
아래와 같이:
먼저 편리한 UIView 확장자를 만듭니다.
extension UIView {
enum AnimationKeyPath: String {
case opacity = "opacity"
}
func flash(animation: AnimationKeyPath ,withDuration duration: TimeInterval = 0.5, repeatCount: Float = 5){
let flash = CABasicAnimation(keyPath: animation.rawValue)
flash.duration = duration
flash.fromValue = 1 // alpha
flash.toValue = 0 // alpha
flash.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
flash.autoreverses = true
flash.repeatCount = repeatCount
layer.add(flash, forKey: nil)
}
}
사용방법:
// You can use it with all kind of UIViews e.g. UIButton, UILabel, UIImage, UIImageView, ...
imageView.flash(animation: .opacity, withDuration: 1, repeatCount: 5)
titleLabel.flash(animation: .opacity, withDuration: 1, repeatCount: 5)
스위프트 5
다른 답변은 맞지만, 제 경우에는 다른 속성도 처리해야 합니다 (alpha
,animate
,completion
) 때문에 아래와 같이 이 매개 변수를 노출하도록 약간 수정했습니다.
extension UIView {
/// Helper function to update view's alpha with animation
/// - Parameter alpha: View's alpha
/// - Parameter animate: Indicate alpha changing with animation or not
/// - Parameter duration: Indicate time for animation
/// - Parameter completion: Completion block after alpha changing is finished
func set(alpha: CGFloat, animate: Bool, duration: TimeInterval = 0.3, completion: ((Bool) -> Void)? = nil) {
let animation = { (view: UIView) in
view.alpha = alpha
}
if animate {
UIView.animate(withDuration: duration, animations: {
animation(self)
}, completion: { finished in
completion?(finished)
})
} else {
layer.removeAllAnimations()
animation(self)
completion?(true)
}
}
}
import UIKit
/*
Here is simple subclass for CAAnimation which create a fadeIn animation
*/
class FadeInAdnimation: CABasicAnimation {
override init() {
super.init()
keyPath = "opacity"
duration = 2.0
fromValue = 0
toValue = 1
fillMode = CAMediaTimingFillMode.forwards
isRemovedOnCompletion = false
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
/*
Example of usage
*/
class ViewController: UIViewController {
weak var label: UILabel!
override func loadView() {
let view = UIView()
view.backgroundColor = .white
let label = UILabel()
label.alpha = 0
label.frame = CGRect(x: 150, y: 200, width: 200, height: 20)
label.text = "Hello World!"
label.textColor = .black
view.addSubview(label)
self.label = label
let button = UIButton(type: .custom)
button.frame = CGRect(x: 0, y: 250, width: 300, height: 100)
button.setTitle("Press to Start FadeIn", for: UIControl.State())
button.backgroundColor = .red
button.addTarget(self, action: #selector(startFadeIn), for: .touchUpInside)
view.addSubview(button)
self.view = view
}
/*
Animation in action
*/
@objc private func startFadeIn() {
label.layer.add(FadeInAdnimation(), forKey: "fadeIn")
}
}
언급URL : https://stackoverflow.com/questions/24111770/make-a-simple-fade-in-animation-in-swift
'programing' 카테고리의 다른 글
안드로이드 앱에서 사용할 웹소켓 라이브러리는? (0) | 2023.10.23 |
---|---|
커널 스레드란? (0) | 2023.10.23 |
C 구조를 선언하는 구문론적으로 적절한 방법은 무엇입니까? (0) | 2023.10.23 |
Android에서 큰 비트맵 파일 크기를 출력 파일 크기로 조정 (0) | 2023.10.23 |
on click div 속성에서 자바스크립트에서 control+click 검출하는 방법? (0) | 2023.10.23 |