Commit 5d6f18d7 by Daniel Dahan

updated calculations for TabBar and Chips scroll view content

parent a921f765
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
961154CC1F32A7B100A78D74 /* ChipBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961154CB1F32A7B100A78D74 /* ChipBar.swift */; }; 961154CC1F32A7B100A78D74 /* Chips.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961154CB1F32A7B100A78D74 /* Chips.swift */; };
961409B11E43D15C00E7BA99 /* FABMenu.swift in Headers */ = {isa = PBXBuildFile; fileRef = 96A183621E0C6CE200083C30 /* FABMenu.swift */; settings = {ATTRIBUTES = (Public, ); }; }; 961409B11E43D15C00E7BA99 /* FABMenu.swift in Headers */ = {isa = PBXBuildFile; fileRef = 96A183621E0C6CE200083C30 /* FABMenu.swift */; settings = {ATTRIBUTES = (Public, ); }; };
961409B21E43D15C00E7BA99 /* FABMenuController.swift in Headers */ = {isa = PBXBuildFile; fileRef = 96A183641E0C6DD400083C30 /* FABMenuController.swift */; settings = {ATTRIBUTES = (Public, ); }; }; 961409B21E43D15C00E7BA99 /* FABMenuController.swift in Headers */ = {isa = PBXBuildFile; fileRef = 96A183641E0C6DD400083C30 /* FABMenuController.swift */; settings = {ATTRIBUTES = (Public, ); }; };
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, ); }; };
...@@ -207,7 +207,7 @@ ...@@ -207,7 +207,7 @@
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
961154CB1F32A7B100A78D74 /* ChipBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChipBar.swift; sourceTree = "<group>"; }; 961154CB1F32A7B100A78D74 /* Chips.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Chips.swift; sourceTree = "<group>"; };
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>"; };
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>"; };
961E6BE11DDA2AF3004E6C93 /* Screen.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Screen.swift; sourceTree = "<group>"; }; 961E6BE11DDA2AF3004E6C93 /* Screen.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Screen.swift; sourceTree = "<group>"; };
...@@ -359,7 +359,7 @@ ...@@ -359,7 +359,7 @@
961154CA1F32999000A78D74 /* Chip */ = { 961154CA1F32999000A78D74 /* Chip */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
961154CB1F32A7B100A78D74 /* ChipBar.swift */, 961154CB1F32A7B100A78D74 /* Chips.swift */,
); );
name = Chip; name = Chip;
sourceTree = "<group>"; sourceTree = "<group>";
...@@ -1069,7 +1069,7 @@ ...@@ -1069,7 +1069,7 @@
96A1808B1F2E2B6E006BD69D /* Motion+UIView.swift in Sources */, 96A1808B1F2E2B6E006BD69D /* Motion+UIView.swift in Sources */,
96A180971F2E2B6E006BD69D /* MotionCoordinateSpace.swift in Sources */, 96A180971F2E2B6E006BD69D /* MotionCoordinateSpace.swift in Sources */,
96E09DC81F2287E50000B121 /* TabsController.swift in Sources */, 96E09DC81F2287E50000B121 /* TabsController.swift in Sources */,
961154CC1F32A7B100A78D74 /* ChipBar.swift in Sources */, 961154CC1F32A7B100A78D74 /* Chips.swift in Sources */,
965689611F002F4C001C656D /* CardCollectionViewController.swift in Sources */, 965689611F002F4C001C656D /* CardCollectionViewController.swift in Sources */,
96A180951F2E2B6E006BD69D /* MotionContext.swift in Sources */, 96A180951F2E2B6E006BD69D /* MotionContext.swift in Sources */,
965E80CC1DD4C50600D61E4B /* Bar.swift in Sources */, 965E80CC1DD4C50600D61E4B /* Bar.swift in Sources */,
......
Motion @ 978902d9
Subproject commit c23972be3063b528465540282d7b5dcb6d0dcc2d Subproject commit 978902d9dd00b123794cf1b939790aafc04c4e5f
...@@ -84,36 +84,36 @@ fileprivate extension ChipItem { ...@@ -84,36 +84,36 @@ fileprivate extension ChipItem {
} }
} }
@objc(ChipBarDelegate) @objc(ChipsDelegate)
public protocol ChipBarDelegate { public protocol ChipsDelegate {
/** /**
A delegation method that is executed when the chipItem will trigger the A delegation method that is executed when the chipItem will trigger the
animation to the next chip. animation to the next chip.
- Parameter chipBar: A ChipBar. - Parameter chipBar: A Chips.
- Parameter chipItem: A ChipItem. - Parameter chipItem: A ChipItem.
*/ */
@objc @objc
optional func chipBar(chipBar: ChipBar, willSelect chipItem: ChipItem) optional func chipBar(chipBar: Chips, willSelect chipItem: ChipItem)
/** /**
A delegation method that is executed when the chipItem did complete the A delegation method that is executed when the chipItem did complete the
animation to the next chip. animation to the next chip.
- Parameter chipBar: A ChipBar. - Parameter chipBar: A Chips.
- Parameter chipItem: A ChipItem. - Parameter chipItem: A ChipItem.
*/ */
@objc @objc
optional func chipBar(chipBar: ChipBar, didSelect chipItem: ChipItem) optional func chipBar(chipBar: Chips, didSelect chipItem: ChipItem)
} }
@objc(ChipBarStyle) @objc(ChipsStyle)
public enum ChipBarStyle: Int { public enum ChipsStyle: Int {
case auto case auto
case nonScrollable case nonScrollable
case scrollable case scrollable
} }
open class ChipBar: Bar { open class Chips: Bar {
/// A boolean indicating if the ChipBar line is in an animation state. /// A boolean indicating if the Chips line is in an animation state.
open fileprivate(set) var isAnimating = false open fileprivate(set) var isAnimating = false
/// The total width of the chipItems. /// The total width of the chipItems.
...@@ -128,7 +128,7 @@ open class ChipBar: Bar { ...@@ -128,7 +128,7 @@ open class ChipBar: Bar {
} }
/// An enum that determines the chip bar style. /// An enum that determines the chip bar style.
open var chipBarStyle = ChipBarStyle.auto { open var chipBarStyle = ChipsStyle.auto {
didSet { didSet {
layoutSubviews() layoutSubviews()
} }
...@@ -148,11 +148,53 @@ open class ChipBar: Bar { ...@@ -148,11 +148,53 @@ open class ChipBar: Bar {
} }
/// A delegation reference. /// A delegation reference.
open weak var delegate: ChipBarDelegate? open weak var delegate: ChipsDelegate?
/// The currently selected chipItem. /// The currently selected chipItem.
open fileprivate(set) var selected: ChipItem? open fileprivate(set) var selected: ChipItem?
/// A preset wrapper around chipItems contentEdgeInsets.
open var chipItemsContentEdgeInsetsPreset: EdgeInsetsPreset {
get {
return scrollView.grid.contentEdgeInsetsPreset
}
set(value) {
scrollView.grid.contentEdgeInsetsPreset = value
}
}
/// A reference to EdgeInsets.
@IBInspectable
open var chipItemsContentEdgeInsets: EdgeInsets {
get {
return scrollView.grid.contentEdgeInsets
}
set(value) {
scrollView.grid.contentEdgeInsets = value
}
}
/// A preset wrapper around chipItems interimSpace.
open var chipItemsInterimSpacePreset: InterimSpacePreset {
get {
return scrollView.grid.interimSpacePreset
}
set(value) {
scrollView.grid.interimSpacePreset = value
}
}
/// A wrapper around chipItems interimSpace.
@IBInspectable
open var chipItemsInterimSpace: InterimSpace {
get {
return scrollView.grid.interimSpace
}
set(value) {
scrollView.grid.interimSpace = value
}
}
/// Buttons. /// Buttons.
open var chipItems = [ChipItem]() { open var chipItems = [ChipItem]() {
didSet { didSet {
...@@ -243,13 +285,17 @@ open class ChipBar: Bar { ...@@ -243,13 +285,17 @@ open class ChipBar: Bar {
grid.axis.columns = columns grid.axis.columns = columns
if .scrollable == chipBarStyle || (.auto == chipBarStyle && chipItemsTotalWidth > bounds.width) { if .scrollable == chipBarStyle || (.auto == chipBarStyle && chipItemsTotalWidth > bounds.width) {
var w: CGFloat = 0 var w: CGFloat = chipItemsContentEdgeInsets.left
let q = 2 * chipItemsInterimSpace
let p = q + chipItemsInterimSpace
for v in chipItems { for v in chipItems {
let x = v.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: contentView.height)).width + interimSpace let x = v.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: scrollView.height)).width
v.height = scrollView.height v.height = scrollView.height
v.width = x v.width = x + q
v.x = w v.x = w
w += x w += x
w += p
if scrollView != v.superview { if scrollView != v.superview {
v.removeFromSuperview() v.removeFromSuperview()
...@@ -257,11 +303,13 @@ open class ChipBar: Bar { ...@@ -257,11 +303,13 @@ open class ChipBar: Bar {
} }
} }
scrollView.contentSize = CGSize(width: w, height: height) w += chipItemsContentEdgeInsets.right - chipItemsInterimSpace
scrollView.contentSize = CGSize(width: w, height: scrollView.height - chipItemsContentEdgeInsets.top - chipItemsContentEdgeInsets.bottom)
} else { } else {
scrollView.grid.views = chipItems scrollView.grid.views = chipItems
scrollView.grid.axis.columns = chipItems.count scrollView.grid.axis.columns = chipItems.count
scrollView.contentSize = CGSize(width: scrollView.width, height: height) scrollView.contentSize = CGSize(width: scrollView.width, height: scrollView.height - chipItemsContentEdgeInsets.top - chipItemsContentEdgeInsets.bottom)
} }
grid.commit() grid.commit()
...@@ -272,8 +320,9 @@ open class ChipBar: Bar { ...@@ -272,8 +320,9 @@ open class ChipBar: Bar {
open override func prepare() { open override func prepare() {
super.prepare() super.prepare()
contentEdgeInsetsPreset = .none contentEdgeInsetsPreset = .square2
interimSpacePreset = .interimSpace6 interimSpacePreset = .interimSpace6
chipItemsInterimSpacePreset = .interimSpace4
prepareContentView() prepareContentView()
prepareScrollView() prepareScrollView()
...@@ -281,7 +330,7 @@ open class ChipBar: Bar { ...@@ -281,7 +330,7 @@ open class ChipBar: Bar {
} }
} }
fileprivate extension ChipBar { fileprivate extension Chips {
/// Prepares the divider. /// Prepares the divider.
func prepareDivider() { func prepareDivider() {
dividerColor = Color.grey.lighten3 dividerColor = Color.grey.lighten3
...@@ -293,6 +342,9 @@ fileprivate extension ChipBar { ...@@ -293,6 +342,9 @@ fileprivate extension ChipBar {
v.grid.columns = 0 v.grid.columns = 0
v.cornerRadius = 0 v.cornerRadius = 0
v.contentEdgeInsets = .zero v.contentEdgeInsets = .zero
v.removeTarget(self, action: #selector(handle(chipItem:)), for: .touchUpInside)
v.addTarget(self, action: #selector(handle(chipItem:)), for: .touchUpInside)
} }
} }
...@@ -310,7 +362,15 @@ fileprivate extension ChipBar { ...@@ -310,7 +362,15 @@ fileprivate extension ChipBar {
} }
} }
extension ChipBar { fileprivate extension Chips {
/// Handles the chipItem touch event.
@objc
func handle(chipItem: ChipItem) {
animate(to: chipItem, isTriggeredByUserInteraction: true)
}
}
extension Chips {
/** /**
Selects a given index from the chipItems array. Selects a given index from the chipItems array.
- Parameter at index: An Int. - Parameter at index: An Int.
...@@ -331,7 +391,9 @@ extension ChipBar { ...@@ -331,7 +391,9 @@ extension ChipBar {
open func animate(to chipItem: ChipItem, completion: ((ChipItem) -> Void)? = nil) { open func animate(to chipItem: ChipItem, completion: ((ChipItem) -> Void)? = nil) {
animate(to: chipItem, isTriggeredByUserInteraction: false, completion: completion) animate(to: chipItem, isTriggeredByUserInteraction: false, completion: completion)
} }
}
fileprivate extension Chips {
/** /**
Animates to a given chipItem. Animates to a given chipItem.
- Parameter to chipItem: A ChipItem. - Parameter to chipItem: A ChipItem.
......
...@@ -111,7 +111,49 @@ open class TabBar: Bar { ...@@ -111,7 +111,49 @@ open class TabBar: Bar {
/// The currently selected tabItem. /// The currently selected tabItem.
open fileprivate(set) var selected: TabItem? open fileprivate(set) var selected: TabItem?
/// A preset wrapper around tabItems contentEdgeInsets.
open var tabItemsContentEdgeInsetsPreset: EdgeInsetsPreset {
get {
return scrollView.grid.contentEdgeInsetsPreset
}
set(value) {
scrollView.grid.contentEdgeInsetsPreset = value
}
}
/// A reference to EdgeInsets.
@IBInspectable
open var tabItemsContentEdgeInsets: EdgeInsets {
get {
return scrollView.grid.contentEdgeInsets
}
set(value) {
scrollView.grid.contentEdgeInsets = value
}
}
/// A preset wrapper around tabItems interimSpace.
open var tabItemsInterimSpacePreset: InterimSpacePreset {
get {
return scrollView.grid.interimSpacePreset
}
set(value) {
scrollView.grid.interimSpacePreset = value
}
}
/// A wrapper around tabItems interimSpace.
@IBInspectable
open var tabItemsInterimSpace: InterimSpace {
get {
return scrollView.grid.interimSpace
}
set(value) {
scrollView.grid.interimSpace = value
}
}
/// TabItems. /// TabItems.
open var tabItems = [TabItem]() { open var tabItems = [TabItem]() {
didSet { didSet {
...@@ -246,13 +288,17 @@ open class TabBar: Bar { ...@@ -246,13 +288,17 @@ open class TabBar: Bar {
grid.axis.columns = columns grid.axis.columns = columns
if .scrollable == tabBarStyle || (.auto == tabBarStyle && tabItemsTotalWidth > bounds.width) { if .scrollable == tabBarStyle || (.auto == tabBarStyle && tabItemsTotalWidth > bounds.width) {
var w: CGFloat = 0 var w: CGFloat = tabItemsContentEdgeInsets.left
let q = scrollView.height / 2
let p = q + tabItemsInterimSpace
for v in tabItems { for v in tabItems {
let x = v.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: contentView.height)).width + interimSpace let x = v.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: scrollView.height)).width
v.height = scrollView.height v.height = scrollView.height
v.width = x v.width = x + q
v.x = w v.x = w
w += x w += x
w += p
if scrollView != v.superview { if scrollView != v.superview {
v.removeFromSuperview() v.removeFromSuperview()
...@@ -260,11 +306,13 @@ open class TabBar: Bar { ...@@ -260,11 +306,13 @@ open class TabBar: Bar {
} }
} }
scrollView.contentSize = CGSize(width: w, height: height) w += tabItemsContentEdgeInsets.right - tabItemsInterimSpace
scrollView.contentSize = CGSize(width: w, height: scrollView.height - tabItemsContentEdgeInsets.top - tabItemsContentEdgeInsets.bottom)
} else { } else {
scrollView.grid.views = tabItems scrollView.grid.views = tabItems
scrollView.grid.axis.columns = tabItems.count scrollView.grid.axis.columns = tabItems.count
scrollView.contentSize = CGSize(width: scrollView.width, height: height) scrollView.contentSize = CGSize(width: scrollView.width, height: scrollView.height - tabItemsContentEdgeInsets.top - tabItemsContentEdgeInsets.bottom)
} }
grid.commit() grid.commit()
...@@ -278,6 +326,7 @@ open class TabBar: Bar { ...@@ -278,6 +326,7 @@ open class TabBar: Bar {
super.prepare() super.prepare()
contentEdgeInsetsPreset = .none contentEdgeInsetsPreset = .none
interimSpacePreset = .interimSpace6 interimSpacePreset = .interimSpace6
tabItemsInterimSpacePreset = .none
prepareContentView() prepareContentView()
prepareScrollView() prepareScrollView()
...@@ -354,20 +403,20 @@ fileprivate extension TabBar { ...@@ -354,20 +403,20 @@ fileprivate extension TabBar {
} }
} }
extension TabBar { fileprivate extension TabBar {
/** /**
Removes the line animation handlers. Removes the line animation handlers.
- Parameter tabItem: A TabItem. - Parameter tabItem: A TabItem.
*/ */
fileprivate func removeLineAnimationHandler(tabItem: TabItem) { func removeLineAnimationHandler(tabItem: TabItem) {
tabItem.removeTarget(self, action: #selector(handleLineAnimation(tabItem:)), for: .touchUpInside) tabItem.removeTarget(self, action: #selector(handleLineAnimation(tabItem:)), for: .touchUpInside)
} }
} }
extension TabBar { fileprivate extension TabBar {
/// Handles the tabItem touch event. /// Handles the tabItem touch event.
@objc @objc
fileprivate func handleLineAnimation(tabItem: TabItem) { func handleLineAnimation(tabItem: TabItem) {
animate(to: tabItem, isTriggeredByUserInteraction: true) animate(to: tabItem, isTriggeredByUserInteraction: true)
} }
} }
...@@ -393,7 +442,9 @@ extension TabBar { ...@@ -393,7 +442,9 @@ extension TabBar {
open func animate(to tabItem: TabItem, completion: ((TabItem) -> Void)? = nil) { open func animate(to tabItem: TabItem, completion: ((TabItem) -> Void)? = nil) {
animate(to: tabItem, isTriggeredByUserInteraction: false, completion: completion) animate(to: tabItem, isTriggeredByUserInteraction: false, completion: completion)
} }
}
fileprivate extension TabBar {
/** /**
Animates to a given tabItem. Animates to a given tabItem.
- Parameter to tabItem: A TabItem. - Parameter to tabItem: A TabItem.
...@@ -424,7 +475,7 @@ extension TabBar { ...@@ -424,7 +475,7 @@ extension TabBar {
} }
completion?(tabItem) completion?(tabItem)
}) })
if !scrollView.bounds.contains(tabItem.frame) { if !scrollView.bounds.contains(tabItem.frame) {
let contentOffsetX = (tabItem.x < scrollView.bounds.minX) ? tabItem.x : tabItem.frame.maxX - scrollView.bounds.width let contentOffsetX = (tabItem.x < scrollView.bounds.minX) ? tabItem.x : tabItem.frame.maxX - scrollView.bounds.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