         drop.setup(status, state: state)
         drop.action = action
         drop.updateHeight()
-
+        
+        guard let superview = drop.superview else { return }
+        superview.layoutIfNeeded()
+        
         topConstraint.constant = 0.0
         UIView.animate(
             withDuration: TimeInterval(0.25),
             delay: TimeInterval(0.0),
             options: [.allowUserInteraction, .curveEaseOut],
-            animations: { [weak drop] () -> Void in
-                if let drop = drop { drop.layoutIfNeeded() }
+            animations: { _ in
+                superview.layoutIfNeeded()
             }, completion: nil
         )
     }

                scheduleUpTimer(0.0, interval: 0.1)
            } else {
                scheduleUpTimer(duration)
                topConstraint.constant = 0.0
                UIView.animate(
                    withDuration: TimeInterval(0.1),
                    delay: TimeInterval(0.0),
                    options: [.allowUserInteraction, .curveEaseOut],
                    animations: { [weak self] () -> Void in
                        if let s = self { s.layoutIfNeeded() }
                    }, completion: nil
                )
            }

    fileprivate class func up(_ drop: Drop, interval: TimeInterval) {
        guard let heightConstant = drop.heightConstraint?.constant else { return }
        drop.topConstraint?.constant = -heightConstant
        
        guard let superview = drop.superview else { return }
        
        UIView.animate(
            withDuration: interval,
            delay: TimeInterval(0.0),
            options: [.allowUserInteraction, .curveEaseIn],
            animations: { _ in
                superview.layoutIfNeeded()
            }) { [weak drop] finished -> Void in
                if let drop = drop { drop.removeFromSuperview() }
        }
