문제점
I 두 뷰 컨트롤러가이 모두 각각의 UINavigationController
번의 UITabBarController
내에 포함를 사용하여 기각한다. 뷰 컨트롤러 중 하나에서 화면에 거품을 그려서 위치를 애니메이션하는 거품 효과를 만듭니다. 문제는 탭 막대를 사용하여 다른보기 컨트롤러로 이동할 때 발생합니다. 이로 인해 CPU가 스파이크를 일으키고 100 %로 유지되고 거품이 계속 움직입니다.애니메이션은 탭 막대
코드 거품에 대한
코드는 UIView
서브 클래스 내에서 캡슐화된다.
override func draw(_ rect: CGRect) {
// spawn shapes
for _ in 1 ... 10 { // spawn 75 shapes initially
spawn()
}
}
drawRect
방법은 반복적으로 거품 뷰를 채우는 spawn
함수를 호출한다.
fileprivate func spawn() {
let shape = CAShapeLayer()
shape.opacity = 0.0
// create an inital path at the starting position
shape.path = UIBezierPath(arcCenter: CGPoint.zero, radius: 1, startAngle: 0, endAngle: 360 * (CGFloat.pi/180), clockwise: true).cgPath
shape.position = CGPoint.zero
layer.addSublayer(shape)
// add animation group
CATransaction.begin()
let radiusAnimation = CABasicAnimation(keyPath: "path")
radiusAnimation.fromValue = shape.path
radiusAnimation.toValue = UIBezierPath(arcCenter: center, radius: 100, startAngle: 0, endAngle: 360 * (CGFloat.pi/180), clockwise: true).cgPath
CATransaction.setCompletionBlock { [unowned self] in
// remove the shape
shape.removeFromSuperlayer()
shape.removeAllAnimations()
// spawn a new shape
self.spawn()
}
let movementAnimation = CABasicAnimation(keyPath: "position")
movementAnimation.fromValue = NSValue(cgPoint: CGPoint.zero)
movementAnimation.toValue = NSValue(cgPoint: CGPoint(x: 100, y: 100))
let animationGroup = CAAnimationGroup()
animationGroup.animations = [radiusAnimation, movementAnimation]
animationGroup.fillMode = kCAFillModeForwards
animationGroup.isRemovedOnCompletion = false
animationGroup.duration = 2.0
shape.add(animationGroup, forKey: "bubble_spawn")
CATransaction.commit()
}
CATransaction
완료 처리기 내에서 수퍼 뷰에서 모양을 제거하고 새 모양을 만듭니다. 나는 removeAllAnimations
를 추가하려고했습니다
답변에서
func removeAllAnimationsFromLayer() {
layer.sublayers?.forEach({ (layer) in
layer.removeAllAnimations()
layer.removeFromSuperlayer()
})
CATransaction.setCompletionBlock(nil)
}
시도 : self.spawn()
에 함수 호출 내가 다음 전화를 포함하는 뷰 컨트롤러의 viewDidDisappear
에
문제를 것 같다 기능은 UITabBarControllerDelegate
입니다.
'completionBlock'에서'self.spawn()'을 제거하면 어떻게됩니까? –
애니메이션이 완료되면 모양이 다시 생성되지 않습니다. 진행중인 애니메이션이 삭제되어 있고 다음 뷰 컨트롤러가 푸시 된 경우 문제가 발생하지 않습니다. – Ollie
'스폰'할지 여부를 제어하는 부울 플래그를 추가 할 수 있습니다. 그냥 생각 : D –