Commit adc1b827 by Daniel Dahan

development: added CollectionViewCard

parent 1bdde898
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
961730361E0E156400A9A297 /* SpringMotion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961730351E0E156400A9A297 /* SpringMotion.swift */; }; 961730361E0E156400A9A297 /* SpringMotion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961730351E0E156400A9A297 /* SpringMotion.swift */; };
9617305A1E145DE900A9A297 /* CollectionViewCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961730591E145DE900A9A297 /* CollectionViewCard.swift */; };
9617B07D1DFCA8CF00410F8F /* Application.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961E6BDE1DDA2A95004E6C93 /* Application.swift */; settings = {ATTRIBUTES = (Public, ); }; }; 9617B07D1DFCA8CF00410F8F /* Application.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961E6BDE1DDA2A95004E6C93 /* Application.swift */; settings = {ATTRIBUTES = (Public, ); }; };
9617B07E1DFCA8CF00410F8F /* Card.swift in Headers */ = {isa = PBXBuildFile; fileRef = 96BCB75D1CB40DC500C806FE /* Card.swift */; settings = {ATTRIBUTES = (Public, ); }; }; 9617B07E1DFCA8CF00410F8F /* Card.swift in Headers */ = {isa = PBXBuildFile; fileRef = 96BCB75D1CB40DC500C806FE /* Card.swift */; settings = {ATTRIBUTES = (Public, ); }; };
9617B07F1DFCA8CF00410F8F /* ImageCard.swift in Headers */ = {isa = PBXBuildFile; fileRef = 96BCB7621CB40DC500C806FE /* ImageCard.swift */; settings = {ATTRIBUTES = (Public, ); }; }; 9617B07F1DFCA8CF00410F8F /* ImageCard.swift in Headers */ = {isa = PBXBuildFile; fileRef = 96BCB7621CB40DC500C806FE /* ImageCard.swift */; settings = {ATTRIBUTES = (Public, ); }; };
...@@ -226,6 +227,7 @@ ...@@ -226,6 +227,7 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
961276621DCD8B1800A7D920 /* CharacterAttribute.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CharacterAttribute.swift; sourceTree = "<group>"; }; 961276621DCD8B1800A7D920 /* CharacterAttribute.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CharacterAttribute.swift; sourceTree = "<group>"; };
961730351E0E156400A9A297 /* SpringMotion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpringMotion.swift; sourceTree = "<group>"; }; 961730351E0E156400A9A297 /* SpringMotion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpringMotion.swift; sourceTree = "<group>"; };
961730591E145DE900A9A297 /* CollectionViewCard.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewCard.swift; sourceTree = "<group>"; };
961DED451DCC40C500F425B6 /* Editor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Editor.swift; sourceTree = "<group>"; }; 961DED451DCC40C500F425B6 /* Editor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Editor.swift; sourceTree = "<group>"; };
961DED4A1DCC546100F425B6 /* EditorController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditorController.swift; sourceTree = "<group>"; }; 961DED4A1DCC546100F425B6 /* EditorController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditorController.swift; sourceTree = "<group>"; };
961E6BDE1DDA2A95004E6C93 /* Application.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Application.swift; sourceTree = "<group>"; }; 961E6BDE1DDA2A95004E6C93 /* Application.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Application.swift; sourceTree = "<group>"; };
...@@ -710,6 +712,7 @@ ...@@ -710,6 +712,7 @@
96BCB75D1CB40DC500C806FE /* Card.swift */, 96BCB75D1CB40DC500C806FE /* Card.swift */,
96BCB7621CB40DC500C806FE /* ImageCard.swift */, 96BCB7621CB40DC500C806FE /* ImageCard.swift */,
9631A7C01D95E3AC00CFB109 /* PresenterCard.swift */, 9631A7C01D95E3AC00CFB109 /* PresenterCard.swift */,
961730591E145DE900A9A297 /* CollectionViewCard.swift */,
); );
name = Card; name = Card;
sourceTree = "<group>"; sourceTree = "<group>";
...@@ -1214,6 +1217,7 @@ ...@@ -1214,6 +1217,7 @@
965E80D21DD4C50600D61E4B /* Color.swift in Sources */, 965E80D21DD4C50600D61E4B /* Color.swift in Sources */,
965E80D31DD4C50600D61E4B /* Device.swift in Sources */, 965E80D31DD4C50600D61E4B /* Device.swift in Sources */,
965E80FD1DD4D59500D61E4B /* Toolbar.swift in Sources */, 965E80FD1DD4D59500D61E4B /* Toolbar.swift in Sources */,
9617305A1E145DE900A9A297 /* CollectionViewCard.swift in Sources */,
965E80D41DD4C50600D61E4B /* Divider.swift in Sources */, 965E80D41DD4C50600D61E4B /* Divider.swift in Sources */,
965E80D51DD4C50600D61E4B /* Grid.swift in Sources */, 965E80D51DD4C50600D61E4B /* Grid.swift in Sources */,
965E80D61DD4C50600D61E4B /* HeightPreset.swift in Sources */, 965E80D61DD4C50600D61E4B /* HeightPreset.swift in Sources */,
......
/*
* Copyright (C) 2015 - 2016, Daniel Dahan and CosmicMind, Inc. <http://cosmicmind.com>.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of CosmicMind nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import UIKit
class CardCollectionViewCell: CollectionViewCell {
open var card: Card? {
didSet {
oldValue?.removeFromSuperview()
if let v = card {
contentView.addSubview(v)
}
}
}
}
@objc(CollectionViewCard)
open class CollectionViewCard: Card {
/// A reference to the dataSourceItems.
open var dataSourceItems = [DataSourceItem]()
/// An index of IndexPath to MenuItem.
open var indexForDataSourceItems = [IndexPath: Any]()
/// A reference to the collectionView.
@IBInspectable
open let collectionView = CollectionView()
open override func layoutSubviews() {
super.layoutSubviews()
reload()
}
open override func prepare() {
super.prepare()
prepareCollectionView()
prepareContentView()
}
open override func reload() {
if 0 == collectionView.height {
var h: CGFloat = 0
for dataSourceItem in dataSourceItems {
h += dataSourceItem.height ?? 0
}
collectionView.height = h
}
collectionView.reloadData()
super.reload()
}
}
extension CollectionViewCard {
/// Prepares the collectionView.
fileprivate func prepareCollectionView() {
collectionView.delegate = self
collectionView.dataSource = self
collectionView.interimSpacePreset = .none
collectionView.register(CardCollectionViewCell.self, forCellWithReuseIdentifier: "CardCollectionViewCell")
}
/// Prepares the contentView.
fileprivate func prepareContentView() {
contentView = collectionView
}
}
extension CollectionViewCard: CollectionViewDelegate {
open func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
guard let card = indexForDataSourceItems[indexPath] as? Card else {
return
}
}
}
extension CollectionViewCard: CollectionViewDataSource {
@objc
open func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
@objc
open func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return dataSourceItems.count
}
@objc
open func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CardCollectionViewCell", for: indexPath) as! CardCollectionViewCell
guard let card = dataSourceItems[indexPath.item].data as? Card else {
return cell
}
indexForDataSourceItems[indexPath] = card
if .vertical == self.collectionView.scrollDirection {
card.width = cell.width
} else {
card.height = cell.height
}
cell.card = card
return cell
}
}
...@@ -113,23 +113,26 @@ open class Menu: Button { ...@@ -113,23 +113,26 @@ open class Menu: Button {
} }
} }
/// A reference to the dataSourceItems.
open fileprivate(set) var dataSourceItems = [DataSourceItem]()
/// An index of IndexPath to MenuItem.
open fileprivate(set) var indexForDataSourceItems = [IndexPath: MenuItem]()
/// A reference to the collectionView. /// A reference to the collectionView.
open let collectionView = CollectionView() open let card = CollectionViewCard()
/// A reference to the card. /**
open let card = Card() Retrieves the data source items for the collectionView.
- Returns: An Array of DataSourceItem objects.
*/
open var dataSourceItems: [DataSourceItem] {
get {
return card.dataSourceItems
}
set(value) {
card.dataSourceItems = value
}
}
/// A reference to the MenuItems. /// A reference to the MenuItems.
open var items = [MenuItem]() { open var items = [MenuItem]() {
didSet { didSet {
dataSourceItems.removeAll() dataSourceItems.removeAll()
indexForDataSourceItems.removeAll()
for item in items { for item in items {
dataSourceItems.append(DataSourceItem(data: item, width: item.width, height: item.height)) dataSourceItems.append(DataSourceItem(data: item, width: item.width, height: item.height))
...@@ -152,7 +155,6 @@ open class Menu: Button { ...@@ -152,7 +155,6 @@ open class Menu: Button {
open override func prepare() { open override func prepare() {
super.prepare() super.prepare()
prepareCollectionView()
prepareCard() prepareCard()
prepareHandler() prepareHandler()
} }
...@@ -161,31 +163,15 @@ open class Menu: Button { ...@@ -161,31 +163,15 @@ open class Menu: Button {
if 0 == card.width { if 0 == card.width {
card.width = Screen.bounds.width card.width = Screen.bounds.width
} }
if 0 == collectionView.height {
var h: CGFloat = 0
for dataSourceItem in dataSourceItems {
h += dataSourceItem.height ?? 0
}
collectionView.height = h
}
collectionView.reloadData()
} }
} }
extension Menu { extension Menu {
/// Prepares the collectionView.
fileprivate func prepareCollectionView() {
collectionView.delegate = self
collectionView.dataSource = self
collectionView.interimSpacePreset = .none
collectionView.register(MenuCollectionViewCell.self, forCellWithReuseIdentifier: "MenuCollectionViewCell")
}
/// Prepares the card. /// Prepares the card.
fileprivate func prepareCard() { fileprivate func prepareCard() {
card.contentView = collectionView card.collectionView.delegate = self
card.collectionView.dataSource = self
card.collectionView.register(MenuCollectionViewCell.self, forCellWithReuseIdentifier: "MenuCollectionViewCell")
} }
/// Prepares the handler. /// Prepares the handler.
...@@ -278,7 +264,7 @@ extension Menu { ...@@ -278,7 +264,7 @@ extension Menu {
extension Menu: CollectionViewDelegate { extension Menu: CollectionViewDelegate {
open func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { open func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
guard let menuItem = indexForDataSourceItems[indexPath] else { guard let menuItem = card.indexForDataSourceItems[indexPath] as? MenuItem else {
return return
} }
...@@ -305,7 +291,7 @@ extension Menu: CollectionViewDataSource { ...@@ -305,7 +291,7 @@ extension Menu: CollectionViewDataSource {
return cell return cell
} }
indexForDataSourceItems[indexPath] = menuItem card.indexForDataSourceItems[indexPath] = menuItem
cell.menuItem = menuItem cell.menuItem = menuItem
cell.menuItem?.width = cell.width cell.menuItem?.width = cell.width
......
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