2017-11-09 11 views
1

ボタンが選択されたときに画面全体をオーバーレイするビューを作成しました。具体的には、UICollectionViewCellの内部にUIButtonがあり、クリックすると、デバイスのウィンドウ全体にオーバーレイがレンダリングされます。オーバーレイは、UIVisualEffectViewがオーバーレイの親ビューであるUIView階層です。前述のUIButtonが選択されると、UIVisualEffectViewがViewController.viewプロパティにサブビューとして追加されます。UITapGestureRecognizerを使用してUIViewを削除すると、2回のクリック(スウィフト)が必要です

また、UITisGestureRecognizerをUIVisualEffectViewに追加しました。これを選択すると、ViewController.viewサブビューからの削除を介して、オーバーレイ全体が消えます。

唯一の問題は、UITapGestureRecognizerの動作です。オーバーレイが消えるまで2回クリックする必要があります。トレース印刷ステートメントを追加すると、最初のクリックでUITapGestureRecognizerアクションの#selector関数が起動しますが、もう一度クリックするか、シミュレータフレームをクリックする(シミュレータを移動する)、オーバーレイが消えるまでは表示されません正しく。私はこれがスレッドや制御を返す必要があるかもしれないと思うが、それを特定することはできない。以下は関連するコードです。どんな助けもありがとうございます。

注:DispatchQueue.main.async()ブロック内にあるremoveFromSuperviewステートメントを使用する場合と使用しない場合を実行しました。行動は同じでもなくても同じです。 UIViewControllerのサブクラスで

セットアップ:

var blurBackground = UIVisualEffectView(effect: UIBlurEffect(style: UIBlurEffectStyle.dark)) 

blurBackground.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(unblurView)))  

ターゲットアクションは、トレースステートメントを経由して発射されることが確認さ:

func unblurView() { 
    UIView.animate(withDuration: 0.2, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: { 
     print("In unblur func") 
     self.blurBackground.alpha = 0.0 

     DispatchQueue.main.async(execute: { 
      self.blurBackground.removeFromSuperview() 
      print("In unblur func - main thread removefromsuperview") 
     }) 

    }, completion: nil) 
} 

それが役に立つならば、私はオーバーレイビューを追加することに関連するコードを追加することができますビューコントローラビューのサブビューに追加します。

答えて

0

次のビューコントローラで新しいシングルビューアプリケーションプロジェクトを作成するには、私

class ViewController: UIViewController { 

    var blurBackground = UIVisualEffectView(effect: UIBlurEffect(style: UIBlurEffectStyle.dark)) 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     blurBackground.frame = self.view.frame 
     blurBackground.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(ViewController.unblurView))) 
     view.addSubview(blurBackground) 
    } 

    @objc func unblurView() { 
     UIView.animate(withDuration: 0.2, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: { 
      print("In unblur func") 
      self.blurBackground.alpha = 0.0 
      DispatchQueue.main.async(execute: { 
       self.blurBackground.removeFromSuperview() 
       print("In unblur func - main thread removefromsuperview") 
      }) 
     }, completion: nil) 
    } 
} 

どのようにあなたがビューにblurBackgroundを追加するためだけで正常に動作しますか?

+0

あなたのコメントの後、私はMBPでこれを実行しようとしました、そして、それは働いています。問題は私のHackintoshにありました。それがそれと関係があるかどうかは分かりません。本当に奇妙です。しかし、私はblurBackgroundがアニメーション化されているので、ユーザはTapGestureが終了する前にアニメーションが完了するまで待たなければならないと考えています。これは予想される動作のようですか? –