     public var isOpen = false
     
     /* Customization */
+    public var itemsPosition: UPActionButtonItemsPosition = .up {
+        didSet {
+            computeOpenSize()
+        }
+    }
     public var itemSize: CGSize = CGSize(width: 30, height: 30) {
         didSet {
             items.forEach({ $0.size = itemSize })

        let path = CGMutablePath()
        path.move(to: item.center)
        if bouncing {
            let bouncingOffset: CGFloat = itemsInterSpacing * -1
            if opening {
                path.addLine(to: CGPoint(x: center.x, y: center.y + bouncingOffset))
                path.addLine(to: CGPoint(x: center.x, y: center.y - (bouncingOffset / 2.0)))

        var containerFrame = containerView.frame
        containerFrame.origin = origin
        containerFrame.size = containerOpenSize
        containerFrame.origin.x -= buttonOpenCenter.x - button.frame.size.width / 2.0
        if case .up = itemsPosition {
            let yOffset: CGFloat = buttonOpenCenter.y - button.frame.size.height / 2.0
            containerFrame.origin.y -= yOffset
        }
        containerView.frame = containerFrame
        
        button.center = buttonOpenCenter
        
        items.forEach({ $0.itemCenter = button.center })
    }
