All of the mock app store submissions have been posted online.
All of the mock app store submissions have been posted online.
Due Date (for Slide Submission)
Wednesday, December 15th — 11:59pm
Background
Final project presentations and live demonstrations will occur during the time allotted for the final exam (Thursday, December 16th 6–8pm). Each group will be scheduled a 3½ – 4 minute chunk of time for their presentation and demonstration. This time limit will be strictly enforced. The specific order of presenters will be determined next class.
Your presentation should consist of a minute or so of slides which present an introduction to your application, followed by an actual live demonstration of your app.
Your slides must be in PDF format and should contain the following content…
Your demonstration should highlight the key features of your application. You are strongly encouraged to rehearse your demonstration ahead of time.
Demo Information
I will be building and installing all apps into the iPhone Simulator on my laptop for the demonstration. To ensure a smooth demo, I recommend the following…
If your app requires features that are not supported on the simulator (such as camera, accelerometer, etc.) email me as soon as possible so we can make the necessary accommodations.
Submission
To submit your slides, open up a terminal, navigate to the directory containing your slides then issue the command:
submit cs491i final-slides slides.pdf
Due Date
Tuesday, December 14th — 11:59pm
Background
If you were publishing an application on the App Store, you would need to provide information about your app for submission. To simulate that experience, you will prepare a mock App Store submission.
For this write up I’ve provided a zip file which you must use as a template for writing up the details of your app. This zipfile includes an HTML file that when viewed in a web browser displays a page similar to that on the App Store.
All mock App Store submissions will be aggregated and posted on the course blog prior to the final presentations.
Zip File Structure
The zip file contains the following directory structure…
appstore/
|-- resources/
| |-- images/
| `-- ...
`-- username/
|-- 1.png
|-- 2.png
|-- 3.png
|-- 4.png
|-- 5.png
|-- Icon-175.png
`-- index.html
You’ll be doing all your work under the username directory (which you’ll rename). The contents of the resources directory are supporting files referenced by the index.html document and should not be edited.
Modifications
You will need perform the following…
username directory to your myUMBC username. Multi-person teams should hyphenate the names (e.g. user1-user2).Icon-175.png with a 175px x 175px PNG icon for your app.[1-5].png with 3-5 screenshots from your application. Screenshots should adhere to the following size constraints…
index.html file. Each item that needs to be updated has been tagged with a “TODO:” in the comments (use a text editor and search). These include…
Tips
Submission
Once you’ve made the changes to the provided HTML file and swapped out the sample icon and images with your own package it up by zipping up the entire directory tree.
To submit your mock app store submission, open up a terminal, navigate to your zip file then issue the command:
submit cs491i final-appstore appstore.zip
Due Date
Monday, December 13th — 11:59pm
Grading Criteria
Grading criteria for the final project will be based on the criteria from the week-long assignments…
…as well as…
Submission
Like all of the short projects this semester, you will need to submit your source code and necessary resources for grading. You should remove your build directory and zip up the directory containing your Xcode project.
To submit your final project source code, open up a terminal, navigate to your zip file then issue the command:
submit cs491i final-code project.zip
Due Date
Slides and current project source code must be submitted electronically by: Wednesday, November 24th — 11:59pm
Background
With just under a month left before final projects are due, you will be submitting a progress report that describes in detail the overall flow of your application as well as your progress against the final project delivery. You will be expanding your oral presentation into a progress report that documents how the project implementation is progressing.
This progress report will be used for the following:
Please note — the syllabus had originally called out the “Detailed project plan” and “Progress report” as two distinct deliverables. To save time and duplication of effort, both of these items will be condensed into this single progress report and source code submission. Since this progress report will contain the same content (albeit in one document) it will carry the combined weight of both assignments as originally detailed on the syllabus.
Slides
Your progress report should contain the following slides:
Example
Below is an example progress report for the Stocks app that’s been used as an example for previous final project deliverables.
Source Code
You must also zip up and hand in your source code thus far. Your source code is not expected to be pretty, nicely formatted, well commented or even free of memory leaks/crashes at this stage. However, your source code should be build-able and run-able.
As a reminder, be sure to remove the build directory and ensure all necessary resources to bundle up the app have been copied into the project.
Submission
Like the previous final project deliverables, your slides must be submitted as a PDF document. Your source code should be zipped up and submitted as well.
If you are working with a partner, only one of you should submit the slides & source code.
Submit using the command:
submit cs491i progressreport slides.pdf project.zip
If authoring on your own machine, you’ll need to transfer the file into your GL account (via SCP) and then SSH into GL and issue the submit command.
Due Date
Monday, November 8th — 11:59pm
Background
This project is designed to give you some hands on experience with…
Task
For this assignment you will be writing a basic Four-in-a-Row app. Your implementation will be a 2-player version of the game where the iOS device could be passed back and forth between two players. This saves you the overhead of implementing an AI to play against.
Your application needn’t look identical to the one shown in the description, but must it contain the following elements…
Main App Behavior
When your app initially loads it should look similar to the screen shown below. When the app is launched a game should automatically start and whose turn it is should be shown in the status area.
The user starts the column selection process by pressing their finger down over a column. When the finger is pressed down (and not yet released) the player’s piece should appear centered above the column their finger is over. The user should be able to drag their finger left and right, and as they do so, the marker should switch columns as needed. You’ll need to detect where the user has their finger and draw accordingly (in my implementation the finger can appear anywhere “in” that column for the full height of the UIView). A finger press is shown below.
Only when the user lifts their finger should the selection be finalized and the piece dropped to the bottom-most free row as shown in the screen shot below. Note that the status has also been updated to reflect black’s turn.
The screen shot below shows the finger press down for the black player. Notice that the piece is now black at the top when the user presses their finger down.
Again, only when the user’s finger is released should the current column be selected as shown below. Notice that the status is once again updated to reflect the red player’s turn.
As users drop pieces into the game board your app should check to see if a user has one by getting four-in-a-row on the horizontal, vertical or either diagonal. If a four-in-a-row is detected, your app should notify the winner in the status area. Additionally, your app should draw a line on the board indicating the four-in-a-row as shown below.
If the game board is not currently in play (someone won or there was a tie) and the user presses the “New Game” button, the app should clear the board and alternate user turns. Below we see the result of pressing the button — it is now Black’s turn.
If the game is not over and the user presses the “New Game” button, an action sheet should should pop-up to confirm that the user really wants to abort the current game as shown in the screen shot below. If the user accepts, the board should be reset. If they decline, then game play should continue uninterrupted.
Your app should be smart enough to not show the user’s piece above the board if the column is full (or if the game is over). For example, if the user presses their finger down in the column immediately left of center the piece should appear…
…then if they drag to the right, the piece should disappear from the column left of center, and when moving to the center column should appear as a hollow piece since the center column is full…
…but if they continue to drag to the right, once they clear the full column, the marker should reappear as normal…
If the board gets completely full without a win, an appropriate status message should be updated. Pressing over any column should have no effect.
Persisting Data
There are no persistence requirements for this assignment.
Hints
As usual, the first thing I’d probably do is to design the initial screen and identify outlets, action methods, etc. You can probably build out the initial UI pretty quickly — less the custom UIView being drawn to by CoreGraphics.
To tackle the UIView that’s rendering the game board I’d recommend starting by sketching out on a piece of paper the overall outline of the board and position of notable items (e.g. legs, main board, position of holes & location of hover pieces). You really need to plan out the dimensions of all of these elements before digging in. I’d recommend making this UIView as large as you can in IB and jotting down the dimensions so you know what your constraints are.
Once you know the positions of the items you will be drawing, I’d move into actually building out and rendering those items. It probably makes sense to start with the 2 legs and main board. Once you have that positioned appropriately, I’d them move onto painting the pieces in the board (perhaps hard coding some to make sure you have that logic figured out). You’ll want to figure out how to do this using loops — you really don’t want to specify the coordinates of all 42 holes.
After you have the static board drawn, I’d then move onto capturing the finger events and simply logging which column on the board you’re over. Once you know you have that correct, you can move onto actually trying to render the piece in real time. Next, I’d probably write the code to actually drop a piece into the correct position when the finger is released.
Once you have that done, it’s a matter of implementing the game logic — alternating turns, checking for wins, updating UI labels, etc. You’ll want to handle suppressing the piece if it shouldn’t be displayed. You’ll also need to wire in the “New Game” button and add the action sheet.
Lastly, don’t forget that you need to draw a line through the four-in-a-row. Think about what information you need to draw this line and where/when you have it.
Additional Ideas
The following items are provided as thoughts as to how you might extend or improve the project beyond the basic requirements. You are not required to implement any of these.
Submission
Like the previous assignment, you are required to submit a zip file of your project directory. Be sure to manually remove the build directory before zipping things up.
To submit the assignment, open up a terminal, navigate to your zip file then issue the command:
submit cs491i assignment5 Assignment5.zip
If developing on your own Mac, you’ll need to transfer the file into your GL account (via SCP), then SSH into GL and issue the submit command.
Due Date
Wednesday, October 27th — 11:59pm
Background
This project is designed to give you some hands on experience with…
Task
For this assignment you will be writing an app that allows a user to take a tour of several pre-defined locations on a Map. Your application needn’t look identical to the one shown in the description, but must it contain the following elements…
Additionally, your application must also include a flip-side view that presents more detailed information for a given location…
Main App Behavior
When your app initially loads it should look similar to the screen shown below. When the app is launched all locations should be drawn on the map with pins.
If it is the first time that the user has ever launched the app, it should automatically select the first location from a list of locations, zoom in on it and display its annotation. If the user had previously launched the app then the map view, selected map style and show location status should be restored as well as opening the annotation of the last location selected by the previous/next buttons.
The application must support allowing the user to switch between the 3 various map types. Below shows the resulting screen after the user presses the satellite segment.
If the user presses the disclosure arrow on an annotation, it should trigger a flip-style animation to a view that shows details about the location that was selected. Below, we see this animation mid-flip.
The flip-side view must neatly present the title of the location and associated image. Additionally, the description associated with the location is shown in a multi-line text view that allows the user to scroll. This back-side view should also contain a button to return back to the front-size of the application. None of the fields on the flip-side should be editable by the user. When the user presses the button to return back to the map the view should animate (flip) back to the front.
If the user presses the previous or next buttons they should be displayed the previous/next location in the list. These navigation buttons should act in such a way that they wrap around. When navigating in either direction, the new location should be centered on the map and its annotation should be automatically opened. Below we see the result of the user pressing the next button.
If the user presses the show location button (bottom left of the screen shot below), then the users location should be shown on the map as illustrated below. You shouldn’t recenter the map, but just show the user’s location. Note that this button acts much like a toggle button — when the user presses the button it should appear on until they press it again to turn it off (similar to the the Maps app).
The user should be able to pan and zoom with the map. Below is an example of pinching to zoom out.
Persisting Data
For this assignment, you must use the preferences system (i.e. NSUserDefaults) to persist and restore the following 4 pieces of data between app restarts…
Provided Resources
For this assignment I’ve provided a zip file that contains the following:
The plist data file describes the various locations. The plist is structured as an array of dictionaries, where each dictionary represents a specific location. Each location contains the following 5 keys/values…
Hints
One of the first thing I’d probably do is to identify properties, outlets, and action methods for both the front and flip sides. Next, I’d probably recommend building the font-side part of the app and get that working. Then add in the annotations and the flip-side view. Lastly, I’d add in the ability to save and restore the required preferences.
You might be tempted to use a utility app for this project, though that’s not what I did. I stuck with a view-based app and built out a second view controller and then programmatically displayed the second view.
Poke around UIBarButtonItem to figure out how to get a highlighted button style when the show location button is pressed (as shown in the example above). You’ll find something that gives you that highlighted (and regular) look.
In terms of documentation, I found the following useful…
Additional Ideas
The following items are provided as thoughts as to how you might extend or improve the project beyond the basic requirements. You are not required to implement any of these.
Submission
Like the previous assignment, you are required to submit a zip file of your project directory. Be sure to manually remove the build directory before zipping things up.
To submit the assignment, open up a terminal, navigate to your zip file then issue the command:
submit cs491i assignment4 Assignment4.zip
If developing on your own Mac, you’ll need to transfer the file into your GL account (via SCP), then SSH into GL and issue the submit command.
Due Date
Monday, October 18th — 11:59pm
Background
This project is designed to give you some hands on experience with…
Task
For this assignment you will be implementing a navigation-based app that allows a user to manage a list of tasks.
You are welcome to reuse your Task and TaskList classes from assignment 1. You may also change the implementation of these classes as you see fit for this assignment. There is no requirement that you preserve the same API that was detailed for the first assignment.
Behavior
When your app initially loads it should look similar to the image shown below. The user should be presented with a large table view with a task bar at the top. The task bar should contain 3 elements:
If the user presses the add button, the next view should slide in (right to left) that allows the user to edit the 4 properties of a task. There should be several UI elements on this page:
In the screenshot below, the user has specified some text as the task text and has dismissed the keyboard (you’ll need to implement a UITextField delegate to dismiss the keyboard). The task text field should display the clear widget icon (the “X” at the right) once text has been typed into it.
If the user selects the priority widget, another view should be brought in (again right to left) that allows the user to change the priority. This priority screen must contain the following widgets:
If the user changes the priority, the widget representing the priority must be updated to reflect the current priority as shown below.
If the user selects the due date widget, another view should be brought in (again right to left) that allows the user to change the due date. This priority screen must contain the following widgets:
If the user specifies a due date, the widget representing the due date must be updated to reflect the current due date. This date should be formatted as shown below.
Once the user enters his/her data and taps the arrow to go back to the main screen the item they edited should be added to the list. Take note that the table cell displays 2 lines of information:
Below we see the main screen after several tasks have been added to the list. Tasks should be color-coded based on the following rules:
Editing and Deleting Tasks
Above I’ve shown screenshots for creating a new task. However, in addition to listing the tasks on the main screen and adding tasks your app must also support editing and deleting tasks.
The editing flow should be pretty much the same as what’s shown above. When a task is selected, it should be shown in the editing view with all of it’s current values populated in the UI — meaning that the text should be in the text field, the widget represented completeness should be selected to the correct value, the priority should be the task’s specified priority and the date should reflect the current value for the task’s due date (or a message if not specified). Likewise when the priority and due date screens are shown for an existing task, they should be pre-set to that task’s values.
The app should also support the standard deletion mode as shown below. When the user presses Edit, this mode should be enabled.
Persistence
Your application must persist the task list between runs of your application. There are many ways to do this, however the underlying implementation of how to do this is up to you.
Additional Ideas
The following items are provided as thoughts as to how you might extend or improve the project beyond the basic requirements. You are not required to implement any of these.
Submission
Like the previous assignment, you are required to submit a zip file of your project directory. Be sure to manually remove the build directory before zipping things up.
To submit the assignment, open up a terminal, navigate to your zip file then issue the command:
submit cs491i assignment3 Assignment3.zip
If developing on your own Mac, you’ll need to transfer the file into your GL account (via SCP), then SSH into GL and issue the submit command.
Due Date
Slides must be submitted electronically by: Monday, October 11th — 11:59pm
Presentations will occur in-class on: Tuesday, October 12th and Thursday, October 14th (as needed)
Background
You will be presenting an in-class overview of your application proposal. This presentation serves several purposes:
Slides
You should prepare some slides for use in your presentation. Specifically, I’m looking for the following…
Presentation
You should aim for keeping your presentation around the 3 minute mark — if you grossly exceed this time limit, you’ll be cut off. You should practice your presentation ahead of time to work out kinks and make sure you have adequate time.
You should start your presentation by first introducing yourself (and team members), move onto your material and end with the opportunity for people to ask (very brief) questions.
The order of presenters will be determined in Thursday night’s class and emailed out after class.
Example
Below is an example presentation, again based off of the stocks app that was shown as an example in the initial written proposal.
Mock-Up Advice
There are varying techniques for mocking-up or wire-framing user interfaces. I’ve tried to give you some different approaches in the provided example slides. Some of the more common approaches I’ve run into include…
I’ve added a wireframing section to the resources page with links to stencils in a variety of formats, printable wireframe templates and online wireframing tools. There’s also some links to some example wireframes.
Submission
Your slides must be submitted as a PDF document. Both Macs and Linux have supported exporting/printing to PDFs for some time. If writing your proposal in MS Windows there are a couple of free PDF generation options including: Save as PDF Plugin for MS Office or PDFCreator (a PDF print driver for MS Windows).
If you are working with a partner, only one of you should submit the slides.
Submit using the command:
submit cs491i initialpresentation slides.pdf
If authoring on your own machine, you’ll need to transfer the file into your GL account (via SCP) and then SSH into GL and issue the submit command.
Due Date
Wednesday, September 29th — 11:59pm
Background
This project is designed to give you some hands on experience with…
Task
For this assignment you will be implementing the game of Pig for iOS. Your application must contain the following UI elements…
Game of Pig
The rules for the game of Pig are rather simple. The following description (care of Wikipedia) defines the rules of the game…
Each turn, a player repeatedly rolls a die until either a 1 is rolled or the player holds and scores the sum of the rolls (i.e. the turn total). At any time during a player’s turn, the player is faced with two options:
- roll — If the player rolls a
- 1: the player scores nothing and it becomes the next player’s turn.
- 2–6: the number is added to the player’s turn total and the player’s turn continues.
- hold — The turn total is added to the player’s score and it becomes the next player’s turn.
The first player to score 100 or more points wins.
We’ll add one additional rule for this assignment — players must alternate turns going first between games.
Behavior
When your app initially loads it should look similar to the image shown below. Note that the states of the “Roll” and “Hold” buttons are disabled when the app starts up.
Once the “New Game” button has been pressed, it should be disabled and relabeled (since all subsequent touches will be to continue with the next player’s turn, I changed it to “Tap to Continue”). Additionally, the “Roll” button should be enabled and the user should be given a message to tap Roll to begin.
After the user presses the roll button, a random die face is selected and is shown to the user. If this number is a not a 1, then the “Hold” button should also be enabled so that the user may score his/her turn, as shown below. The running total of the current turn should be shown to the user under the die face.
Once the user scores his/her turn the current turn should be added to the previous total (a zero in this case). This new total score should be shown as a number next to the user’s name. Additionally, the progress bar should be updated to show how far along the user is to reaching the goal of 100.
In addition to scoring the turn, you must enable the “Tap to Continue” button and disable the “Roll” and “Hold” buttons. The message should be updated to indicate the number of points scored and display whose turn it is.
This allows the user to tap “Roll” and begin his/her turn. Below player 2 has tapped “Roll” once and rolled a 5. Note that the “Hold” button has been re-enabled once the user has rolled a die face (other than 1). Again, the running turn total is shown below the die face.
Here player 2 has held. Like when player 1 held, the turn total was scored, the “Roll” and “Hold” buttons have been disabled, the “Tap to Continue” button has been re-enabled, and we’re at a similar state to when player 1 started. Once again, the status has been updated to shown how many points were scored and whose turn it is.
Here player 1 has tapped to unlocked, but hasn’t yet rolled — the message has been updated accordingly.
If a player happens to roll a 1, then he/she should be notified that his/her turn is over and that it’s the other user’s turn. “Roll” and “Hold” buttons should be disabled, and the “Tap to Continue” button re-enabled as shown below.
The following screenshot picks up many turns later with player 2 starting his/her turn.
If a the score of the current turn plus the user’s existing score reach or exceed 100 points, then the user should be congratulated on his/her win in the status area under the die face. The “Roll” and “Hold” buttons should be disabled. The “Tap to Continue” button should be changed back to “New Game” and re-enabled.
Pressing “New Game” should return the game to the second screenshot, except that it should start with the other player’s turn.
Images
Below are the images I used in my implementation — you may use these if you wish…
Additional Ideas
The following items are provided as thoughts as to how you might extend or improve the project beyond the basic requirements. You are not required to implement any of these.
Getting Started
Create a new project by selecting File → New Project… then under iOS select View-based Application. Be sure that the Product is set to iPhone, then select Choose…
Feel free to name the project as you see fit — though remember that things such as the app name and class names will get generated based on the name you give the overall project.
Submission
Like the previous assignment, you are required to submit a zip file of your project directory. Be sure to manually remove the build directory before zipping things up.
To submit the assignment, open up a terminal, navigate to your zip file then issue the command:
submit cs491i assignment2 Assignment2.zip
If developing on your own Mac, you’ll need to transfer the file into your GL account (via SCP), then SSH into GL and issue the submit command.