2015-01-30 2 views
2

프로그래밍에 익숙하지 않지만 지난 2 개월 동안 iOS 용 Swift를 배우는 보폭을 만들었습니다. 간단한 타이핑 게임을 만들고 있습니다. 그리고 프로젝트를 구조화 한 방법은 플레이어가 누른 문자를 감지하는 숨겨진 UITextView를 가지고 있고, 그 문자열을 보이는 UITextView의 문자열과 일치시키는 것입니다. 내가 지금 찾고 있어요 무엇Swift에서 문자열 페이딩 인/아웃

애니메이션의 어떤 종류를 추가하는 것입니다 - 나는 UITextView에 추가, 내가 기인 문자열을 만들었습니다/

을 페이드하기 위해 개별 문자를 싶습니다, 문자열의 특정 범위에 애니메이션을 적용하는 방법을 알 수 없습니다. 나는이의 라인을 따라 뭔가를 사용하여 시도했다 :

  UIView.animateWithDuration(1, delay: 0.5, options: .CurveEaseOut, animations: { 
       self.stringForPlayer.addAttribute(
        NSForegroundColorAttributeName, 
        value: UIColor.greenColor(), 
        range: NSRange(location: self.rangeOfText, length: 1)) 
       self.textViewForPlayer.attributedText = self.textForPlayer 
       }, completion: { finished in 
        println("FINISHED")} 
      ) 

을 행운으로. 어쩌면 UIView 애니메이션은 뷰 개체 자체에만 있고 특성이 지정된 문자열에는 사용할 수 없습니다. 이 문제를 해결하기위한 아이디어 나 해결책이 있습니까? 어떤 도움을 주셔서 감사합니다, 많이 고마워요!

+0

당신이 시도 할 수 있습니다 : 당신이 원하는 색으로 퇴색하기 전에 clearColor에 퇴색하고 싶었다면


(그것을 만드는 "팝업은"더 작은), 당신은 completion 블록을 사용할 수 있습니다 UIView 객체로 문자열을 마스크 한 다음 애니메이션으로 알파를 변경합니다. –

+0

@DinoTw 답장을 보내 주셔서 감사합니다. 문자열을 마스크하는 방법에 대해 좀 더 자세히 설명해 주시겠습니까? 죄송합니다. 저는이 일에 아주 새롭습니다. 당신은 내가 새로운 UIView 개체를 만들 수 있고, UITextView 위에 위치시키고, 그 대신에 애니메이션을 적용 할 수 있다고 말하고 있습니까? – Chris

+0

네, 맞습니다. –

답변

2

UIView.transitionWithView을 사용하여 애니메이션을 수행 할 수 있습니다. 이 경우, 녹색으로 단어 ipsum 페이딩 : 당신이 볼 수 있듯이

let rangeOfText = (textViewForPlayer.text as NSString).rangeOfString("ipsum", options: nil) 
let stringForPlayer = textViewForPlayer.attributedText.mutableCopy() as NSMutableAttributedString 

UIView.transitionWithView(self.textViewForPlayer, duration: 1.0, options: .TransitionCrossDissolve, animations: {() -> Void in 
    stringForPlayer.addAttribute(
     NSForegroundColorAttributeName, 
     value: UIColor.greenColor(), 
     range: rangeOfText) 
    self.textViewForPlayer.attributedText = stringForPlayer 
    }, completion: nil) 

, 즉 현저하게 간단합니다.

텍스트의 크기를 변경하려고 시도하면 텍스트보기의 나머지 부분이 다시 레이아웃 될 수 있기 때문에이 애니메이션 중에 텍스트가 축소되고 커지도록하려면 완전히 다른 왁스 공이 있어야합니다. 너의 의도가 아니야.

그런 경우 텍스트보기의 해당 부분에 대한 스냅 샷을 찍은 다음 스냅 샷을 텍스트보기 위에 놓고 크기 조정 및 변형에 애니메이션을 적용 할 수 있습니다. 그리고 그것들 모두는 애니메이션의 끝 부분으로 변환하는 것이 이전과 정확히 같은 크기라고 가정합니다 (그렇지 않으면 애니메이션 중에 나머지 텍스트를 어떻게 처리해야하는지에 대해 복잡한 질문이 있습니다).

이것은 특정 애니메이션을 얻기위한 많은 작업이 될 것입니다. 원하는 효과를 더 단순하게 다른 방법으로 구현할 수 있는지 물어볼 것입니다. (예 : 중첩 된 애니메이션, 텍스트 색상을 지우고 새 색상으로 페이드 처리하여 "사라지고 다시 나타나는 느낌"을 조금씩내는 애니메이션) . 애니메이션 코드의 쥐 둥지에서 길을 잃지 않으면 서 변형이 더욱 눈에 띄게됩니다.

UIView.transitionWithView(self.textViewForPlayer, duration: 0.25, options: .TransitionCrossDissolve, animations: {() -> Void in 
    stringForPlayer.addAttribute(
     NSForegroundColorAttributeName, 
     value: UIColor.clearColor(), 
     range: rangeOfText) 
    self.textViewForPlayer.attributedText = stringForPlayer 
    }, completion: { (finished) -> Void in 
     UIView.transitionWithView(self.textViewForPlayer, duration: 0.25, options: .TransitionCrossDissolve, animations: {() -> Void in 
      stringForPlayer.addAttribute(
       NSForegroundColorAttributeName, 
       value: UIColor.greenColor(), 
       range: rangeOfText) 
      self.textViewForPlayer.attributedText = stringForPlayer 
      }, completion: nil) 
}) 
+0

위대한! 캐릭터의 크기를 움직여 스케일을 올리거나 내리는 방법에 대한 답변을 게시 할 수 있습니까? (터지는 애니메이션) – Chris

+0

그냥 해결책을 자세히 설명해 - 다음 단계가 시작되기 전에 애니메이션 블록의 각 실행이 완료되도록하는 방법이 있습니까? 이러한 애니메이션은 연속적으로 빠르게 트리거됩니다. – Chris

+0

원하는 경우 각 기간을 늘리십시오. 그리고 위에 표시된 것처럼 두 번째 블록이 첫 번째 블록의 완료 블록인지 확인하십시오. – Rob