2017-05-10 10 views
1

나는 UIButton을 가지고 있으며, titleLabel 속성에 액세스하여 텍스트를 변경하고 싶습니다. 그러나 단추에서 텍스트를 변경하는 방법은 처음에는 아주 작은 크기로 축소 한 다음 즉시 보이지 않는 상태로 변경 한 다음 다시 크기를 조정하는 것입니다. 여기에 여러 게시물을 통해 검토 한 결과,이에 도달했습니다 :지연 후 UILabel의 텍스트를 움직이는 방법?

let changeText = CATransition(); 
    changeText.type = kCATransitionReveal; 
    changeText.duration = 0.0; 
    changeText.timingFunction = CAMediaTimingFunction(name:kCAMediaTimingFunctionLinear); 
    submitButton.titleLabel?.layer.add(changeText, forKey: "changeTextTransition"); 


    UIView.animateKeyframes(withDuration: 0.6, delay: 0, options: .calculationModeLinear, animations: { 
     //Zzzeeeewwwwwwwwww 
     UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 0.5, animations: { 
      self.submitButton.titleLabel?.transform = self.submitButton.titleLabel!.transform.scaledBy(x: 0.001, y: 0.001); 
     }) 


     UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.0, animations: { 
      self.submitButton.titleLabel?.text = "Green"; 
     }) 

     //Wwwwwweeeeeeyyyyyppp 
     UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5, animations: { 
      self.submitButton.titleLabel?.transform = self.submitButton.titleLabel!.transform.scaledBy(x: 1000, y: 1000); 
     }) 
    }, completion: nil) 

문제는이 작동하지 않는다는 것입니다. 내가 얻는 것은 라벨이 축소되면서 "New Text"라는 단어가 빠르게 깜박이고, 다시 크기가 조정되면 여전히 "Old Text"입니다. 너무 이상해. 심지어 내 머리를 감싸기 시작하지도 못한다. 나는 그것이 일어난다 고 생각한다. 그것은 새로운 텍스트가 축소되기 전에 드러내는 전환을 재생한다는 것이다. (왜 duration = 0으로 지정했는지 모르겠다.) 그런 다음, 이전 텍스트를 되 돌린다. 것을

Weird Bug

+0

'fillMode'를'kCAFillModeBoth'로 설정하십시오. –

+0

이 질문에 답을 얻지 못했지만 복잡한 애니메이션을 정의하고 https://github.com/airbnb/lottie-ios를 사용하여 멋진 애니메이션을 보여준 경험이있었습니다. Lottie는 After Effects 파일을 기반으로하는 https://github.com/bodymovin/bodymovin에서 만든 json 파일을 사용합니다. 애프터 이펙트 기술이 없어도 fivver에서 수행되는 간단한 작업을 수행 할 수 있습니다. –

+0

@JonRose가 작동하지 않았습니다. 변경 없음. – QuantumHoneybees

답변

2

우선 해제, 당신의 코드 주석의 음향 효과를 포함한 축하, 기쁜 그것의 저를 그냥 : 여기

은 (내가 위에서 생략 몇 가지 배경 색상 변화에) 모습입니다 것을 수행.

레이블의 텍스트 속성을 애니메이션으로 만들 수 없으므로 즉시 적용되어 애니메이션을 망칠 수 있습니다.

복잡한 애니메이션에 많이 사용되는 하나의 솔루션은 스냅 샷을 사용하는 것입니다. 애니메이션의 시작 부분에서 레이블의 스냅 샷을 만든 다음 레이블의 알파를 0으로 설정하고 텍스트를 업데이트하십시오. 그런 다음 레이블과 스냅 샷의 변형을 애니메이션으로 작 춥니 다. 레이블이 보이고 스냅 샷이 보이지 않게 한 다음 다시 애니메이션을 적용하십시오.

그것보다 더 복잡 소리

, 여기 코드는 놀이터에서 실행 할 수있다 :

당신이 결과를 제공
import UIKit 
import PlaygroundSupport 

let view = UIView(frame: CGRect(x: 0, y: 0, width: 400, height: 400)) 
view.backgroundColor = .blue 
PlaygroundPage.current.liveView = view 

let label = UILabel(frame: CGRect(x: 100, y: 100, width: 200, height: 200)) 
label.text = "Hello" 
label.font = UIFont.systemFont(ofSize: 50) 
label.textAlignment = .center 
label.textColor = .white 
view.addSubview(label) 

let snapshot = label.snapshotView(afterScreenUpdates: true)! 
view.addSubview(snapshot) 
snapshot.frame = label.frame 
label.alpha = 0 
label.text = "Goodbye" 

UIView.animateKeyframes(withDuration: 2, delay: 0, options: [.repeat, .autoreverse], animations: { 
    UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.45) { 
     label.transform = CGAffineTransform(scaleX: 0.01, y: 0.01) 
     snapshot.transform = label.transform 
    } 

    UIView.addKeyframe(withRelativeStartTime: 0.45, relativeDuration: 0.1) { 
     label.alpha = 1.0 
     snapshot.alpha = 0.0 
    } 

    UIView.addKeyframe(withRelativeStartTime: 0.55, relativeDuration: 0.45) { 
     label.transform = CGAffineTransform.identity 
    } 
}) { _ in 
    snapshot.removeFromSuperview() 
} 

:

enter image description here

그것은 내게 분명하지 않다을 무엇 당신이 찾고있는 또 다른 효과가 없다면 CATransition을 사용하려고합니다. 그것은 당신의 원인을 돕지 않습니다.

+0

하하, 마침내 누군가 내 유익한 의견을 감사합니다 !! 내보기가 'UIButton'일 때 분명히 작동하지 않습니다. 모든 것은 버튼/라벨의 텍스트를 설정하는 선까지 완벽하게 작동합니다. 어떤 이유로 든 버튼의 레이블에 텍스트를 지정하지 않습니다. – QuantumHoneybees

+0

나는 할당 선 바로 아래에 인쇄 (button.titleLabel.text)가 있는데, 분명히 텍스트는 여전히 오래된 텍스트입니다. – QuantumHoneybees

+1

Nvm, fixed. 나는'button.titleLabel.text' 대신'setTitle'을 사용해야했습니다. 감사!!!!!! – QuantumHoneybees