Swift에서 UITextField / UIView에 대한 애니메이션 흔들기
사용자가 텍스트 필드를 비워 둘 때 버튼을 누를 때 텍스트 필드 흔들림을 만드는 방법을 알아 내려고합니다.
현재 다음 코드가 작동합니다.
if self.subTotalAmountData.text == "" {
let alertController = UIAlertController(title: "Title", message:
"What is the Sub-Total!", preferredStyle: UIAlertControllerStyle.Alert)
alertController.addAction(UIAlertAction(title: "Okay", style: UIAlertActionStyle.Default,handler: nil))
self.presentViewController(alertController, animated: true, completion: nil)
} else {
}
하지만 경고로 텍스트 필드를 흔드는 것이 훨씬 더 매력적이라고 생각합니다.
텍스트 필드에 애니메이션을 적용 할 항목을 찾을 수 없습니다.
어떤 아이디어?
감사!
당신은을 변경할 수 있습니다 duration그리고 repeatCount그것을 조정할. 이것은 내 코드에서 사용하는 것입니다. 변화 fromValue와 것은 toValue쉐이크 이동 거리를 달라집니다.
let animation = CABasicAnimation(keyPath: "position")
animation.duration = 0.07
animation.repeatCount = 4
animation.autoreverses = true
animation.fromValue = NSValue(cgPoint: CGPoint(x: viewToShake.center.x - 10, y: viewToShake.center.y))
animation.toValue = NSValue(cgPoint: CGPoint(x: viewToShake.center.x + 10, y: viewToShake.center.y))
viewToShake.layer.add(animation, forKey: "position")
다음 기능은 모든보기에서 사용됩니다.
extension UIView {
func shake() {
let animation = CAKeyframeAnimation(keyPath: "transform.translation.x")
animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear)
animation.duration = 0.6
animation.values = [-20.0, 20.0, -20.0, 20.0, -10.0, 10.0, -5.0, 5.0, 0.0 ]
layer.add(animation, forKey: "shake")
}
}
편집 : CABasicAnimation애니메이션을 연속으로 두 번 트리거하면 앱이 충돌합니다. 따라서 CAKeyframeAnimation. 댓글 덕분에 버그가 수정되었습니다. :)
또는 더 많은 매개 변수를 원하면 이것을 사용할 수 있습니다 ( swift 5에서 ) :
public extension UIView {
func shake(count : Float = 4,for duration : TimeInterval = 0.5,withTranslation translation : Float = 5) {
let animation = CAKeyframeAnimation(keyPath: "transform.translation.x")
animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear)
animation.repeatCount = count
animation.duration = duration/TimeInterval(animation.repeatCount)
animation.autoreverses = true
animation.values = [translation, -translation]
layer.add(animation, forKey: "shake")
}
}
UIView, UIButton, UILabel, UITextView 등에서이 함수를 호출 할 수 있습니다.
yourView.shake()
또는 애니메이션에 사용자 지정 매개 변수를 추가하려는 경우 다음과 같이하십시오.
yourView.shake(count: 5, for: 1.5, withTranslation: 10)
이 모든 것이 위험하다고 생각합니다.
흔들림 애니메이션이 사용자 작업을 기반으로하고 해당 사용자 작업이 애니메이션 중에 트리거되는 경우.
CRAAAAAASH
Swift 4의 내 방식은 다음과 같습니다 .
static func shake(view: UIView, for duration: TimeInterval = 0.5, withTranslation translation: CGFloat = 10) {
let propertyAnimator = UIViewPropertyAnimator(duration: duration, dampingRatio: 0.3) {
view.transform = CGAffineTransform(translationX: translation, y: 0)
}
propertyAnimator.addAnimations({
view.transform = CGAffineTransform(translationX: 0, y: 0)
}, delayFactor: 0.2)
propertyAnimator.startAnimation()
}
가장 깨끗한 방법은 아니지만이 방법은 반복적으로 트리거 될 수 있으며 쉽게 이해할 수 있습니다.
편집하다:
저는 UIViewPropertyAnimator의 사용에 대한 큰 지지자입니다. 기본 애니메이션을 동적으로 수정할 수있는 멋진 기능이 너무 많습니다.
다음은 뷰가 흔들리는 동안 빨간색 테두리를 추가 한 다음 흔들림이 끝나면 제거하는 또 다른 예입니다.
static func shake(view: UIView, for duration: TimeInterval = 0.5, withTranslation translation: CGFloat = 10) {
let propertyAnimator = UIViewPropertyAnimator(duration: duration, dampingRatio: 0.3) {
view.layer.borderColor = UIColor.red.cgColor
view.layer.borderWidth = 1
view.transform = CGAffineTransform(translationX: translation, y: 0)
}
propertyAnimator.addAnimations({
view.transform = CGAffineTransform(translationX: 0, y: 0)
}, delayFactor: 0.2)
propertyAnimator.addCompletion { (_) in
view.layer.borderWidth = 0
}
propertyAnimator.startAnimation()
}
스위프트 5.0
extension UIView {
func shake(){
let animation = CABasicAnimation(keyPath: "position")
animation.duration = 0.07
animation.repeatCount = 3
animation.autoreverses = true
animation.fromValue = NSValue(cgPoint: CGPoint(x: self.center.x - 10, y: self.center.y))
animation.toValue = NSValue(cgPoint: CGPoint(x: self.center.x + 10, y: self.center.y))
self.layer.add(animation, forKey: "position")
}
}
쓰다
self.vwOffer.shake()
extension CALayer {
func shake(duration: NSTimeInterval = NSTimeInterval(0.5)) {
let animationKey = "shake"
removeAnimationForKey(animationKey)
let kAnimation = CAKeyframeAnimation(keyPath: "transform.translation.x")
kAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
kAnimation.duration = duration
var needOffset = CGRectGetWidth(frame) * 0.15,
values = [CGFloat]()
let minOffset = needOffset * 0.1
repeat {
values.append(-needOffset)
values.append(needOffset)
needOffset *= 0.5
} while needOffset > minOffset
values.append(0)
kAnimation.values = values
addAnimation(kAnimation, forKey: animationKey)
}
}
사용하는 방법:
[UIView, UILabel, UITextField, UIButton & etc].layer.shake(NSTimeInterval(0.7))
func shakeTextField(textField: UITextField)
{
let animation = CABasicAnimation(keyPath: "position")
animation.duration = 0.07
animation.repeatCount = 3
animation.autoreverses = true
animation.fromValue = NSValue(cgPoint: CGPoint(x: textField.center.x - 10, y: textField.center.y))
animation.toValue = NSValue(cgPoint: CGPoint(x: textField.center.x + 10, y: textField.center.y))
textField.layer.add(animation, forKey: "position")
textField.attributedPlaceholder = NSAttributedString(string: textField.placeholder ?? "",
attributes: [NSAttributedStringKey.foregroundColor: UIColor.red])
}
//write in base class or any view controller and use it
This is based on CABasicAnimation, it contain also an audio effect :
extension UIView{
var audioPlayer = AVAudioPlayer()
func vibrate(){
let animation = CABasicAnimation(keyPath: "position")
animation.duration = 0.05
animation.repeatCount = 5
animation.autoreverses = true
animation.fromValue = NSValue(CGPoint: CGPointMake(self.center.x - 5.0, self.center.y))
animation.toValue = NSValue(CGPoint: CGPointMake(self.center.x + 5.0, self.center.y))
self.layer.addAnimation(animation, forKey: "position")
// audio part
do {
audioPlayer = try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(mySoundFileName, ofType: "mp3")!))
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch {
print("∙ Error playing vibrate sound..")
}
}
}
Swift 5
Safe (non crash) shake extension for Corey Pett answer:
extension UIView {
func shake(for duration: TimeInterval = 0.5, withTranslation translation: CGFloat = 10) {
let propertyAnimator = UIViewPropertyAnimator(duration: duration, dampingRatio: 0.3) {
self.transform = CGAffineTransform(translationX: translation, y: 0)
}
propertyAnimator.addAnimations({
self.transform = CGAffineTransform(translationX: 0, y: 0)
}, delayFactor: 0.2)
propertyAnimator.startAnimation()
}
}
참고URL : https://stackoverflow.com/questions/27987048/shake-animation-for-uitextfield-uiview-in-swift
'Program Club' 카테고리의 다른 글
| Linux 명령 줄 : du — 각 디렉토리에 대한 총계 만 표시하는 방법 (0) | 2020.12.14 |
|---|---|
| didSelectRowAtIndexPath : 호출되지 않음 (0) | 2020.12.13 |
| Objective-C 빌드의 중복 기호 오류? (0) | 2020.12.13 |
| LINQ는 느리기 때문에 피해야합니까? (0) | 2020.12.13 |
| 높이 전환 방법 : 0; (0) | 2020.12.13 |