2016-05-02 2 views
0

Я пытаюсь анимировать 2 UIViews, присутствует UIView1, а при нажатии кнопки UIView2 скользит справа налево и занимает экран, перемещая UIView1 в сторону.Проблемы с анимацией слайдов UIView слева направо?

Эта часть Я успешно смогу с slideLeftTransitionFromView. Однако, при нажатии кнопки снова, чтобы сместить UIView1 слева направо с slideRightTransitionFromView, UIView1 как-то исчезает во время анимации. UIView2 действительно успешно удаляется слева направо, но я не вижу UIView1.

Я уверен, что slideRightTransitionFromView следует аналогичной логике, как slideLeftTransitionFromView, но у меня возникли проблемы с ее работой.

Вот эти 2 функции:

func slideLeftTransitionFromView(view: UIView, toView: UIView, duration: NSTimeInterval, completion: ((Bool) -> Void)?) 
{ 
    if let container = view.superview 
    { 
     // Final position of outgoing view 
     let outgoingViewEndX = view.frame.origin.x - view.frame.size.width 

     // Final position of incoming view (existing frame) 
     let incomingViewEndX = view.frame.origin.x 

     // Start point of incoming view -- at the right edge of the outgoing view 
     let incomingViewStartX = view.frame.origin.x + view.frame.size.width 

     // Distance traveled by outgoing view 
     let outgoingDisplacement = view.frame.origin.x - outgoingViewEndX 

     toView.frame.origin = CGPointMake(incomingViewStartX, toView.frame.origin.y) 
     container.addSubview(toView) 

     dispatch_async(dispatch_get_main_queue(), {() 
      UIView.animateWithDuration(duration, delay: 0, options: .CurveLinear, animations: { 

       view.frame.origin.x = outgoingViewEndX 
       toView.frame.origin.x = incomingViewEndX 

       }, completion: {(complete: Bool) in 

        // If the outgoing view is still in onscreen, keep sliding until it's offscreen 
        if outgoingViewEndX + view.frame.size.width > 0 { 

         // Adjust the duration for the final animation based on the distance it has to travel in order to keep the same velocity. 
         let finalDuration = duration * Double((outgoingViewEndX + view.frame.size.width)/outgoingDisplacement) 

         UIView.animateWithDuration(finalDuration, delay: 0, options: .CurveLinear, animations: { 

          view.frame.origin.x = -view.frame.size.width 
          }, completion: { (complete: Bool) in 
           completion?(complete) 
           view.removeFromSuperview() 
         }) 
        } 
        else 
        { 
         completion?(complete) 
         view.removeFromSuperview() 
        } 
      }) 
     }) 
    } 
} 

func slideRightTransitionFromView(view: UIView, toView: UIView, duration: NSTimeInterval, completion: ((Bool) -> Void)?) 
{ 
    if let container = view.superview 
    { 
     // Final position of outgoing view 
     let outgoingViewEndX = view.frame.origin.x + view.frame.size.width 

     // Final position of incoming view (existing frame) 
     let incomingViewEndX = view.frame.origin.x 

     // Start point of incoming view -- at the left edge of the outgoing view 
     let incomingViewStartX = view.frame.origin.x - view.frame.size.width 

     // Distance traveled by outgoing view 
     let outgoingDisplacement = view.frame.origin.x + outgoingViewEndX 

     toView.frame.origin = CGPointMake(incomingViewStartX, toView.frame.origin.y) 
     container.addSubview(toView) 

     dispatch_async(dispatch_get_main_queue(), {() 
      UIView.animateWithDuration(duration, delay: 0, options: .CurveLinear, animations: { 

       view.frame.origin.x = outgoingViewEndX 
       toView.frame.origin.x = incomingViewEndX 

       }, completion: {(complete: Bool) in 

        // If the outgoing view is still in onscreen, keep sliding until it's offscreen 
        if outgoingViewEndX + view.frame.size.width < 0 { 

         // Adjust the duration for the final animation based on the distance it has to travel in order to keep the same velocity. 
         let finalDuration = duration * Double((outgoingViewEndX + view.frame.size.width)/outgoingDisplacement) 

         UIView.animateWithDuration(finalDuration, delay: 0, options: .CurveLinear, animations: { 

          view.frame.origin.x = view.frame.size.width 
          }, completion: { (complete: Bool) in 
           completion?(complete) 
           view.removeFromSuperview() 
         }) 
        } 
        else 
        { 
         completion?(complete) 
         view.removeFromSuperview() 
        } 
      }) 
     }) 
    } 
} 

Вполне вероятно, что-то простое, но я не могу видеть это. В чем проблема?

Благодаря

ответ

1

Вы, вероятно, объявлен UIView IBOutlet, как слабый вар

в slideLeftTransitionFromView вызова view.removeFromSuperview() удаляет вид с видом иерархией, и я уверен, что ваша точка зрения будет освобождён, так как он является слабым вар а не часть макета больше.

Поэтому вы не видите его, когда пытаетесь добавить его снова, как subview позже. Попробуйте сделать ссылку на переменную var.

+0

Комментирование 'view.removeFromSuperview()' на самом деле помогли снова видеть UIView1, однако, при вызове 'slideRightTransitionFromView', вместо UIView2 скольжения вправо, он немедленно исчезает и UIView1 сразу появляется, без анимации :( – Pangu

+0

зарегистрируйте значения фрейма по тому, сколько значения вы перемещаете, для этого потребуется больше отладки со своей стороны. – Shubhank

+0

Я зарегистрировал значения, и мне казалось, что это правильно. Я изменил 'outgoingViewEndX + view.frame.size. width' to 'view.frame.size.width - outgoingViewEndX' внутри' slideRightTransitionFromView', потому что я думал, что имеет больше смысла. Но он все равно дал те же результаты. – Pangu

Смежные вопросы