2017-04-18 4 views
1

나는보기의 너비와 미래의 어떤 지점을 얻는 타이머 (다음 5 분)로 설정된보기를 가지고 있습니다. 내 목표는 내가타이머를 사용하여 UIView의 너비를 움직이게하려면 어떻게해야합니까?

UIView.animate(withDuration: date.timeIntervalSinceNow, delay: 0, options: .curveEaseIn, animations: { 
    self.countdownBar?.frame = CGRect(x: 0, y:self.view.frame.maxY - 3, width: 0, height: 3) 
}, completion: nil) 

을하려고은 0

에 아래 view.width에서보기의 폭을 애니메이션하는 것입니다 그러나 이것은 maxY 위치의 아래로보기의 상단에서 countdownBar 애니메이션을 제작했다 - 3 너비보다

도움이 될 것입니다!

편집 : 타이머 코드

self.timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.countdownToCartExpiration), userInfo: nil, repeats: true) 

그리고 countdownToCartExpiration에서 나는 몇 가지 UI 분의 특정 시간 간격으로 변경 및 초

답변

3

당신은 타이머 아니면 그냥 UIViewAnimation 같은 것을 사용해야하거나 않습니다.

width을 5 분 동안 0으로 애니메이트하려면 다음과 같이하십시오.

var finalFrame = countdownBar!.frame 
finalFrame.size.width = 0 

UIView.animate(withDuration: 300, animations: { 
    self.countdownBar?.frame = finalFrame 
}) 

이보기는 화면의 전체 너비를 가정하고 300 초에 걸쳐 0으로 애니메이션을 생성합니다. 또한 AutoLayout을 사용하여 레이아웃을 관리하지 않는다고 가정합니다. Autolayout을 사용하는 경우, 프레임을 변경하는 대신 구속 조건을 변경하려면이 값을 조정해야합니다.

업데이트

당신이 매 초마다 발사 타이머가 그래서 있기 때문이다. 우리는 여전히 애니메이션 효과를 원할 것입니다. 타이머가 발사되는 경우 매초 30 또는 60 분마다 말하면 프레임을 조정하면 부드럽게 보일 수 있습니다. 그러나 매 초마다 고르지 않게 보일 것입니다.

func countdownToCartExpiration (timer: Timer) { 

    guard let countdownBar = countdownBar else { 
     return 
    } 

    // Assuming you're already tracking currentTime somehow 
    currentTime += timer.timeInterval 

    var finalFrame = countdownBar.frame 
    let totalTime = 300.0 

    finalFrame.size.width = view.frame.width * CGFloat(currentTime/totalTime) 

    UIView.animate(withDuration: timer.timeInterval, delay: 0, options: [.beginFromCurrentState, .curveLinear], animations: { 
     countdownBar.frame = finalFrame 
    }, completion: nil) 

    // ... Other stuff 
} 

. beginFromCurrentState 애니메이션이 중첩되는 경우 중요합니다. .curveLinear이 중요합니다. 왜냐하면 애니메이션을 연속적으로 재생할 때 속도가 일정하기를 원하기 때문입니다.

나는이 애니메이션의 currentTime과 totalTime을 추적하고 있다고 가정했습니다.이 애니메이션의 시간은 300 초입니다. 그러나 당신은 분명히 조정할 수 있습니다. 목표는 너비를 totalTime 중 currentTime의 백분율로 설정하는 것입니다.

+0

저는 이미 타이머가 있습니다.'animate' 블록보다 사용하고 싶습니다. –

+0

btw,'finalFrame.width = 0'은 "width는 get-only 속성입니다." –

+0

Oops yea you 'd you 'finalFrame.size.width'가 필요합니다. 나는 그것을 업데이트했다. 타이머에 관해서는, 당신이 설정 한 타이머와 호출하는 방법을 게시 할 수 있습니까? 타이머를 사용하여 너비를 수동으로 변경하려면 타이머 중에 정기적으로 호출되는 메소드가 필요합니다. 진행 표시 줄과 같은 것입니까? –