2017-12-28 38 views
0

左から来るメニューにスライドを作成しようとしていますが、何かをしてその代わりに右に来ています。私はプログラムでストーリーボードを使用していないのですが、ほとんどの場合、制約が崩れます。iOSのメニューでスライドする

HERESにスクリーンショット(私がやった、おそらく何か)例えば

Slide Menu - Gone Wrong

import UIKit 

class SideInMenu: NSObject { 

    let blackView = UIView() 

    let collectionView: UICollectionView = { 
     let layout = UICollectionViewFlowLayout() 
     let cv = UICollectionView(frame: .zero, collectionViewLayout: layout) 
     return cv 
    }() 

    @objc func showSlideMenu() { 
     //Show slide in menu Here 

     if let window = UIApplication.shared.keyWindow { 
      blackView.backgroundColor = UIColor(white: 0, alpha: 0.5) 

      blackView.addGestureRecognizer(UITapGestureRecognizer(target: 
       self, action: #selector(handleDismiss))) 

      window.addSubview(blackView) 
      window.addSubview(collectionView) 

      let width: CGFloat = 194 
      let x = window.frame.width - width 
      collectionView.frame = CGRectMake(x, 0, width, window.frame.height) 
      //collectionView.frame = CGRectMake(x, 0, width, window.frame.height) 

      blackView.frame = window.frame 
      blackView.alpha = 0 

      UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 
       1, initialSpringVelocity: 1, options: .curveEaseOut, 
       animations: { 
       self.blackView.alpha = 1 

       self.collectionView.frame = self.CGRectMake(width, 0, self.collectionView.frame.width, self.collectionView.frame.height) 

      }, completion: nil) 

     } 
    } 

    @objc func handleDismiss() { 
     UIView.animate(withDuration: 0.5) { 
      self.blackView.alpha = 0 
      if let window = UIApplication.shared.keyWindow { 
       self.collectionView.frame = self.CGRectMake(window.frame.width, 0, self.collectionView.frame.width, self.collectionView.frame.height) 
      } 
     } 

    } 

    override init() { 
     super.init() 
    } 

    func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect {return CGRect(x: x, y: y, width: width, height: height) 
    } 
} 
+0

フレームを定義します。制約の変更をアニメートすると、ここでそれらを使用しないようにする理由があります。 – slickdaddy

+0

制約を実行するのではなく、制約をアニメーション化する方が良いでしょうか? –

答えて

1

常にxとy 0、0は常に幅、画面のとあれば左上であることを覚えていて、高さは20,20です。左上から右に20px、横に20pxです。 viewDidLoadの中で最初に行うことは、collectionViewsの初期フレームを設定することです。これは、このような画面の外にあります。左そう等からそれで

self.collectionView.frame = self.CGRectMake(-width, 0, self.collectionView.frame.width, self.collectionView.frame.height) 

アニメーション:はMINUS幅を忘れないようにしてください

 UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 
      1, initialSpringVelocity: 1, options: .curveEaseOut, 
      animations: { 
      self.blackView.alpha = 1 

      self.collectionView.frame = self.CGRectMake(0, 0, self.collectionView.frame.width, self.collectionView.frame.height) 

     }, completion: nil) 

をして却下:あなたは本当に、明示的に制約の代わりに使用する必要があり

 UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 
      1, initialSpringVelocity: 1, options: .curveEaseOut, 
      animations: { 
      self.blackView.alpha = 1 

      self.collectionView.frame = self.CGRectMake(-width, 0, self.collectionView.frame.width, self.collectionView.frame.height) 

     }, completion: nil) 
+0

ViewDidLoadの部分にエラーが発生しました。 –

+0

エラーが発生しました。 +1 –

+0

@RyanCouchすごい男。喜んで助けてください。それがあなたを助けてくれたら、答えとして投票していただければ幸いです。それ以上の問題がある場合はお知らせください –