       }
     }
   }
+
+  // MARK: - Private methods
+
+  private func textRowHeight() -> CGFloat {
+    var rowHeight: CGFloat = 0
+
+    if let config = config {
+      let infoConfig = config.campaign.info
+
+      if let textNode = textNode {
+        let size = textNode.measure(CGSize(
+          width: width,
+          height: CGFloat(FLT_MAX)))
+        rowHeight = size.height
+      }
+
+      if let iconNode = iconNode {
+        if infoConfig.text.icon.size.height > rowHeight {
+          rowHeight = infoConfig.text.icon.size.height
+        }
+      }
+    }
+
+    return rowHeight
+  }
 }

        height += size.height + infoConfig.verticalPadding
      }

      if let textNode = textNode {
        let size = textNode.measure(CGSize(
          width: width,
          height: CGFloat(FLT_MAX)))
        height += size.height + infoConfig.verticalPadding
      }

      if let divider = divider {

        y += size.height + padding
      }

      let rowHeight = textRowHeight()
      if rowHeight > 0 {
        if let textNode = textNode {
          let size = textNode.calculatedSize
          var rowX = (width - size.width) / CGFloat(2)

          if let iconNode = iconNode {
            let iconWidth = infoConfig.text.icon.padding
              + infoConfig.text.icon.size.width
            rowX -= iconWidth / CGFloat(2)

            let size = infoConfig.text.icon.size
            iconNode.frame = CGRect(
              x: rowX,
              y: y + (rowHeight - size.height) / CGFloat(2),
              width: size.width,
              height: size.height)

            rowX += iconWidth
          }

          textNode.frame = CGRect(
            x: rowX,
            y: y + (rowHeight - size.height) / CGFloat(2),
            width: size.width,
            height: size.height)

          y += rowHeight + padding
        }
      }

      if let divider = divider {
