2017-02-15 3 views
3

시간이 지남에 따라 애니메이션 광고를 늘리는 돈 카운터가 있습니다. 아래 확장 기능을 사용하여 애니메이션을 실행하지만 문제는 애니메이션 광고가 전체 자릿수에만 애니메이션 효과를 적용한다는 것입니다. 애니메이션으로 바뀌고 있습니다.특정 소수 자릿수 가져 오기

숫자를 나눠서 각각의 개별 숫자를 자체적으로 움직이는 것으로 생각했습니다. 문제는 숫자를 세분화하고 특정 숫자를 얻는 방법을 파악할 수 없다는 것입니다.

내가 숫자를 깨고 개별 숫자를 얻거나 개별 숫자로 애니메이션을 실행하는 더 좋은 방법을 얻는 방법은 무엇입니까?

func pushTransition(duration:CFTimeInterval) { 
    let animation:CATransition = CATransition() 
    animation.timingFunction = CAMediaTimingFunction(name: 
     kCAMediaTimingFunctionEaseInEaseOut) 
    animation.type = kCATransitionPush 
    animation.subtype = kCATransitionFromTop 
    animation.duration = duration 
    self.layer.add(animation, forKey: kCATransitionPush) 
} 



if let aLabel = self.money{ 
     aLabel.pushTransition(duration: 0.2) 
     aLabel.text = "$\(strRoundDollars)" 
     money.sizeToFit() 
     } 

답변

2

먼저 로캘/통화에 대해 올바른 자릿수 (소수점 이하 자릿수)가 & 개임을 확인하려면 NumberFormatter을 간단한 문자열 보간 대신 사용하고 싶습니다. 그럼 당신이 할 필요는 다시 문자열의 배열로 문자열의 .characters 속성을지도한다 : 내 첫 번째 대답은 String(format: "$%0.2f", dollars)를 사용한다는 지적에 대해 @Sulthan에

let dollars = 123.4 
let n = NumberFormatter() 
n.numberStyle = .currency 
n.locale = Locale.autoupdatingCurrent // or whatever locale you want 
if let text = n.string(from: NSNumber(value: dollars)) { 
    text // "$123.40" 
    let charactersAsStrings = text.characters.map({String($0)}) 
    charactersAsStrings // ["$", "1", "2", "3", ".", "4", "0"] 
} 

많은 감사 겉만 번지르르 한 :

했다
+0

@ 설탄 - 당신은 물론 정확합니다! – Grimxn

+0

그리고 나서 배열에서 개별 항목을 가져 와서 레이블에 추가합니다. – Mick

+0

예 - 나는 "숫자를 세분화하고 특정 숫자를 얻는 방법을 생각할 수 없습니다"라고 대답했습니다. 나는 애니메이션을 위해 당신이 한 자릿수마다 하나의 라벨을 필요로한다고 가정합니다 ... – Grimxn

0

실제로 더 까다로운 애니메이션이며 단 하나의 라벨로는이를 달성 할 수 없다고 생각합니다. 내 생각은 현재 레이블을 가로 스택보기로 대체하는 것입니다. 전화 번호가 100.00 $라고 가정 해 봅시다. 스택에 7 개의 레이블을 추가합니다. 각 레이블은 ","및 "$"를 포함하여 한 자리 만 표시합니다. 이제 현재 값이 변경 될 때마다 어떤 숫자가 변경되었는지 확인하면됩니다. 이를 위해 값을 변경하기 전에 문자를 비교할 수 있으며 값을 변경 한 후 문자로 비교할 수 있습니다. 문자는 모든 문자열의 속성입니다. 이제는 어떤 값을 변경해야하는지 알았으므로 스택의 모든 하위 뷰를 반복하여 각 숫자에 개별적으로 애니메이션을 적용 할 수 있습니다. 더 복잡한보기 계층 구조이지만 결과는 좋을 것입니다.