Commit 42b6d525 by Daniel Dahan

development: added delegation methods to FABMenu

parent 9875036d
...@@ -42,8 +42,8 @@ open class Button: UIButton, PulseableMotion { ...@@ -42,8 +42,8 @@ open class Button: UIButton, PulseableMotion {
/// A Pulse reference. /// A Pulse reference.
fileprivate var pulse: PulseMotion! fileprivate var pulse: PulseMotion!
/// PulseMotionAnimation value. /// PulseAnimation value.
open var pulseAnimation: PulseMotionAnimation { open var pulseAnimation: PulseAnimation {
get { get {
return pulse.animation return pulse.animation
} }
...@@ -52,7 +52,7 @@ open class Button: UIButton, PulseableMotion { ...@@ -52,7 +52,7 @@ open class Button: UIButton, PulseableMotion {
} }
} }
/// PulseMotionAnimation color. /// PulseAnimation color.
@IBInspectable @IBInspectable
open var pulseColor: UIColor { open var pulseColor: UIColor {
get { get {
......
...@@ -43,8 +43,8 @@ open class CollectionReusableView: UICollectionReusableView, PulseableMotion { ...@@ -43,8 +43,8 @@ open class CollectionReusableView: UICollectionReusableView, PulseableMotion {
/// A Pulse reference. /// A Pulse reference.
fileprivate var pulse: PulseMotion! fileprivate var pulse: PulseMotion!
/// PulseMotionAnimation value. /// PulseAnimation value.
open var pulseAnimation: PulseMotionAnimation { open var pulseAnimation: PulseAnimation {
get { get {
return pulse.animation return pulse.animation
} }
...@@ -53,7 +53,7 @@ open class CollectionReusableView: UICollectionReusableView, PulseableMotion { ...@@ -53,7 +53,7 @@ open class CollectionReusableView: UICollectionReusableView, PulseableMotion {
} }
} }
/// PulseMotionAnimation color. /// PulseAnimation color.
@IBInspectable @IBInspectable
open var pulseColor: UIColor { open var pulseColor: UIColor {
get { get {
......
...@@ -43,8 +43,8 @@ open class CollectionViewCell: UICollectionViewCell, PulseableMotion { ...@@ -43,8 +43,8 @@ open class CollectionViewCell: UICollectionViewCell, PulseableMotion {
/// A Pulse reference. /// A Pulse reference.
fileprivate var pulse: PulseMotion! fileprivate var pulse: PulseMotion!
/// PulseMotionAnimation value. /// PulseAnimation value.
open var pulseAnimation: PulseMotionAnimation { open var pulseAnimation: PulseAnimation {
get { get {
return pulse.animation return pulse.animation
} }
...@@ -53,7 +53,7 @@ open class CollectionViewCell: UICollectionViewCell, PulseableMotion { ...@@ -53,7 +53,7 @@ open class CollectionViewCell: UICollectionViewCell, PulseableMotion {
} }
} }
/// PulseMotionAnimation color. /// PulseAnimation color.
@IBInspectable @IBInspectable
open var pulseColor: UIColor { open var pulseColor: UIColor {
get { get {
......
...@@ -42,7 +42,6 @@ open class FABButton: Button { ...@@ -42,7 +42,6 @@ open class FABButton: Button {
super.prepare() super.prepare()
depthPreset = .depth1 depthPreset = .depth1
shapePreset = .circle shapePreset = .circle
pulseAnimation = .centerWithBacking
backgroundColor = .white backgroundColor = .white
} }
} }
...@@ -51,7 +51,7 @@ extension UIViewController { ...@@ -51,7 +51,7 @@ extension UIViewController {
open class FABMenuController: RootController { open class FABMenuController: RootController {
/// Reference to the MenuView. /// Reference to the MenuView.
@IBInspectable @IBInspectable
open let menu = FABMenu() open let fabMenu = FABMenu()
open override func layoutSubviews() { open override func layoutSubviews() {
super.layoutSubviews() super.layoutSubviews()
...@@ -67,67 +67,68 @@ open class FABMenuController: RootController { ...@@ -67,67 +67,68 @@ open class FABMenuController: RootController {
*/ */
open override func prepare() { open override func prepare() {
super.prepare() super.prepare()
prepareMenu() prepareFABMenu()
} }
} }
extension FABMenuController { extension FABMenuController {
/// Prepares the Menu. /// Prepares the fabMenu.
fileprivate func prepareMenu() { fileprivate func prepareFABMenu() {
menu.zPosition = 1000 fabMenu.delegate = self
view.addSubview(menu) fabMenu.zPosition = 1000
view.addSubview(fabMenu)
} }
} }
extension FABMenuController { extension FABMenuController: FABMenuDelegate {
/**
Opens the menu with a callback.
- Parameter completion: An Optional callback that is executed when
all menu items have been opened.
*/
open func openMenu(completion: ((UIView) -> Void)? = nil) {
if true == isUserInteractionEnabled {
isUserInteractionEnabled = false
UIView.animate(withDuration: 0.15, animations: { [weak self] in
guard let s = self else {
return
}
s.rootViewController.view.alpha = 0.15
})
menu.open { [completion = completion] (view) in
completion?(view)
}
}
}
/** // /**
Opens the menu with a callback. // Opens the menu with a callback.
- Parameter completion: An Optional callback that is executed when // - Parameter completion: An Optional callback that is executed when
all menu items have been closed. // all menu items have been opened.
*/ // */
open func closeMenu(completion: ((UIView) -> Void)? = nil) { // open func openMenu(completion: ((UIView) -> Void)? = nil) {
if false == isUserInteractionEnabled { // if true == isUserInteractionEnabled {
UIView.animate(withDuration: 0.15, animations: { [weak self] in // isUserInteractionEnabled = false
guard let s = self else { //
return // UIView.animate(withDuration: 0.15, animations: { [weak self] in
} // guard let s = self else {
s.rootViewController.view.alpha = 1 // return
}) // }
// s.rootViewController.view.alpha = 0.15
menu.close { [weak self] (view) in // })
guard let s = self else { //
return // fabMenu.open { [completion = completion] (view) in
} // completion?(view)
// }
completion?(view) // }
// }
if view == s.menu.items.last { //
s.isUserInteractionEnabled = true // /**
} // Opens the menu with a callback.
} // - Parameter completion: An Optional callback that is executed when
} // all menu items have been closed.
} // */
// open func closeMenu(completion: ((UIView) -> Void)? = nil) {
// if false == isUserInteractionEnabled {
// UIView.animate(withDuration: 0.15, animations: { [weak self] in
// guard let s = self else {
// return
// }
// s.rootViewController.view.alpha = 1
// })
//
// fabMenu.close { [weak self] (view) in
// guard let s = self else {
// return
// }
//
// completion?(view)
//
// if view == s.fabMenu.items.last {
// s.isUserInteractionEnabled = true
// }
// }
// }
// }
} }
...@@ -61,7 +61,7 @@ open class Menu: View, SpringableMotion { ...@@ -61,7 +61,7 @@ open class Menu: View, SpringableMotion {
open weak var delegate: MenuDelegate? open weak var delegate: MenuDelegate?
/// The direction in which the animation opens the menu. /// The direction in which the animation opens the menu.
open var springDirection = SpringMotionDirection.up { open var springDirection = SpringDirection.up {
didSet { didSet {
layoutSubviews() layoutSubviews()
} }
......
...@@ -30,8 +30,8 @@ ...@@ -30,8 +30,8 @@
import UIKit import UIKit
@objc(PulseMotionAnimation) @objc(PulseAnimation)
public enum PulseMotionAnimation: Int { public enum PulseAnimation: Int {
case none case none
case center case center
case centerWithBacking case centerWithBacking
...@@ -43,8 +43,8 @@ public enum PulseMotionAnimation: Int { ...@@ -43,8 +43,8 @@ public enum PulseMotionAnimation: Int {
} }
public protocol PulseableMotion { public protocol PulseableMotion {
/// A reference to the PulseMotionAnimation. /// A reference to the PulseAnimation.
var pulseAnimation: PulseMotionAnimation { get set } var pulseAnimation: PulseAnimation { get set }
/// A UIColor. /// A UIColor.
var pulseColor: UIColor { get set } var pulseColor: UIColor { get set }
...@@ -63,8 +63,8 @@ public struct PulseMotion { ...@@ -63,8 +63,8 @@ public struct PulseMotion {
/// Pulse layers. /// Pulse layers.
fileprivate var layers = [CAShapeLayer]() fileprivate var layers = [CAShapeLayer]()
/// A reference to the PulseMotionAnimation. /// A reference to the PulseAnimation.
public var animation = PulseMotionAnimation.pointWithBacking public var animation = PulseAnimation.pointWithBacking
/// A UIColor. /// A UIColor.
public var color = Color.grey.base public var color = Color.grey.base
......
...@@ -34,8 +34,8 @@ open class PulseView: View, PulseableMotion { ...@@ -34,8 +34,8 @@ open class PulseView: View, PulseableMotion {
/// A Pulse reference. /// A Pulse reference.
fileprivate var pulse: PulseMotion! fileprivate var pulse: PulseMotion!
/// PulseMotionAnimation value. /// PulseAnimation value.
open var pulseAnimation: PulseMotionAnimation { open var pulseAnimation: PulseAnimation {
get { get {
return pulse.animation return pulse.animation
} }
...@@ -44,7 +44,7 @@ open class PulseView: View, PulseableMotion { ...@@ -44,7 +44,7 @@ open class PulseView: View, PulseableMotion {
} }
} }
/// PulseMotionAnimation color. /// PulseAnimation color.
@IBInspectable @IBInspectable
open var pulseColor: UIColor { open var pulseColor: UIColor {
get { get {
......
...@@ -30,8 +30,8 @@ ...@@ -30,8 +30,8 @@
import UIKit import UIKit
@objc(SpringMotionDirection) @objc(SpringDirection)
public enum SpringMotionDirection: Int { public enum SpringDirection: Int {
case up case up
case down case down
case left case left
...@@ -39,13 +39,13 @@ public enum SpringMotionDirection: Int { ...@@ -39,13 +39,13 @@ public enum SpringMotionDirection: Int {
} }
public protocol SpringableMotion { public protocol SpringableMotion {
/// A SpringMotionDirection value. /// A SpringDirection value.
var springDirection: SpringMotionDirection { get set } var springDirection: SpringDirection { get set }
} }
open class SpringMotion { open class SpringMotion {
/// A SpringMotionDirection value. /// A SpringDirection value.
open var direction = SpringMotionDirection.up open var direction = SpringDirection.up
/// A Boolean that indicates if the menu is open or not. /// A Boolean that indicates if the menu is open or not.
open var isOpened = false open var isOpened = false
...@@ -92,20 +92,13 @@ open class SpringMotion { ...@@ -92,20 +92,13 @@ open class SpringMotion {
open func reload() { open func reload() {
isOpened = false isOpened = false
guard let first = views.first else { for i in 0..<views.count {
return
}
first.frame.size = baseSize
first.zPosition = 10000
for i in 1..<views.count {
let v = views[i] let v = views[i]
v.alpha = 0 v.alpha = 0
v.isHidden = true v.isHidden = true
v.frame.size = itemSize v.frame.size = itemSize
v.x = first.x + (baseSize.width - itemSize.width) / 2 v.x = (baseSize.width - itemSize.width) / 2
v.y = first.y + (baseSize.height - itemSize.height) / 2 v.y = (baseSize.height - itemSize.height) / 2
v.zPosition = CGFloat(10000 - views.count - i) v.zPosition = CGFloat(10000 - views.count - i)
} }
} }
...@@ -239,11 +232,7 @@ extension SpringMotion { ...@@ -239,11 +232,7 @@ extension SpringMotion {
- Parameter completion: A completion block to execute on each view's animation. - Parameter completion: A completion block to execute on each view's animation.
*/ */
fileprivate func expandUp(duration: TimeInterval, delay: TimeInterval, usingSpringWithDamping: CGFloat, initialSpringVelocity: CGFloat, options: UIViewAnimationOptions, animations: ((UIView) -> Void)?, completion: ((UIView) -> Void)?) { fileprivate func expandUp(duration: TimeInterval, delay: TimeInterval, usingSpringWithDamping: CGFloat, initialSpringVelocity: CGFloat, options: UIViewAnimationOptions, animations: ((UIView) -> Void)?, completion: ((UIView) -> Void)?) {
guard let first = views.first else { for i in 0..<views.count {
return
}
for i in 1..<views.count {
let v = views[i] let v = views[i]
v.isHidden = false v.isHidden = false
...@@ -252,10 +241,9 @@ extension SpringMotion { ...@@ -252,10 +241,9 @@ extension SpringMotion {
usingSpringWithDamping: usingSpringWithDamping, usingSpringWithDamping: usingSpringWithDamping,
initialSpringVelocity: initialSpringVelocity, initialSpringVelocity: initialSpringVelocity,
options: options, options: options,
animations: { [s = self, first = first, v = v] in animations: { [s = interimSpace, m = CGFloat(i + 1), v = v] in
v.alpha = 1 v.alpha = 1
v.y = first.y - CGFloat(i) * v.height - CGFloat(i) * s.interimSpace v.y = -m * (v.height + s)
animations?(v) animations?(v)
}) { [weak self, v = v] _ in }) { [weak self, v = v] _ in
self?.handleOpenCompletion(view: v, completion: completion) self?.handleOpenCompletion(view: v, completion: completion)
...@@ -274,11 +262,7 @@ extension SpringMotion { ...@@ -274,11 +262,7 @@ extension SpringMotion {
- Parameter completion: A completion block to execute on each view's animation. - Parameter completion: A completion block to execute on each view's animation.
*/ */
fileprivate func contractUp(duration: TimeInterval, delay: TimeInterval, usingSpringWithDamping: CGFloat, initialSpringVelocity: CGFloat, options: UIViewAnimationOptions, animations: ((UIView) -> Void)?, completion: ((UIView) -> Void)?) { fileprivate func contractUp(duration: TimeInterval, delay: TimeInterval, usingSpringWithDamping: CGFloat, initialSpringVelocity: CGFloat, options: UIViewAnimationOptions, animations: ((UIView) -> Void)?, completion: ((UIView) -> Void)?) {
guard let first = views.first else { for i in 0..<views.count {
return
}
for i in 1..<views.count {
let v = views[i] let v = views[i]
UIView.animate(withDuration: Double(i) * duration, UIView.animate(withDuration: Double(i) * duration,
...@@ -286,10 +270,9 @@ extension SpringMotion { ...@@ -286,10 +270,9 @@ extension SpringMotion {
usingSpringWithDamping: usingSpringWithDamping, usingSpringWithDamping: usingSpringWithDamping,
initialSpringVelocity: initialSpringVelocity, initialSpringVelocity: initialSpringVelocity,
options: options, options: options,
animations: { [base = first, v = v] in animations: { [v = v] in
v.alpha = 0 v.alpha = 0
v.y = base.y v.y = 0
animations?(v) animations?(v)
}) { [weak self, v = v] _ in }) { [weak self, v = v] _ in
self?.handleCloseCompletion(view: v, completion: completion) self?.handleCloseCompletion(view: v, completion: completion)
...@@ -314,7 +297,7 @@ extension SpringMotion { ...@@ -314,7 +297,7 @@ extension SpringMotion {
let h = baseSize.height let h = baseSize.height
for i in 1..<views.count { for i in 0..<views.count {
let v = views[i] let v = views[i]
v.isHidden = false v.isHidden = false
...@@ -351,7 +334,7 @@ extension SpringMotion { ...@@ -351,7 +334,7 @@ extension SpringMotion {
let h = baseSize.height let h = baseSize.height
for i in 1..<views.count { for i in 0..<views.count {
let v = views[i] let v = views[i]
UIView.animate(withDuration: Double(i) * duration, UIView.animate(withDuration: Double(i) * duration,
...@@ -385,7 +368,7 @@ extension SpringMotion { ...@@ -385,7 +368,7 @@ extension SpringMotion {
return return
} }
for i in 1..<views.count { for i in 0..<views.count {
let v = views[i] let v = views[i]
v.isHidden = false v.isHidden = false
...@@ -420,7 +403,7 @@ extension SpringMotion { ...@@ -420,7 +403,7 @@ extension SpringMotion {
return return
} }
for i in 1..<views.count { for i in 0..<views.count {
let v = views[i] let v = views[i]
UIView.animate(withDuration: Double(i) * duration, UIView.animate(withDuration: Double(i) * duration,
...@@ -456,7 +439,7 @@ extension SpringMotion { ...@@ -456,7 +439,7 @@ extension SpringMotion {
let h = baseSize.height let h = baseSize.height
for i in 1..<views.count { for i in 0..<views.count {
let v = views[i] let v = views[i]
v.isHidden = false v.isHidden = false
...@@ -493,7 +476,7 @@ extension SpringMotion { ...@@ -493,7 +476,7 @@ extension SpringMotion {
let w = baseSize.width let w = baseSize.width
for i in 1..<views.count { for i in 0..<views.count {
let v = views[i] let v = views[i]
UIView.animate(withDuration: Double(i) * duration, UIView.animate(withDuration: Double(i) * duration,
......
...@@ -42,8 +42,8 @@ open class TableViewCell: UITableViewCell, PulseableMotion { ...@@ -42,8 +42,8 @@ open class TableViewCell: UITableViewCell, PulseableMotion {
/// A Pulse reference. /// A Pulse reference.
fileprivate var pulse: PulseMotion! fileprivate var pulse: PulseMotion!
/// PulseMotionAnimation value. /// PulseAnimation value.
open var pulseAnimation: PulseMotionAnimation { open var pulseAnimation: PulseAnimation {
get { get {
return pulse.animation return pulse.animation
} }
...@@ -52,7 +52,7 @@ open class TableViewCell: UITableViewCell, PulseableMotion { ...@@ -52,7 +52,7 @@ open class TableViewCell: UITableViewCell, PulseableMotion {
} }
} }
/// PulseMotionAnimation color. /// PulseAnimation color.
@IBInspectable @IBInspectable
open var pulseColor: UIColor { open var pulseColor: UIColor {
get { get {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment