From c32a0d71b0a081359fde5c7fd4fe327722e4b18b Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 10 Dec 2019 15:58:59 -0500 Subject: [PATCH] good working state. --- MVMCoreUI/Atoms/Views/Switch.swift | 111 +++++++++++++++++------------ 1 file changed, 67 insertions(+), 44 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/Switch.swift b/MVMCoreUI/Atoms/Views/Switch.swift index 332bacc5..ee257ce8 100644 --- a/MVMCoreUI/Atoms/Views/Switch.swift +++ b/MVMCoreUI/Atoms/Views/Switch.swift @@ -26,17 +26,12 @@ import UIKit public var isAnimated = true - private var valueShouldChange = true - private var shouldTouchToSwitch = true - private var actionBlock: ActionBlock? // Sizes are from InVision design specs. static let trackSize = CGSize(width: 46, height: 24) static let thumbSize = CGSize(width: 22, height: 22) - static let shakeIntensity: CGFloat = 2 - private var thumbView: View = { let view = View() view.backgroundColor = .white @@ -56,6 +51,12 @@ import UIKit } } + public var isLocked: Bool = false { + didSet { + isUserInteractionEnabled = !isLocked + } + } + open var isOn: Bool = false { didSet { isSelected = isOn @@ -73,21 +74,10 @@ import UIKit }, completion: nil) - UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0.3, 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 - } + UIView.animate(withDuration: 0.33, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0.2, options: [], animations: { - self.thumbWidthConstraint?.constant = Switch.getThumbWidth() + PaddingOne + self.constrainThumb() + self.thumbWidthConstraint?.constant = Switch.getThumbWidth() self.layoutIfNeeded() }, completion: nil) @@ -95,6 +85,7 @@ import UIKit } else { backgroundColor = isOn ? trackTintColor?.on : trackTintColor?.off thumbView.backgroundColor = isOn ? thumbTintColor?.on : thumbTintColor?.off + self.constrainThumb() } FormValidator.enableByValidationWith(delegate: delegateObject?.formValidationProtocol) @@ -116,14 +107,17 @@ import UIKit private var thumbLeadingConstraint: NSLayoutConstraint? private var thumbTrailingConstraint: NSLayoutConstraint? - private var relativeThumbLeadingConstraint: NSLayoutConstraint? - private var relativeThumbTrailingConstraint: NSLayoutConstraint? - private var thumbHeightConstraint: NSLayoutConstraint? private var thumbWidthConstraint: NSLayoutConstraint? private var heightConstraint: NSLayoutConstraint? private var widthConstraint: NSLayoutConstraint? + private func constrainThumb() { + + self.thumbLeadingConstraint?.isActive = isOn + self.thumbTrailingConstraint?.isActive = !isOn + } + //-------------------------------------------------- // MARK: - Initializers //-------------------------------------------------- @@ -186,35 +180,51 @@ import UIKit addSubview(thumbView) - thumbView.heightAnchor.constraint(equalToConstant: Switch.thumbSize.height).isActive = true - thumbView.widthAnchor.constraint(equalToConstant: Switch.thumbSize.width).isActive = true + thumbHeightConstraint = thumbView.heightAnchor.constraint(equalToConstant: Switch.thumbSize.height) + thumbHeightConstraint?.isActive = true + thumbWidthConstraint = thumbView.widthAnchor.constraint(equalToConstant: Switch.thumbSize.width) + thumbWidthConstraint?.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) - relativeThumbTrailingConstraint = trailingAnchor.constraint(greaterThanOrEqualTo: thumbView.trailingAnchor) - relativeThumbTrailingConstraint?.isActive = true - - relativeThumbLeadingConstraint = thumbView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor) thumbLeadingConstraint = thumbView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 1) thumbLeadingConstraint?.isActive = true + let longPress = UILongPressGestureRecognizer(target: self, action: #selector(stretchThumb)) + addGestureRecognizer(longPress) + 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 { - 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 { - 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 { - 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 { - 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) } - public func touchesBegan(_ touches: Set, with event: UIEvent) { - - UIView.animate(withDuration: 0.1, animations: { - self.thumbWidthConstraint?.constant += PaddingOne - self.layoutIfNeeded() - }) - - sendActions(for: .touchDown) - } - public override func touchesEnded(_ touches: Set, with event: UIEvent?) { thumbReformAnimation() - valueShouldChange = true sendActions(for: .touchUpInside) } + /* + open override func touchesMoved(_ touches: Set, 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, with event: UIEvent) { @@ -347,7 +370,7 @@ extension Switch { } 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 {