Skip to content

Commit

Permalink
updated ToolbarController and SearchBarController to accept alignment…
Browse files Browse the repository at this point in the history
… properties
  • Loading branch information
Daniel Dahan committed Aug 17, 2017
1 parent 6fe0628 commit 112992a
Show file tree
Hide file tree
Showing 7 changed files with 177 additions and 63 deletions.
72 changes: 72 additions & 0 deletions Material.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,42 @@
96BFC1541E5E486F0075DE1F /* SpringAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965532281E47E388005C2792 /* SpringAnimation.swift */; };
96BFC16F1E63C10A0075DE1F /* SpringAnimation.swift in Headers */ = {isa = PBXBuildFile; fileRef = 965532281E47E388005C2792 /* SpringAnimation.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D88C321C1328D800B91418 /* Material.h in Headers */ = {isa = PBXBuildFile; fileRef = 96D88C091C1328D800B91418 /* Material.h */; settings = {ATTRIBUTES = (Public, ); }; };
96D994741F4521BB00AFD6E3 /* MotionAnimator.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527581F393C0E00E8B2AC /* MotionAnimator.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994751F4521BB00AFD6E3 /* MotionAnimatorViewContext.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527591F393C0E00E8B2AC /* MotionAnimatorViewContext.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994761F4521BB00AFD6E3 /* MotionCoreAnimationViewContext.swift in Headers */ = {isa = PBXBuildFile; fileRef = 9615275A1F393C0E00E8B2AC /* MotionCoreAnimationViewContext.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994771F4521BB00AFD6E3 /* MotionHasInsertOrder.swift in Headers */ = {isa = PBXBuildFile; fileRef = 9615275B1F393C0E00E8B2AC /* MotionHasInsertOrder.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994781F4521BB00AFD6E3 /* MotionTransitionAnimator.swift in Headers */ = {isa = PBXBuildFile; fileRef = 9615275C1F393C0E00E8B2AC /* MotionTransitionAnimator.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994791F4521BB00AFD6E3 /* MotionViewPropertyViewContext.swift in Headers */ = {isa = PBXBuildFile; fileRef = 9615275D1F393C0E00E8B2AC /* MotionViewPropertyViewContext.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D9947A1F4521BB00AFD6E3 /* Motion+Array.swift in Headers */ = {isa = PBXBuildFile; fileRef = 9615275F1F393C0E00E8B2AC /* Motion+Array.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D9947B1F4521BB00AFD6E3 /* Motion+CALayer.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527601F393C0E00E8B2AC /* Motion+CALayer.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D9947C1F4521BB00AFD6E3 /* Motion+CAMediaTimingFunction.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527611F393C0E00E8B2AC /* Motion+CAMediaTimingFunction.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D9947D1F4521BB00AFD6E3 /* Motion+CG.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527621F393C0E00E8B2AC /* Motion+CG.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D9947E1F4521BB00AFD6E3 /* Motion+Obj-C.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527631F393C0E00E8B2AC /* Motion+Obj-C.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D9947F1F4521BB00AFD6E3 /* Motion+UIKit.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527641F393C0E00E8B2AC /* Motion+UIKit.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994801F4521BB00AFD6E3 /* Motion+UIView.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527651F393C0E00E8B2AC /* Motion+UIView.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994811F4521BB00AFD6E3 /* Motion+UIViewController.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527661F393C0E00E8B2AC /* Motion+UIViewController.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994821F4521BB00AFD6E3 /* MotionAnimationFillMode.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527671F393C0E00E8B2AC /* MotionAnimationFillMode.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994831F4521BB00AFD6E3 /* LICENSE in Headers */ = {isa = PBXBuildFile; fileRef = 961527681F393C0E00E8B2AC /* LICENSE */; settings = {ATTRIBUTES = (Public, ); }; };
96D994841F4521BB00AFD6E3 /* Motion.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527691F393C0E00E8B2AC /* Motion.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994851F4521BB00AFD6E3 /* MotionAnimation.swift in Headers */ = {isa = PBXBuildFile; fileRef = 9615276A1F393C0E00E8B2AC /* MotionAnimation.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994861F4521BB00AFD6E3 /* MotionAnimationState.swift in Headers */ = {isa = PBXBuildFile; fileRef = 9615276B1F393C0E00E8B2AC /* MotionAnimationState.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994871F4521BB00AFD6E3 /* MotionCAAnimation.swift in Headers */ = {isa = PBXBuildFile; fileRef = 9615276C1F393C0E00E8B2AC /* MotionCAAnimation.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994881F4521BB00AFD6E3 /* MotionContext.swift in Headers */ = {isa = PBXBuildFile; fileRef = 9615276D1F393C0E00E8B2AC /* MotionContext.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994891F4521BB00AFD6E3 /* MotionController.swift in Headers */ = {isa = PBXBuildFile; fileRef = 9615276E1F393C0E00E8B2AC /* MotionController.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D9948A1F4521BB00AFD6E3 /* MotionCoordinateSpace.swift in Headers */ = {isa = PBXBuildFile; fileRef = 9615276F1F393C0E00E8B2AC /* MotionCoordinateSpace.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D9948B1F4521BB00AFD6E3 /* MotionIndependentController.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527701F393C0E00E8B2AC /* MotionIndependentController.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D9948C1F4521BB00AFD6E3 /* MotionPlugin.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527711F393C0E00E8B2AC /* MotionPlugin.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D9948D1F4521BB00AFD6E3 /* MotionSnapshotType.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527721F393C0E00E8B2AC /* MotionSnapshotType.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D9948E1F4521BB00AFD6E3 /* MotionTransition.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527731F393C0E00E8B2AC /* MotionTransition.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D9948F1F4521BB00AFD6E3 /* MotionTransitionObserver.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527741F393C0E00E8B2AC /* MotionTransitionObserver.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994901F4521BB00AFD6E3 /* MotionTransitionState.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527751F393C0E00E8B2AC /* MotionTransitionState.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994911F4521BB00AFD6E3 /* CascadePreprocessor.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527771F393C0E00E8B2AC /* CascadePreprocessor.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994921F4521BB00AFD6E3 /* DurationPreprocessor.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527781F393C0E00E8B2AC /* DurationPreprocessor.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994931F4521BB00AFD6E3 /* IgnoreSubviewModifiersPreprocessor.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961527791F393C0E00E8B2AC /* IgnoreSubviewModifiersPreprocessor.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994941F4521BB00AFD6E3 /* MatchPreprocessor.swift in Headers */ = {isa = PBXBuildFile; fileRef = 9615277A1F393C0E00E8B2AC /* MatchPreprocessor.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994951F4521BB00AFD6E3 /* MotionPreprocessor.swift in Headers */ = {isa = PBXBuildFile; fileRef = 9615277B1F393C0E00E8B2AC /* MotionPreprocessor.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994961F4521BB00AFD6E3 /* SourcePreprocessor.swift in Headers */ = {isa = PBXBuildFile; fileRef = 9615277C1F393C0E00E8B2AC /* SourcePreprocessor.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96D994971F4521BB00AFD6E3 /* TransitionPreprocessor.swift in Headers */ = {isa = PBXBuildFile; fileRef = 9615277D1F393C0E00E8B2AC /* TransitionPreprocessor.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96E09DC81F2287E50000B121 /* TabsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96E09DC71F2287E50000B121 /* TabsController.swift */; };
96E3C3951D3A1CC20086A024 /* IconButton.swift in Headers */ = {isa = PBXBuildFile; fileRef = 9658F2161CD6FA4700B902C1 /* IconButton.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96E3C3961D3A1CC20086A024 /* CollectionReusableView.swift in Headers */ = {isa = PBXBuildFile; fileRef = 966ECF291CF4C20100BB0BDF /* CollectionReusableView.swift */; settings = {ATTRIBUTES = (Public, ); }; };
Expand Down Expand Up @@ -924,6 +960,42 @@
9685D5B01F0F04CB00AFEB79 /* CardCollectionViewController.swift in Headers */,
9685D5B11F0F04CB00AFEB79 /* Material+MotionAnimation.swift in Headers */,
96F1A5531F24F17A001D8CAF /* TabsController.swift in Headers */,
96D994741F4521BB00AFD6E3 /* MotionAnimator.swift in Headers */,
96D994751F4521BB00AFD6E3 /* MotionAnimatorViewContext.swift in Headers */,
96D994761F4521BB00AFD6E3 /* MotionCoreAnimationViewContext.swift in Headers */,
96D994771F4521BB00AFD6E3 /* MotionHasInsertOrder.swift in Headers */,
96D994781F4521BB00AFD6E3 /* MotionTransitionAnimator.swift in Headers */,
96D994791F4521BB00AFD6E3 /* MotionViewPropertyViewContext.swift in Headers */,
96D9947A1F4521BB00AFD6E3 /* Motion+Array.swift in Headers */,
96D9947B1F4521BB00AFD6E3 /* Motion+CALayer.swift in Headers */,
96D9947C1F4521BB00AFD6E3 /* Motion+CAMediaTimingFunction.swift in Headers */,
96D9947D1F4521BB00AFD6E3 /* Motion+CG.swift in Headers */,
96D9947E1F4521BB00AFD6E3 /* Motion+Obj-C.swift in Headers */,
96D9947F1F4521BB00AFD6E3 /* Motion+UIKit.swift in Headers */,
96D994801F4521BB00AFD6E3 /* Motion+UIView.swift in Headers */,
96D994811F4521BB00AFD6E3 /* Motion+UIViewController.swift in Headers */,
96D994821F4521BB00AFD6E3 /* MotionAnimationFillMode.swift in Headers */,
96D994831F4521BB00AFD6E3 /* LICENSE in Headers */,
96D994841F4521BB00AFD6E3 /* Motion.swift in Headers */,
96D994851F4521BB00AFD6E3 /* MotionAnimation.swift in Headers */,
96D994861F4521BB00AFD6E3 /* MotionAnimationState.swift in Headers */,
96D994871F4521BB00AFD6E3 /* MotionCAAnimation.swift in Headers */,
96D994881F4521BB00AFD6E3 /* MotionContext.swift in Headers */,
96D994891F4521BB00AFD6E3 /* MotionController.swift in Headers */,
96D9948A1F4521BB00AFD6E3 /* MotionCoordinateSpace.swift in Headers */,
96D9948B1F4521BB00AFD6E3 /* MotionIndependentController.swift in Headers */,
96D9948C1F4521BB00AFD6E3 /* MotionPlugin.swift in Headers */,
96D9948D1F4521BB00AFD6E3 /* MotionSnapshotType.swift in Headers */,
96D9948E1F4521BB00AFD6E3 /* MotionTransition.swift in Headers */,
96D9948F1F4521BB00AFD6E3 /* MotionTransitionObserver.swift in Headers */,
96D994901F4521BB00AFD6E3 /* MotionTransitionState.swift in Headers */,
96D994911F4521BB00AFD6E3 /* CascadePreprocessor.swift in Headers */,
96D994921F4521BB00AFD6E3 /* DurationPreprocessor.swift in Headers */,
96D994931F4521BB00AFD6E3 /* IgnoreSubviewModifiersPreprocessor.swift in Headers */,
96D994941F4521BB00AFD6E3 /* MatchPreprocessor.swift in Headers */,
96D994951F4521BB00AFD6E3 /* MotionPreprocessor.swift in Headers */,
96D994961F4521BB00AFD6E3 /* SourcePreprocessor.swift in Headers */,
96D994971F4521BB00AFD6E3 /* TransitionPreprocessor.swift in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
2 changes: 0 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ Take a look at a sample [Photos](https://github.com/CosmicMind/Samples/tree/mast

![Photos](http://www.cosmicmind.com/motion/projects/photos.gif)

* [Photos Sample](https://github.com/CosmicMind/Samples/tree/master/Projects/Programmatic/Photos)

## Sample Projects

Take a look at [Sample Projects](https://github.com/CosmicMind/Samples) to get your projects started.
Expand Down
6 changes: 0 additions & 6 deletions Sources/iOS/ImageCard.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,6 @@

import UIKit

@objc(ToolbarAlignment)
public enum ToolbarAlignment: Int {
case top
case bottom
}

open class ImageCard: Card {
/**
A Display value to indicate whether or not to
Expand Down
27 changes: 16 additions & 11 deletions Sources/iOS/SearchBar.swift
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ open class SearchBar: Bar {
return
}

textField.frame = contentView.bounds
layoutTextField()
layoutLeftView()
layoutClearButton()
}
Expand All @@ -161,10 +161,9 @@ open class SearchBar: Bar {
}

extension SearchBar {
/// Layout the clearButton.
open func layoutClearButton() {
let h = textField.frame.height
clearButton.frame = CGRect(x: textField.frame.width - h - 4, y: 4, width: h, height: h - 8)
/// Layout the textField.
open func layoutTextField() {
textField.frame = contentView.bounds
}

/// Layout the leftView.
Expand All @@ -178,12 +177,18 @@ extension SearchBar {

(v as? UIImageView)?.contentMode = .scaleAspectFit
}

/// Layout the clearButton.
open func layoutClearButton() {
let h = textField.frame.height
clearButton.frame = CGRect(x: textField.frame.width - h - 4, y: 4, width: h, height: h - 8)
}
}

extension SearchBar {
fileprivate extension SearchBar {
/// Clears the textField text.
@objc
fileprivate func handleClearButton() {
func handleClearButton() {
guard nil == textField.delegate?.textFieldShouldClear || true == textField.delegate?.textFieldShouldClear?(textField) else {
return
}
Expand All @@ -199,14 +204,14 @@ extension SearchBar {

// Live updates the search results.
@objc
fileprivate func handleEditingChanged(textField: UITextField) {
func handleEditingChanged(textField: UITextField) {
delegate?.searchBar?(searchBar: self, didChange: textField, with: textField.text)
}
}

extension SearchBar {
fileprivate extension SearchBar {
/// Prepares the textField.
fileprivate func prepareTextField() {
func prepareTextField() {
textField.contentScaleFactor = Screen.scale
textField.font = RobotoFont.regular(with: 17)
textField.backgroundColor = Color.clear
Expand All @@ -219,7 +224,7 @@ extension SearchBar {
}

/// Prepares the clearButton.
fileprivate func prepareClearButton() {
func prepareClearButton() {
clearButton = IconButton(image: Icon.cm.close, tintColor: placeholderColor)
clearButton.contentEdgeInsets = .zero
isClearButtonAutoHandleEnabled = true
Expand Down
69 changes: 43 additions & 26 deletions Sources/iOS/SearchBarController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,45 +61,62 @@ open class SearchBarController: StatusBarController {

open override func layoutSubviews() {
super.layoutSubviews()

let y = Application.shouldStatusBarBeHidden || statusBar.isHidden ? 0 : statusBar.height

searchBar.y = y
searchBar.width = view.width

switch displayStyle {
case .partial:


let h = y + searchBar.height
container.y = h
container.height = view.height - h
case .full:
container.frame = view.bounds
}

rootViewController.view.frame = container.bounds
layoutSearchBar()
layoutContainer()
layoutRootViewController()
}

open override func prepare() {
super.prepare()
displayStyle = .partial

prepareStatusBar()
prepareSearchBar()
prepareSearchBar()
}
}

fileprivate extension SearchBarController {
/// Prepares the statusBar.
func prepareStatusBar() {
shouldHideStatusBarOnRotation = false
}

/// Prepares the searchBar.
func prepareSearchBar() {
searchBar.depthPreset = .depth1
searchBar.zPosition = 1000
searchBar.depthPreset = .depth1
view.addSubview(searchBar)
}
}

fileprivate extension SearchBarController {
/// Layout the container.
func layoutContainer() {
switch displayStyle {
case .partial:
let p = searchBar.height
let q = statusBarOffsetAdjustment
let h = view.height - p - q

switch searchBarAlignment {
case .top:
container.y = q + p
container.height = h
case .bottom:
container.y = q
container.height = h
}

container.width = view.width

case .full:
container.frame = view.bounds
}
}

/// Layout the searchBar.
func layoutSearchBar() {
searchBar.x = 0
searchBar.y = .top == searchBarAlignment ? statusBarOffsetAdjustment : view.height - searchBar.height
searchBar.width = view.width
}

/// Layout the rootViewController.
func layoutRootViewController() {
rootViewController.view.frame = container.bounds
}
}
11 changes: 9 additions & 2 deletions Sources/iOS/StatusBarController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,13 @@ open class StatusBarController: TransitionController {
}
}

/// An adjustment based on the rules for displaying the statusBar.
open var statusBarOffsetAdjustment: CGFloat {
return Application.shouldStatusBarBeHidden || statusBar.isHidden ? 0 : statusBar.height
}

/// A boolean that indicates to hide the statusBar on rotation.
open var shouldHideStatusBarOnRotation = true
open var shouldHideStatusBarOnRotation = false

/// A reference to the statusBar.
open let statusBar = UIView()
Expand All @@ -99,7 +104,9 @@ open class StatusBarController: TransitionController {
}

rootViewController.view.frame = container.bounds
}

container.zPosition = statusBar.zPosition + (Application.shouldStatusBarBeHidden ? 1 : -1)
}

open override func prepare() {
super.prepare()
Expand Down
53 changes: 37 additions & 16 deletions Sources/iOS/ToolbarController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@

import UIKit

@objc(ToolbarAlignment)
public enum ToolbarAlignment: Int {
case top
case bottom
}

public extension UIViewController {
/**
A convenience property that provides access to the ToolbarController.
Expand All @@ -47,6 +53,13 @@ open class ToolbarController: StatusBarController {
@IBInspectable
open let toolbar = Toolbar()

/// The toolbar alignment.
open var toolbarAlignment = ToolbarAlignment.top {
didSet {
layoutSubviews()
}
}

open override func layoutSubviews() {
super.layoutSubviews()
layoutToolbar()
Expand All @@ -57,44 +70,52 @@ open class ToolbarController: StatusBarController {
open override func prepare() {
super.prepare()
displayStyle = .partial

prepareStatusBar()

prepareToolbar()
}
}

fileprivate extension ToolbarController {
/// Prepares the statusBar.
func prepareStatusBar() {
shouldHideStatusBarOnRotation = false
}

/// Prepares the toolbar.
func prepareToolbar() {
toolbar.zPosition = 1000
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
let p = toolbar.height
let q = statusBarOffsetAdjustment
let h = view.height - p - q

switch toolbarAlignment {
case .top:
container.y = q + p
container.height = h
case .bottom:
container.y = q
container.height = h
}

container.width = view.width

case .full:
container.frame = view.bounds
}
}

/// Layout the toolbar.
func layoutToolbar() {
toolbar.x = 0
toolbar.y = .top == toolbarAlignment ? statusBarOffsetAdjustment : view.height - toolbar.height
toolbar.width = view.width
}

/// Layout the rootViewController.
func layoutRootViewController() {
rootViewController.view.frame = container.bounds
Expand Down

0 comments on commit 112992a

Please sign in to comment.