     }
     
     // MARK: Private Methods
-    private func infoBannerViewHeight() -> CGFloat {
-        if let navigationController = self.topViewController?.parentViewController as? UINavigationController {
-            return navigationController.navigationBarHidden ? RADInfoBannerViewWithoutNavigationBarHeight : RADInfoBannerViewWithNavigationBarHeight
+    func hideInfoBannerView(animated: Bool = true) {
+        // if already removed then just return
+        guard let _ = self.superview else {
+            return
         }
-        return RADInfoBannerViewWithNavigationBarHeight
+        
+        if animated {
+            // set height back to 0
+            self.heightConstraint.constant = 0.0
+            UIView.animateWithDuration(0.3, animations: { () -> Void in
+                self.superview!.layoutIfNeeded()
+            }, completion: { (finished) -> Void in
+                self.removeFromSuperview()
+            })
+        } else {
+            self.removeFromSuperview()
+        }
+    }
+    
+    func textLabelHeight() -> CGFloat {
+        let textString = NSString(string: self.textLabel.text!)
+        
+        let screenWidth = CGRectGetWidth(UIScreen.mainScreen().bounds)
+        let constraintRect = CGSize(width: screenWidth * 0.8, height: CGFloat.max)
+        let boundingBox = textString.boundingRectWithSize(constraintRect, options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName: self.textLabel.font], context: nil)
+        let calculatedHeight = boundingBox.size.height + RADInfoBannerViewHeightPadding
+        return calculatedHeight > RADInfoBannerViewHeight ? calculatedHeight : RADInfoBannerViewHeight
     }
     
     // MARK: Public Methods
-    public func show(inController topViewController: UIViewController? = UIApplication.topViewController()) -> Self {
+    public func show(inController topViewController: UIViewController? = nil) -> Self {
         // get top view controller
-        guard let topViewController = topViewController else {
-            fatalError("no top view controller detected")
+        if let topViewController = topViewController {
+            self.topViewController = topViewController
+        } else {
+            self.topViewController = UIApplication.topViewController()
         }
-        self.topViewController = topViewController
         
         // first remove all banners
-        RADInfoBannerView.hideAllInfoBannerViewInView(topViewController.view)
+        RADInfoBannerView.hideAllInfoBannerViewInView(self.topViewController!.view)
         
         // add to view
-        topViewController.view.addSubview(self)
-        topViewController.view.layoutIfNeeded()
-        topViewController.view.updateConstraintsIfNeeded()
-        // compute the correct height of the info banner view
-        self.heightConstraint.constant = self.infoBannerViewHeight()
+        self.topViewController!.view.addSubview(self)
+        self.topViewController!.view.layoutIfNeeded()
+        self.topViewController!.view.updateConstraintsIfNeeded()
+        // set height of the info banner view
+        self.heightConstraint.constant = self.textLabelHeight()
         UIView.animateWithDuration(0.3, animations: { () -> Void in
             self.layoutIfNeeded()
         })

    }
    
    override public func updateConstraints() {
        var topOffset: CGFloat = 0.0
        if let navigationController = self.topViewController as? UINavigationController {
            if navigationController.navigationBarHidden == false {
                topOffset = 20.0 + CGRectGetHeight(navigationController.navigationBar.frame) // 20 px for status bar + navigation bar height
            }
        }
        

        self.textLabel.font = UIFont.systemFontOfSize(14.0)
        self.textLabel.textAlignment = .Center
        self.textLabel.textColor = UIColor.whiteColor()
        self.textLabel.numberOfLines = 0
        self.addSubview(self.textLabel)
        
        self.activityIndicatorView.translatesAutoresizingMaskIntoConstraints = false
