2017-05-08 13 views
1

"kg/lbs"의 두 가지 범주가있는 레이블 ('profile/uid'에 저장 됨)의 firebase 데이터베이스에서 사용자를 "가중치"라고 부릅니다. 나는 라벨을 통해 사용자의 체중을 kg로 표시 한 다음 lbs로 페이드 아웃 한 후 다시 kg로 되돌릴 수 있도록하고 싶습니다. 지금까지 내가 지속적으로하고 파운드의 무게 페이드 아웃되고 다음과 같은 코드를 작성하고 난 kg 번 페이드 아웃 파운드에이 무게를 표시하는 방법을 확실 해요 :CAAnimation을 사용하여 두 변수를 무한대로 회전

func weight() { 

    let userRf = self.firDatabaseRef.child("profile").child("\(User!.uid)").observe(FIRDataEventType.value, with: { (snapshot) in 
     if snapshot.exists() { 
      if let weight = snapshot.childSnapshot(forPath: "weight").value as? [String: AnyObject] { 
       if let kg = weight["kg"] as? Float, let lbs = weight["lbs"] as? Int { 

        let animation: CATransition = CATransition() 
        animation.duration = 2.0 
        animation.type = kCATransitionFade 
        animation.repeatDuration = .infinity 
        animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 
        self.displayWeight.layer.add(animation, forKey: "changeTextTransition") 

        self.displayWeight.text = "\(lbs) lbs" 

       } 
      } 
     } 
    } 

} 

답변

1

한 가지 방법은이다 Timer으로 반복 UIVIew 애니메이션을 함께 사용 :이 라벨이 표시 밖으로 시작한다고 가정한다

// set up some helpful constants 
let kgsText = "\(kgs) kgs" 
let lbsText = "\(lbs) lbs" 
let fadeDuration = 2.0 

// keep track of which unit is being displayed 
var isDisplayingKgs = true 

// animate the fade in and out, repeating 
UIView.animate(withDuration: fadeDuration, delay: 0, options: [.autoreverse, .repeat], animations: { 
    label.alpha = 0 
}, completion: nil) 

// start the timer to switch the text after a short delay 
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + fadeDuration) { 
    self.displayWeight.text = lbsText 
    isDisplayingKgs = false 
    Timer.scheduledTimer(withTimeInterval: fadeDuration * 2, repeats: true, block: { timer in 
     self.displayWeight.text = isDisplayingKgs ? lbsText : kgsText 
     isDisplayingKgs = !isDisplayingKgs 
    }) 
} 

(알파 = 1). 디스패치 지연은 레이블이 처음 페이드 아웃 될 때 첫 번째 전환이 발생하도록하는 것입니다,하지만의 타이머 차기 여기

되기 전에 애니메이션은 행동의 모양 :.

gif of the label animation

+1

이것은 아주 고마워! –

+0

또 다른 빠른 질문입니다. 만약 내가 타이머를 사용하여 표시 할 변수가 2 개 이상이라면 어떻게 될까요? 지금까지 나는 타이머 내에 if 문을 사용하여 각각의 변수를 하나씩 보여줍니다. 변수가 하나라도 있으면 타이머가 마지막 변수에 도달하면 첫 번째 변수를 다시 표시합니다. 따라서 다시 변수가 표시됩니다. 마지막 변수를 표시합니다. –

+1

@UmarYaqub 먼저 표시 할 항목 수를 확인하여 표시 할 항목 수를 결정해야합니다. 그런 다음 배열에 추가합니다. 애니메이션 코드는 임의의 수의 항목을 설명하기 위해 리팩토링되어야하지만 타이머 블록이 실행될 때마다 배열의 요소를 통해 회전하기가 어렵지 않아야합니다. – nathan