ボタンが選択されたときに画面全体をオーバーレイするビューを作成しました。具体的には、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)
}
それが役に立つならば、私はオーバーレイビューを追加することに関連するコードを追加することができますビューコントローラビューのサブビューに追加します。
あなたのコメントの後、私はMBPでこれを実行しようとしました、そして、それは働いています。問題は私のHackintoshにありました。それがそれと関係があるかどうかは分かりません。本当に奇妙です。しかし、私はblurBackgroundがアニメーション化されているので、ユーザはTapGestureが終了する前にアニメーションが完了するまで待たなければならないと考えています。これは予想される動作のようですか? –