Commit 42b6d525 by Daniel Dahan

development: added delegation methods to FABMenu

parent 9875036d
......@@ -42,8 +42,8 @@ open class Button: UIButton, PulseableMotion {
/// A Pulse reference.
fileprivate var pulse: PulseMotion!
/// PulseMotionAnimation value.
open var pulseAnimation: PulseMotionAnimation {
/// PulseAnimation value.
open var pulseAnimation: PulseAnimation {
get {
return pulse.animation
}
......@@ -52,7 +52,7 @@ open class Button: UIButton, PulseableMotion {
}
}
/// PulseMotionAnimation color.
/// PulseAnimation color.
@IBInspectable
open var pulseColor: UIColor {
get {
......
......@@ -43,8 +43,8 @@ open class CollectionReusableView: UICollectionReusableView, PulseableMotion {
/// A Pulse reference.
fileprivate var pulse: PulseMotion!
/// PulseMotionAnimation value.
open var pulseAnimation: PulseMotionAnimation {
/// PulseAnimation value.
open var pulseAnimation: PulseAnimation {
get {
return pulse.animation
}
......@@ -53,7 +53,7 @@ open class CollectionReusableView: UICollectionReusableView, PulseableMotion {
}
}
/// PulseMotionAnimation color.
/// PulseAnimation color.
@IBInspectable
open var pulseColor: UIColor {
get {
......
......@@ -43,8 +43,8 @@ open class CollectionViewCell: UICollectionViewCell, PulseableMotion {
/// A Pulse reference.
fileprivate var pulse: PulseMotion!
/// PulseMotionAnimation value.
open var pulseAnimation: PulseMotionAnimation {
/// PulseAnimation value.
open var pulseAnimation: PulseAnimation {
get {
return pulse.animation
}
......@@ -53,7 +53,7 @@ open class CollectionViewCell: UICollectionViewCell, PulseableMotion {
}
}
/// PulseMotionAnimation color.
/// PulseAnimation color.
@IBInspectable
open var pulseColor: UIColor {
get {
......
......@@ -42,7 +42,6 @@ open class FABButton: Button {
super.prepare()
depthPreset = .depth1
shapePreset = .circle
pulseAnimation = .centerWithBacking
backgroundColor = .white
}
}
......@@ -51,7 +51,7 @@ extension UIViewController {
open class FABMenuController: RootController {
/// Reference to the MenuView.
@IBInspectable
open let menu = FABMenu()
open let fabMenu = FABMenu()
open override func layoutSubviews() {
super.layoutSubviews()
......@@ -67,67 +67,68 @@ open class FABMenuController: RootController {
*/
open override func prepare() {
super.prepare()
prepareMenu()
prepareFABMenu()
}
}
extension FABMenuController {
/// Prepares the Menu.
fileprivate func prepareMenu() {
menu.zPosition = 1000
view.addSubview(menu)
/// Prepares the fabMenu.
fileprivate func prepareFABMenu() {
fabMenu.delegate = self
fabMenu.zPosition = 1000
view.addSubview(fabMenu)
}
}
extension FABMenuController {
/**
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
})
extension FABMenuController: FABMenuDelegate {
menu.open { [completion = completion] (view) in
completion?(view)
}
}
}
/**
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
})
menu.close { [weak self] (view) in
guard let s = self else {
return
}
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 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
// })
//
// fabMenu.open { [completion = completion] (view) in
// completion?(view)
// }
// }
// }
//
// /**
// 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 {
open weak var delegate: MenuDelegate?
/// The direction in which the animation opens the menu.
open var springDirection = SpringMotionDirection.up {
open var springDirection = SpringDirection.up {
didSet {
layoutSubviews()
}
......
......@@ -30,8 +30,8 @@
import UIKit
@objc(PulseMotionAnimation)
public enum PulseMotionAnimation: Int {
@objc(PulseAnimation)
public enum PulseAnimation: Int {
case none
case center
case centerWithBacking
......@@ -43,8 +43,8 @@ public enum PulseMotionAnimation: Int {
}
public protocol PulseableMotion {
/// A reference to the PulseMotionAnimation.
var pulseAnimation: PulseMotionAnimation { get set }
/// A reference to the PulseAnimation.
var pulseAnimation: PulseAnimation { get set }
/// A UIColor.
var pulseColor: UIColor { get set }
......@@ -63,8 +63,8 @@ public struct PulseMotion {
/// Pulse layers.
fileprivate var layers = [CAShapeLayer]()
/// A reference to the PulseMotionAnimation.
public var animation = PulseMotionAnimation.pointWithBacking
/// A reference to the PulseAnimation.
public var animation = PulseAnimation.pointWithBacking
/// A UIColor.
public var color = Color.grey.base
......
......@@ -34,8 +34,8 @@ open class PulseView: View, PulseableMotion {
/// A Pulse reference.
fileprivate var pulse: PulseMotion!
/// PulseMotionAnimation value.
open var pulseAnimation: PulseMotionAnimation {
/// PulseAnimation value.
open var pulseAnimation: PulseAnimation {
get {
return pulse.animation
}
......@@ -44,7 +44,7 @@ open class PulseView: View, PulseableMotion {
}
}
/// PulseMotionAnimation color.
/// PulseAnimation color.
@IBInspectable
open var pulseColor: UIColor {
get {
......
......@@ -30,8 +30,8 @@
import UIKit
@objc(SpringMotionDirection)
public enum SpringMotionDirection: Int {
@objc(SpringDirection)
public enum SpringDirection: Int {
case up
case down
case left
......@@ -39,13 +39,13 @@ public enum SpringMotionDirection: Int {
}
public protocol SpringableMotion {
/// A SpringMotionDirection value.
var springDirection: SpringMotionDirection { get set }
/// A SpringDirection value.
var springDirection: SpringDirection { get set }
}
open class SpringMotion {
/// A SpringMotionDirection value.
open var direction = SpringMotionDirection.up
/// A SpringDirection value.
open var direction = SpringDirection.up
/// A Boolean that indicates if the menu is open or not.
open var isOpened = false
......@@ -92,20 +92,13 @@ open class SpringMotion {
open func reload() {
isOpened = false
guard let first = views.first else {
return
}
first.frame.size = baseSize
first.zPosition = 10000
for i in 1..<views.count {
for i in 0..<views.count {
let v = views[i]
v.alpha = 0
v.isHidden = true
v.frame.size = itemSize
v.x = first.x + (baseSize.width - itemSize.width) / 2
v.y = first.y + (baseSize.height - itemSize.height) / 2
v.x = (baseSize.width - itemSize.width) / 2
v.y = (baseSize.height - itemSize.height) / 2
v.zPosition = CGFloat(10000 - views.count - i)
}
}
......@@ -239,11 +232,7 @@ extension SpringMotion {
- 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)?) {
guard let first = views.first else {
return
}
for i in 1..<views.count {
for i in 0..<views.count {
let v = views[i]
v.isHidden = false
......@@ -252,10 +241,9 @@ extension SpringMotion {
usingSpringWithDamping: usingSpringWithDamping,
initialSpringVelocity: initialSpringVelocity,
options: options,
animations: { [s = self, first = first, v = v] in
animations: { [s = interimSpace, m = CGFloat(i + 1), v = v] in
v.alpha = 1
v.y = first.y - CGFloat(i) * v.height - CGFloat(i) * s.interimSpace
v.y = -m * (v.height + s)
animations?(v)
}) { [weak self, v = v] _ in
self?.handleOpenCompletion(view: v, completion: completion)
......@@ -274,11 +262,7 @@ extension SpringMotion {
- 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)?) {
guard let first = views.first else {
return
}
for i in 1..<views.count {
for i in 0..<views.count {
let v = views[i]
UIView.animate(withDuration: Double(i) * duration,
......@@ -286,10 +270,9 @@ extension SpringMotion {
usingSpringWithDamping: usingSpringWithDamping,
initialSpringVelocity: initialSpringVelocity,
options: options,
animations: { [base = first, v = v] in
animations: { [v = v] in
v.alpha = 0
v.y = base.y
v.y = 0
animations?(v)
}) { [weak self, v = v] _ in
self?.handleCloseCompletion(view: v, completion: completion)
......@@ -314,7 +297,7 @@ extension SpringMotion {
let h = baseSize.height
for i in 1..<views.count {
for i in 0..<views.count {
let v = views[i]
v.isHidden = false
......@@ -351,7 +334,7 @@ extension SpringMotion {
let h = baseSize.height
for i in 1..<views.count {
for i in 0..<views.count {
let v = views[i]
UIView.animate(withDuration: Double(i) * duration,
......@@ -385,7 +368,7 @@ extension SpringMotion {
return
}
for i in 1..<views.count {
for i in 0..<views.count {
let v = views[i]
v.isHidden = false
......@@ -420,7 +403,7 @@ extension SpringMotion {
return
}
for i in 1..<views.count {
for i in 0..<views.count {
let v = views[i]
UIView.animate(withDuration: Double(i) * duration,
......@@ -456,7 +439,7 @@ extension SpringMotion {
let h = baseSize.height
for i in 1..<views.count {
for i in 0..<views.count {
let v = views[i]
v.isHidden = false
......@@ -493,7 +476,7 @@ extension SpringMotion {
let w = baseSize.width
for i in 1..<views.count {
for i in 0..<views.count {
let v = views[i]
UIView.animate(withDuration: Double(i) * duration,
......
......@@ -42,8 +42,8 @@ open class TableViewCell: UITableViewCell, PulseableMotion {
/// A Pulse reference.
fileprivate var pulse: PulseMotion!
/// PulseMotionAnimation value.
open var pulseAnimation: PulseMotionAnimation {
/// PulseAnimation value.
open var pulseAnimation: PulseAnimation {
get {
return pulse.animation
}
......@@ -52,7 +52,7 @@ open class TableViewCell: UITableViewCell, PulseableMotion {
}
}
/// PulseMotionAnimation color.
/// PulseAnimation color.
@IBInspectable
open var pulseColor: UIColor {
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