231 lines
8.5 KiB
Swift
231 lines
8.5 KiB
Swift
//
|
|
// ExampleViewController.swift
|
|
// Segmentio
|
|
//
|
|
// Created by Dmitriy Demchenko
|
|
// Copyright © 2016 Yalantis Mobile. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
import Segmentio
|
|
|
|
class ExampleViewController: UIViewController {
|
|
|
|
var segmentioStyle = SegmentioStyle.imageOverLabel
|
|
|
|
@IBOutlet fileprivate weak var segmentViewHeightConstraint: NSLayoutConstraint!
|
|
@IBOutlet fileprivate weak var segmentioView: Segmentio!
|
|
@IBOutlet fileprivate weak var containerView: UIView!
|
|
@IBOutlet fileprivate weak var scrollView: UIScrollView!
|
|
|
|
fileprivate lazy var viewControllers: [UIViewController] = {
|
|
return self.preparedViewControllers()
|
|
}()
|
|
|
|
// MARK: - Init
|
|
|
|
class func create() -> ExampleViewController {
|
|
let board = UIStoryboard(name: "Main", bundle: nil)
|
|
return board.instantiateViewController(withIdentifier: String(describing: self)) as! ExampleViewController
|
|
}
|
|
|
|
// MARK: - Lifecycle
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
|
|
switch segmentioStyle {
|
|
case .onlyLabel, .imageBeforeLabel, .imageAfterLabel:
|
|
segmentViewHeightConstraint.constant = 50
|
|
case .onlyImage:
|
|
segmentViewHeightConstraint.constant = 100
|
|
default:
|
|
break
|
|
}
|
|
}
|
|
|
|
override func viewDidAppear(_ animated: Bool) {
|
|
super.viewDidAppear(animated)
|
|
setupSegmentioView()
|
|
setupScrollView()
|
|
setupBadgeCountForIndex(1)
|
|
}
|
|
|
|
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
|
|
super.viewWillTransition(to: size, with: coordinator)
|
|
|
|
coordinator.animate(alongsideTransition: { [weak self] _ in
|
|
self?.segmentioView.interfaceOrientationDidChange()
|
|
}, completion: nil)
|
|
}
|
|
|
|
fileprivate func setupSegmentioView() {
|
|
segmentioView.setup(
|
|
content: segmentioContent(),
|
|
style: segmentioStyle,
|
|
options: segmentioOptions()
|
|
)
|
|
|
|
segmentioView.selectedSegmentioIndex = selectedSegmentioIndex()
|
|
|
|
segmentioView.valueDidChange = { [weak self] _, segmentIndex in
|
|
if let scrollViewWidth = self?.scrollView.frame.width {
|
|
let contentOffsetX = scrollViewWidth * CGFloat(segmentIndex)
|
|
self?.scrollView.setContentOffset(CGPoint(x: contentOffsetX, y: 0), animated: true)
|
|
}
|
|
}
|
|
}
|
|
|
|
fileprivate func setupBadgeCountForIndex(_ index: Int) {
|
|
segmentioView.addBadge(at: index, count: 10, color: ColorPalette.coral)
|
|
}
|
|
|
|
fileprivate func segmentioContent() -> [SegmentioItem] {
|
|
return [
|
|
SegmentioItem(title: "Tornado", image: UIImage(named: "tornado")),
|
|
SegmentioItem(title: "Earthquakes", image: UIImage(named: "earthquakes")),
|
|
SegmentioItem(title: "Extreme heat", image: UIImage(named: "heat")),
|
|
SegmentioItem(title: "Eruption", image: UIImage(named: "eruption")),
|
|
SegmentioItem(title: "Floods", image: UIImage(named: "floods")),
|
|
SegmentioItem(title: "Wildfires", image: UIImage(named: "wildfires"))
|
|
]
|
|
}
|
|
|
|
fileprivate func segmentioOptions() -> SegmentioOptions {
|
|
var imageContentMode = UIViewContentMode.center
|
|
switch segmentioStyle {
|
|
case .imageBeforeLabel, .imageAfterLabel:
|
|
imageContentMode = .scaleAspectFit
|
|
default:
|
|
break
|
|
}
|
|
|
|
return SegmentioOptions(
|
|
backgroundColor: ColorPalette.white,
|
|
maxVisibleItems: 3,
|
|
scrollEnabled: true,
|
|
indicatorOptions: segmentioIndicatorOptions(),
|
|
horizontalSeparatorOptions: segmentioHorizontalSeparatorOptions(),
|
|
verticalSeparatorOptions: segmentioVerticalSeparatorOptions(),
|
|
imageContentMode: imageContentMode,
|
|
labelTextAlignment: .center,
|
|
labelTextNumberOfLines: 1,
|
|
segmentStates: segmentioStates(),
|
|
animationDuration: 0.3
|
|
)
|
|
}
|
|
|
|
fileprivate func segmentioStates() -> SegmentioStates {
|
|
let font = UIFont.exampleAvenirMedium(ofSize: 13)
|
|
return SegmentioStates(
|
|
defaultState: segmentioState(
|
|
backgroundColor: .clear,
|
|
titleFont: font,
|
|
titleTextColor: ColorPalette.grayChateau
|
|
),
|
|
selectedState: segmentioState(
|
|
backgroundColor: .cyan,
|
|
titleFont: font,
|
|
titleTextColor: ColorPalette.black
|
|
),
|
|
highlightedState: segmentioState(
|
|
backgroundColor: ColorPalette.whiteSmoke,
|
|
titleFont: font,
|
|
titleTextColor: ColorPalette.grayChateau
|
|
)
|
|
)
|
|
}
|
|
|
|
fileprivate func segmentioState(backgroundColor: UIColor, titleFont: UIFont, titleTextColor: UIColor) -> SegmentioState {
|
|
return SegmentioState(backgroundColor: backgroundColor, titleFont: titleFont, titleTextColor: titleTextColor)
|
|
}
|
|
|
|
fileprivate func segmentioIndicatorOptions() -> SegmentioIndicatorOptions {
|
|
return SegmentioIndicatorOptions(type: .bottom, ratio: 1, height: 5, color: ColorPalette.coral)
|
|
}
|
|
|
|
fileprivate func segmentioHorizontalSeparatorOptions() -> SegmentioHorizontalSeparatorOptions {
|
|
return SegmentioHorizontalSeparatorOptions(type: .topAndBottom, height: 1, color: ColorPalette.whiteSmoke)
|
|
}
|
|
|
|
fileprivate func segmentioVerticalSeparatorOptions() -> SegmentioVerticalSeparatorOptions {
|
|
return SegmentioVerticalSeparatorOptions(ratio: 1, color: ColorPalette.whiteSmoke)
|
|
}
|
|
|
|
// Example viewControllers
|
|
|
|
fileprivate func preparedViewControllers() -> [ContentViewController] {
|
|
let tornadoController = ContentViewController.create()
|
|
tornadoController.disaster = Disaster(cardName: "Before tornado", hints: Hints.tornado)
|
|
|
|
let earthquakesController = ContentViewController.create()
|
|
earthquakesController.disaster = Disaster(cardName: "Before earthquakes", hints: Hints.earthquakes)
|
|
|
|
let extremeHeatController = ContentViewController.create()
|
|
extremeHeatController.disaster = Disaster(cardName: "Before extreme heat", hints: Hints.extremeHeat)
|
|
|
|
let eruptionController = ContentViewController.create()
|
|
eruptionController.disaster = Disaster(cardName: "Before eruption", hints: Hints.eruption)
|
|
|
|
let floodsController = ContentViewController.create()
|
|
floodsController.disaster = Disaster(cardName: "Before floods", hints: Hints.floods)
|
|
|
|
let wildfiresController = ContentViewController.create()
|
|
wildfiresController.disaster = Disaster(cardName: "Before wildfires", hints: Hints.wildfires)
|
|
|
|
return [
|
|
tornadoController,
|
|
earthquakesController,
|
|
extremeHeatController,
|
|
eruptionController,
|
|
floodsController,
|
|
wildfiresController
|
|
]
|
|
}
|
|
|
|
fileprivate func selectedSegmentioIndex() -> Int {
|
|
return 0
|
|
}
|
|
|
|
// MARK: - Setup container view
|
|
|
|
fileprivate func setupScrollView() {
|
|
scrollView.contentSize = CGSize(
|
|
width: UIScreen.main.bounds.width * CGFloat(viewControllers.count),
|
|
height: containerView.frame.height
|
|
)
|
|
|
|
for (index, viewController) in viewControllers.enumerated() {
|
|
viewController.view.frame = CGRect(
|
|
x: UIScreen.main.bounds.width * CGFloat(index),
|
|
y: 0,
|
|
width: scrollView.frame.width,
|
|
height: scrollView.frame.height
|
|
)
|
|
addChildViewController(viewController)
|
|
scrollView.addSubview(viewController.view, options: .useAutoresize) // module's extension
|
|
viewController.didMove(toParentViewController: self)
|
|
}
|
|
}
|
|
|
|
// MARK: - Actions
|
|
|
|
fileprivate func goToControllerAtIndex(_ index: Int) {
|
|
segmentioView.selectedSegmentioIndex = index
|
|
}
|
|
|
|
}
|
|
|
|
extension ExampleViewController: UIScrollViewDelegate {
|
|
|
|
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
|
|
let currentPage = floor(scrollView.contentOffset.x / scrollView.frame.width)
|
|
segmentioView.selectedSegmentioIndex = Int(currentPage)
|
|
}
|
|
|
|
func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
|
scrollView.contentSize = CGSize(width: scrollView.contentSize.width, height: 0)
|
|
}
|
|
|
|
}
|