GitHub repository: AnthonyWhitakerJr/TapList_iOS
Description: Sample mobile conversion of Kroger's ClickList website.

TapList v0.2.0: tag_name: v0.2.0
body: Includes PRs #41 & #49

# PR #41: Quantity Selection & Keyboard Handler

## Quantity Selection:

New quantity selection interface!

When selecting a quantity, user is shown a popover table with numbers 1-10+. This allows quick and easy selection for numbers 1-9.

If the user selects '10+', they are presented with a text field and keyboard allowing manual entry of numbers 0-99. Defaults to '0' if no value is entered.

This control has already been integrated into the Product Details view. May find it's way to the main view as well.

Note: Must implement QuantityViewDataSource protocol to use this interface.

Closes #28.

## KeyboardHandler:

Created a designated keyboard handler class to handle dismissing the keyboard when tapping outside of it as well as scrolling the view when the keyboard appears.

Also handles multiple fields/keyboards on the same view. 

Controllers interested in this behavior need only initialize a KeyboardHandler property, and call startDismissingKeyboardOnTap() and/or startObservingKeyboardEvents().

Note: For the keyboard handler to scroll in response to keyboard events, a scroll view must be provided.

Closes #15.

## Additional Improvements:

PlaceholderTextViews (ex. Special Instructions entry) now trim their contents. Leading & trailing whitespace will be removed.

# PR #49: CustomerCart Part 2

## Customer Cart

Completion of Customer Cart feature, #26.

Adds cart icon to product selection & product detail views.
Cart icon navigates user to a cart view.
Allows user to update quantity of products in cart and immediately see effects on subtotals.
Cart view shows:
- Product Info:
  - Product image
  - Product title
  - Product detail
  - Quantity of product in cart
  - Total price for quantity of product in cart
- Order summary:
  - Number of items in order
  - Subtotal
  - Service fee
  - Estimated total

Closes #26, closes #27, closes #29, closes #47. 

## Refactoring

Quantity selection has been refactored for a pair of ui elements to a single, (mostly) self contained UIControl.
Closes #46

PlaceholderTextView & QuantityTextField set their own custom delegates during initialization.
Closes #17 

Image fetching has been refactored to use semaphores, removing some unnecessary processing.
Closes #37 

## Enhancements

A placeholder image has been added for all image views to be shown while product image is loading.
Closes #36 

Product images on the product detail view can now be browsed full screen by tapping them.
Closes #32, closes #48

## Bugfixes

PlaceholderTextView is now @IBDesignable. `Font` on `UITextView` is not set on initialization in IB, but is in application. Its absence was causing a crash in `PlaceholderLabel`. Added a workaround specifically for IB.
Closes #19 

TapList v0.1: tag_name: v0.1
body: Basic application setup & functionality. Interfaces for browsing products, viewing their details and adding them to cart (with optional special instructions).

Includes progress from pull requests #11, #21 & #38

Customer Cart:
- Add products to cart.
- Add special instructions to product from product detail view.
- Add multiple copies of product to cart from product detail view.
- Remove product from cart from product detail view.
- Quantity of product in cart is displayed in main view & product detail view.
- User cart is stored on server.
- User cart is kept up-to-date across all devices.

+Cell size adjusted to fit 4+ products on screen.

Product Screen:
Created Product Detail View to display product in greater detail. Allows user to view images of all sides of a product, add multiple copies of product to cart (pending) & add special instructions (pending).

Features:
- Custom UITextView to support placeholder text.
- Page-scrollable images of product.
- Sale price popover
- Navigation to and from main view
- Common logic handled by protocol with default implementation.

Firebase:
- Configure application to communicate with Firebase.
- Remove hardcoded products and move them to external database. More closely mirrors how data would be loaded from official server.
- Setup anonymous user accounts that authenticate at application launch.