ExpandableButton


Requirements
Installation
- Add the following line to your
Podfile:
pod 'ExpandableButton'
pod 'ExpandableButton', '~> 1.0.0'
- Add
use_frameworks! to your Podfile.
- Run
pod install.
- Add to files:
import ExpandableButton
Usage
You can init ExpandableButton with frame (default is .zero), direction (default is .right) and items (each item will be button). direction is opening direction. items is [ExpandableButtonItem] whiches contain information about future buttons.
Diretions example:
let rightButton = ExpandableButtonView(frame: frame, direction: .right, items: items)
let leftButton = ExpandableButtonView(frame: frame, direction: .left, items: items)
let upButton = ExpandableButtonView(frame: frame, direction: .up, items: items)
let downButton = ExpandableButtonView(frame: frame, direction: .down, items: items)

Items with image and action:
let items = [
ExpandableButtonItem(
image: UIImage(named: "delete"),
action: {_ in
print("delete")
}
),
ExpandableButtonItem(
image: UIImage(named: "edit"),
action: {_ in
print("edit")
}
),
ExpandableButtonItem(
image: UIImage(named: "share"),
action: { _ in
print("share")
}
)
]
let buttonView = ExpandableButtonView(items: items)
buttonView.frame = CGRect(x: 0, y: 0, width: 60, height: 60)
buttonView.backgroundColor = .white
view.addSubview(buttonView)

With image, highlightedImage, imageEdgeInsets:
let insets = UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16)
let items = [
ExpandableButtonItem(
image: UIImage(named: "delete"),
highlightedImage: UIImage(named: "highlightedDelete"),
imageEdgeInsets: insets,
action: {_ in
print("delete")
}
)
...
]

arrowWidth, separatorWidth and cornerRadius:
buttonView.arrowWidth = 2
buttonView.separatorWidth = 2
buttonView.layer.cornerRadius = 30

Custom icons for open and close actions, closeOpenImagesInsets:
buttonView.openImage = UIImage(named: "open")
buttonView.closeImage = UIImage(named: "close")
buttonView.closeOpenImagesInsets = insets

With attributedTitle, highlightedAttributedTitle and custom item size:
let items = [
ExpandableButtonItem(
attributedTitle: NSAttributedString(
string: "Attributed Text",
attributes: [.foregroundColor: UIColor.red]
),
highlightedAttributedTitle: NSAttributedString(
string: "Attributed Text",
attributes: [.foregroundColor: UIColor.green]
),
size: CGSize(width: 160, height: 60)
)
]

With attributedTitle under image (using contentEdgeInsets, titleEdgeInsets, imageEdgeInsets, titleAlignment, imageContentMode, size):
let attributedTitle = NSAttributedString(
string: "Share",
attributes: [.foregroundColor: UIColor.black,
.font: UIFont.systemFont(ofSize: 12)]
)
let highlightedAttributedTitle = NSAttributedString(
string: "Share",
attributes: [.foregroundColor: UIColor.lightGray,
.font: UIFont.systemFont(ofSize: 12)]
)
let items = [
ExpandableButtonItem(
image: UIImage(named: "share"),
highlightedImage: UIImage(named: "haglightedShare"),
attributedTitle: attributedTitle,
highlightedAttributedTitle: highlightedAttributedTitle,
contentEdgeInsets: UIEdgeInsets(top: 6, left: 6, bottom: 6, right: 6),
titleEdgeInsets: UIEdgeInsets(top: 24, left: -200, bottom: 0, right: 0),
imageEdgeInsets: UIEdgeInsets(top: 6, left: 0, bottom: 24, right: 0),
size: CGSize(width: 80, height: 60),
titleAlignment: .center,
imageContentMode: .scaleAspectFit
)
]

You can also open() and close():
let buttonView = ExpandableButtonView(items: items)
buttonView.open()
buttonView.close()
All options
direction | Direction | .right | Opening direction. Could be .left, .right, .up, .down. Set only on init(frame:direction:items:). |
state | State | .closed | Current state. Could be .opened, .closed or .animating. |
animationDuration | TimeInterval | 0.2 | Opening, closing and arrow animation duration. |
closeOnAction | Bool | false | If true call close() after any item action. |
isHapticFeedback | Bool | true | Turn on haptic feedback (Taptic engine) |
arrowInsets | UIEdgeInsets | top: 12 left: 12 bottom: 12 right: 12 | Arrow insets. |
arrowWidth | CGFloat | 1 | Arrow line width. |
arrowColor | UIColor | UIColor.black | Arrow color. |
closeOpenImagesInsets | UIEdgeInsets | .zero | Insets for custom close and open images. |
closeImage | UIImage? | nil | Custom close image. |
openImage | UIImage? | nil | Custom open image. |
isSeparatorHidden | Bool | false | If true hide separator view. |
separatorColor | UIColor | UIColor.black | Separator color. |
separatorInset | CGFloat | 8 | Separator inset from top, bottom for .left, .right directions and from left, right for up, down. |
separatorWidth | CGFloat | 1 | Separator view width. |
image | UIImage? | nil | Image for .normal state. |
highlightedImage | UIImage? | nil | Image for .highlighted state. |
attributedTitle | NSAttributedString? | nil | Attributed string for .normal state. |
highlightedAttributedTitle | NSAttributedString? | nil | Attributed string for .highlighted state. |
contentEdgeInsets | UIEdgeInsets | .zero | contentEdgeInsets for UIButton |
titleEdgeInsets | UIEdgeInsets | .zero | titleEdgeInsets for UIButton. |
imageEdgeInsets | UIEdgeInsets | .zero | imageEdgeInsets for UIButton. |
size | CGSize? | nil | UIButton size for current item. If nil will be equal to arrow button size. |
titleAlignment | NSTextAlignment | .center | titleAlignment for titleLabel in UIButton. |
imageContentMode | UIViewContentMode | .scaleAspectFit | imageContentMode for imageView in UIButton. |
action | (ExpandableButtonItem) -> Void | {_ in} | Action closure. Calls on .touchUpInside |
identifier | String | "" | Identifier for ExpandableButtonItem. |
You can also use ArrowButton (button which can drow left, right, up and down arrows using core graphics, just call showLeftArrow(), showRightArrow(), showUpArrow() or showDownArrow()) and ActionButton (simple UIButton but with actionBlock propertie which calls on .touchUpInside) in your projects.
License
ExpandableButton is under MIT license. See the LICENSE file for more info.