good working state.

This commit is contained in:
Kevin G Christiano 2019-12-10 15:58:59 -05:00
parent ab0ff64677
commit c32a0d71b0

View File

@ -26,17 +26,12 @@ import UIKit
public var isAnimated = true public var isAnimated = true
private var valueShouldChange = true
private var shouldTouchToSwitch = true
private var actionBlock: ActionBlock? private var actionBlock: ActionBlock?
// Sizes are from InVision design specs. // Sizes are from InVision design specs.
static let trackSize = CGSize(width: 46, height: 24) static let trackSize = CGSize(width: 46, height: 24)
static let thumbSize = CGSize(width: 22, height: 22) static let thumbSize = CGSize(width: 22, height: 22)
static let shakeIntensity: CGFloat = 2
private var thumbView: View = { private var thumbView: View = {
let view = View() let view = View()
view.backgroundColor = .white view.backgroundColor = .white
@ -56,6 +51,12 @@ import UIKit
} }
} }
public var isLocked: Bool = false {
didSet {
isUserInteractionEnabled = !isLocked
}
}
open var isOn: Bool = false { open var isOn: Bool = false {
didSet { didSet {
isSelected = isOn isSelected = isOn
@ -73,21 +74,10 @@ import UIKit
}, completion: nil) }, completion: nil)
UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0.3, options: [], animations: { UIView.animate(withDuration: 0.33, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0.2, options: [], animations: {
if self.isOn {
self.thumbLeadingConstraint?.isActive = true
self.thumbTrailingConstraint?.isActive = false
self.relativeThumbLeadingConstraint?.isActive = false
self.relativeThumbTrailingConstraint?.isActive = true
} else {
self.thumbLeadingConstraint?.isActive = false
self.thumbTrailingConstraint?.isActive = true
self.relativeThumbLeadingConstraint?.isActive = true
self.relativeThumbTrailingConstraint?.isActive = false
}
self.thumbWidthConstraint?.constant = Switch.getThumbWidth() + PaddingOne self.constrainThumb()
self.thumbWidthConstraint?.constant = Switch.getThumbWidth()
self.layoutIfNeeded() self.layoutIfNeeded()
}, completion: nil) }, completion: nil)
@ -95,6 +85,7 @@ import UIKit
} else { } else {
backgroundColor = isOn ? trackTintColor?.on : trackTintColor?.off backgroundColor = isOn ? trackTintColor?.on : trackTintColor?.off
thumbView.backgroundColor = isOn ? thumbTintColor?.on : thumbTintColor?.off thumbView.backgroundColor = isOn ? thumbTintColor?.on : thumbTintColor?.off
self.constrainThumb()
} }
FormValidator.enableByValidationWith(delegate: delegateObject?.formValidationProtocol) FormValidator.enableByValidationWith(delegate: delegateObject?.formValidationProtocol)
@ -116,14 +107,17 @@ import UIKit
private var thumbLeadingConstraint: NSLayoutConstraint? private var thumbLeadingConstraint: NSLayoutConstraint?
private var thumbTrailingConstraint: NSLayoutConstraint? private var thumbTrailingConstraint: NSLayoutConstraint?
private var relativeThumbLeadingConstraint: NSLayoutConstraint?
private var relativeThumbTrailingConstraint: NSLayoutConstraint?
private var thumbHeightConstraint: NSLayoutConstraint? private var thumbHeightConstraint: NSLayoutConstraint?
private var thumbWidthConstraint: NSLayoutConstraint? private var thumbWidthConstraint: NSLayoutConstraint?
private var heightConstraint: NSLayoutConstraint? private var heightConstraint: NSLayoutConstraint?
private var widthConstraint: NSLayoutConstraint? private var widthConstraint: NSLayoutConstraint?
private func constrainThumb() {
self.thumbLeadingConstraint?.isActive = isOn
self.thumbTrailingConstraint?.isActive = !isOn
}
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Initializers // MARK: - Initializers
//-------------------------------------------------- //--------------------------------------------------
@ -186,35 +180,51 @@ import UIKit
addSubview(thumbView) addSubview(thumbView)
thumbView.heightAnchor.constraint(equalToConstant: Switch.thumbSize.height).isActive = true thumbHeightConstraint = thumbView.heightAnchor.constraint(equalToConstant: Switch.thumbSize.height)
thumbView.widthAnchor.constraint(equalToConstant: Switch.thumbSize.width).isActive = true thumbHeightConstraint?.isActive = true
thumbWidthConstraint = thumbView.widthAnchor.constraint(equalToConstant: Switch.thumbSize.width)
thumbWidthConstraint?.isActive = true
thumbView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true thumbView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
thumbView.topAnchor.constraint(greaterThanOrEqualTo: topAnchor).isActive = true
bottomAnchor.constraint(greaterThanOrEqualTo: thumbView.bottomAnchor).isActive = true
thumbTrailingConstraint = trailingAnchor.constraint(equalTo: thumbView.trailingAnchor, constant: 1) thumbTrailingConstraint = trailingAnchor.constraint(equalTo: thumbView.trailingAnchor, constant: 1)
relativeThumbTrailingConstraint = trailingAnchor.constraint(greaterThanOrEqualTo: thumbView.trailingAnchor)
relativeThumbTrailingConstraint?.isActive = true
relativeThumbLeadingConstraint = thumbView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor)
thumbLeadingConstraint = thumbView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 1) thumbLeadingConstraint = thumbView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 1)
thumbLeadingConstraint?.isActive = true thumbLeadingConstraint?.isActive = true
let longPress = UILongPressGestureRecognizer(target: self, action: #selector(stretchThumb))
addGestureRecognizer(longPress)
accessibilityLabel = MVMCoreUIUtility.hardcodedString(withKey: "Switch_buttonlabel") accessibilityLabel = MVMCoreUIUtility.hardcodedString(withKey: "Switch_buttonlabel")
} }
@objc private func stretchThumb() {
UIView.animate(withDuration: 0.1, animations: {
self.thumbWidthConstraint?.constant = 26
self.layoutIfNeeded()
})
}
class func getTrackWidth() -> CGFloat { class func getTrackWidth() -> CGFloat {
return (MFSizeObject(standardSize: Switch.trackSize.width, standardiPadPortraitSize: CGFloat(Switch.trackSize.width * 1.5)))!.getValueBasedOnApplicationWidth() let trackWidth = Switch.trackSize.width
return (MFSizeObject(standardSize: trackWidth, standardiPadPortraitSize: CGFloat(Switch.trackSize.width * 1.5)))?.getValueBasedOnApplicationWidth() ?? trackWidth
} }
class func getTrackHeight() -> CGFloat { class func getTrackHeight() -> CGFloat {
return (MFSizeObject(standardSize: Switch.trackSize.height, standardiPadPortraitSize: CGFloat(Switch.trackSize.height * 1.5) ))!.getValueBasedOnApplicationWidth() let trackHeight = Switch.trackSize.height
return (MFSizeObject(standardSize: trackHeight, standardiPadPortraitSize: CGFloat(Switch.trackSize.height * 1.5)))?.getValueBasedOnApplicationWidth() ?? trackHeight
} }
class func getThumbWidth() -> CGFloat { class func getThumbWidth() -> CGFloat {
return (MFSizeObject(standardSize: Switch.thumbSize.width, standardiPadPortraitSize: CGFloat(Switch.thumbSize.width * 1.5)))!.getValueBasedOnApplicationWidth() let thumbWidth = Switch.thumbSize.width
return (MFSizeObject(standardSize: thumbWidth, standardiPadPortraitSize: CGFloat(Switch.thumbSize.width * 1.5)))?.getValueBasedOnApplicationWidth() ?? thumbWidth
} }
class func getThumbHeight() -> CGFloat { class func getThumbHeight() -> CGFloat {
return (MFSizeObject(standardSize: Switch.thumbSize.height, standardiPadPortraitSize: CGFloat(Switch.thumbSize.height * 1.5)))!.getValueBasedOnApplicationWidth() let thumbHeight = Switch.thumbSize.width
return (MFSizeObject(standardSize: thumbHeight, standardiPadPortraitSize: CGFloat(Switch.thumbSize.height * 1.5)))?.getValueBasedOnApplicationWidth() ?? thumbHeight
} }
//-------------------------------------------------- //--------------------------------------------------
@ -248,22 +258,35 @@ import UIKit
return area.contains(point) return area.contains(point)
} }
public func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
UIView.animate(withDuration: 0.1, animations: {
self.thumbWidthConstraint?.constant += PaddingOne
self.layoutIfNeeded()
})
sendActions(for: .touchDown)
}
public override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { public override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
thumbReformAnimation() thumbReformAnimation()
valueShouldChange = true
sendActions(for: .touchUpInside) sendActions(for: .touchUpInside)
} }
/*
open override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
if shouldTouchToSwitch {
if touchMoves(toLeft: touches) {
thumbMoveAnitmationTo(on: false)
thumbShakeAnitmationTo(on: false)
thumbReformAnimation(true)
} else {
thumbMoveAnitmationTo(on: true)
thumbShakeAnitmationTo(on: true)
thumbReformAnimation(true)
}
}
if touchIsOutSide(touches) {
sendActions(for: .touchDragOutside)
if !shouldTouchToSwitch {
thumbReformAnimation(true)
}
} else {
sendActions(for: .touchDragInside)
}
}*/
public func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent) { public func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent) {
@ -347,7 +370,7 @@ extension Switch {
} }
if let actionMap = dictionary.optionalDictionaryForKey("actionMap") { if let actionMap = dictionary.optionalDictionaryForKey("actionMap") {
// actionBlock = { MVMCoreActionHandler.shared()?.handleAction(with: actionMap, additionalData: additionalData, delegateObject: delegateObject) } actionBlock = { MVMCoreActionHandler.shared()?.handleAction(with: actionMap, additionalData: additionalData, delegateObject: delegateObject) }
} }
if let isAnimated = dictionary["state"] as? Bool { if let isAnimated = dictionary["state"] as? Bool {