2016-09-30 4 views
8

私はちょっと立ち往生した異常な動きに遭遇しました。問題は次のとおりです。ボタンをタップして初めてsegueのカスタムアニメーションが再生されない

起動画面として4つのスライドを表示するには、BWWalkthroughライブラリを使用しています。だから私のappdelegateに私はviewcontrollersを初期化し、次のコードを持っている:

let storyboard = UIStoryboard(name: "SlidesFlow", bundle: nil) 

let walkthrough = storyboard.instantiateViewController(withIdentifier: "SlidesView") as! BWWalkthroughViewController 
let page_zero = storyboard.instantiateViewController(withIdentifier: "page_1") 
let page_one = storyboard.instantiateViewController(withIdentifier: "page_2") 
let page_two = storyboard.instantiateViewController(withIdentifier: "page_3") 
let page_three = storyboard.instantiateViewController(withIdentifier: "page_4") 

walkthrough.delegate = self 
walkthrough.addViewController(page_zero) 
walkthrough.addViewController(page_one) 
walkthrough.addViewController(page_two) 
walkthrough.addViewController(page_three) 

すべてが意図したとおりに動作しないので、ここでは何の問題。 ViewController page_threeに私はカスタムセグエアニメーション今

class sentSegueFromRight: UIStoryboardSegue { 

override func perform() 
{ 
    let src = self.source as UIViewController 
    let dst = self.destination as UIViewController 

    src.view.superview?.insertSubview(dst.view, aboveSubview: src.view) 
    dst.view.transform = CGAffineTransform(translationX: src.view.frame.size.width, y: 0) 

    UIView.animate(withDuration: 0.25, 
           delay: 0.0, 
           options: UIViewAnimationOptions.curveEaseInOut, 
           animations: { 
           dst.view.transform = CGAffineTransform(translationX: 0, y: 0) 
     }, 
           completion: { finished in 
           src.present(dst, animated: false, completion: nil) 
     } 
    ) 
} 
} 

を使用して、他のビューコントローラに私をリダイレクトするボタンを持っている問題であり、私は通常のViewControllerのボタンやアニメーション作品なしに同じコードを使用している場合問題。問題は、私がBWWalkthroughの最後のスライドから上で定義したセグを使うときです。最初にボタンをタップすると、表示されるはずのビューコントロールが表示されますが、対応するアニメーションは表示されません。それを閉じると、アニメーションが再生されますが、エラーが返され、再びボタンをテーピングした後:私は、標準的なアニメーションとボタンを使用している場合

切り離さビューコントローラのビューコントローラを提示 は

を落胆さ(私のカスタムアニメーションコードを使用せずに)エラーはなく、デフォルトのアニメーションが再生されます。

私はこの問題を解決できないようです。誰かがこのようなことに遭遇しましたか?

答えて

2

ここでの問題は、追加するさまざまなViewControllerのすべてのビューを表示するためにscrollviewを使用しているBWWalkthroughライブラリにあります。

このように、scrollview(オフセットscreenwidth、0)の先頭にdst.viewを追加し、offset(0,0)に変換します。

これはすべて、ウォークスルーの3番目の画面(オフセット(screenwidth * 3,0))にあるので、これはすべてオフスクリーンです。そのため、アニメーションを見たり、セグが終了したときに表示されたView Controllerを直接見ることはありません。

これを解決するには、スクロールビューのスーパービューにsegueのdst.viewを追加します。すなわち、src.view.superview?.insertSubview(dst.view, aboveSubview: src.view) の代わりにsrc.view.superview?.superview?.insertSubview(dst.view, aboveSubview: src.view)を書きます。

segueを他の場所でも使用する予定がある場合は、segueにタイプチェックを追加して、src.viewのスーパービューが次のようになっているかどうかを確認してください(おそらく、あなたはウォークスルーからセグエを使用していると仮定します)。スクロールビューがあれば、dst.viewをスクロールビューのスーパービューに追加します。

+0

この点を私に指摘していただきありがとうございます。それは理にかなっている。 – Netra

関連する問題