156 lines
3.6 KiB
Swift
156 lines
3.6 KiB
Swift
//
|
|
// StopwatchViewController.swift
|
|
// ProjectClock
|
|
//
|
|
// Created by Dallon Archibald on 1/23/21.
|
|
// Reference: https://youtu.be/H691qFRpaWA
|
|
|
|
import UIKit
|
|
|
|
/**
|
|
Stopwatch feature
|
|
*/
|
|
class StopwatchViewController: UIViewController
|
|
{
|
|
// UI Components
|
|
@IBOutlet weak var timeLabel: UILabel!
|
|
@IBOutlet weak var startButton: UIButton!
|
|
@IBOutlet weak var resetButton: UIButton!
|
|
@IBOutlet weak var tableView: UITableView!
|
|
|
|
// Time Components
|
|
var hours = 0
|
|
var minutes = 0
|
|
var seconds = 0
|
|
var started = false
|
|
|
|
var lappedTimes: [String] = []
|
|
var timer = Timer()
|
|
|
|
/**
|
|
Start/stop stopwatch
|
|
*/
|
|
@IBAction func start(_ sender: UIButton)
|
|
{
|
|
if !started
|
|
{
|
|
// Start timer
|
|
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(count), userInfo: nil, repeats: true)
|
|
started = true
|
|
startButton.setTitle("Stop", for: .normal)
|
|
resetButton.setTitle("Lap", for: .normal)
|
|
}
|
|
else
|
|
{
|
|
// Stop timer
|
|
timer.invalidate()
|
|
started = false
|
|
startButton.setTitle("Start", for: .normal)
|
|
resetButton.setTitle("Reset", for: .normal)
|
|
}
|
|
}
|
|
|
|
@objc fileprivate func count()
|
|
{
|
|
// Add time (If it goes longer than 24 hours, the hour count should go to 25)
|
|
seconds += 1
|
|
|
|
if seconds == 60
|
|
{
|
|
minutes += 1
|
|
seconds = 0
|
|
}
|
|
if minutes == 60
|
|
{
|
|
hours += 1
|
|
minutes = 0
|
|
}
|
|
|
|
// Set label text
|
|
timeLabel.text = String(format: "%02i:%02i:%02i", hours, minutes, seconds)
|
|
}
|
|
|
|
/**
|
|
Lap/reset button
|
|
*/
|
|
@IBAction func lapOrReset(_ sender: UIButton)
|
|
{
|
|
if started
|
|
{
|
|
// Insert lap
|
|
lappedTimes.insert(timeLabel.text!, at: 0)
|
|
tableView.reloadData()
|
|
}
|
|
else
|
|
{
|
|
// Reset
|
|
seconds = 0
|
|
minutes = 0
|
|
seconds = 0
|
|
lappedTimes = []
|
|
timeLabel.text = "00:00:00"
|
|
tableView.reloadData()
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
Table data source
|
|
*/
|
|
extension StopwatchViewController: UITableViewDelegate, UITableViewDataSource
|
|
{
|
|
/**
|
|
Define row count
|
|
*/
|
|
func tableView(_ _: UITableView, numberOfRowsInSection _: Int) -> Int
|
|
{
|
|
return lappedTimes.count
|
|
}
|
|
|
|
/**
|
|
Set cell at i
|
|
*/
|
|
func tableView(_ view: UITableView, cellForRowAt i: IndexPath) -> UITableViewCell
|
|
{
|
|
let cell = view.dequeueReusableCell(withIdentifier: "lapCell", for: i)
|
|
cell.textLabel?.text = lappedTimes[i.row]
|
|
cell.selectionStyle = .none
|
|
return cell
|
|
}
|
|
|
|
/**
|
|
Swipe left to delete cells at i
|
|
*/
|
|
func tableView(_ view: UITableView, commit: UITableViewCell.EditingStyle, forRowAt i: IndexPath)
|
|
{
|
|
if commit == .delete
|
|
{
|
|
lappedTimes.remove(at: i.row)
|
|
view.deleteRows(at: [i], with: .automatic)
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
Class to set relative font size for the stopwatch
|
|
*/
|
|
class StopwatchText: UILabel
|
|
{
|
|
@IBInspectable var iPhoneFontSize: CGFloat = 0
|
|
{
|
|
didSet
|
|
{
|
|
overrideFontSize(iPhoneFontSize)
|
|
}
|
|
}
|
|
|
|
func overrideFontSize(_ fontSize: CGFloat)
|
|
{
|
|
let size = UIScreen.main.bounds.size
|
|
let width = UIDevice.current.orientation.isPortrait ? size.width : size.height
|
|
|
|
// ViewWidth-based font size
|
|
font = font.withSize(0.22 * width)
|
|
}
|
|
}
|