Merge branch 'feature/carousel_separator' into 'develop'
Feature/carousel separator See merge request BPHV_MIPS/mvm_core_ui!620
This commit is contained in:
commit
c60d41c03a
@ -496,6 +496,8 @@
|
|||||||
D2E2A99F23E07F8A000B42E6 /* PillButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A99E23E07F8A000B42E6 /* PillButton.swift */; };
|
D2E2A99F23E07F8A000B42E6 /* PillButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A99E23E07F8A000B42E6 /* PillButton.swift */; };
|
||||||
D2E2A9A123E095AB000B42E6 /* ButtonModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A9A023E095AB000B42E6 /* ButtonModelProtocol.swift */; };
|
D2E2A9A123E095AB000B42E6 /* ButtonModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A9A023E095AB000B42E6 /* ButtonModelProtocol.swift */; };
|
||||||
D2E2A9A323E096B1000B42E6 /* DisableableModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A9A223E096B1000B42E6 /* DisableableModelProtocol.swift */; };
|
D2E2A9A323E096B1000B42E6 /* DisableableModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A9A223E096B1000B42E6 /* DisableableModelProtocol.swift */; };
|
||||||
|
D2EAC0A02541EFFB00AA9495 /* LineDecorationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EAC09F2541EFFB00AA9495 /* LineDecorationView.swift */; };
|
||||||
|
D2EAC0A42541F00F00AA9495 /* CarouselCollectionLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EAC0A32541F00F00AA9495 /* CarouselCollectionLayout.swift */; };
|
||||||
D2EC7BD52527B7A600F540AF /* MoleculeSectionHeaderModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EC7BD42527B7A600F540AF /* MoleculeSectionHeaderModel.swift */; };
|
D2EC7BD52527B7A600F540AF /* MoleculeSectionHeaderModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EC7BD42527B7A600F540AF /* MoleculeSectionHeaderModel.swift */; };
|
||||||
D2EC7BD92527B7CF00F540AF /* MoleculeSectionHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EC7BD82527B7CF00F540AF /* MoleculeSectionHeader.swift */; };
|
D2EC7BD92527B7CF00F540AF /* MoleculeSectionHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EC7BD82527B7CF00F540AF /* MoleculeSectionHeader.swift */; };
|
||||||
D2EC7BDD2527B83700F540AF /* SectionHeaderFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EC7BDC2527B83700F540AF /* SectionHeaderFooterView.swift */; };
|
D2EC7BDD2527B83700F540AF /* SectionHeaderFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2EC7BDC2527B83700F540AF /* SectionHeaderFooterView.swift */; };
|
||||||
@ -1007,6 +1009,8 @@
|
|||||||
D2E2A99E23E07F8A000B42E6 /* PillButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PillButton.swift; sourceTree = "<group>"; };
|
D2E2A99E23E07F8A000B42E6 /* PillButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PillButton.swift; sourceTree = "<group>"; };
|
||||||
D2E2A9A023E095AB000B42E6 /* ButtonModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonModelProtocol.swift; sourceTree = "<group>"; };
|
D2E2A9A023E095AB000B42E6 /* ButtonModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonModelProtocol.swift; sourceTree = "<group>"; };
|
||||||
D2E2A9A223E096B1000B42E6 /* DisableableModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisableableModelProtocol.swift; sourceTree = "<group>"; };
|
D2E2A9A223E096B1000B42E6 /* DisableableModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisableableModelProtocol.swift; sourceTree = "<group>"; };
|
||||||
|
D2EAC09F2541EFFB00AA9495 /* LineDecorationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineDecorationView.swift; sourceTree = "<group>"; };
|
||||||
|
D2EAC0A32541F00F00AA9495 /* CarouselCollectionLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselCollectionLayout.swift; sourceTree = "<group>"; };
|
||||||
D2EC7BD42527B7A600F540AF /* MoleculeSectionHeaderModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeSectionHeaderModel.swift; sourceTree = "<group>"; };
|
D2EC7BD42527B7A600F540AF /* MoleculeSectionHeaderModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeSectionHeaderModel.swift; sourceTree = "<group>"; };
|
||||||
D2EC7BD82527B7CF00F540AF /* MoleculeSectionHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeSectionHeader.swift; sourceTree = "<group>"; };
|
D2EC7BD82527B7CF00F540AF /* MoleculeSectionHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeSectionHeader.swift; sourceTree = "<group>"; };
|
||||||
D2EC7BDC2527B83700F540AF /* SectionHeaderFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionHeaderFooterView.swift; sourceTree = "<group>"; };
|
D2EC7BDC2527B83700F540AF /* SectionHeaderFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionHeaderFooterView.swift; sourceTree = "<group>"; };
|
||||||
@ -1413,12 +1417,11 @@
|
|||||||
D22479902316A9CB003FCCF9 /* Organisms */ = {
|
D22479902316A9CB003FCCF9 /* Organisms */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
D2EAC09E2541EFE200AA9495 /* Carousel */,
|
||||||
D260105A23D0BB7100764D80 /* StackModelProtocol.swift */,
|
D260105A23D0BB7100764D80 /* StackModelProtocol.swift */,
|
||||||
D260106423D0CEA700764D80 /* StackModel.swift */,
|
D260106423D0CEA700764D80 /* StackModel.swift */,
|
||||||
D260105C23D0BCD400764D80 /* Stack.swift */,
|
D260105C23D0BCD400764D80 /* Stack.swift */,
|
||||||
D21B7F5E2437C5BC00051ABF /* MoleculeStackView.swift */,
|
D21B7F5E2437C5BC00051ABF /* MoleculeStackView.swift */,
|
||||||
012A88AE238C626E00FE3DA1 /* CarouselModel.swift */,
|
|
||||||
D2A6390022CBB1820052ED1F /* Carousel.swift */,
|
|
||||||
);
|
);
|
||||||
path = Organisms;
|
path = Organisms;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -2142,6 +2145,17 @@
|
|||||||
path = TopNotification;
|
path = TopNotification;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
D2EAC09E2541EFE200AA9495 /* Carousel */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
012A88AE238C626E00FE3DA1 /* CarouselModel.swift */,
|
||||||
|
D2A6390022CBB1820052ED1F /* Carousel.swift */,
|
||||||
|
D2EAC09F2541EFFB00AA9495 /* LineDecorationView.swift */,
|
||||||
|
D2EAC0A32541F00F00AA9495 /* CarouselCollectionLayout.swift */,
|
||||||
|
);
|
||||||
|
path = Carousel;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
D2EC7BD22527A1E400F540AF /* HeadersAndFooters */ = {
|
D2EC7BD22527A1E400F540AF /* HeadersAndFooters */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@ -2326,6 +2340,7 @@
|
|||||||
0A6682B5243769C700AD3CA1 /* TextView.swift in Sources */,
|
0A6682B5243769C700AD3CA1 /* TextView.swift in Sources */,
|
||||||
D224799B231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift in Sources */,
|
D224799B231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift in Sources */,
|
||||||
D21B7F602437C5BC00051ABF /* MoleculeStackView.swift in Sources */,
|
D21B7F602437C5BC00051ABF /* MoleculeStackView.swift in Sources */,
|
||||||
|
D2EAC0A02541EFFB00AA9495 /* LineDecorationView.swift in Sources */,
|
||||||
0A6682A42434DB8D00AD3CA1 /* ListLeftVariableRadioButtonBodyTextModel.swift in Sources */,
|
0A6682A42434DB8D00AD3CA1 /* ListLeftVariableRadioButtonBodyTextModel.swift in Sources */,
|
||||||
AA2AD116244EE46800BBFFE3 /* ListDeviceComplexLinkMedium.swift in Sources */,
|
AA2AD116244EE46800BBFFE3 /* ListDeviceComplexLinkMedium.swift in Sources */,
|
||||||
AA7F32AD246C0F8C00C965BA /* ListLeftVariableRadioButtonAllTextAndLinks.swift in Sources */,
|
AA7F32AD246C0F8C00C965BA /* ListLeftVariableRadioButtonAllTextAndLinks.swift in Sources */,
|
||||||
@ -2573,6 +2588,7 @@
|
|||||||
279B1569242BBC2F00921D6C /* ActionModelAdapter.swift in Sources */,
|
279B1569242BBC2F00921D6C /* ActionModelAdapter.swift in Sources */,
|
||||||
BB6C6AC0242232DF005F7224 /* ListOneColumnTextWithWhitespaceDividerTallModel.swift in Sources */,
|
BB6C6AC0242232DF005F7224 /* ListOneColumnTextWithWhitespaceDividerTallModel.swift in Sources */,
|
||||||
8DEFA95E243DAC2F000D27E5 /* ListThreeColumnDataUsageDivider.swift in Sources */,
|
8DEFA95E243DAC2F000D27E5 /* ListThreeColumnDataUsageDivider.swift in Sources */,
|
||||||
|
D2EAC0A42541F00F00AA9495 /* CarouselCollectionLayout.swift in Sources */,
|
||||||
AAE7270E24AC8B9300A3ED0E /* HeadersH2CaretLink.swift in Sources */,
|
AAE7270E24AC8B9300A3ED0E /* HeadersH2CaretLink.swift in Sources */,
|
||||||
0AD93A9F24C0AA5100E56A97 /* ImageView.swift in Sources */,
|
0AD93A9F24C0AA5100E56A97 /* ImageView.swift in Sources */,
|
||||||
D2A638FD22CA98280052ED1F /* HeadlineBody.swift in Sources */,
|
D2A638FD22CA98280052ED1F /* HeadlineBody.swift in Sources */,
|
||||||
|
|||||||
@ -30,7 +30,6 @@ open class MoleculeCollectionViewCell: CollectionViewCell {
|
|||||||
open override func reset() {
|
open override func reset() {
|
||||||
super.reset()
|
super.reset()
|
||||||
molecule?.reset()
|
molecule?.reset()
|
||||||
backgroundColor = .mvmWhite
|
|
||||||
}
|
}
|
||||||
|
|
||||||
open override class func nameForReuse(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> String? {
|
open override class func nameForReuse(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> String? {
|
||||||
|
|||||||
@ -16,11 +16,10 @@ public protocol CarouselPageControlProtocol {
|
|||||||
func scrollViewDidScroll(_ collectionView: UICollectionView)
|
func scrollViewDidScroll(_ collectionView: UICollectionView)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
open class Carousel: View {
|
open class Carousel: View {
|
||||||
|
|
||||||
public let collectionView: CollectionView = {
|
public let collectionView: CollectionView = {
|
||||||
let layout = UICollectionViewFlowLayout()
|
let layout = CarouselCollectionLayout()
|
||||||
layout.scrollDirection = .horizontal
|
layout.scrollDirection = .horizontal
|
||||||
layout.minimumInteritemSpacing = 0
|
layout.minimumInteritemSpacing = 0
|
||||||
layout.minimumLineSpacing = 0
|
layout.minimumLineSpacing = 0
|
||||||
@ -149,10 +148,9 @@ open class Carousel: View {
|
|||||||
|
|
||||||
guard let carouselModel = model as? CarouselModel else { return }
|
guard let carouselModel = model as? CarouselModel else { return }
|
||||||
accessibilityLabel = carouselModel.accessibilityText
|
accessibilityLabel = carouselModel.accessibilityText
|
||||||
collectionView.backgroundColor = backgroundColor
|
collectionView.layer.borderColor = UIColor.mvmCoolGray3.cgColor
|
||||||
collectionView.layer.borderColor = backgroundColor?.cgColor
|
|
||||||
collectionView.layer.borderWidth = (carouselModel.border ?? false) ? 1 : 0
|
collectionView.layer.borderWidth = (carouselModel.border ?? false) ? 1 : 0
|
||||||
backgroundColor = .white
|
(collectionView.collectionViewLayout as? CarouselCollectionLayout)?.useLines = carouselModel.border ?? false
|
||||||
(collectionView.collectionViewLayout as? UICollectionViewFlowLayout)?.minimumLineSpacing = carouselModel.spacing ?? 0
|
(collectionView.collectionViewLayout as? UICollectionViewFlowLayout)?.minimumLineSpacing = carouselModel.spacing ?? 0
|
||||||
|
|
||||||
itemWidthPercent = carouselModel.itemWidthPercent / 100.0
|
itemWidthPercent = carouselModel.itemWidthPercent / 100.0
|
||||||
@ -375,7 +373,7 @@ extension Carousel: UICollectionViewDataSource {
|
|||||||
open func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
open func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
||||||
return molecules?.count ?? 0
|
return molecules?.count ?? 0
|
||||||
}
|
}
|
||||||
|
|
||||||
open func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
open func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
||||||
guard let molecule = molecules?[indexPath.row],
|
guard let molecule = molecules?[indexPath.row],
|
||||||
let moleculeInfo = getMoleculeInfo(with: molecule, delegateObject: nil)
|
let moleculeInfo = getMoleculeInfo(with: molecule, delegateObject: nil)
|
||||||
@ -0,0 +1,65 @@
|
|||||||
|
//
|
||||||
|
// CarouselCollectionLayout.swift
|
||||||
|
// MVMCoreUI
|
||||||
|
//
|
||||||
|
// Created by Scott Pfeil on 10/22/20.
|
||||||
|
// Copyright © 2020 Verizon Wireless. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
open class CarouselCollectionLayout: UICollectionViewFlowLayout {
|
||||||
|
open var useLines = false
|
||||||
|
|
||||||
|
public override init() {
|
||||||
|
super.init()
|
||||||
|
registerViews()
|
||||||
|
}
|
||||||
|
|
||||||
|
required public init?(coder: NSCoder) {
|
||||||
|
super.init(coder: coder)
|
||||||
|
registerViews()
|
||||||
|
}
|
||||||
|
|
||||||
|
open func registerViews() {
|
||||||
|
register(LineDecorationView.self, forDecorationViewOfKind: LineDecorationView.elementKind)
|
||||||
|
}
|
||||||
|
|
||||||
|
open override func layoutAttributesForDecorationView(ofKind elementKind: String, at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
|
||||||
|
// Lines are added between each item
|
||||||
|
guard useLines,
|
||||||
|
elementKind == LineDecorationView.elementKind else { return nil }
|
||||||
|
let attributes = UICollectionViewLayoutAttributes(forDecorationViewOfKind: elementKind, with: indexPath)
|
||||||
|
let itemFrame = layoutAttributesForItem(at: indexPath)?.frame ?? .zero
|
||||||
|
let width: CGFloat = 1.0
|
||||||
|
attributes.frame = CGRect(x: itemFrame.maxX + ((minimumLineSpacing - width) / 2.0), y: 0, width: width, height: itemFrame.height)
|
||||||
|
return attributes
|
||||||
|
}
|
||||||
|
|
||||||
|
func shouldHaveLine(for indexPath: IndexPath) -> Bool {
|
||||||
|
// No line for the final index
|
||||||
|
guard let numberOfSections = collectionView?.numberOfSections,
|
||||||
|
numberOfSections > 0,
|
||||||
|
let numberOfItemsInLastSection = collectionView?.numberOfItems(inSection: numberOfSections - 1),
|
||||||
|
numberOfItemsInLastSection > 0,
|
||||||
|
indexPath.section == numberOfSections - 1,
|
||||||
|
indexPath.row == numberOfItemsInLastSection - 1 else { return true }
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
open override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
|
||||||
|
guard let allAttributes = super.layoutAttributesForElements(in: rect) else { return nil }
|
||||||
|
guard useLines else { return allAttributes }
|
||||||
|
// Add line decorators.
|
||||||
|
var newAttributes = allAttributes
|
||||||
|
allAttributes.forEach { (attributes) in
|
||||||
|
|
||||||
|
guard shouldHaveLine(for: attributes.indexPath),
|
||||||
|
attributes.representedElementCategory == .cell,
|
||||||
|
let lineAttributes = layoutAttributesForDecorationView(ofKind: LineDecorationView.elementKind, at: attributes.indexPath),
|
||||||
|
rect.intersects(lineAttributes.frame) else { return }
|
||||||
|
newAttributes.append(lineAttributes)
|
||||||
|
}
|
||||||
|
return newAttributes
|
||||||
|
}
|
||||||
|
}
|
||||||
20
MVMCoreUI/Atomic/Organisms/Carousel/LineDecorationView.swift
Normal file
20
MVMCoreUI/Atomic/Organisms/Carousel/LineDecorationView.swift
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
//
|
||||||
|
// LineDecorationView.swift
|
||||||
|
// MVMCoreUI
|
||||||
|
//
|
||||||
|
// Created by Scott Pfeil on 10/22/20.
|
||||||
|
// Copyright © 2020 Verizon Wireless. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
public class LineDecorationView: UICollectionReusableView {
|
||||||
|
static public let elementKind = "line"
|
||||||
|
|
||||||
|
public override init(frame: CGRect) {
|
||||||
|
super.init(frame:frame)
|
||||||
|
backgroundColor = .mvmCoolGray3
|
||||||
|
}
|
||||||
|
|
||||||
|
public required init?(coder aDecoder: NSCoder) {
|
||||||
|
super.init(coder: aDecoder)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -87,7 +87,7 @@ open class CollectionViewCell: UICollectionViewCell, MoleculeViewProtocol, MVMCo
|
|||||||
|
|
||||||
open func reset() {
|
open func reset() {
|
||||||
molecule?.reset()
|
molecule?.reset()
|
||||||
backgroundColor = .mvmWhite
|
backgroundColor = .clear
|
||||||
width = nil
|
width = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user