Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
Material
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Dmitriy Stepanets
Material
Commits
b254e22d
Commit
b254e22d
authored
Aug 08, 2017
by
Daniel Dahan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
updated layout mathematics for TabBarController and ChipBarController
parent
4d61e3f8
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
210 additions
and
276 deletions
+210
-276
Sources/iOS/Bar.swift
+1
-0
Sources/iOS/ChipBar.swift
+47
-113
Sources/iOS/ChipBarController.swift
+54
-13
Sources/iOS/TabBar.swift
+40
-111
Sources/iOS/TabBarController.swift
+37
-20
Sources/iOS/ToolbarController.swift
+31
-19
No files found.
Sources/iOS/Bar.swift
View file @
b254e22d
...
...
@@ -265,6 +265,7 @@ open class Bar: View {
autoresizingMask
=
.
flexibleWidth
interimSpacePreset
=
.
interimSpace3
contentEdgeInsetsPreset
=
.
square1
prepareContentView
()
}
}
...
...
Sources/iOS/ChipBar.swift
View file @
b254e22d
...
...
@@ -156,10 +156,10 @@ open class ChipBar: Bar {
/// A preset wrapper around chipItems contentEdgeInsets.
open
var
chipItemsContentEdgeInsetsPreset
:
EdgeInsetsPreset
{
get
{
return
scroll
View
.
grid
.
contentEdgeInsetsPreset
return
content
View
.
grid
.
contentEdgeInsetsPreset
}
set
(
value
)
{
scroll
View
.
grid
.
contentEdgeInsetsPreset
=
value
content
View
.
grid
.
contentEdgeInsetsPreset
=
value
}
}
...
...
@@ -167,20 +167,20 @@ open class ChipBar: Bar {
@IBInspectable
open
var
chipItemsContentEdgeInsets
:
EdgeInsets
{
get
{
return
scroll
View
.
grid
.
contentEdgeInsets
return
content
View
.
grid
.
contentEdgeInsets
}
set
(
value
)
{
scroll
View
.
grid
.
contentEdgeInsets
=
value
content
View
.
grid
.
contentEdgeInsets
=
value
}
}
/// A preset wrapper around chipItems interimSpace.
open
var
chipItemsInterimSpacePreset
:
InterimSpacePreset
{
get
{
return
scroll
View
.
grid
.
interimSpacePreset
return
content
View
.
grid
.
interimSpacePreset
}
set
(
value
)
{
scroll
View
.
grid
.
interimSpacePreset
=
value
content
View
.
grid
.
interimSpacePreset
=
value
}
}
...
...
@@ -188,10 +188,10 @@ open class ChipBar: Bar {
@IBInspectable
open
var
chipItemsInterimSpace
:
InterimSpace
{
get
{
return
scroll
View
.
grid
.
interimSpace
return
content
View
.
grid
.
interimSpace
}
set
(
value
)
{
scroll
View
.
grid
.
interimSpace
=
value
content
View
.
grid
.
interimSpace
=
value
}
}
...
...
@@ -213,116 +213,17 @@ open class ChipBar: Bar {
return
}
var
lc
=
0
var
rc
=
0
grid
.
begin
()
grid
.
views
.
removeAll
()
for
v
in
leftViews
{
if
let
b
=
v
as?
ChipItem
{
b
.
contentEdgeInsets
=
.
zero
b
.
titleEdgeInsets
=
.
zero
}
v
.
width
=
v
.
intrinsicContentSize
.
width
v
.
sizeToFit
()
v
.
grid
.
columns
=
Int
(
ceil
(
v
.
width
/
gridFactor
))
+
2
lc
+=
v
.
grid
.
columns
grid
.
views
.
append
(
v
)
}
grid
.
views
.
append
(
contentView
)
for
v
in
rightViews
{
if
let
b
=
v
as?
ChipItem
{
b
.
contentEdgeInsets
=
.
zero
b
.
titleEdgeInsets
=
.
zero
}
v
.
width
=
v
.
intrinsicContentSize
.
width
v
.
sizeToFit
()
v
.
grid
.
columns
=
Int
(
ceil
(
v
.
width
/
gridFactor
))
+
2
rc
+=
v
.
grid
.
columns
grid
.
views
.
append
(
v
)
}
contentView
.
grid
.
begin
()
contentView
.
grid
.
offset
.
columns
=
0
var
l
:
CGFloat
=
0
var
r
:
CGFloat
=
0
if
.
center
==
contentViewAlignment
{
if
leftViews
.
count
<
rightViews
.
count
{
r
=
CGFloat
(
rightViews
.
count
)
*
interimSpace
l
=
r
}
else
{
l
=
CGFloat
(
leftViews
.
count
)
*
interimSpace
r
=
l
}
}
let
p
=
width
-
l
-
r
-
contentEdgeInsets
.
left
-
contentEdgeInsets
.
right
let
columns
=
Int
(
ceil
(
p
/
gridFactor
))
if
.
center
==
contentViewAlignment
{
if
lc
<
rc
{
contentView
.
grid
.
columns
=
columns
-
2
*
rc
contentView
.
grid
.
offset
.
columns
=
rc
-
lc
}
else
{
contentView
.
grid
.
columns
=
columns
-
2
*
lc
rightViews
.
first
?
.
grid
.
offset
.
columns
=
lc
-
rc
}
}
else
{
contentView
.
grid
.
columns
=
columns
-
lc
-
rc
}
grid
.
axis
.
columns
=
columns
if
.
scrollable
==
chipBarStyle
||
(
.
auto
==
chipBarStyle
&&
chipItemsTotalWidth
>
bounds
.
width
)
{
var
w
:
CGFloat
=
chipItemsContentEdgeInsets
.
left
let
q
=
2
*
chipItemsInterimSpace
let
p
=
q
+
chipItemsInterimSpace
for
v
in
chipItems
{
let
x
=
v
.
sizeThatFits
(
CGSize
(
width
:
CGFloat
.
greatestFiniteMagnitude
,
height
:
scrollView
.
height
))
.
width
v
.
height
=
scrollView
.
height
v
.
width
=
x
+
q
v
.
x
=
w
w
+=
x
w
+=
p
if
scrollView
!=
v
.
superview
{
v
.
removeFromSuperview
()
scrollView
.
addSubview
(
v
)
}
}
w
+=
chipItemsContentEdgeInsets
.
right
-
chipItemsInterimSpace
scrollView
.
contentSize
=
CGSize
(
width
:
w
,
height
:
scrollView
.
height
-
chipItemsContentEdgeInsets
.
top
-
chipItemsContentEdgeInsets
.
bottom
)
}
else
{
scrollView
.
grid
.
views
=
chipItems
scrollView
.
grid
.
axis
.
columns
=
chipItems
.
count
scrollView
.
contentSize
=
CGSize
(
width
:
scrollView
.
width
,
height
:
scrollView
.
height
-
chipItemsContentEdgeInsets
.
top
-
chipItemsContentEdgeInsets
.
bottom
)
}
grid
.
commit
()
contentView
.
grid
.
commit
()
layoutDivider
()
layoutScrollView
()
}
open
override
func
prepare
()
{
super
.
prepare
()
contentEdgeInsetsPreset
=
.
square2
interimSpacePreset
=
.
interimSpace6
interimSpacePreset
=
.
interimSpace3
contentEdgeInsetsPreset
=
.
square1
chipItemsInterimSpacePreset
=
.
interimSpace4
chipItemsContentEdgeInsetsPreset
=
.
square2
chipItemsContentEdgeInsets
.
left
=
0
chipItemsContentEdgeInsets
.
right
=
0
prepareContentView
()
prepareScrollView
()
...
...
@@ -363,6 +264,39 @@ fileprivate extension ChipBar {
}
fileprivate
extension
ChipBar
{
/// Layout the scrollView.
func
layoutScrollView
()
{
if
.
scrollable
==
chipBarStyle
||
(
.
auto
==
chipBarStyle
&&
chipItemsTotalWidth
>
bounds
.
width
)
{
var
w
:
CGFloat
=
0
let
q
=
2
*
chipItemsInterimSpace
let
p
=
q
+
chipItemsInterimSpace
for
v
in
chipItems
{
let
x
=
v
.
sizeThatFits
(
CGSize
(
width
:
CGFloat
.
greatestFiniteMagnitude
,
height
:
scrollView
.
height
))
.
width
v
.
height
=
scrollView
.
height
v
.
width
=
x
+
q
v
.
x
=
w
w
+=
x
w
+=
p
if
scrollView
!=
v
.
superview
{
v
.
removeFromSuperview
()
scrollView
.
addSubview
(
v
)
}
}
w
-=
chipItemsInterimSpace
scrollView
.
contentSize
=
CGSize
(
width
:
w
,
height
:
scrollView
.
height
)
}
else
{
scrollView
.
grid
.
views
=
chipItems
scrollView
.
grid
.
axis
.
columns
=
chipItems
.
count
scrollView
.
contentSize
=
scrollView
.
bounds
.
size
}
}
}
fileprivate
extension
ChipBar
{
/// Handles the chipItem touch event.
@objc
func
handle
(
chipItem
:
ChipItem
)
{
...
...
Sources/iOS/ChipBarController.swift
View file @
b254e22d
...
...
@@ -75,19 +75,9 @@ open class ChipBarController: TransitionController {
open
override
func
layoutSubviews
()
{
super
.
layoutSubviews
()
chipBar
.
width
=
view
.
width
switch
displayStyle
{
case
.
partial
:
let
h
=
chipBar
.
height
container
.
y
=
h
container
.
height
=
view
.
height
-
h
case
.
full
:
container
.
frame
=
view
.
bounds
}
rootViewController
.
view
.
frame
=
container
.
bounds
layoutChipBar
()
layoutContainer
()
layoutRootViewController
()
}
open
override
func
prepare
()
{
...
...
@@ -103,3 +93,54 @@ fileprivate extension ChipBarController {
view
.
addSubview
(
chipBar
)
}
}
fileprivate
extension
ChipBarController
{
/// Layout the container.
func
layoutContainer
()
{
chipBar
.
width
=
view
.
width
switch
displayStyle
{
case
.
partial
:
let
p
=
chipBar
.
height
let
y
=
view
.
height
-
p
switch
chipBarAlignment
{
case
.
top
:
container
.
y
=
p
container
.
height
=
y
case
.
bottom
:
container
.
y
=
0
container
.
height
=
y
case
.
hidden
:
container
.
y
=
0
container
.
height
=
view
.
height
}
container
.
width
=
view
.
width
case
.
full
:
container
.
frame
=
view
.
bounds
}
}
/// Layout the chipBar.
func
layoutChipBar
()
{
chipBar
.
width
=
view
.
width
switch
chipBarAlignment
{
case
.
top
:
chipBar
.
isHidden
=
false
chipBar
.
y
=
0
case
.
bottom
:
chipBar
.
isHidden
=
false
chipBar
.
y
=
view
.
height
-
chipBar
.
height
case
.
hidden
:
chipBar
.
isHidden
=
true
}
}
/// Layout the rootViewController.
func
layoutRootViewController
()
{
rootViewController
.
view
.
frame
=
container
.
bounds
}
}
Sources/iOS/TabBar.swift
View file @
b254e22d
...
...
@@ -115,10 +115,10 @@ open class TabBar: Bar {
/// A preset wrapper around tabItems contentEdgeInsets.
open
var
tabItemsContentEdgeInsetsPreset
:
EdgeInsetsPreset
{
get
{
return
scroll
View
.
grid
.
contentEdgeInsetsPreset
return
content
View
.
grid
.
contentEdgeInsetsPreset
}
set
(
value
)
{
scroll
View
.
grid
.
contentEdgeInsetsPreset
=
value
content
View
.
grid
.
contentEdgeInsetsPreset
=
value
}
}
...
...
@@ -126,20 +126,20 @@ open class TabBar: Bar {
@IBInspectable
open
var
tabItemsContentEdgeInsets
:
EdgeInsets
{
get
{
return
scroll
View
.
grid
.
contentEdgeInsets
return
content
View
.
grid
.
contentEdgeInsets
}
set
(
value
)
{
scroll
View
.
grid
.
contentEdgeInsets
=
value
content
View
.
grid
.
contentEdgeInsets
=
value
}
}
/// A preset wrapper around tabItems interimSpace.
open
var
tabItemsInterimSpacePreset
:
InterimSpacePreset
{
get
{
return
scroll
View
.
grid
.
interimSpacePreset
return
content
View
.
grid
.
interimSpacePreset
}
set
(
value
)
{
scroll
View
.
grid
.
interimSpacePreset
=
value
content
View
.
grid
.
interimSpacePreset
=
value
}
}
...
...
@@ -147,10 +147,10 @@ open class TabBar: Bar {
@IBInspectable
open
var
tabItemsInterimSpace
:
InterimSpace
{
get
{
return
scroll
View
.
grid
.
interimSpace
return
content
View
.
grid
.
interimSpace
}
set
(
value
)
{
scroll
View
.
grid
.
interimSpace
=
value
content
View
.
grid
.
interimSpace
=
value
}
}
...
...
@@ -216,109 +216,7 @@ open class TabBar: Bar {
return
}
var
lc
=
0
var
rc
=
0
grid
.
begin
()
grid
.
views
.
removeAll
()
for
v
in
leftViews
{
if
let
b
=
v
as?
TabItem
{
b
.
contentEdgeInsets
=
.
zero
b
.
titleEdgeInsets
=
.
zero
}
v
.
width
=
v
.
intrinsicContentSize
.
width
v
.
sizeToFit
()
v
.
grid
.
columns
=
Int
(
ceil
(
v
.
width
/
gridFactor
))
+
2
lc
+=
v
.
grid
.
columns
grid
.
views
.
append
(
v
)
}
grid
.
views
.
append
(
contentView
)
for
v
in
rightViews
{
if
let
b
=
v
as?
TabItem
{
b
.
contentEdgeInsets
=
.
zero
b
.
titleEdgeInsets
=
.
zero
}
v
.
width
=
v
.
intrinsicContentSize
.
width
v
.
sizeToFit
()
v
.
grid
.
columns
=
Int
(
ceil
(
v
.
width
/
gridFactor
))
+
2
rc
+=
v
.
grid
.
columns
grid
.
views
.
append
(
v
)
}
contentView
.
grid
.
begin
()
contentView
.
grid
.
offset
.
columns
=
0
var
l
:
CGFloat
=
0
var
r
:
CGFloat
=
0
if
.
center
==
contentViewAlignment
{
if
leftViews
.
count
<
rightViews
.
count
{
r
=
CGFloat
(
rightViews
.
count
)
*
interimSpace
l
=
r
}
else
{
l
=
CGFloat
(
leftViews
.
count
)
*
interimSpace
r
=
l
}
}
let
p
=
width
-
l
-
r
-
contentEdgeInsets
.
left
-
contentEdgeInsets
.
right
let
columns
=
Int
(
ceil
(
p
/
gridFactor
))
if
.
center
==
contentViewAlignment
{
if
lc
<
rc
{
contentView
.
grid
.
columns
=
columns
-
2
*
rc
contentView
.
grid
.
offset
.
columns
=
rc
-
lc
}
else
{
contentView
.
grid
.
columns
=
columns
-
2
*
lc
rightViews
.
first
?
.
grid
.
offset
.
columns
=
lc
-
rc
}
}
else
{
contentView
.
grid
.
columns
=
columns
-
lc
-
rc
}
grid
.
axis
.
columns
=
columns
if
.
scrollable
==
tabBarStyle
||
(
.
auto
==
tabBarStyle
&&
tabItemsTotalWidth
>
bounds
.
width
)
{
var
w
:
CGFloat
=
tabItemsContentEdgeInsets
.
left
let
q
=
scrollView
.
height
/
2
let
p
=
q
+
tabItemsInterimSpace
for
v
in
tabItems
{
let
x
=
v
.
sizeThatFits
(
CGSize
(
width
:
CGFloat
.
greatestFiniteMagnitude
,
height
:
scrollView
.
height
))
.
width
v
.
height
=
scrollView
.
height
v
.
width
=
x
+
q
v
.
x
=
w
w
+=
x
w
+=
p
if
scrollView
!=
v
.
superview
{
v
.
removeFromSuperview
()
scrollView
.
addSubview
(
v
)
}
}
w
+=
tabItemsContentEdgeInsets
.
right
-
tabItemsInterimSpace
scrollView
.
contentSize
=
CGSize
(
width
:
w
,
height
:
scrollView
.
height
-
tabItemsContentEdgeInsets
.
top
-
tabItemsContentEdgeInsets
.
bottom
)
}
else
{
scrollView
.
grid
.
views
=
tabItems
scrollView
.
grid
.
axis
.
columns
=
tabItems
.
count
scrollView
.
contentSize
=
CGSize
(
width
:
scrollView
.
width
,
height
:
scrollView
.
height
-
tabItemsContentEdgeInsets
.
top
-
tabItemsContentEdgeInsets
.
bottom
)
}
grid
.
commit
()
contentView
.
grid
.
commit
()
layoutDivider
()
layoutScrollView
()
layoutLine
()
}
...
...
@@ -387,6 +285,37 @@ fileprivate extension TabBar {
}
fileprivate
extension
TabBar
{
/// Layout the scrollView.
func
layoutScrollView
()
{
if
.
scrollable
==
tabBarStyle
||
(
.
auto
==
tabBarStyle
&&
tabItemsTotalWidth
>
bounds
.
width
)
{
var
w
:
CGFloat
=
0
let
q
=
2
*
tabItemsInterimSpace
let
p
=
q
+
tabItemsInterimSpace
for
v
in
tabItems
{
let
x
=
v
.
sizeThatFits
(
CGSize
(
width
:
CGFloat
.
greatestFiniteMagnitude
,
height
:
scrollView
.
height
))
.
width
v
.
height
=
scrollView
.
height
v
.
width
=
x
+
q
v
.
x
=
w
w
+=
x
w
+=
p
if
scrollView
!=
v
.
superview
{
v
.
removeFromSuperview
()
scrollView
.
addSubview
(
v
)
}
}
w
-=
tabItemsInterimSpace
scrollView
.
contentSize
=
CGSize
(
width
:
w
,
height
:
scrollView
.
height
)
}
else
{
scrollView
.
grid
.
views
=
tabItems
scrollView
.
grid
.
axis
.
columns
=
tabItems
.
count
scrollView
.
contentSize
=
scrollView
.
bounds
.
size
}
}
/// Layout the line view.
func
layoutLine
()
{
guard
0
<
tabItems
.
count
else
{
...
...
Sources/iOS/TabBarController.swift
View file @
b254e22d
...
...
@@ -65,6 +65,17 @@ extension UIViewController {
}
open
class
TabBarController
:
UIViewController
{
/**
A Display value to indicate whether or not to
display the rootViewController to the full view
bounds, or up to the toolbar height.
*/
open
var
displayStyle
=
DisplayStyle
.
partial
{
didSet
{
layoutSubviews
()
}
}
/// The TabBar used to switch between view controllers.
@IBInspectable
open
let
tabBar
=
TabBar
()
...
...
@@ -150,9 +161,9 @@ open class TabBarController: UIViewController {
open
func
prepare
()
{
view
.
backgroundColor
=
.
white
view
.
contentScaleFactor
=
Screen
.
scale
prepareContainer
()
prepareTabBar
()
prepareTabBarItems
()
prepareContainer
()
prepareViewControllers
()
}
}
...
...
@@ -219,30 +230,36 @@ fileprivate extension TabBarController {
}
fileprivate
extension
TabBarController
{
/// Layout the container
view
.
/// Layout the container.
func
layoutContainer
()
{
let
p
=
tabBar
.
height
let
y
=
view
.
height
-
p
tabBar
.
width
=
view
.
width
switch
tabBarAlignment
{
case
.
top
:
container
.
y
=
p
container
.
height
=
y
case
.
bottom
:
container
.
y
=
0
container
.
height
=
y
case
.
hidden
:
container
.
y
=
0
container
.
height
=
view
.
height
switch
displayStyle
{
case
.
partial
:
let
p
=
tabBar
.
height
let
y
=
view
.
height
-
p
switch
tabBarAlignment
{
case
.
top
:
container
.
y
=
p
container
.
height
=
y
case
.
bottom
:
container
.
y
=
0
container
.
height
=
y
case
.
hidden
:
container
.
y
=
0
container
.
height
=
view
.
height
}
container
.
width
=
view
.
width
case
.
full
:
container
.
frame
=
view
.
bounds
}
container
.
width
=
view
.
width
}
/// Layout the
T
abBar.
/// Layout the
t
abBar.
func
layoutTabBar
()
{
let
y
=
view
.
height
-
tabBar
.
height
tabBar
.
width
=
view
.
width
switch
tabBarAlignment
{
...
...
@@ -251,7 +268,7 @@ fileprivate extension TabBarController {
tabBar
.
y
=
0
case
.
bottom
:
tabBar
.
isHidden
=
false
tabBar
.
y
=
y
tabBar
.
y
=
view
.
height
-
tabBar
.
height
case
.
hidden
:
tabBar
.
isHidden
=
true
}
...
...
Sources/iOS/ToolbarController.swift
View file @
b254e22d
...
...
@@ -49,22 +49,9 @@ open class ToolbarController: StatusBarController {
open
override
func
layoutSubviews
()
{
super
.
layoutSubviews
()
let
y
=
Application
.
shouldStatusBarBeHidden
||
statusBar
.
isHidden
?
0
:
statusBar
.
height
toolbar
.
y
=
y
toolbar
.
width
=
view
.
width
switch
displayStyle
{
case
.
partial
:
let
h
=
y
+
toolbar
.
height
container
.
y
=
h
container
.
height
=
view
.
height
-
h
case
.
full
:
container
.
frame
=
view
.
bounds
}
rootViewController
.
view
.
frame
=
container
.
bounds
layoutToolbar
()
layoutContainer
()
layoutRootViewController
()
}
open
override
func
prepare
()
{
...
...
@@ -76,15 +63,40 @@ open class ToolbarController: StatusBarController {
}
}
extension
ToolbarController
{
fileprivate
extension
ToolbarController
{
/// Prepares the statusBar.
f
ileprivate
f
unc
prepareStatusBar
()
{
func
prepareStatusBar
()
{
shouldHideStatusBarOnRotation
=
false
}
/// Prepares the toolbar.
f
ileprivate
f
unc
prepareToolbar
()
{
func
prepareToolbar
()
{
toolbar
.
depthPreset
=
.
depth1
view
.
addSubview
(
toolbar
)
}
}
fileprivate
extension
ToolbarController
{
/// Layout the toolbar.
func
layoutToolbar
()
{
toolbar
.
y
=
Application
.
shouldStatusBarBeHidden
||
statusBar
.
isHidden
?
0
:
statusBar
.
height
toolbar
.
width
=
view
.
width
}
/// Layout the container.
func
layoutContainer
()
{
switch
displayStyle
{
case
.
partial
:
let
h
=
toolbar
.
y
+
toolbar
.
height
container
.
y
=
h
container
.
height
=
view
.
height
-
h
case
.
full
:
container
.
frame
=
view
.
bounds
}
}
/// Layout the rootViewController.
func
layoutRootViewController
()
{
rootViewController
.
view
.
frame
=
container
.
bounds
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment