   public func presentView(view: UIView, duration: NSTimeInterval? = 5, position: NoticePosition = .Top, animated: Bool = true, completion: (() -> Void)? = nil) {
 
     if currentNotice != nil {
-      pendingNotice = (view, position)
+      pendingNotice = (view, position, { completion?() })
 
-      dismissCurrentNotice(animated) {[weak self] in
-        if let (pendingView, pendingPosition) = self?.pendingNotice {
-          self?.showView(pendingView, duration: duration, position: pendingPosition, animated: animated, dismissOnTouch: true, completion: completion)
+      dismissCurrentNotice(animated) { [weak self] in
+        if let (pendingView, pendingPosition, pendingCompletion) = self?.pendingNotice {
+          self?.showView(
+            view: pendingView,
+            duration: duration,
+            position: pendingPosition,
+            animated: animated,
+            dismissOnTouch: true,
+            presented: { },
+            completion: pendingCompletion)
           self?.pendingNotice = nil
         }
       }
 
-    } else {
-      showView(view, duration: duration, position: position, animated: animated, dismissOnTouch: true, completion: completion)
+    }
+    else {
+
+      showView(
+        view: view,
+        duration: duration,
+        position: position,
+        animated: animated,
+        dismissOnTouch: true,
+        presented: { },
+        completion: { completion?() })
     }
   }
 
-  private func showView(view: UIView, duration: NSTimeInterval?, position: NoticePosition, animated: Bool, dismissOnTouch: Bool, completion: (() -> Void)? = nil) {
+  private func showView(view view: UIView, duration: NSTimeInterval?, position: NoticePosition, animated: Bool, dismissOnTouch: Bool, presented: () -> Void, completion: () -> Void) {
 
     if dismissOnTouch {
-      view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "noticeTouched"))
+      view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(noticeTouched)))
     }
 
-    currentNotice = (view, position)
+    currentNotice = (view, position, completion)
     addSubview(view)
 
     view.translatesAutoresizingMaskIntoConstraints = false

      view.layer.addAnimation(animation, forKey: "slide in")
      CATransaction.commit()
    } else {
      completion?()
    }
  }

  public func dismissCurrentNotice(animated: Bool = true, completion: (() -> ())? = nil) {
    if let (noticeView, position) = self.currentNotice
      where noticeView.layer.animationForKey("slide out") == nil
    {
      dismissNotice(noticeView, position: position, animated: animated, completion: completion)
    }
  }

  public func dismissNotice(noticeView: UIView, position: NoticePosition, animated: Bool = true, completion: (() -> ())? = nil) {

    let complete: () -> () = { [weak self] in
      if let current = self?.currentNotice?.view where current == noticeView {
        current.removeFromSuperview()
        self?.currentNotice = nil
      }
      completion?()
    }

    if animated {

public class NoticeWindow : UIWindow {

  /// pending notice
  private var pendingNotice: (UIView, NoticePosition, () -> Void)?

  /// current notice view that is presented
  private var currentNotice: (view: UIView, position: NoticePosition, completion: () -> Void)?

  override public var frame: CGRect {
    didSet {

      guard
        let current = self.currentNotice,
        let noticeView = current.view as? NoticeView
        where noticeView.style.adjustTopInsetForStatusBar
      else { return }

