Я пытаюсь анимировать 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()
}
})
})
}
}
Вполне вероятно, что-то простое, но я не могу видеть это. В чем проблема?
Благодаря
Комментирование 'view.removeFromSuperview()' на самом деле помогли снова видеть UIView1, однако, при вызове 'slideRightTransitionFromView', вместо UIView2 скольжения вправо, он немедленно исчезает и UIView1 сразу появляется, без анимации :( – Pangu
зарегистрируйте значения фрейма по тому, сколько значения вы перемещаете, для этого потребуется больше отладки со своей стороны. – Shubhank
Я зарегистрировал значения, и мне казалось, что это правильно. Я изменил 'outgoingViewEndX + view.frame.size. width' to 'view.frame.size.width - outgoingViewEndX' внутри' slideRightTransitionFromView', потому что я думал, что имеет больше смысла. Но он все равно дал те же результаты. – Pangu