{"id":21388549,"url":"https://github.com/monte9/ios-portfolio-outdated","last_synced_at":"2026-01-02T08:45:23.339Z","repository":{"id":66129176,"uuid":"52146393","full_name":"Monte9/iOS-portfolio-outdated","owner":"Monte9","description":"This is a portfolio of all my work in iOS development.","archived":false,"fork":false,"pushed_at":"2016-04-03T18:45:16.000Z","size":49957,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-23T00:26:49.122Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://monte9.github.io","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Monte9.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-02-20T09:37:19.000Z","updated_at":"2021-05-02T05:28:05.000Z","dependencies_parsed_at":"2023-02-22T20:30:36.861Z","dependency_job_id":null,"html_url":"https://github.com/Monte9/iOS-portfolio-outdated","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Monte9%2FiOS-portfolio-outdated","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Monte9%2FiOS-portfolio-outdated/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Monte9%2FiOS-portfolio-outdated/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Monte9%2FiOS-portfolio-outdated/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Monte9","download_url":"https://codeload.github.com/Monte9/iOS-portfolio-outdated/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243871524,"owners_count":20361375,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-22T12:18:28.202Z","updated_at":"2026-01-02T08:45:23.298Z","avatar_url":"https://github.com/Monte9.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# \u003ca href=\"https://monte9.github.io\"\u003ePortfolio-\u003c/a\u003e \n\n**\"I live, *breathe* and *sleep* swift.\"** - Monte Thakkar\n\nI am really **passionate** about iOS development and I find developing new iOS apps challenging yet fun. I am looking for **opportunities** as a iOS Developer to work on **ideas** that are making (or plan to make) a **difference**\n\n## Tools and Resources (common across all apps)-\n\n1. Written in [Swift](https://github.com/apple/swift)\n2. Use [Cocoapods](https://github.com/CocoaPods/CocoaPods)\n3. Auto Layout all the way (iPhone 5/5s 6/6s 6Plus/6sPlus)\n4. Git for source control via terminal\n5. Use tab-bars as primary navigation\n\n\n## Implemented features-\n\n- [x] GET/POST Request (API Calls)\n- [x] OAuth \n- [x] Table View/ Collection View (duh..)\n- [x] Pull to referesh \u0026 Infinite Scroll\n- [x] Autolayout\n- [x] Map View\n- [x] Camera\n\n\n## Demo Apps-\n\n- \u003ca href=\"https://github.com/Monte9/LikesApp\"\u003e Likes App: \u003c/a\u003e \n\nLikes app is an iOS app that provides a uniform and simple UI for interacting with several websites and services. \n\n(The gif below shows integration with Yelp API and saves your favorite resturants.)\n\n\u003ca href=\"https://github.com/Monte9/LikesApp\"\u003e\u003cimg  height=\"600\" width=\"320\" src='Likes.gif' alt=\"Likes iOS App\" /\u003e\u003c/a\u003e\n\u003cbr /\u003e\u003cbr /\u003e\n\n- \u003ca href=\"https://github.com/Monte9/CuteBunnyApp\"\u003e Cute Bunny App: \u003c/a\u003e \n\nAn iOS app written in Swift 2.1 that displays gifs of cute bunnies + trending gifs using the Giphy APIs. This was inspired by \u003ca href=\"http://www.randomgoat.com/\"\u003ehttp://www.randomgoat.com/\u003c/a\u003e\n\n\u003ca href=\"https://github.com/Monte9/CuteBunnyApp\"\u003e\u003cimg  height=\"600\" width=\"320\" src='CuteBunnies.gif' alt=\"Cute Bunny iOS App\" /\u003e\u003c/a\u003e\n\u003cbr /\u003e\u003cbr /\u003e\n\n- \u003ca href=\"https://github.com/Monte9/MoviesDBApp-CodePathU\"\u003e FlickM App: \u003c/a\u003e\n\nFlickM is a movies app displaying Top Rated, Popular, Now Playing, Upcoming and Movie Genres using The Movie Database API.\n\n\u003ca href=\"https://github.com/Monte9/MoviesDBApp-CodePathU\"\u003e\u003cimg  height=\"600\" width=\"320\" src='FlickM.gif' alt=\"FlickM iOS App\" \u003e\u003c/a\u003e\n\u003cbr /\u003e\u003cbr /\u003e\n\n- \u003ca href=\"https://github.com/Monte9/YelpApp-CodePathU\"\u003e Yelp App: \u003c/a\u003e\n\nYelpM is a Yelp search app using the Yelp API.\n\n\u003ca href=\"https://github.com/Monte9/YelpApp-CodePathU\"\u003e\u003cimg  height=\"600\" width=\"320\" src='YelpM.gif' alt=\"Yelp iOS App\" \u003e\u003c/a\u003e\n\u003cbr /\u003e\u003cbr /\u003e\n\n- \u003ca href=\"https://github.com/Monte9/TwitterApp-CodePathU\"\u003e Twitter App: \u003c/a\u003e\n\nTwitterM is a basic twitter app to read and compose tweets the Twitter API.\n\n\u003ca href=\"https://github.com/Monte9/TwitterApp-CodePathU\"\u003e\u003cimg  height=\"600\" width=\"320\" src='Twitter.gif' alt=\"Twitter iOS App\" \u003e\u003c/a\u003e\n\u003cbr /\u003e\u003cbr /\u003e\n\n- \u003ca href=\"https://github.com/Monte9/TinderApp-CodePathU\"\u003e Tinder App: \u003c/a\u003e\n\nTinder is an iOS app that is a clone of the Tinder app.\n\n\u003ca href=\"https://github.com/Monte9/TinderApp-CodePathU\"\u003e\u003cimg  height=\"600\" width=\"320\" src='Tinder.gif' alt=\"Tinder iOS App\" \u003e\u003c/a\u003e\n\u003cbr /\u003e\u003cbr /\u003e\n\n## Code Samples-\n\n**Tab Bar setup**\n```swift\nfunc setupTabBars() {\n    // Set up the Tweets View Controller\n    let tweetsNavigationController = storyboard.instantiateViewControllerWithIdentifier(\"TweetsNavigationController\") as! UINavigationController\n    let tweetsViewController = tweetsNavigationController.topViewController as! TweetsViewController\n    tweetsNavigationController.tabBarItem.title = \"Home\"\n    tweetsNavigationController.tabBarItem.image = UIImage(named: \"home\")\n    \n    //Customize Tweets navigation bar UI\n    tweetsNavigationController.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor(rgba: \"#55acee\").CGColor]\n    \n    // Set up the Home View Controller\n    let meViewController = storyboard.instantiateViewControllerWithIdentifier(\"ProfileViewController\")\n    meViewController.tabBarItem.title = \"Me\"\n    meViewController.tabBarItem.image = UIImage(named: \"me\")\n    \n    // Set up the Tab Bar Controller to have two tabs\n    tabBarController.viewControllers = [tweetsNavigationController, meViewController]\n    UITabBar.appearance().tintColor = UIColor(rgba: \"#55acee\")\n    //    UITabBar.appearance().barTintColor = UIColor.blackColor()\n    \n    // Create an Image View to replace the Title View\n    var imageView: UIImageView = UIImageView(frame: CGRectMake(0.0, 0.0, 40.0, 40.0))\n    imageView.contentMode = UIViewContentMode.ScaleAspectFit\n    var image: UIImage = UIImage(named: \"Icon-Small-50\")!\n    imageView.image = image\n    tweetsNavigationController.navigationBar.topItem?.titleView = imageView\n    \n    // Make the Tab Bar Controller the root view controller\n    window?.rootViewController = tabBarController\n    window?.makeKeyAndVisible()\n    \n}\n```\n\n\n**GET Request**\n```swift\nfunc makeSearchCallWithCompletion(completion: (gifs: [Gif]?, error: NSError?) -\u003e ()) {\n    let url = NSURL(string:\"http://api.giphy.com/v1/gifs/search?q=\\(searchTerm)\u0026api_key=\\(publicBetaApiKey)\")\n    \n    let request = NSURLRequest(URL: url!)\n    let session = NSURLSession(\n        configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),\n        delegate:nil,\n        delegateQueue:NSOperationQueue.mainQueue()\n    )\n    \n    let task : NSURLSessionDataTask = session.dataTaskWithRequest(request,\n        completionHandler: { (dataOrNil, response, error) in\n            if let data = dataOrNil {\n                if let responseDictionary = try! NSJSONSerialization.JSONObjectWithData(\n                    data, options:[]) as? NSDictionary {\n                        //print(responseDictionary)\n                        if (responseDictionary[\"data\"] != nil ) {\n                            \n                            self.gifs = Gif.gifsWithArray(responseDictionary[\"data\"] as! [NSDictionary])\n                            \n                            print(\"Connection to API successful!\")\n                            completion(gifs: self.gifs, error: nil)\n                        }\n                        else {\n                            print(\"error\")\n                            completion(gifs: nil, error: error)\n                        }\n                } else { completion(gifs: nil, error: error) }\n            } else { completion(gifs: nil, error: error) }\n    });\n    task.resume()\n}\n```\n\n\n**OAuth** (for twitter)\n```swift\nfunc openUrl(url: NSURL?) {\n    \n    //Get access token\n    fetchAccessTokenWithPath(\"oauth/access_token\", method: \"POST\", requestToken: BDBOAuth1Credential(queryString: url!.query), success: { (accessToken: BDBOAuth1Credential!) -\u003e Void in\n        print(\"Access Token received\")\n        \n        TwitterClient.sharedInstance.requestSerializer.saveAccessToken(\n            accessToken)\n        \n        TwitterClient.sharedInstance.GET(\"1.1/account/verify_credentials.json\", parameters: nil, success: { (operation: NSURLSessionDataTask, response: AnyObject?) -\u003e Void in\n            //                print(\"user: \\(response)\")\n            var user = User(dictionary: response as! NSDictionary)\n            User.currentUser = user\n            print(\"user.name = \\(user.name)\")\n            self.loginCompletion!(user: user, error: nil)\n            }, failure: { (operation: NSURLSessionDataTask?, error: NSError) -\u003e Void in\n                print(\"error: \\(error)\")\n                self.loginCompletion?(user: nil, error: error)\n        })\n        \n        })\n        { (error: NSError!) -\u003e Void in\n            print(\"Access Token error\")\n            self.loginCompletion?(user: nil, error: error)\n    }\n    \n}\n\nfunc loginWithCompletion(completion: (user: User?, error: NSError?) -\u003e ()) {\n    loginCompletion = completion\n    \n    //remove access token if it exist previously\n    TwitterClient.sharedInstance.requestSerializer.removeAccessToken()\n    \n    //Getting the request token and redirect to authorization page\n    TwitterClient.sharedInstance.fetchRequestTokenWithPath(\"oauth/request_token\", method: \"GET\", callbackURL: NSURL(string: \"michokan://oauth\"), scope: nil, success: { (requestToken: BDBOAuth1Credential!) -\u003e Void in\n        print(\"Got request token\")\n        var authURL = NSURL(string: \"https://api.twitter.com/oauth/authorize?oauth_token=\\(requestToken.token)\")\n        UIApplication.sharedApplication().openURL(authURL!)\n        \n        })\n        { (error: NSError!) -\u003e Void in\n            print(\"Failed to get request token:  \\(error)\")\n            self.loginCompletion?(user: nil, error: error)\n    }\n    //    manager.requestSerializer = [AFJSONRequestSerializer serializer];\n}\n```\n\n\n**Map View**\n```swift\n//use location manager to get the current location\nlocationManager = CLLocationManager()\nlocationManager.delegate = self\nlocationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters\nlocationManager.distanceFilter = 200\nlocationManager.requestWhenInUseAuthorization()\n\nmapView.delegate = self\n\nfunc locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {\n    if status == CLAuthorizationStatus.AuthorizedWhenInUse {\n        locationManager.startUpdatingLocation()\n    }\n}\n\nfunc mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -\u003e MKAnnotationView? {\n    let identifier = \"customAnnotationView\"\n    \n    // custom image annotation\n    var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier)\n    if (annotationView == nil) {\n        annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: identifier)\n    }\n    else {\n        annotationView!.annotation = annotation\n    }\n    annotationView!.image = UIImage(named: \"business\")\n    annotationView!.canShowCallout = true\n    return annotationView\n}\n\npublic func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, didChangeDragState newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) {\n    mapView.reloadInputViews()\n}\n\nfunc locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {\n    if let location = locations.first {\n        let span = MKCoordinateSpanMake(0.1, 0.1)\n        let region = MKCoordinateRegionMake(location.coordinate, span)\n        region.center\n        mapView.setRegion(region, animated: false)\n    }\n}\n\nfunc addAnnotationAtCoordinate(coordinate: CLLocationCoordinate2D, title: String) {\n    let annotation = MKPointAnnotation()\n    annotation.coordinate = coordinate\n    annotation.title = title\n    mapView.addAnnotation(annotation)\n    //  print(\"annotation added\")\n}\n\nfunc goToLocation(location: CLLocation) {\n    let span = MKCoordinateSpanMake(0.1, 0.1)\n    let region = MKCoordinateRegionMake(location.coordinate, span)\n    mapView.setRegion(region, animated: false)\n}\n```\n\n\n**Search** in table views/ collection views\n```swift\nfunc searchBar(searchBar: UISearchBar, textDidChange searchText: String) {\n        searchResults = searchText.isEmpty ? businesses : businesses!.filter({ (business: Business) -\u003e Bool in\n            return (business.name)!.rangeOfString(searchText, options: .CaseInsensitiveSearch) != nil\n        })\n        businessTableView.reloadData()\n    }\n```\n\n\n**Gif playback** (using Gifu library)\n```swift\nfunc tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        \n        print(\"cell click detected index path \\(indexPath.row)\")\n        \n        let cell = tableView.dequeueReusableCellWithIdentifier(\"cell\", forIndexPath: indexPath) as! GifCell\n        \n        var gifData = NSData(contentsOfURL: NSURL(string: gifs![indexPath.row].playingImageUrl!)!)\n        \n        cell.gifImageView.prepareForAnimation(imageData: gifData!)\n        cell.gifImageView.startAnimatingGIF()\n    }\n```\n\n## Other resources-\n1.  [CodePath University](https://codepath.com/): \"Without CodePath, I would still be *trying* to learn swift from a physical book\"\n2.  [Slack](https://slack.com/): \"Helping teams everywhere 'Be less busy'\"\n3.  [LiceCap](http://www.cockos.com/licecap/): \"Gifs created with LiceCap\"\n4.  [icons8](https://icons8.com/): \"All the Icons You Need. Guaranteed.\"\n\n\n## Contact\nEmail me @ mthakkar@mail.sfsu.edu\n\nFollow me [@mthakkar_](https://twitter.com/MThakkar_)\n\n\n#### \u003ca href=\"https://monte9.github.io\"\u003eVisit Portfolio website here\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonte9%2Fios-portfolio-outdated","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmonte9%2Fios-portfolio-outdated","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonte9%2Fios-portfolio-outdated/lists"}