diff --git a/MVMCoreUI/Atomic/Atoms/Views/CaretView.swift b/MVMCoreUI/Atomic/Atoms/Views/CaretView.swift index b3081654..b9de9b3a 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CaretView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CaretView.swift @@ -140,7 +140,7 @@ open class CaretView: View { caretPath.addLine(to: CGPoint(x: frame.size.width - inset, y: frame.size.height - inset)) } - enabledColor.setStroke() + _ = isEnabled ? enabledColor.setStroke() : disabledColor.setStroke() caretPath.stroke() } @@ -160,6 +160,7 @@ open class CaretView: View { isHidden = false backgroundColor = .clear enabledColor = .mvmBlack + disabledColor = .mvmCoolGray3 } /// Ensure you have defined a CaretSize with Orientation before calling. diff --git a/MVMCoreUI/Atomic/Atoms/Views/ImageViewModel.swift b/MVMCoreUI/Atomic/Atoms/Views/ImageViewModel.swift index 86add716..a970e072 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/ImageViewModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/ImageViewModel.swift @@ -24,6 +24,7 @@ public var contentMode: UIView.ContentMode? public var localBundle: Bundle? public var cornerRadius: CGFloat? + public var clipsImage: Bool? //-------------------------------------------------- // MARK: - Initializer @@ -51,5 +52,6 @@ case height case contentMode case cornerRadius + case clipsImage } } diff --git a/MVMCoreUI/Atomic/Atoms/Views/LoadImageView.swift b/MVMCoreUI/Atomic/Atoms/Views/LoadImageView.swift index 532056cb..42267a20 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/LoadImageView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/LoadImageView.swift @@ -254,6 +254,10 @@ import UIKit clipsToBounds = true layer.cornerRadius = cornerRadius } + + if let clipsImage = imageModel.clipsImage { + clipsToBounds = clipsImage + } } // MARK: - load functions diff --git a/MVMCoreUI/Atomic/Atoms/Views/MFTransparentGIFView.swift b/MVMCoreUI/Atomic/Atoms/Views/MFTransparentGIFView.swift index 0c220de5..7dd9e15f 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/MFTransparentGIFView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/MFTransparentGIFView.swift @@ -8,20 +8,24 @@ import UIKit +enum MFTransparentGIFViewError: Error { + case gifNotFoundError +} + @objcMembers public class MFTransparentGIFView: FLAnimatedImageView { var imageData: Data? /** Creates the GIF display view with the passed in frame. frame: frame to set the view to. - ImageName: name of the .gif to load. Should not contain the extension. + ImageName: name of the .gif to load. Should not contain the extension. Local images only. StartImmediately: should the gif immeidately begin playing. If YES, it will start. If NO, call [performAnimations] to start it. Duration: how long the animation takes to loop. Pass a negative value to use the default. LoopCompletionBlock: a block called whenever the gif finishes a loop. animatedImage : set as nil when use this view in reusable cell */ - public init(withFrame frame: CGRect, imageName: String, startImmediately: Bool, duration: TimeInterval, loopCompletionBlock: ((UInt) -> Void)?) { + public init(withFrame frame: CGRect, imageName: String, startImmediately: Bool, duration: TimeInterval, loopCompletionBlock: ((UInt) -> Void)?) throws { super.init(frame: frame) - loadImage(imageName, startImmediately: startImmediately, duration: duration, loopCompletionBlock: loopCompletionBlock) + try loadImage(imageName, startImmediately: startImmediately, duration: duration, loopCompletionBlock: loopCompletionBlock) } public override init(frame: CGRect) { @@ -32,7 +36,7 @@ import UIKit super.init(coder: aDecoder) } - public func loadImage(_ imageName: String, startImmediately: Bool, duration: TimeInterval, loopCompletionBlock: ((UInt) -> Void)?) { + public func loadImage(_ imageName: String, startImmediately: Bool, duration: TimeInterval, loopCompletionBlock: ((UInt) -> Void)?) throws { contentMode = UIView.ContentMode.scaleAspectFill clipsToBounds = true @@ -42,13 +46,10 @@ import UIKit self.loopCompletionBlock = loopCompletionBlock backgroundColor = .clear - var url: URL? - if imageName.contains("http") { - url = URL(string: imageName) - } else { - url = MVMCoreUIUtility.bundleForMVMCoreUI()?.url(forResource: imageName, withExtension: "gif") + guard let url = MVMCoreUIUtility.bundleForMVMCoreUI()?.url(forResource: imageName, withExtension: "gif") else { + throw MFTransparentGIFViewError.gifNotFoundError } - imageData = MFFreebeeHandler.shared()?.freebee_data(withContentsOf: url) + imageData = try Data(contentsOf: url) runLoopMode = RunLoop.Mode.common.rawValue if startImmediately { diff --git a/MVMCoreUI/Atomic/Molecules/Items/AccordionListItemModel.swift b/MVMCoreUI/Atomic/Molecules/Items/AccordionListItemModel.swift index ac299a8b..cd2c12aa 100644 --- a/MVMCoreUI/Atomic/Molecules/Items/AccordionListItemModel.swift +++ b/MVMCoreUI/Atomic/Molecules/Items/AccordionListItemModel.swift @@ -9,12 +9,21 @@ import UIKit class AccordionListItemModel: MoleculeListItemModel { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + override public class var identifier: String { return "accordionListItem" - } + } + public var molecules: [ListItemModelProtocol & MoleculeModelProtocol] public var hideLineWhenExpanded: Bool = false + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + private enum CodingKeys: String, CodingKey { case moleculeName case molecules @@ -22,11 +31,19 @@ class AccordionListItemModel: MoleculeListItemModel { case hideLineWhenExpanded } + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + public override func setDefaults() { super.setDefaults() hideArrow = true } + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) molecules = try typeContainer.decodeModels(codingKey: .molecules) diff --git a/MVMCoreUI/Atomic/Molecules/Items/AccordionMoleculeTableViewCell.swift b/MVMCoreUI/Atomic/Molecules/Items/AccordionMoleculeTableViewCell.swift index f6e6dd6f..8488703d 100644 --- a/MVMCoreUI/Atomic/Molecules/Items/AccordionMoleculeTableViewCell.swift +++ b/MVMCoreUI/Atomic/Molecules/Items/AccordionMoleculeTableViewCell.swift @@ -8,20 +8,29 @@ import UIKit + @objcMembers public class AccordionMoleculeTableViewCell: MoleculeTableViewCell { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + var accordionListItemModel: AccordionListItemModel? { return listItemModel as? AccordionListItemModel } - let accordionButton = createAccordionButton() - static func createAccordionButton() -> Button { + let accordionButton: Button = { let accordionButton = Button(type: .custom) accordionButton.setTitle("+", for: .normal) accordionButton.setTitleColor(.black, for: .normal) accordionButton.titleLabel?.font = UIFont.systemFont(ofSize: 40, weight: .ultraLight) accordionButton.frame = CGRect(x: 0, y: 0, width: 20, height: 20) + accordionButton.translatesAutoresizingMaskIntoConstraints = true return accordionButton - } + }() + + //-------------------------------------------------- + // MARK: - Setup + //-------------------------------------------------- override public func setupView() { customAccessoryView = true @@ -29,11 +38,13 @@ import UIKit accessoryView = accordionButton } - override public func didSelectCell(at index: IndexPath, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) { - accordionButton.isSelected = !accordionButton.isSelected + override public func didSelectCell(at index: IndexPath, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { + + accordionButton.isSelected.toggle() accordionButton.setTitle(accordionButton.isSelected ? "-" : "+", for: .normal) + guard let model = accordionListItemModel else { return } - + if accordionButton.isSelected { if let indexPath = delegateObject?.moleculeDelegate?.getIndexPath(for: model) { delegateObject?.moleculeDelegate?.addMolecules(model.molecules, indexPath: indexPath, animation: .automatic) diff --git a/MVMCoreUI/Atomic/Molecules/OtherContainers/BGImageMolecule.swift b/MVMCoreUI/Atomic/Molecules/OtherContainers/BGImageMolecule.swift index 1c39975e..4aa811a1 100644 --- a/MVMCoreUI/Atomic/Molecules/OtherContainers/BGImageMolecule.swift +++ b/MVMCoreUI/Atomic/Molecules/OtherContainers/BGImageMolecule.swift @@ -10,7 +10,7 @@ import Foundation open class BGImageMolecule: MoleculeContainer { - let image = LoadImageView(pinnedEdges: .all) + public let image = LoadImageView(pinnedEdges: .all) open override func setupView() { super.setupView() diff --git a/MVMCoreUI/Atomic/Molecules/OtherContainers/BGImageMoleculeModel.swift b/MVMCoreUI/Atomic/Molecules/OtherContainers/BGImageMoleculeModel.swift index 83b5931d..2dbfced5 100644 --- a/MVMCoreUI/Atomic/Molecules/OtherContainers/BGImageMoleculeModel.swift +++ b/MVMCoreUI/Atomic/Molecules/OtherContainers/BGImageMoleculeModel.swift @@ -9,7 +9,7 @@ import Foundation open class BGImageMoleculeModel: MoleculeContainerModel { - public override class var identifier: String { + open override class var identifier: String { return "bgImageContainer" } public var image: ImageViewModel @@ -44,7 +44,7 @@ open class BGImageMoleculeModel: MoleculeContainerModel { try super.init(from: decoder) } - public override func encode(to encoder: Encoder) throws { + open override func encode(to encoder: Encoder) throws { try super.encode(to: encoder) var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(image, forKey: .image) diff --git a/MVMCoreUI/BaseClasses/TableViewCell.swift b/MVMCoreUI/BaseClasses/TableViewCell.swift index 65c05e53..8f936020 100644 --- a/MVMCoreUI/BaseClasses/TableViewCell.swift +++ b/MVMCoreUI/BaseClasses/TableViewCell.swift @@ -8,8 +8,12 @@ import UIKit -@objcMembers open class TableViewCell: UITableViewCell, MoleculeViewProtocol, MoleculeListCellProtocol, MVMCoreViewProtocol, MFButtonProtocol { +@objcMembers open class TableViewCell: UITableViewCell, MoleculeViewProtocol, MoleculeListCellProtocol, MVMCoreViewProtocol, MFButtonProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + open var molecule: MoleculeViewProtocol? open var listItemModel: ListItemModelProtocol? public let containerHelper = ContainerHelper() @@ -30,7 +34,10 @@ import UIKit private var initialSetupPerformed = false + //-------------------------------------------------- // MARK: - Styling + //-------------------------------------------------- + open func styleLine(with style: ListItemStyle?) { switch style { case .standard?: