2015-09-28 2 views
1

У меня есть подкласс UIView, который называется TitleView, этот подкласс действительно переопределяет layerClass, чтобы вернуть CATransformLayer.Двухсторонний UIView не работает

В моем titleView недвижимости есть некоторые подземелья; a titleBackgroundView и titleLabel.

Когда я запускаю свой код, то отображается верхний слой titleView (зеленый фон), но когда я запускаю свою флип-анимацию, анимации нет. Код просто переходит в конечное состояние. Кроме того, не видно ни одного нижнего слоя (красный фон), просто обратная версия titleView (преобразованная titleLabel).

В инкубаторе IBOutlet у меня есть следующий код:

@IBOutlet private weak var titleView: TitleView! { 
    didSet { 
     titleView.backgroundColor = UIColor.clearColor() 

     let topLayer = CALayer() 
     topLayer.backgroundColor = UIColor.greenColor().CGColor 
     topLayer.frame = titleView.bounds 
     topLayer.doubleSided = false 
     topLayer.zPosition = 3 

     titleView.layer.addSublayer(topLayer) 

     let bottomLayer = CALayer() 
     bottomLayer.backgroundColor = UIColor.redColor().CGColor 
     bottomLayer.frame = titleView.bounds 
     bottomLayer.doubleSided = false 
     bottomLayer.zPosition = 2 
     bottomLayer.transform = CATransform3DMakeRotation(CGFloat(M_PI), 1, 0, 0) 

     titleView.layer.addSublayer(bottomLayer) 
    } 
} 

titleView анимации код:

private func setIsCategoriesShowing(showCategories: Bool, animated: Bool) 
{ 
    let alreadyInFinishState = (isShowingCategories == showCategories) ? true : false 

    if alreadyInFinishState 
    { 
     return 
    } 

    // Setup animations 

    isAnimatingCategories = true 

    headerView.superview?.bringSubviewToFront(headerView) 

    titleView.layer.setAnchorPointDynamically(CGPoint(x: 0.5, y: 1)) // Change position when updating anchor point 

    // Animate 

    let duration: NSTimeInterval = animated ? 0.8 : 0 
    let options: UIViewAnimationOptions = (showCategories == true) ? [.CurveEaseIn] : [.CurveEaseOut] 
    let newRotationValue: CGFloat = (showCategories == true) ? -179 : 0 
    let damping: CGFloat = (showCategories == true) ? 0.7 : 1 
    let initialSpringVelocity: CGFloat = (showCategories == true) ? 0.5 : 1 

    UIView.animateWithDuration(duration, 
     delay: 0, 
     usingSpringWithDamping: damping, 
     initialSpringVelocity: initialSpringVelocity, 
     options: options, 
     animations: {() -> Void in 

      var rotationAndPerspectiveTransform = CATransform3DIdentity 
      rotationAndPerspectiveTransform.m34 = 1/-500 
      rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, newRotationValue, 1, 0, 0); 

      self.titleView.layer.sublayerTransform = rotationAndPerspectiveTransform; 
     }) { (success) -> Void in 

      if showCategories == false 
      { 
       self.titleView.layer.sublayerTransform = CATransform3DIdentity 
      } 

      self.isAnimatingCategories = false 
      self.isShowingCategories = showCategories 
    } 
} 
+0

UPDATE: установка 'цвет фона titleViewBackgroundView' для четкого цвета показывает красный нижний слой. Но анимация не происходит. –

+0

Кроме того, обратная версия показывает обратную 'titleLabel', когда она не должна –

ответ

0

Итак, учитывая ряд проб и ошибок мне удалось (кажется) исправить мою проблему. Вы можете посмотреть ...

Вот рабочий код:

@IBOutlet private weak var titleView: TitleView! { 
    didSet { 
     let bottomLayer = CALayer() 
     bottomLayer.backgroundColor = UIColor.redColor().CGColor 
     bottomLayer.frame = titleView.bounds 
     bottomLayer.doubleSided = false 
     bottomLayer.zPosition = 2 
     bottomLayer.transform = CATransform3DMakeRotation(CGFloat(M_PI), 0, 1, 0) // Reverse bottom layer, so when flipped it's visible. 

     titleView.layer.addSublayer(bottomLayer) 

     // All subviews are one-sided 

     for subview in titleView.subviews 
     { 
      subview.layer.doubleSided = false 
     } 
    } 
} 

@IBOutlet private weak var titleViewBackgroundView: UIView! 

Анимация Код:

private func setIsCategoriesShowing(showCategories: Bool, animated: Bool) 
{ 
    let alreadyInFinishState = (isShowingCategories == showCategories) ? true : false 

    if alreadyInFinishState 
    { 
     return 
    } 

    // Housekeeping 

    headerView.superview?.bringSubviewToFront(headerView) 

    titleView.layer.setAnchorPointDynamically(CGPoint(x: 0.5, y: 1)) 

    // Animate 

    isAnimatingCategories = true 

    let isOpening = (showCategories == true) 

    let duration: NSTimeInterval = animated ? 3 : 0 
    let damping: CGFloat = isOpening ? 0.7 : 1 
    let initialSpringVelocity: CGFloat = isOpening ? 0.5 : 1 
    let options: UIViewAnimationOptions = isOpening ? [.CurveEaseIn] : [.CurveEaseOut] 

    let newRotationValue: CGFloat = isOpening ? -179 : 0 

    var rotationAndPerspectiveTransform = CATransform3DIdentity 
    rotationAndPerspectiveTransform.m34 = 1/-500 
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, newRotationValue, 1, 0, 0); 

    UIView.animateWithDuration(duration, 
     delay: 0, 
     usingSpringWithDamping: damping, 
     initialSpringVelocity: initialSpringVelocity, 
     options: options, 
     animations: { 

      self.titleView.layer.transform = rotationAndPerspectiveTransform; 
     }) { (success) -> Void in 

      if !isOpening 
      { 
       self.titleView.layer.transform = CATransform3DIdentity 
      } 

      self.isAnimatingCategories = !success 
      self.isShowingCategories = showCategories 
    } 
} 
Смежные вопросы