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
0eb7acf7
Commit
0eb7acf7
authored
Feb 25, 2018
by
intoxicated
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed indentation to 2 for consistency
parent
9ab21516
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
448 additions
and
448 deletions
+448
-448
Sources/iOS/Bar.swift
+213
-213
Sources/iOS/NavigationController.swift
+148
-148
Sources/iOS/NavigationItem.swift
+87
-87
No files found.
Sources/iOS/Bar.swift
View file @
0eb7acf7
...
...
@@ -32,245 +32,245 @@ import UIKit
@objc(ContentViewAlignment)
public
enum
ContentViewAlignment
:
Int
{
case
full
case
center
case
full
case
center
}
open
class
Bar
:
View
{
/// Will layout the view.
open
var
willLayout
:
Bool
{
return
0
<
bounds
.
width
&&
0
<
bounds
.
height
&&
nil
!=
superview
&&
!
grid
.
isDeferred
/// Will layout the view.
open
var
willLayout
:
Bool
{
return
0
<
bounds
.
width
&&
0
<
bounds
.
height
&&
nil
!=
superview
&&
!
grid
.
isDeferred
}
open
override
var
intrinsicContentSize
:
CGSize
{
return
bounds
.
size
}
/// Should center the contentView.
open
var
contentViewAlignment
=
ContentViewAlignment
.
full
{
didSet
{
layoutSubviews
()
}
open
override
var
intrinsicContentSize
:
CGSize
{
return
bounds
.
size
}
/// A preset wrapper around contentEdgeInsets.
open
var
contentEdgeInsetsPreset
:
EdgeInsetsPreset
{
get
{
return
grid
.
contentEdgeInsetsPreset
}
/// Should center the contentView.
open
var
contentViewAlignment
=
ContentViewAlignment
.
full
{
didSet
{
layoutSubviews
()
}
set
(
value
)
{
grid
.
contentEdgeInsetsPreset
=
value
}
/// A preset wrapper around contentEdgeInsets.
open
var
contentEdgeInsetsPreset
:
EdgeInsetsPreset
{
get
{
return
grid
.
contentEdgeInsetsPreset
}
set
(
value
)
{
grid
.
contentEdgeInsetsPreset
=
value
}
}
/// A reference to EdgeInsets.
@IBInspectable
open
var
contentEdgeInsets
:
EdgeInsets
{
get
{
return
grid
.
contentEdgeInsets
}
/// A reference to EdgeInsets.
@IBInspectable
open
var
contentEdgeInsets
:
EdgeInsets
{
get
{
return
grid
.
contentEdgeInsets
}
set
(
value
)
{
grid
.
contentEdgeInsets
=
value
}
set
(
value
)
{
grid
.
contentEdgeInsets
=
value
}
/// A preset wrapper around interimSpace.
open
var
interimSpacePreset
:
InterimSpacePreset
{
get
{
return
grid
.
interimSpacePreset
}
set
(
value
)
{
grid
.
interimSpacePreset
=
value
}
}
/// A preset wrapper around interimSpace.
open
var
interimSpacePreset
:
InterimSpacePreset
{
get
{
return
grid
.
interimSpacePreset
}
/// A wrapper around grid.interimSpace.
@IBInspectable
open
var
interimSpace
:
InterimSpace
{
get
{
return
grid
.
interimSpace
}
set
(
value
)
{
grid
.
interimSpace
=
value
}
set
(
value
)
{
grid
.
interimSpacePreset
=
value
}
/// Grid cell factor.
@IBInspectable
open
var
gridFactor
:
CGFloat
=
12
{
didSet
{
assert
(
0
<
gridFactor
,
"[Material Error: gridFactor must be greater than 0.]"
)
layoutSubviews
()
}
}
/// A wrapper around grid.interimSpace.
@IBInspectable
open
var
interimSpace
:
InterimSpace
{
get
{
return
grid
.
interimSpace
}
set
(
value
)
{
grid
.
interimSpace
=
value
}
}
/// Grid cell factor.
@IBInspectable
open
var
gridFactor
:
CGFloat
=
12
{
didSet
{
assert
(
0
<
gridFactor
,
"[Material Error: gridFactor must be greater than 0.]"
)
layoutSubviews
()
}
}
/// ContentView that holds the any desired subviews.
open
let
contentView
=
UIView
()
/// Left side UIViews.
open
var
leftViews
=
[
UIView
]()
{
didSet
{
oldValue
.
forEach
{
$0
.
removeFromSuperview
()
}
layoutSubviews
()
}
}
/// Right side UIViews.
open
var
rightViews
=
[
UIView
]()
{
didSet
{
oldValue
.
forEach
{
$0
.
removeFromSuperview
()
}
layoutSubviews
()
}
}
/// Center UIViews.
open
var
centerViews
:
[
UIView
]
{
get
{
return
contentView
.
grid
.
views
}
set
(
value
)
{
contentView
.
grid
.
views
=
value
}
}
/**
An initializer that initializes the object with a NSCoder object.
- Parameter aDecoder: A NSCoder instance.
*/
public
required
init
?(
coder
aDecoder
:
NSCoder
)
{
super
.
init
(
coder
:
aDecoder
)
}
/**
An initializer that initializes the object with a CGRect object.
If AutoLayout is used, it is better to initilize the instance
using the init() initializer.
- Parameter frame: A CGRect instance.
*/
public
override
init
(
frame
:
CGRect
)
{
super
.
init
(
frame
:
frame
)
}
/// Convenience initializer.
public
convenience
init
()
{
self
.
init
(
frame
:
.
zero
)
}
/**
A convenience initializer with parameter settings.
- Parameter leftViews: An Array of UIViews that go on the left side.
- Parameter rightViews: An Array of UIViews that go on the right side.
- Parameter centerViews: An Array of UIViews that go in the center.
*/
public
convenience
init
(
leftViews
:
[
UIView
]?
=
nil
,
rightViews
:
[
UIView
]?
=
nil
,
centerViews
:
[
UIView
]?
=
nil
)
{
self
.
init
()
self
.
leftViews
=
leftViews
??
[]
self
.
rightViews
=
rightViews
??
[]
self
.
centerViews
=
centerViews
??
[]
}
open
override
func
layoutSubviews
()
{
super
.
layoutSubviews
()
guard
willLayout
else
{
return
}
/// ContentView that holds the any desired subviews.
open
let
contentView
=
UIView
()
var
lc
=
0
var
rc
=
0
/// Left side UIViews.
open
var
leftViews
=
[
UIView
]()
{
didSet
{
oldValue
.
forEach
{
$0
.
removeFromSuperview
()
}
layoutSubviews
()
}
}
grid
.
begin
()
grid
.
views
.
removeAll
()
/// Right side UIViews.
open
var
rightViews
=
[
UIView
]()
{
didSet
{
oldValue
.
forEach
{
$0
.
removeFromSuperview
()
}
layoutSubviews
()
}
for
v
in
leftViews
{
if
let
b
=
v
as?
UIButton
{
b
.
contentEdgeInsets
=
.
zero
b
.
titleEdgeInsets
=
.
zero
}
v
.
frame
.
size
.
width
=
v
.
intrinsicContentSize
.
width
v
.
sizeToFit
()
v
.
grid
.
columns
=
Int
(
ceil
(
v
.
bounds
.
width
/
gridFactor
))
+
2
lc
+=
v
.
grid
.
columns
grid
.
views
.
append
(
v
)
}
/// Center UIViews.
open
var
centerViews
:
[
UIView
]
{
get
{
return
contentView
.
grid
.
views
}
set
(
value
)
{
contentView
.
grid
.
views
=
value
}
}
grid
.
views
.
append
(
contentView
)
/**
An initializer that initializes the object with a NSCoder object.
- Parameter aDecoder: A NSCoder instance.
*/
public
required
init
?(
coder
aDecoder
:
NSCoder
)
{
super
.
init
(
coder
:
aDecoder
)
for
v
in
rightViews
{
if
let
b
=
v
as?
UIButton
{
b
.
contentEdgeInsets
=
.
zero
b
.
titleEdgeInsets
=
.
zero
}
v
.
frame
.
size
.
width
=
v
.
intrinsicContentSize
.
width
v
.
sizeToFit
()
v
.
grid
.
columns
=
Int
(
ceil
(
v
.
bounds
.
width
/
gridFactor
))
+
2
rc
+=
v
.
grid
.
columns
grid
.
views
.
append
(
v
)
}
/**
An initializer that initializes the object with a CGRect object.
If AutoLayout is used, it is better to initilize the instance
using the init() initializer.
- Parameter frame: A CGRect instance.
*/
public
override
init
(
frame
:
CGRect
)
{
super
.
init
(
frame
:
frame
)
}
contentView
.
grid
.
begin
()
contentView
.
grid
.
offset
.
columns
=
0
/// Convenience initializer.
public
convenience
init
()
{
self
.
init
(
frame
:
.
zero
)
}
var
l
:
CGFloat
=
0
var
r
:
CGFloat
=
0
/**
A convenience initializer with parameter settings.
- Parameter leftViews: An Array of UIViews that go on the left side.
- Parameter rightViews: An Array of UIViews that go on the right side.
- Parameter centerViews: An Array of UIViews that go in the center.
*/
public
convenience
init
(
leftViews
:
[
UIView
]?
=
nil
,
rightViews
:
[
UIView
]?
=
nil
,
centerViews
:
[
UIView
]?
=
nil
)
{
self
.
init
()
self
.
leftViews
=
leftViews
??
[]
self
.
rightViews
=
rightViews
??
[]
self
.
centerViews
=
centerViews
??
[]
if
.
center
==
contentViewAlignment
{
if
leftViews
.
count
<
rightViews
.
count
{
r
=
CGFloat
(
rightViews
.
count
)
*
interimSpace
l
=
r
}
else
{
l
=
CGFloat
(
leftViews
.
count
)
*
interimSpace
r
=
l
}
}
open
override
func
layoutSubviews
()
{
super
.
layoutSubviews
()
guard
willLayout
else
{
return
}
var
lc
=
0
var
rc
=
0
grid
.
begin
()
grid
.
views
.
removeAll
()
for
v
in
leftViews
{
if
let
b
=
v
as?
UIButton
{
b
.
contentEdgeInsets
=
.
zero
b
.
titleEdgeInsets
=
.
zero
}
v
.
frame
.
size
.
width
=
v
.
intrinsicContentSize
.
width
v
.
sizeToFit
()
v
.
grid
.
columns
=
Int
(
ceil
(
v
.
bounds
.
width
/
gridFactor
))
+
2
lc
+=
v
.
grid
.
columns
grid
.
views
.
append
(
v
)
}
grid
.
views
.
append
(
contentView
)
for
v
in
rightViews
{
if
let
b
=
v
as?
UIButton
{
b
.
contentEdgeInsets
=
.
zero
b
.
titleEdgeInsets
=
.
zero
}
v
.
frame
.
size
.
width
=
v
.
intrinsicContentSize
.
width
v
.
sizeToFit
()
v
.
grid
.
columns
=
Int
(
ceil
(
v
.
bounds
.
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
=
bounds
.
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
grid
.
commit
()
contentView
.
grid
.
commit
()
layoutDivider
()
}
let
p
=
bounds
.
width
-
l
-
r
-
contentEdgeInsets
.
left
-
contentEdgeInsets
.
right
let
columns
=
Int
(
ceil
(
p
/
gridFactor
))
open
override
func
prepare
()
{
super
.
prepare
()
heightPreset
=
.
normal
autoresizingMask
=
.
flexibleWidth
interimSpacePreset
=
.
interimSpace3
contentEdgeInsetsPreset
=
.
square1
prepareContentView
()
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
grid
.
commit
()
contentView
.
grid
.
commit
()
layoutDivider
()
}
open
override
func
prepare
()
{
super
.
prepare
()
heightPreset
=
.
normal
autoresizingMask
=
.
flexibleWidth
interimSpacePreset
=
.
interimSpace3
contentEdgeInsetsPreset
=
.
square1
prepareContentView
()
}
}
extension
Bar
{
/// Prepares the contentView.
fileprivate
func
prepareContentView
()
{
contentView
.
contentScaleFactor
=
Screen
.
scale
}
/// Prepares the contentView.
fileprivate
func
prepareContentView
()
{
contentView
.
contentScaleFactor
=
Screen
.
scale
}
}
Sources/iOS/NavigationController.swift
View file @
0eb7acf7
...
...
@@ -32,173 +32,173 @@ import UIKit
import
Motion
extension
NavigationController
{
/// Device status bar style.
open
var
statusBarStyle
:
UIStatusBarStyle
{
get
{
return
Application
.
statusBarStyle
}
set
(
value
)
{
Application
.
statusBarStyle
=
value
}
/// Device status bar style.
open
var
statusBarStyle
:
UIStatusBarStyle
{
get
{
return
Application
.
statusBarStyle
}
set
(
value
)
{
Application
.
statusBarStyle
=
value
}
}
}
open
class
NavigationController
:
UINavigationController
{
/**
An initializer that initializes the object with a NSCoder object.
- Parameter aDecoder: A NSCoder instance.
*/
public
required
init
?(
coder
aDecoder
:
NSCoder
)
{
super
.
init
(
coder
:
aDecoder
)
}
/**
An initializer that initializes the object with an Optional nib and bundle.
- Parameter nibNameOrNil: An Optional String for the nib.
- Parameter bundle: An Optional NSBundle where the nib is located.
*/
public
override
init
(
nibName
nibNameOrNil
:
String
?,
bundle
nibBundleOrNil
:
Bundle
?)
{
super
.
init
(
nibName
:
nibNameOrNil
,
bundle
:
nibBundleOrNil
)
}
/**
An initializer that initializes the object with a rootViewController.
- Parameter rootViewController: A UIViewController for the rootViewController.
*/
public
override
init
(
rootViewController
:
UIViewController
)
{
super
.
init
(
navigationBarClass
:
NavigationBar
.
self
,
toolbarClass
:
nil
)
setViewControllers
([
rootViewController
],
animated
:
false
)
}
open
override
func
viewWillAppear
(
_
animated
:
Bool
)
{
super
.
viewWillAppear
(
animated
)
guard
let
v
=
interactivePopGestureRecognizer
else
{
return
}
guard
let
x
=
navigationDrawerController
else
{
return
}
if
let
l
=
x
.
leftPanGesture
{
l
.
require
(
toFail
:
v
)
}
if
let
r
=
x
.
rightPanGesture
{
r
.
require
(
toFail
:
v
)
}
}
open
override
func
viewDidLoad
()
{
super
.
viewDidLoad
()
prepare
()
}
open
override
func
viewDidAppear
(
_
animated
:
Bool
)
{
super
.
viewDidAppear
(
animated
)
guard
let
v
=
navigationBar
as?
NavigationBar
else
{
return
}
guard
let
item
=
v
.
topItem
else
{
return
}
v
.
layoutNavigationItem
(
item
:
item
)
}
/**
An initializer that initializes the object with a NSCoder object.
- Parameter aDecoder: A NSCoder instance.
*/
public
required
init
?(
coder
aDecoder
:
NSCoder
)
{
super
.
init
(
coder
:
aDecoder
)
}
/**
An initializer that initializes the object with an Optional nib and bundle.
- Parameter nibNameOrNil: An Optional String for the nib.
- Parameter bundle: An Optional NSBundle where the nib is located.
*/
public
override
init
(
nibName
nibNameOrNil
:
String
?,
bundle
nibBundleOrNil
:
Bundle
?)
{
super
.
init
(
nibName
:
nibNameOrNil
,
bundle
:
nibBundleOrNil
)
}
/**
An initializer that initializes the object with a rootViewController.
- Parameter rootViewController: A UIViewController for the rootViewController.
*/
public
override
init
(
rootViewController
:
UIViewController
)
{
super
.
init
(
navigationBarClass
:
NavigationBar
.
self
,
toolbarClass
:
nil
)
setViewControllers
([
rootViewController
],
animated
:
false
)
}
open
override
func
viewWillAppear
(
_
animated
:
Bool
)
{
super
.
viewWillAppear
(
animated
)
guard
let
v
=
interactivePopGestureRecognizer
else
{
return
}
open
override
func
viewWillLayoutSubviews
()
{
super
.
viewWillLayoutSubviews
()
layoutSubviews
()
guard
let
x
=
navigationDrawerController
else
{
return
}
/**
Prepares the view instance when intialized. When subclassing,
it is recommended to override the prepare method
to initialize property values and other setup operations.
The super.prepare method should always be called immediately
when subclassing.
*/
open
func
prepare
()
{
navigationBar
.
frame
.
size
.
width
=
view
.
bounds
.
width
navigationBar
.
heightPreset
=
.
normal
view
.
clipsToBounds
=
true
view
.
backgroundColor
=
.
white
view
.
contentScaleFactor
=
Screen
.
scale
// This ensures the panning gesture is available when going back between views.
if
let
v
=
interactivePopGestureRecognizer
{
v
.
isEnabled
=
true
v
.
delegate
=
self
}
}
if
let
l
=
x
.
leftPanGesture
{
l
.
require
(
toFail
:
v
)
}
/// Calls the layout functions for the view heirarchy.
open
func
layoutSubviews
()
{
navigationBar
.
setNeedsUpdateConstraints
()
navigationBar
.
updateConstraintsIfNeeded
()
navigationBar
.
setNeedsLayout
()
navigationBar
.
layoutIfNeeded
()
if
let
r
=
x
.
rightPanGesture
{
r
.
require
(
toFail
:
v
)
}
}
open
override
func
viewDidLoad
()
{
super
.
viewDidLoad
()
prepare
()
}
open
override
func
viewDidAppear
(
_
animated
:
Bool
)
{
super
.
viewDidAppear
(
animated
)
guard
let
v
=
navigationBar
as?
NavigationBar
else
{
return
}
guard
let
item
=
v
.
topItem
else
{
return
}
v
.
layoutNavigationItem
(
item
:
item
)
}
open
override
func
viewWillLayoutSubviews
()
{
super
.
viewWillLayoutSubviews
()
layoutSubviews
()
}
/**
Prepares the view instance when intialized. When subclassing,
it is recommended to override the prepare method
to initialize property values and other setup operations.
The super.prepare method should always be called immediately
when subclassing.
*/
open
func
prepare
()
{
navigationBar
.
frame
.
size
.
width
=
view
.
bounds
.
width
navigationBar
.
heightPreset
=
.
normal
view
.
clipsToBounds
=
true
view
.
backgroundColor
=
.
white
view
.
contentScaleFactor
=
Screen
.
scale
// This ensures the panning gesture is available when going back between views.
if
let
v
=
interactivePopGestureRecognizer
{
v
.
isEnabled
=
true
v
.
delegate
=
self
}
}
/// Calls the layout functions for the view heirarchy.
open
func
layoutSubviews
()
{
navigationBar
.
setNeedsUpdateConstraints
()
navigationBar
.
updateConstraintsIfNeeded
()
navigationBar
.
setNeedsLayout
()
navigationBar
.
layoutIfNeeded
()
}
}
extension
NavigationController
:
UINavigationBarDelegate
{
/**
Delegation method that is called when a new UINavigationItem is about to be pushed.
This is used to prepare the transitions between UIViewControllers on the stack.
- Parameter navigationBar: A UINavigationBar that is used in the NavigationController.
- Parameter item: The UINavigationItem that will be pushed on the stack.
- Returns: A Boolean value that indicates whether to push the item on to the stack or not.
True is yes, false is no.
*/
public
func
navigationBar
(
_
navigationBar
:
UINavigationBar
,
shouldPush
item
:
UINavigationItem
)
->
Bool
{
if
let
v
=
navigationBar
as?
NavigationBar
{
if
nil
==
item
.
backButton
.
image
&&
nil
==
item
.
backButton
.
title
{
item
.
backButton
.
image
=
v
.
backButtonImage
}
if
!
item
.
backButton
.
isHidden
{
item
.
leftViews
.
insert
(
item
.
backButton
,
at
:
0
)
}
item
.
backButton
.
addTarget
(
self
,
action
:
#selector(
handle(backButton:)
)
,
for
:
.
touchUpInside
)
item
.
hidesBackButton
=
false
item
.
setHidesBackButton
(
true
,
animated
:
false
)
v
.
layoutNavigationItem
(
item
:
item
)
}
return
true
/**
Delegation method that is called when a new UINavigationItem is about to be pushed.
This is used to prepare the transitions between UIViewControllers on the stack.
- Parameter navigationBar: A UINavigationBar that is used in the NavigationController.
- Parameter item: The UINavigationItem that will be pushed on the stack.
- Returns: A Boolean value that indicates whether to push the item on to the stack or not.
True is yes, false is no.
*/
public
func
navigationBar
(
_
navigationBar
:
UINavigationBar
,
shouldPush
item
:
UINavigationItem
)
->
Bool
{
if
let
v
=
navigationBar
as?
NavigationBar
{
if
nil
==
item
.
backButton
.
image
&&
nil
==
item
.
backButton
.
title
{
item
.
backButton
.
image
=
v
.
backButtonImage
}
if
!
item
.
backButton
.
isHidden
{
item
.
leftViews
.
insert
(
item
.
backButton
,
at
:
0
)
}
item
.
backButton
.
addTarget
(
self
,
action
:
#selector(
handle(backButton:)
)
,
for
:
.
touchUpInside
)
item
.
hidesBackButton
=
false
item
.
setHidesBackButton
(
true
,
animated
:
false
)
v
.
layoutNavigationItem
(
item
:
item
)
}
public
func
navigationBar
(
_
navigationBar
:
UINavigationBar
,
didPop
item
:
UINavigationItem
)
{
if
let
index
=
item
.
leftViews
.
index
(
of
:
item
.
backButton
)
{
item
.
leftViews
.
remove
(
at
:
index
)
}
item
.
backButton
.
removeTarget
(
self
,
action
:
#selector(
handle(backButton:)
)
,
for
:
.
touchUpInside
)
return
true
}
public
func
navigationBar
(
_
navigationBar
:
UINavigationBar
,
didPop
item
:
UINavigationItem
)
{
if
let
index
=
item
.
leftViews
.
index
(
of
:
item
.
backButton
)
{
item
.
leftViews
.
remove
(
at
:
index
)
}
item
.
backButton
.
removeTarget
(
self
,
action
:
#selector(
handle(backButton:)
)
,
for
:
.
touchUpInside
)
}
}
internal
extension
NavigationController
{
/// Handler for the backbutton.
@objc
func
handle
(
backButton
:
UIButton
)
{
popViewController
(
animated
:
true
)
}
/// Handler for the backbutton.
@objc
func
handle
(
backButton
:
UIButton
)
{
popViewController
(
animated
:
true
)
}
}
extension
NavigationController
:
UIGestureRecognizerDelegate
{
/**
Detects the gesture recognizer being used. This is necessary when using
NavigationDrawerController. It eliminates the conflict in panning.
- Parameter gestureRecognizer: A UIGestureRecognizer to detect.
- Parameter touch: The UITouch event.
- Returns: A Boolean of whether to continue the gesture or not, true yes, false no.
*/
public
func
gestureRecognizer
(
_
gestureRecognizer
:
UIGestureRecognizer
,
shouldReceive
touch
:
UITouch
)
->
Bool
{
return
interactivePopGestureRecognizer
==
gestureRecognizer
&&
nil
!=
navigationBar
.
backItem
}
/**
Detects the gesture recognizer being used. This is necessary when using
NavigationDrawerController. It eliminates the conflict in panning.
- Parameter gestureRecognizer: A UIGestureRecognizer to detect.
- Parameter touch: The UITouch event.
- Returns: A Boolean of whether to continue the gesture or not, true yes, false no.
*/
public
func
gestureRecognizer
(
_
gestureRecognizer
:
UIGestureRecognizer
,
shouldReceive
touch
:
UITouch
)
->
Bool
{
return
interactivePopGestureRecognizer
==
gestureRecognizer
&&
nil
!=
navigationBar
.
backItem
}
}
Sources/iOS/NavigationItem.swift
View file @
0eb7acf7
...
...
@@ -36,105 +36,105 @@ fileprivate var NavigationItemKey: UInt8 = 0
fileprivate
var
NavigationItemContext
:
UInt8
=
0
fileprivate
class
NavigationItem
:
NSObject
{
/// A reference to the toolbar.
@objc
let
toolbar
=
Toolbar
()
/// Back Button.
lazy
var
backButton
=
IconButton
()
/// An optional reference to the NavigationBar.
var
navigationBar
:
NavigationBar
?
{
var
v
=
toolbar
.
contentView
.
superview
while
nil
!=
v
{
if
let
navigationBar
=
v
as?
NavigationBar
{
return
navigationBar
}
v
=
v
?
.
superview
}
return
nil
/// A reference to the toolbar.
@objc
let
toolbar
=
Toolbar
()
/// Back Button.
lazy
var
backButton
=
IconButton
()
/// An optional reference to the NavigationBar.
var
navigationBar
:
NavigationBar
?
{
var
v
=
toolbar
.
contentView
.
superview
while
nil
!=
v
{
if
let
navigationBar
=
v
as?
NavigationBar
{
return
navigationBar
}
v
=
v
?
.
superview
}
return
nil
}
}
fileprivate
extension
UINavigationItem
{
/// NavigationItem reference.
var
navigationItem
:
NavigationItem
{
get
{
return
AssociatedObject
.
get
(
base
:
self
,
key
:
&
NavigationItemKey
)
{
return
NavigationItem
()
}
}
set
(
value
)
{
AssociatedObject
.
set
(
base
:
self
,
key
:
&
NavigationItemKey
,
value
:
value
)
}
/// NavigationItem reference.
var
navigationItem
:
NavigationItem
{
get
{
return
AssociatedObject
.
get
(
base
:
self
,
key
:
&
NavigationItemKey
)
{
return
NavigationItem
()
}
}
set
(
value
)
{
AssociatedObject
.
set
(
base
:
self
,
key
:
&
NavigationItemKey
,
value
:
value
)
}
}
}
internal
extension
UINavigationItem
{
/// A reference to the NavigationItem Toolbar.
var
toolbar
:
Toolbar
{
return
navigationItem
.
toolbar
}
/// A reference to the NavigationItem Toolbar.
var
toolbar
:
Toolbar
{
return
navigationItem
.
toolbar
}
}
extension
UINavigationItem
{
/// Should center the contentView.
open
var
contentViewAlignment
:
ContentViewAlignment
{
get
{
return
toolbar
.
contentViewAlignment
}
set
(
value
)
{
toolbar
.
contentViewAlignment
=
value
}
/// Should center the contentView.
open
var
contentViewAlignment
:
ContentViewAlignment
{
get
{
return
toolbar
.
contentViewAlignment
}
set
(
value
)
{
toolbar
.
contentViewAlignment
=
value
}
}
/// Content View.
open
var
contentView
:
UIView
{
return
toolbar
.
contentView
}
/// Back Button.
open
var
backButton
:
IconButton
{
return
navigationItem
.
backButton
}
/// Title Label.
open
var
titleLabel
:
UILabel
{
return
toolbar
.
titleLabel
}
/// Detail Label.
open
var
detailLabel
:
UILabel
{
return
toolbar
.
detailLabel
}
/// Left side UIViews.
open
var
leftViews
:
[
UIView
]
{
get
{
return
toolbar
.
leftViews
}
set
(
value
)
{
toolbar
.
leftViews
=
value
}
}
/// Right side UIViews.
open
var
rightViews
:
[
UIView
]
{
get
{
return
toolbar
.
rightViews
}
set
(
value
)
{
toolbar
.
rightViews
=
value
}
/// Content View.
open
var
contentView
:
UIView
{
return
toolbar
.
contentView
}
/// Center UIViews.
open
var
centerViews
:
[
UIView
]
{
get
{
return
toolbar
.
centerViews
}
/// Back Button.
open
var
backButton
:
IconButton
{
return
navigationItem
.
backButton
}
/// Title Label.
open
var
titleLabel
:
UILabel
{
return
toolbar
.
titleLabel
}
/// Detail Label.
open
var
detailLabel
:
UILabel
{
return
toolbar
.
detailLabel
}
/// Left side UIViews.
open
var
leftViews
:
[
UIView
]
{
get
{
return
toolbar
.
leftViews
}
set
(
value
)
{
toolbar
.
leftViews
=
value
}
}
/// Right side UIViews.
open
var
rightViews
:
[
UIView
]
{
get
{
return
toolbar
.
rightViews
}
set
(
value
)
{
toolbar
.
rightViews
=
value
}
}
/// Center UIViews.
open
var
centerViews
:
[
UIView
]
{
get
{
return
toolbar
.
centerViews
}
set
(
value
)
{
toolbar
.
centerViews
=
value
}
set
(
value
)
{
toolbar
.
centerViews
=
value
}
}
}
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