Skip to content
This repository has been archived by the owner on Mar 10, 2022. It is now read-only.
/ Tiime Public archive

An iOS app for displaying time in interesting ways

License

Notifications You must be signed in to change notification settings

hisaac/Tiime

Repository files navigation

Tiime's app icon, designed by Ryan Lower
Tiime's app icon, designed by Ryan Lower

Tiime

Tiime was two things:

  1. A clock that told time in unconventional ways
  2. An app I developed to learn more about iOS development

⚠️ Tiime is no longer under active development ⚠️

This was a really fun project to work on — it was my first iOS app built from scratch! — but I will no longer be actively developing on the project. I'm leaving it here in case there is any code that could still be useful to others.

Tiime will also be removed from the App Store.

About Tiime

The idea for Tiime came after listening to an episode of the late TLDR podcast (hosted by Reply All's PJ Vogt and Alex Goldman) titled Internet Time. In it, PJ talks about Swatch's 1998 attempt to reinvent our concept of time by inventing Internet Time (or .beat time). In .beat time, the day is divided into 1000 "beats" of equal length (1 beat = 86.4 seconds). The experiment ultimately has fallen by the wayside, but there are still a scant few people in the world that use — or at least appreciate — the concept.

I decided it would be an interesting experiment to try to make a clock that told time in beats. As this is a simple enough idea, I also realized that it would be a great way to easily and quickly learn about iOS development as a whole. I plan to bring the app to as many platforms as possible (iOS, watchOS, tvOS, macOS), use as many features and niceties as I can (iOS and macOS Today extensions, Apple Watch complication, CarPlay, macOS screen saver, etc.), and try out various iOS development tools (AppCode, fastlane, TestFlight, app localization & translation, RxSwift, ReSwift, Carthage, etc.).

Landscape view of .beat time in version 1.0.0
Landscape view of .beat time in version 1.0.0
Click here for more screenshots

Architecture

I've architected the app using the Coordinator pattern, originally conceived of by Soroush Khanlou in a blog post titled The Coordinator. He wrote a followup titled Coordinators Redux which is also a great read. Since Khanlou's initial idea, the topic has been written about extensively, so it shouldn't be difficult to find information on it online.

Essentially, the flow of the application is handled by a "Coordinator", a special type of class whose purpose is to coordinate movement and communication between view controllers. Tiime's coordinators are relatively simple (as the app itself is relatively simple). There is an ApplicationCoordinator that coordinates things at the highest level, and then a ClockListCooordinator and a SettingsListCoordinator below that. Most of the interesting bits are in the ApplicationCoordinator.

UI Design

I tried to follow Apple's general design guidelines throughout the app, and rely on native APIs where I could. I also chose to do all UI work in code rather than through Storbyoards, both as a way to challenge myself, and to learn about interacting with UIKit through code.

At the highest level there is a UISplitViewController which handles switching between the primary and secondary views on compact width devices (most iPhones), and displaying both the primary and secondary views at once on normal width devices (all iPads, and some iPhones when in landscape mode).

Time Types

Currently Implemented

Planned Implementation

Web based implementations of most of these can be found online at the Geek Clock Tool

Participate

Beta Test

Would you like to beta test the app? Send me an email at tiime@level.software, and I'll get you added to the list!

Development

I'm developing the app in the open because I believe in Open Source, and it would be fun if others wanted to collaborate on the project. I'm new to iOS development, so I am very open to any suggestions you might have. I'd especially love recommendations on how to architect the project. I'd like to make it as modular as reasonably possible.

Bootstrapping Instructions

The project's only external dependencies are its fonts, which are setup as git submodules. To clone the project and also the submodules, include the --recurse-submodules flag in your git clone command. Like so:

git clone --recurse-submodules https://github.com/hisaac/Tiime.git

Then, to update the submodules in the future, use the following command:

git submodule update --recursive

Alternately, you can add the following entry to your .gitconfig so that doing a git pull will also update any submodules in the project:

[submodule]
	recurse = true

Thanks

Acknowledgements/Resources

  • Countless StackOverflow posts.
  • Internet Time - The TLDR episode that planted the initial idea in my brain.
  • NetTime - An iOS beat time clock app by Simon Rice that he has graciously made open source. Looking at his code has made the initial steps of getting the project up and running much easier.
  • Geek Clock Tool - A web app (and Android app) by Steve Pugh that displays the current time in eight different ways! I'm hoping to implement some of these other methods into Tiime someday.
  • Metric Time - A great explainer of Metric time by Lyle Zapato.
  • UIKit init Patterns - Explains some good practices to use when initializing a UIViewController or UIView from code. I found that overriding the init methods isn't quite as easy as I expected, mainly because UIKit elements can be initialized from code, or from Interface Builder, and there are built-in initializer methods you have to use/override in order to also implement a custom one.