2017-03-16 7 views
0

「閉じるボタン」ビューを含むUIScrollViewから継承するカスタムクラスがあります。 "閉じるボタン"を押すと、アニメーションスケールの変換を行い、その後、SuperViewから全体のビューを削除したいと思います。swift UIView.animateはアニメーションをスキップします

class AddReview : UIScrollView { 

override init(frame: CGRect){ 
    super.init(frame: frame) 

    let closeButton = CloseButtonView() 
    closeButton.frame = CGRect(x:frame.maxX - 50, y:0, width: 50, height: 50) 
    self.addSubview(closeButton) 

    let tapCloseGestureRecognizer = UITapGestureRecognizer(target:self, action:#selector(closeButtonPressed)) 
    closeButton.isUserInteractionEnabled = true 
    closeButton.addGestureRecognizer(tapCloseGestureRecognizer) 
} 

func closeButtonPressed(){ 
    UIView.animate(withDuration: 0.3){ 
     self.transform = CGAffineTransform(scaleX: 1.1, y: 1.1) 
    } 

    UIView.animate(withDuration: 0.2, delay: 0.4, animations: {() -> Void in 
     self.transform = CGAffineTransform(scaleX: 0.1, y: 0.1) 
    }, completion: { (finished: Bool) -> Void in 
     if (finished) 
     { 
      //self.removeFromSuperview() 
     } 
    }) 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

} 

私の問題は、アニメーションが発生しないことです。ビューが直ちに削除されるか、またはremoveFromSuperviewがコメントアウトされている場合、アニメーションなしでそのサイズが10%にリサイズされます。

私はlayoutIfNeeded、メインキューのディスパッチなどを試しましたが、他にもたくさんありましたが、nothigは動作していました。

さらに、私はときどき動作していることに気付きましたが、ほとんどの場合動作しません。

何が問題なのですか? アドバイスをいただきありがとうございます:)

+0

二 '最初の1が完了するまでUIView.animate'は待ちません。 2番目のものは最初のものが終了する前に開始されます。私は推測しています.2番目のものは最初のものを上書きし、ビューを削除します。次々に実行したい場合は、連鎖する必要があります。 – Magnas

答えて

0

Magnasが述べたように、2番目のアニメーションは最初のアニメーションが完了する前に呼び出されます。試してみてください:

UIView.animate(withDuration: 0.3, animations: {() -> Void in 
    self.transform = CGAffineTransform(scaleX: 1.1, y: 1.1) 
}, completion: { (finished: Bool) -> Void in 
    // wait for first animation to complete 
    UIView.animate(withDuration: 0.2, animations: {() -> Void in 
     self.transform = CGAffineTransform(scaleX: 0.1, y: 0.1) 
    }, completion: { (finished: Bool) -> Void in 
     if (finished) 
     { 
      //self.removeFromSuperview() 
     } 
    }) 
}) 

この

を少し短くすることができます。

UIView.animate(withDuration: 0.3, animations: { 
    self.transform = CGAffineTransform(scaleX: 1.1, y: 1.1) 
}, completion: { (finished: Bool) -> Void in 
    // wait for first animation to complete 
    UIView.animate(withDuration: 0.2, animations: { 
     self.transform = CGAffineTransform(scaleX: 0.1, y: 0.1) 
    }, completion: { finished in 
     if (finished) 
     { 
      //self.removeFromSuperview() 
     } 
    }) 
}) 
+0

Aleksありがとう、これは動作するようです。しかし、デバッグ中ではなく、一度デバッガをデタッチすると、手動でアプリを終了してから、アプリを再起動してから動作させる必要があります。 –

関連する問題