2016-10-26 2 views
0

업데이트 backgroundView에 살해되지 않는 :애니메이션은 jQuery과

  1. 나는 웹 서비스에서 데이터를로드하는 jQuery과가있다.
  2. 데이터를로드하는 동안 UIAnyCustomView (UIView의 하위 클래스)에 backgroundView를 설정하고 있습니다. 프로그래밍 방식으로 그려서 애니메이션을 적용합니다.
  3. 웹 서비스에서 데이터를받은 후 선택적으로 UITableView의 backgroundView를 nil로 설정합니다. 여기서는 애니메이션이 자동으로 제거되어야한다고 생각하지만 그렇지 않습니다.

내 질문 : 이유가 무엇입니까? (설명 업데이트)

원래의 질문에

나는 내 애플 리케이션 중 하나에 대한 몇 가지 배터리 사용 피드백을 받았습니다. xCode 기기를 사용하여 배터리 사용량을 모니터링하고 문제를 발견했습니다. 영원히 애니메이션을 호출 한 정적으로 jQuery과/UICollectionView의 backgroundView를 설정했다 (의이 UICustomeActivityIndicator를 호출하자) : 콘텐츠가 내가 설정하여 backgroundView을 삭제 한로드 된 다음

fileprivate func rotateLoadingView() { 
    UIView.animate(withDuration: 0.5, delay: 0.0, options: [.curveLinear], animations: { 
     self.innerCircleView.transform = self.innerCircleView.transform.rotated(by: CGFloat(M_PI_2)) 
    }) { result in 
     if !self.isHidden { 
      self.rotateLoadingView() 
     } 
    } 
} 

에 무기 호 :

// collectionView.backgroundView = nil 
tableView.backgroundView = nil 

backgroundView를 지우고 있었지만 애니메이션이 계속 진행 중이었고 거대한 배터리를 사용하고있었습니다 (백그라운드로 응용 프로그램을 보내는 중).

내 질문; 이 동작은 정상적인가 아니면 backgroundView UITableView/UICollectionView의 버그이며 nil로 설정되어있는 동안 자동으로 지워 져야합니까?

+0

컨트롤러에서 'activityIndicator.hidden = true'를하고 계십니까? 왜'backgroundView'를 nil로 설정하면'activityView'에 영향을 미칠까요? – alexburtnik

+0

예 activityIndicator.hidden = true로 설정합니다. backgroundView를 nil로 설정하면 왜 activityView에 영향을 미치지 않아야합니까?시스템에서 애니메이션을 자동으로 제거해야합니다. 맞습니까? – Rashid

+0

@ downvote에 대한 근본적인 이유? – Jeyamahesan

답변

1

계층에서보기를 제거하면 시스템에서 애니메이션이 취소 될 것이라고 생각하는 것은 잘못입니다. 보기가 수퍼 뷰에 추가 될 수도 있고 아닐 수도 있지만 어떤 경우에도 객체가 완전히 할당 취소되지 않는 한 애니메이션을 실행할 수 있습니다. 컨트롤러에서 indicatorView을 강력하게 참조하기 때문에 아직 살아 있고 애니메이션을 제거 할 이유가 없습니다.

재귀 적 메서드를 사용하지 않는 것이 좋습니다. 당신은 당신의 사용자 정의 활동 표시에 두 가지 방법에 의해 필요로하는 결과를 얻을 수 있습니다

func startAnimation() { 
    let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation") 
    rotateAnimation.fromValue = 0.0 
    rotateAnimation.toValue = CGFloat(M_PI * 2.0) 
    rotateAnimation.duration = 1 
    rotateAnimation.repeatCount = .infinity 

    layer.add(rotateAnimation, forKey: nil) 
} 

func stopRotation() { 
    layer.removeAllAnimations() 
} 

지금 바로 전화 startstop 당신이 컨트롤러에서 필요할 때마다 그리고 당신이 설명 된대로 문제가되지 않습니다.

+1

이것에 downvote을 이해할 수 없습니다. 당신은 완전한 유효 지점을 가지고 있습니다. –

+0

질문의 외부로 가지 마십시오. 재귀 적으로 애니메이션을 호출하는 동안 내 접근 방식이 잘못 되더라도 backgroundView를 nil로 설정하면 시스템에서 자동으로 애니메이션을 제거해야합니다. 맞습니까? 질문에이 사건을 명확히하고 싶습니다. – Rashid

+0

귀하의 질문에 실제로 귀하의 활동 지표가 backgroundView와 얼마나 관련이 있는지 명확하게 설명되어 있지 않습니다. backgroundView의 서브 뷰입니까? 아니면 무엇입니까? – alexburtnik

1

애니메이션이 UIView 레이어에 추가되므로보기를 제거해도 애니메이션이 제거되지 않습니다. 뷰를 nil로 설정하면 레이어 속성이 변경되지 않습니다. 뷰를 제거하면 레이어 속성이 아닌 표시되는 부분 만 제거됩니다. 이것이 애니메이션이 배경에서 돌아가고있는 이유입니다.

view.layer.removeAllAnimations() 
+0

@Rashid \t downvote의 이유는 무엇입니까? – Jeyamahesan

+0

설명을 위해 질문을 업데이트했습니다. – Rashid

+0

애니메이션이 뷰 레이어에 추가되어 뷰를 제거하여 애니메이션을 제거 할 수 없습니다. 당신이 그만두고 싶다면 레이어에서 애니메이션을 제거해야합니다. – Jeyamahesan