├── Icon ├── Snapchat Clone ├── hang_up.m4a ├── boop_boop.m4a ├── chat_sent.m4a ├── left_call.m4a ├── SC_scanned.mp3 ├── generic_push.mp3 ├── ringtone_bff.mp3 ├── Assets.xcassets │ ├── Contents.json │ ├── Icon.imageset │ │ ├── Icon.png │ │ ├── Icon@2x.png │ │ ├── Icon@3x.png │ │ └── Contents.json │ ├── Mute.imageset │ │ ├── Mute.png │ │ ├── Mute@2x.png │ │ ├── Mute@3x.png │ │ └── Contents.json │ ├── Sent.imageset │ │ ├── Sent.png │ │ ├── Sent@2x.png │ │ ├── Sent@3x.png │ │ └── Contents.json │ ├── Close.imageset │ │ ├── Close.png │ │ ├── Close@2x.png │ │ ├── Close@3x.png │ │ └── Contents.json │ ├── Droid.imageset │ │ ├── Droid.png │ │ ├── Droid@2x.png │ │ ├── Droid@3x.png │ │ └── Contents.json │ ├── Focus.imageset │ │ ├── Focus.png │ │ ├── Focus@2x.png │ │ ├── Focus@3x.png │ │ └── Contents.json │ ├── Droid-1.imageset │ │ ├── Droid.png │ │ ├── Droid@2x.png │ │ ├── Droid@3x.png │ │ └── Contents.json │ ├── Opened.imageset │ │ ├── Opened.png │ │ ├── Opened@2x.png │ │ ├── Opened@3x.png │ │ └── Contents.json │ ├── Search.imageset │ │ ├── Search.png │ │ ├── Search@2x.png │ │ ├── Search@3x.png │ │ └── Contents.json │ ├── Select.imageset │ │ ├── Select.png │ │ ├── Select@2x.png │ │ ├── Select@3x.png │ │ └── Contents.json │ ├── Unmute.imageset │ │ ├── Unmute.png │ │ ├── Unmute@2x.png │ │ ├── Unmute@3x.png │ │ └── Contents.json │ ├── Add Friend.imageset │ │ ├── Plus.png │ │ ├── Plus@2x.png │ │ ├── Plus@3x.png │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ ├── Icon-20.png │ │ ├── Icon-29.png │ │ ├── Icon-30.png │ │ ├── Icon-40.png │ │ ├── Icon-50.png │ │ ├── Icon-57.png │ │ ├── Icon-72.png │ │ ├── Icon-76.png │ │ ├── Icon-512.png │ │ ├── Icon-20@2x-1.png │ │ ├── Icon-20@2x.png │ │ ├── Icon-20@3x.png │ │ ├── Icon-24@2x.png │ │ ├── Icon-27.5@2x.png │ │ ├── Icon-29@2x-1.png │ │ ├── Icon-29@2x-2.png │ │ ├── Icon-29@2x.png │ │ ├── Icon-29@3x-1.png │ │ ├── Icon-29@3x.png │ │ ├── Icon-40@2x-1.png │ │ ├── Icon-40@2x-2.png │ │ ├── Icon-40@2x.png │ │ ├── Icon-40@3x.png │ │ ├── Icon-50@2x.png │ │ ├── Icon-512@2x.png │ │ ├── Icon-57@2x.png │ │ ├── Icon-60@2x.png │ │ ├── Icon-60@3x.png │ │ ├── Icon-72@2x.png │ │ ├── Icon-76@2x.png │ │ ├── Icon-83.5@2x.png │ │ ├── Icon-86@2x.png │ │ ├── Icon-98@2x.png │ │ └── Icon-512@0.5x.png │ ├── Contacts.imageset │ │ ├── Contacts.png │ │ ├── Contacts@2x.png │ │ ├── Contacts@3x.png │ │ └── Contents.json │ ├── Default.imageset │ │ ├── Default.png │ │ ├── Default@2x.png │ │ ├── Default@3x.png │ │ └── Contents.json │ ├── Download.imageset │ │ ├── Download.png │ │ ├── Download@2x.png │ │ ├── Download@3x.png │ │ └── Contents.json │ ├── Flash On.imageset │ │ ├── Flash On.png │ │ ├── Flash On@2x.png │ │ ├── Flash On@3x.png │ │ └── Contents.json │ ├── New Chat.imageset │ │ ├── New Chat.png │ │ ├── New Chat@2x.png │ │ ├── New Chat@3x.png │ │ └── Contents.json │ ├── Refresh.imageset │ │ ├── Refresh.png │ │ ├── Refresh@2x.png │ │ ├── Refresh@3x.png │ │ └── Contents.json │ ├── Added Friend.imageset │ │ ├── Check.png │ │ ├── Check@2x.png │ │ ├── Check@3x.png │ │ └── Contents.json │ ├── Checkmark.imageset │ │ ├── Checkmark.png │ │ ├── Checkmark@2x.png │ │ ├── Checkmark@3x.png │ │ └── Contents.json │ ├── Flash Off.imageset │ │ ├── Flash Off.png │ │ ├── Flash Off@2x.png │ │ ├── Flash Off@3x.png │ │ └── Contents.json │ ├── Switch On.imageset │ │ ├── Switch On.png │ │ ├── Switch On@2x.png │ │ ├── Switch On@3x.png │ │ └── Contents.json │ ├── BackButton.imageset │ │ ├── BackButton.png │ │ ├── BackButton@2x.png │ │ ├── BackButton@3x.png │ │ └── Contents.json │ ├── Cool Ghost.imageset │ │ ├── Cool Ghost.png │ │ ├── Cool Ghost@2x.png │ │ ├── Cool Ghost@3x.png │ │ └── Contents.json │ ├── Downloaded.imageset │ │ ├── Downloaded.png │ │ ├── Downloaded@2x.png │ │ ├── Downloaded@3x.png │ │ └── Contents.json │ ├── Happy Icon.imageset │ │ ├── Happy Icon.png │ │ ├── Happy Icon@2x.png │ │ ├── Happy Icon@3x.png │ │ └── Contents.json │ ├── Switch Off.imageset │ │ ├── Switch Off.png │ │ ├── Switch Off@2x.png │ │ ├── Switch Off@3x.png │ │ └── Contents.json │ ├── White Icon.imageset │ │ ├── White Icon.png │ │ ├── White Icon@2x.png │ │ ├── White Icon@3x.png │ │ └── Contents.json │ ├── Background3.imageset │ │ ├── Background3.png │ │ ├── Background3@2x.png │ │ ├── Background3@3x.png │ │ └── Contents.json │ ├── Cool Ghost-1.imageset │ │ ├── Cool Ghost.png │ │ ├── Cool Ghost@2x.png │ │ ├── Cool Ghost@3x.png │ │ └── Contents.json │ ├── Empty Ghost.imageset │ │ ├── Empty Ghost.png │ │ ├── Empty Ghost@2x.png │ │ ├── Empty Ghost@3x.png │ │ └── Contents.json │ ├── Happy Ghost.imageset │ │ ├── Happy Ghost.png │ │ ├── Happy Ghost@2x.png │ │ ├── Happy Ghost@3x.png │ │ └── Contents.json │ ├── Opened Chat.imageset │ │ ├── Opened Chat.png │ │ ├── Opened Chat@2x.png │ │ ├── Opened Chat@3x.png │ │ └── Contents.json │ ├── Opened Sent.imageset │ │ ├── Opened Sent.png │ │ ├── Opened Sent@2x.png │ │ ├── Opened Sent@3x.png │ │ └── Contents.json │ ├── Right Arrow.imageset │ │ ├── Right Arrow.png │ │ ├── Right Arrow@2x.png │ │ ├── Right Arrow@3x.png │ │ └── Contents.json │ ├── Cooler Ghost.imageset │ │ ├── Cooler Ghost.png │ │ ├── Cooler Ghost@2x.png │ │ ├── Cooler Ghost@3x.png │ │ └── Contents.json │ ├── Empty Circle.imageset │ │ ├── Empty Circle.png │ │ ├── Empty Circle@2x.png │ │ ├── Empty Circle@3x.png │ │ └── Contents.json │ ├── Shocked Ghost.imageset │ │ ├── Shocked Ghost.png │ │ ├── Shocked Ghost@2x.png │ │ ├── Shocked Ghost@3x.png │ │ └── Contents.json │ ├── Tongue Ghost.imageset │ │ ├── Tongue Ghost.png │ │ ├── Tongue Ghost@2x.png │ │ ├── Tongue Ghost@3x.png │ │ └── Contents.json │ ├── Worried Ghost.imageset │ │ ├── Worried Ghost.png │ │ ├── Worried Ghost@2x.png │ │ ├── Worried Ghost@3x.png │ │ └── Contents.json │ ├── Faceless Ghost.imageset │ │ ├── Faceless Ghost.png │ │ ├── Faceless Ghost@2x.png │ │ ├── Faceless Ghost@3x.png │ │ └── Contents.json │ └── Loading Screen.imageset │ │ ├── Loading Screen.png │ │ ├── Loading Screen@2x.png │ │ ├── Loading Screen@3x.png │ │ └── Contents.json ├── SC_SwipeToSend.m4a ├── chat_received.m4a ├── ringtone_full.mp3 ├── ringtone_outgoing.m4a ├── ringtone_outgoing_bff.m4a ├── ReadMe ├── CountryCode.swift ├── ColorExtension.swift ├── StoriesController.swift ├── ProfileController.swift ├── BaseCollectionViewCell.swift ├── SnapCell.swift ├── AllPhotosCell.swift ├── VideoCell.swift ├── ConstraintsExtension.swift ├── UserDefaultsExtension.swift ├── UnderlinedTextFieldExtension.swift ├── CountryCell.swift ├── RoundedCorner.swift ├── EmailValidation.swift ├── TextViewMode.swift ├── Nav.ControllerExt.swift ├── GhostCell.swift ├── PhoneValidation.swift ├── Base.lproj │ ├── Main.storyboard │ └── LaunchScreen.storyboard ├── Info.plist ├── MainNavigationController.swift ├── FooterCell.swift ├── AppDelegate.swift ├── CountryController.swift ├── MessageCell.swift ├── PhotoMenuBar.swift ├── CameraRollCell.swift ├── ContactCell.swift ├── PhotoViewController.swift ├── ScreenshotsCell.swift ├── VerticalScrollViewController.swift ├── SnapContainerViewController.swift └── MenuBar.swift ├── Screenshots ├── First screen.png ├── User Info pt.1.png ├── User Info pt.10.png ├── User Info pt.11.png ├── User Info pt.12.png ├── User Info pt.13.png ├── User Info pt.14.png ├── User Info pt.15.png ├── User Info pt.16.png ├── User Info pt.2.png ├── User Info pt.3.png ├── User Info pt.4.png ├── User Info pt.5.png ├── User Info pt.6.png ├── User Info pt.7.png ├── User Info pt.8.png └── User Info pt.9.png ├── Pods ├── Target Support Files │ ├── SwiftyCam │ │ ├── SwiftyCam.modulemap │ │ ├── SwiftyCam-dummy.m │ │ ├── SwiftyCam-prefix.pch │ │ ├── SwiftyCam-umbrella.h │ │ ├── SwiftyCam.xcconfig │ │ └── Info.plist │ └── Pods-Snapchat Clone │ │ ├── Pods-Snapchat Clone.modulemap │ │ ├── Pods-Snapchat Clone-dummy.m │ │ ├── Pods-Snapchat Clone-umbrella.h │ │ ├── Pods-Snapchat Clone.debug.xcconfig │ │ ├── Pods-Snapchat Clone.release.xcconfig │ │ ├── Info.plist │ │ ├── Pods-Snapchat Clone-acknowledgements.markdown │ │ ├── Pods-Snapchat Clone-acknowledgements.plist │ │ ├── Pods-Snapchat Clone-frameworks.sh │ │ └── Pods-Snapchat Clone-resources.sh ├── Manifest.lock ├── Pods.xcodeproj │ └── xcuserdata │ │ └── michael.xcuserdatad │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ ├── SwiftyCam.xcscheme │ │ └── Pods-Snapchat Clone.xcscheme └── SwiftyCam │ ├── LICENSE │ └── Source │ ├── PreviewView.swift │ ├── SwiftyCamButton.swift │ └── SwiftyCamViewControllerDelegate.swift ├── Snapchat Clone.xcodeproj ├── xcuserdata │ └── michael.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── Snapchat Clone.xcscheme └── project.xcworkspace │ └── contents.xcworkspacedata ├── Podfile.lock ├── Snapchat Clone.xcworkspace └── contents.xcworkspacedata ├── Podfile └── README.md /Icon : -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Snapchat Clone/hang_up.m4a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/hang_up.m4a -------------------------------------------------------------------------------- /Screenshots/First screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Screenshots/First screen.png -------------------------------------------------------------------------------- /Snapchat Clone/boop_boop.m4a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/boop_boop.m4a -------------------------------------------------------------------------------- /Snapchat Clone/chat_sent.m4a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/chat_sent.m4a -------------------------------------------------------------------------------- /Snapchat Clone/left_call.m4a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/left_call.m4a -------------------------------------------------------------------------------- /Screenshots/User Info pt.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Screenshots/User Info pt.1.png -------------------------------------------------------------------------------- /Screenshots/User Info pt.10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Screenshots/User Info pt.10.png -------------------------------------------------------------------------------- /Screenshots/User Info pt.11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Screenshots/User Info pt.11.png -------------------------------------------------------------------------------- /Screenshots/User Info pt.12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Screenshots/User Info pt.12.png -------------------------------------------------------------------------------- /Screenshots/User Info pt.13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Screenshots/User Info pt.13.png -------------------------------------------------------------------------------- /Screenshots/User Info pt.14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Screenshots/User Info pt.14.png -------------------------------------------------------------------------------- /Screenshots/User Info pt.15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Screenshots/User Info pt.15.png -------------------------------------------------------------------------------- /Screenshots/User Info pt.16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Screenshots/User Info pt.16.png -------------------------------------------------------------------------------- /Screenshots/User Info pt.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Screenshots/User Info pt.2.png -------------------------------------------------------------------------------- /Screenshots/User Info pt.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Screenshots/User Info pt.3.png -------------------------------------------------------------------------------- /Screenshots/User Info pt.4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Screenshots/User Info pt.4.png -------------------------------------------------------------------------------- /Screenshots/User Info pt.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Screenshots/User Info pt.5.png -------------------------------------------------------------------------------- /Screenshots/User Info pt.6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Screenshots/User Info pt.6.png -------------------------------------------------------------------------------- /Screenshots/User Info pt.7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Screenshots/User Info pt.7.png -------------------------------------------------------------------------------- /Screenshots/User Info pt.8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Screenshots/User Info pt.8.png -------------------------------------------------------------------------------- /Screenshots/User Info pt.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Screenshots/User Info pt.9.png -------------------------------------------------------------------------------- /Snapchat Clone/SC_scanned.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/SC_scanned.mp3 -------------------------------------------------------------------------------- /Snapchat Clone/generic_push.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/generic_push.mp3 -------------------------------------------------------------------------------- /Snapchat Clone/ringtone_bff.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/ringtone_bff.mp3 -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Snapchat Clone/SC_SwipeToSend.m4a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/SC_SwipeToSend.m4a -------------------------------------------------------------------------------- /Snapchat Clone/chat_received.m4a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/chat_received.m4a -------------------------------------------------------------------------------- /Snapchat Clone/ringtone_full.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/ringtone_full.mp3 -------------------------------------------------------------------------------- /Snapchat Clone/ringtone_outgoing.m4a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/ringtone_outgoing.m4a -------------------------------------------------------------------------------- /Snapchat Clone/ringtone_outgoing_bff.m4a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/ringtone_outgoing_bff.m4a -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Icon.imageset/Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Icon.imageset/Icon.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Mute.imageset/Mute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Mute.imageset/Mute.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Sent.imageset/Sent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Sent.imageset/Sent.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Close.imageset/Close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Close.imageset/Close.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Droid.imageset/Droid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Droid.imageset/Droid.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Focus.imageset/Focus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Focus.imageset/Focus.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Icon.imageset/Icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Icon.imageset/Icon@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Icon.imageset/Icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Icon.imageset/Icon@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Mute.imageset/Mute@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Mute.imageset/Mute@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Mute.imageset/Mute@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Mute.imageset/Mute@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Sent.imageset/Sent@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Sent.imageset/Sent@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Sent.imageset/Sent@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Sent.imageset/Sent@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Close.imageset/Close@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Close.imageset/Close@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Close.imageset/Close@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Close.imageset/Close@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Droid-1.imageset/Droid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Droid-1.imageset/Droid.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Droid.imageset/Droid@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Droid.imageset/Droid@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Droid.imageset/Droid@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Droid.imageset/Droid@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Focus.imageset/Focus@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Focus.imageset/Focus@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Focus.imageset/Focus@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Focus.imageset/Focus@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Opened.imageset/Opened.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Opened.imageset/Opened.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Search.imageset/Search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Search.imageset/Search.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Select.imageset/Select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Select.imageset/Select.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Unmute.imageset/Unmute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Unmute.imageset/Unmute.png -------------------------------------------------------------------------------- /Snapchat Clone/ReadMe: -------------------------------------------------------------------------------- 1 | Credit: 2 | Ghost by AB from the Noun Project 3 | 4 | Ghost by Visual Glow from the Noun Project 5 | 6 | Mute by Adrien Coquet from the Noun Project 7 | -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Add Friend.imageset/Plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Add Friend.imageset/Plus.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-20.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-29.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-30.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-40.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-50.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-57.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-72.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-76.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Contacts.imageset/Contacts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Contacts.imageset/Contacts.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Default.imageset/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Default.imageset/Default.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Download.imageset/Download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Download.imageset/Download.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Droid-1.imageset/Droid@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Droid-1.imageset/Droid@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Droid-1.imageset/Droid@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Droid-1.imageset/Droid@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Flash On.imageset/Flash On.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Flash On.imageset/Flash On.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/New Chat.imageset/New Chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/New Chat.imageset/New Chat.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Opened.imageset/Opened@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Opened.imageset/Opened@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Opened.imageset/Opened@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Opened.imageset/Opened@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Refresh.imageset/Refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Refresh.imageset/Refresh.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Search.imageset/Search@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Search.imageset/Search@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Search.imageset/Search@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Search.imageset/Search@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Select.imageset/Select@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Select.imageset/Select@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Select.imageset/Select@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Select.imageset/Select@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Unmute.imageset/Unmute@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Unmute.imageset/Unmute@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Unmute.imageset/Unmute@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Unmute.imageset/Unmute@3x.png -------------------------------------------------------------------------------- /Pods/Target Support Files/SwiftyCam/SwiftyCam.modulemap: -------------------------------------------------------------------------------- 1 | framework module SwiftyCam { 2 | umbrella header "SwiftyCam-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Add Friend.imageset/Plus@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Add Friend.imageset/Plus@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Add Friend.imageset/Plus@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Add Friend.imageset/Plus@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Added Friend.imageset/Check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Added Friend.imageset/Check.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-512.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Checkmark.imageset/Checkmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Checkmark.imageset/Checkmark.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Default.imageset/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Default.imageset/Default@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Default.imageset/Default@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Default.imageset/Default@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Flash Off.imageset/Flash Off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Flash Off.imageset/Flash Off.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Refresh.imageset/Refresh@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Refresh.imageset/Refresh@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Refresh.imageset/Refresh@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Refresh.imageset/Refresh@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Switch On.imageset/Switch On.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Switch On.imageset/Switch On.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Added Friend.imageset/Check@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Added Friend.imageset/Check@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Added Friend.imageset/Check@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Added Friend.imageset/Check@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-20@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-20@2x-1.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-20@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-20@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-24@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-24@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-27.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-27.5@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-29@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-29@2x-1.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-29@2x-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-29@2x-2.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-29@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-29@3x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-29@3x-1.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-29@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-1.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-2.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-50@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-512@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-57@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-57@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-72@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-86@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-86@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-98@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-98@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/BackButton.imageset/BackButton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/BackButton.imageset/BackButton.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Checkmark.imageset/Checkmark@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Checkmark.imageset/Checkmark@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Checkmark.imageset/Checkmark@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Checkmark.imageset/Checkmark@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Contacts.imageset/Contacts@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Contacts.imageset/Contacts@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Contacts.imageset/Contacts@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Contacts.imageset/Contacts@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Cool Ghost.imageset/Cool Ghost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Cool Ghost.imageset/Cool Ghost.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Download.imageset/Download@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Download.imageset/Download@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Download.imageset/Download@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Download.imageset/Download@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Downloaded.imageset/Downloaded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Downloaded.imageset/Downloaded.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Flash Off.imageset/Flash Off@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Flash Off.imageset/Flash Off@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Flash Off.imageset/Flash Off@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Flash Off.imageset/Flash Off@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Flash On.imageset/Flash On@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Flash On.imageset/Flash On@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Flash On.imageset/Flash On@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Flash On.imageset/Flash On@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Happy Icon.imageset/Happy Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Happy Icon.imageset/Happy Icon.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/New Chat.imageset/New Chat@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/New Chat.imageset/New Chat@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/New Chat.imageset/New Chat@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/New Chat.imageset/New Chat@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Switch Off.imageset/Switch Off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Switch Off.imageset/Switch Off.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Switch On.imageset/Switch On@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Switch On.imageset/Switch On@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Switch On.imageset/Switch On@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Switch On.imageset/Switch On@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/White Icon.imageset/White Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/White Icon.imageset/White Icon.png -------------------------------------------------------------------------------- /Pods/Target Support Files/SwiftyCam/SwiftyCam-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_SwiftyCam : NSObject 3 | @end 4 | @implementation PodsDummy_SwiftyCam 5 | @end 6 | -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-512@0.5x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/AppIcon.appiconset/Icon-512@0.5x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/BackButton.imageset/BackButton@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/BackButton.imageset/BackButton@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/BackButton.imageset/BackButton@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/BackButton.imageset/BackButton@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Background3.imageset/Background3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Background3.imageset/Background3.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Cool Ghost-1.imageset/Cool Ghost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Cool Ghost-1.imageset/Cool Ghost.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Cool Ghost.imageset/Cool Ghost@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Cool Ghost.imageset/Cool Ghost@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Cool Ghost.imageset/Cool Ghost@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Cool Ghost.imageset/Cool Ghost@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Downloaded.imageset/Downloaded@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Downloaded.imageset/Downloaded@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Downloaded.imageset/Downloaded@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Downloaded.imageset/Downloaded@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Empty Ghost.imageset/Empty Ghost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Empty Ghost.imageset/Empty Ghost.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Happy Ghost.imageset/Happy Ghost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Happy Ghost.imageset/Happy Ghost.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Happy Icon.imageset/Happy Icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Happy Icon.imageset/Happy Icon@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Happy Icon.imageset/Happy Icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Happy Icon.imageset/Happy Icon@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Opened Chat.imageset/Opened Chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Opened Chat.imageset/Opened Chat.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Opened Sent.imageset/Opened Sent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Opened Sent.imageset/Opened Sent.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Right Arrow.imageset/Right Arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Right Arrow.imageset/Right Arrow.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Switch Off.imageset/Switch Off@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Switch Off.imageset/Switch Off@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Switch Off.imageset/Switch Off@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Switch Off.imageset/Switch Off@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/White Icon.imageset/White Icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/White Icon.imageset/White Icon@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/White Icon.imageset/White Icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/White Icon.imageset/White Icon@3x.png -------------------------------------------------------------------------------- /Snapchat Clone.xcodeproj/xcuserdata/michael.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Background3.imageset/Background3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Background3.imageset/Background3@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Background3.imageset/Background3@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Background3.imageset/Background3@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Cool Ghost-1.imageset/Cool Ghost@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Cool Ghost-1.imageset/Cool Ghost@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Cool Ghost-1.imageset/Cool Ghost@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Cool Ghost-1.imageset/Cool Ghost@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Cooler Ghost.imageset/Cooler Ghost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Cooler Ghost.imageset/Cooler Ghost.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Empty Circle.imageset/Empty Circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Empty Circle.imageset/Empty Circle.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Empty Ghost.imageset/Empty Ghost@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Empty Ghost.imageset/Empty Ghost@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Empty Ghost.imageset/Empty Ghost@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Empty Ghost.imageset/Empty Ghost@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Happy Ghost.imageset/Happy Ghost@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Happy Ghost.imageset/Happy Ghost@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Happy Ghost.imageset/Happy Ghost@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Happy Ghost.imageset/Happy Ghost@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Opened Chat.imageset/Opened Chat@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Opened Chat.imageset/Opened Chat@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Opened Chat.imageset/Opened Chat@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Opened Chat.imageset/Opened Chat@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Opened Sent.imageset/Opened Sent@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Opened Sent.imageset/Opened Sent@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Opened Sent.imageset/Opened Sent@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Opened Sent.imageset/Opened Sent@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Right Arrow.imageset/Right Arrow@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Right Arrow.imageset/Right Arrow@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Right Arrow.imageset/Right Arrow@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Right Arrow.imageset/Right Arrow@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Shocked Ghost.imageset/Shocked Ghost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Shocked Ghost.imageset/Shocked Ghost.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Tongue Ghost.imageset/Tongue Ghost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Tongue Ghost.imageset/Tongue Ghost.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Worried Ghost.imageset/Worried Ghost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Worried Ghost.imageset/Worried Ghost.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Cooler Ghost.imageset/Cooler Ghost@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Cooler Ghost.imageset/Cooler Ghost@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Cooler Ghost.imageset/Cooler Ghost@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Cooler Ghost.imageset/Cooler Ghost@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Empty Circle.imageset/Empty Circle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Empty Circle.imageset/Empty Circle@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Empty Circle.imageset/Empty Circle@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Empty Circle.imageset/Empty Circle@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Faceless Ghost.imageset/Faceless Ghost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Faceless Ghost.imageset/Faceless Ghost.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Loading Screen.imageset/Loading Screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Loading Screen.imageset/Loading Screen.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Tongue Ghost.imageset/Tongue Ghost@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Tongue Ghost.imageset/Tongue Ghost@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Tongue Ghost.imageset/Tongue Ghost@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Tongue Ghost.imageset/Tongue Ghost@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Faceless Ghost.imageset/Faceless Ghost@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Faceless Ghost.imageset/Faceless Ghost@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Faceless Ghost.imageset/Faceless Ghost@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Faceless Ghost.imageset/Faceless Ghost@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Loading Screen.imageset/Loading Screen@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Loading Screen.imageset/Loading Screen@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Loading Screen.imageset/Loading Screen@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Loading Screen.imageset/Loading Screen@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Shocked Ghost.imageset/Shocked Ghost@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Shocked Ghost.imageset/Shocked Ghost@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Shocked Ghost.imageset/Shocked Ghost@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Shocked Ghost.imageset/Shocked Ghost@3x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Worried Ghost.imageset/Worried Ghost@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Worried Ghost.imageset/Worried Ghost@2x.png -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Worried Ghost.imageset/Worried Ghost@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LemaMichael/SnapchatClone/HEAD/Snapchat Clone/Assets.xcassets/Worried Ghost.imageset/Worried Ghost@3x.png -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Snapchat Clone/Pods-Snapchat Clone.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_Snapchat_Clone { 2 | umbrella header "Pods-Snapchat Clone-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Snapchat Clone/Pods-Snapchat Clone-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_Snapchat_Clone : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_Snapchat_Clone 5 | @end 6 | -------------------------------------------------------------------------------- /Snapchat Clone.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SwiftyCam (2.6.0) 3 | 4 | DEPENDENCIES: 5 | - SwiftyCam 6 | 7 | SPEC CHECKSUMS: 8 | SwiftyCam: 86c114177a1b1f5dc2c82384577d0c20b922a31b 9 | 10 | PODFILE CHECKSUM: bca136c462b8e358237dbc06d5f20c9499043a86 11 | 12 | COCOAPODS: 1.3.1 13 | -------------------------------------------------------------------------------- /Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SwiftyCam (2.6.0) 3 | 4 | DEPENDENCIES: 5 | - SwiftyCam 6 | 7 | SPEC CHECKSUMS: 8 | SwiftyCam: 86c114177a1b1f5dc2c82384577d0c20b922a31b 9 | 10 | PODFILE CHECKSUM: bca136c462b8e358237dbc06d5f20c9499043a86 11 | 12 | COCOAPODS: 1.3.1 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/SwiftyCam/SwiftyCam-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Snapchat Clone.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'Snapchat Clone' do 5 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for Snapchat Clone 9 | pod "SwiftyCam" 10 | end 11 | -------------------------------------------------------------------------------- /Snapchat Clone/CountryCode.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CountryCode.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/17/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | struct CountryCode: Decodable { 13 | let name: String 14 | let dial_code: String 15 | let code: String 16 | } 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/SwiftyCam/SwiftyCam-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double SwiftyCamVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char SwiftyCamVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Snapchat Clone/Pods-Snapchat Clone-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_Snapchat_CloneVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_Snapchat_CloneVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Snapchat Clone/ColorExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ColorExtension.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/3/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | 13 | extension UIColor { 14 | static func rgb(red: CGFloat, green: CGFloat, blue: CGFloat) -> UIColor { 15 | return UIColor(red: red/255, green: green/255, blue: blue/255, alpha: 1) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SnapchatClone 2 | An extensive recreation of the Snapchat Application 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Snapchat Clone/StoriesController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StoriesController.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/22/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class StoriesController: UIViewController { 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | //: Purple color 16 | view.backgroundColor = UIColor.rgb(red: 154, green: 87, blue: 159) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Icon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Icon@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Icon@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Mute.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Mute.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Mute@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Mute@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Sent.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Sent.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Sent@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Sent@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/ProfileController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProfileController.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/26/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class ProfileController: UIViewController { 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | //: Dark black color 16 | view.backgroundColor = UIColor.rgb(red: 40, green: 44, blue: 48) 17 | } 18 | } 19 | 20 | -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Close.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Close.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Close@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Close@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Droid.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Droid.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Droid@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Droid@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Focus.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Focus.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Focus@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Focus@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Add Friend.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Plus.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Plus@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Plus@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Droid-1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Droid.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Droid@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Droid@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Opened.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Opened.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Opened@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Opened@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Search.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Search.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Search@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Search@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Select.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Select.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Select@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Select@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Unmute.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Unmute.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Unmute@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Unmute@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Added Friend.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Check.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Check@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Check@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Default.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Default.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Default@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Default@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Refresh.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Refresh.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Refresh@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Refresh@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Checkmark.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Checkmark.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Checkmark@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Checkmark@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Contacts.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Contacts.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Contacts@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Contacts@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Download.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Download.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Download@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Download@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Flash Off.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Flash Off.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Flash Off@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Flash Off@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Flash On.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Flash On.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Flash On@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Flash On@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/New Chat.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "New Chat.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "New Chat@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "New Chat@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Switch On.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Switch On.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Switch On@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Switch On@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/BackButton.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "BackButton.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "BackButton@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "BackButton@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Cool Ghost.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Cool Ghost.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Cool Ghost@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Cool Ghost@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Downloaded.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Downloaded.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Downloaded@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Downloaded@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Happy Icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Happy Icon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Happy Icon@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Happy Icon@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Switch Off.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Switch Off.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Switch Off@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Switch Off@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/White Icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "White Icon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "White Icon@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "White Icon@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Background3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Background3.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Background3@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Background3@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Cool Ghost-1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Cool Ghost.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Cool Ghost@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Cool Ghost@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Empty Ghost.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Empty Ghost.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Empty Ghost@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Empty Ghost@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Happy Ghost.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Happy Ghost.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Happy Ghost@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Happy Ghost@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Opened Chat.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Opened Chat.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Opened Chat@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Opened Chat@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Opened Sent.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Opened Sent.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Opened Sent@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Opened Sent@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Right Arrow.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Right Arrow.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Right Arrow@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Right Arrow@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Cooler Ghost.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Cooler Ghost.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Cooler Ghost@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Cooler Ghost@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Empty Circle.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Empty Circle.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Empty Circle@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Empty Circle@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Tongue Ghost.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Tongue Ghost.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Tongue Ghost@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Tongue Ghost@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Faceless Ghost.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Faceless Ghost.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Faceless Ghost@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Faceless Ghost@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Loading Screen.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Loading Screen.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Loading Screen@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Loading Screen@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Shocked Ghost.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Shocked Ghost.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Shocked Ghost@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Shocked Ghost@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/Assets.xcassets/Worried Ghost.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Worried Ghost.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Worried Ghost@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Worried Ghost@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Snapchat Clone/BaseCollectionViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseCollectionViewCell.swift 3 | // Memories 4 | // 5 | // Created by Michael Lema on 9/10/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | 12 | class BaseCollectionViewCell: UICollectionViewCell { 13 | override init(frame: CGRect) { 14 | super.init(frame: frame) 15 | setupViews() 16 | } 17 | 18 | required init?(coder aDecoder: NSCoder) { 19 | fatalError("init(coder:) has not been implemented") 20 | } 21 | func setupViews() { 22 | } 23 | } 24 | 25 | -------------------------------------------------------------------------------- /Pods/Target Support Files/SwiftyCam/SwiftyCam.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/SwiftyCam 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 4 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/SwiftyCam 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/xcuserdata/michael.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Pods-Snapchat Clone.xcscheme 8 | 9 | isShown 10 | 11 | 12 | SwiftyCam.xcscheme 13 | 14 | isShown 15 | 16 | 17 | 18 | SuppressBuildableAutocreation 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /Snapchat Clone/SnapCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SnapCell.swift 3 | // Memories 4 | // 5 | // Created by Michael Lema on 9/10/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class SnapCell: BaseCollectionViewCell { 12 | let view: UIView = { 13 | let view = UIView() 14 | view.backgroundColor = .blue 15 | return view 16 | }() 17 | override func setupViews() { 18 | addSubview(view) 19 | addConstraintsWithFormat(format: "H:|[v0]|", views: view) 20 | addConstraintsWithFormat(format: "V:|[v0]|", views: view) 21 | } 22 | } 23 | 24 | -------------------------------------------------------------------------------- /Snapchat Clone.xcodeproj/xcuserdata/michael.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Snapchat Clone.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 4C6187631F2DC237001245ED 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Snapchat Clone/AllPhotosCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AllPhotosCell.swift 3 | // Memories 4 | // 5 | // Created by Michael Lema on 9/10/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class AllPhotosCell: BaseCollectionViewCell { 12 | let view: UIView = { 13 | let view = UIView() 14 | view.backgroundColor = .yellow 15 | return view 16 | }() 17 | override func setupViews() { 18 | //: Do something 19 | addSubview(view) 20 | addConstraintsWithFormat(format: "H:|[v0]|", views: view) 21 | addConstraintsWithFormat(format: "V:|[v0]|", views: view) 22 | } 23 | } 24 | 25 | -------------------------------------------------------------------------------- /Snapchat Clone/VideoCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // VideosCell.swift 3 | // Memories 4 | // 5 | // Created by Michael Lema on 9/10/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class VideosCell: BaseCollectionViewCell { 12 | let view: UIView = { 13 | let view = UIView() 14 | view.backgroundColor = .red 15 | return view 16 | }() 17 | override func setupViews() { 18 | //: Do something 19 | addSubview(view) 20 | addConstraintsWithFormat(format: "H:|[v0]|", views: view) 21 | addConstraintsWithFormat(format: "V:|[v0]|", views: view) 22 | } 23 | 24 | } 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Snapchat Clone/Pods-Snapchat Clone.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/SwiftyCam" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftyCam/SwiftyCam.framework/Headers" 6 | OTHER_LDFLAGS = $(inherited) -framework "SwiftyCam" 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_BUILD_DIR = $BUILD_DIR 9 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Snapchat Clone/Pods-Snapchat Clone.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/SwiftyCam" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftyCam/SwiftyCam.framework/Headers" 6 | OTHER_LDFLAGS = $(inherited) -framework "SwiftyCam" 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_BUILD_DIR = $BUILD_DIR 9 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /Snapchat Clone/ConstraintsExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConstraintsExtension.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/3/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | 13 | 14 | extension UIView { 15 | func addConstraintsWithFormat(format: String, views: UIView...) { 16 | var viewsDictionary = [String: UIView]() 17 | for (index, view) in views.enumerated() { 18 | let key = "v\(index)" 19 | viewsDictionary[key] = view 20 | view.translatesAutoresizingMaskIntoConstraints = false 21 | } 22 | addConstraints(NSLayoutConstraint.constraints(withVisualFormat: format, options: NSLayoutFormatOptions(), metrics: nil, views: viewsDictionary)) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Snapchat Clone/UserDefaultsExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserDefaultsExtension.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 9/1/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UserDefaults { 12 | 13 | enum UserDefaultsKeys: String { 14 | case isLoggedIn 15 | case isFirstLaunch 16 | } 17 | 18 | func setIsLoggedIn(value: Bool) { 19 | set(value, forKey: UserDefaultsKeys.isLoggedIn.rawValue) 20 | synchronize() 21 | } 22 | func isLoggedIn() -> Bool { 23 | return bool(forKey: UserDefaultsKeys.isLoggedIn.rawValue) 24 | } 25 | func setIsFirstLaunch(value: Bool) { 26 | set(value, forKey: UserDefaultsKeys.isFirstLaunch.rawValue) 27 | } 28 | func isFirstLaunch() -> Bool { 29 | return bool(forKey: UserDefaultsKeys.isFirstLaunch.rawValue) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Snapchat Clone/UnderlinedTextFieldExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UnderlinedTextFieldExtension.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/7/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UITextField { 12 | //: Create an underlined UITextField 13 | func setUnderlinedBorder() { 14 | self.borderStyle = .none 15 | self.layer.backgroundColor = UIColor.white.cgColor 16 | 17 | self.layer.masksToBounds = false 18 | self.layer.shadowColor = UIColor.lightGray.cgColor 19 | self.layer.shadowOffset = CGSize(width: 0.0, height: 1.0) 20 | self.layer.shadowOpacity = 1.0 21 | self.layer.shadowRadius = 0.0 22 | 23 | self.contentVerticalAlignment = UIControlContentVerticalAlignment.bottom 24 | //self.layer.sublayerTransform = CATransform3DMakeTranslation(0, 7.5, 0) 25 | } 26 | } 27 | 28 | -------------------------------------------------------------------------------- /Pods/Target Support Files/SwiftyCam/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 2.6.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Snapchat Clone/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Snapchat Clone/CountryCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CountryCell.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/30/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class CountryCell: UITableViewCell { 12 | override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 13 | super.init(style: style, reuseIdentifier: reuseIdentifier) 14 | setupViews() 15 | } 16 | required init?(coder aDecoder: NSCoder) { 17 | fatalError("init(coder:) has not been implemented") 18 | } 19 | lazy var countryLabel: UILabel = { 20 | let label = UILabel() 21 | label.text = "Afghanistan (+93)" 22 | label.font = UIFont(name: "Avenir Next-Regular", size: 14) 23 | return label 24 | }() 25 | func setupViews() { 26 | addSubview(countryLabel) 27 | addConstraintsWithFormat(format: "H:|-16-[v0]|", views: countryLabel) 28 | addConstraintsWithFormat(format: "V:|[v0]|", views: countryLabel) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Snapchat Clone/RoundedCorner.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RoundedCorner.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/18/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | extension UIView { 13 | func roundedCorner(_ corner: UIRectCorner) { 14 | let cornerRadii = CGSize(width: 9.0, height: 9.0) 15 | let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corner, cornerRadii: cornerRadii) 16 | let shapeLayer = CAShapeLayer() 17 | shapeLayer.frame = self.bounds 18 | shapeLayer.path = path.cgPath 19 | self.layer.mask = shapeLayer 20 | } 21 | 22 | func roundedCellCorners(_ corner: UIRectCorner) { 23 | let cornerRadii = CGSize(width: 20.0, height: 20.0) 24 | let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corner, cornerRadii: cornerRadii) 25 | let shapeLayer = CAShapeLayer() 26 | shapeLayer.frame = self.bounds 27 | shapeLayer.path = path.cgPath 28 | self.layer.mask = shapeLayer 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Snapchat Clone/EmailValidation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EmailValidation.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/16/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | func isValidEmail(email: String) -> Bool { 13 | let emailFormat = "^(?:(?:(?:(?: )*(?:(?:(?:\\t| )*\\r\\n)?(?:\\t| )+))+(?: )*)|(?: )+)?(?:(?:(?:[-A-Za-z0-9!#$%&’*+/=?^_'{|}~]+(?:\\.[-A-Za-z0-9!#$%&’*+/=?^_'{|}~]+)*)|(?:\"(?:(?:(?:(?: )*(?:(?:[!#-Z^-~]|\\[|\\])|(?:\\\\(?:\\t|[ -~]))))+(?: )*)|(?: )+)\"))(?:@)(?:(?:(?:[A-Za-z0-9](?:[-A-Za-z0-9]{0,61}[A-Za-z0-9])?)(?:\\.[A-Za-z0-9](?:[-A-Za-z0-9]{0,61}[A-Za-z0-9])?)*)|(?:\\[(?:(?:(?:(?:(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5]))\\.){3}(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5]))))|(?:(?:(?: )*[!-Z^-~])*(?: )*)|(?:[Vv][0-9A-Fa-f]+\\.[-A-Za-z0-9._~!$&'()*+,;=:]+))\\])))(?:(?:(?:(?: )*(?:(?:(?:\\t| )*\\r\\n)?(?:\\t| )+))+(?: )*)|(?: )+)?$" 14 | let emailPredicate = NSPredicate(format:"SELF MATCHES %@", emailFormat) 15 | return emailPredicate.evaluate(with: email) 16 | } 17 | -------------------------------------------------------------------------------- /Snapchat Clone/TextViewMode.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TextViewMode.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/20/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | extension UITextField { 13 | func setLeftImage(_ image: UIImage, padding: Int) { 14 | let size = 10 15 | let view = UIView(frame: CGRect(x: 0, y: 0, width: size + padding / 2, height: size)) 16 | let imageView = UIImageView(frame: CGRect(x: padding, y: 0, width: size, height: size)) 17 | imageView.image = image 18 | view.addSubview(imageView) 19 | leftView = view 20 | leftViewMode = .always 21 | } 22 | func modifyLeftImage(_ image: UIImage, padding: Int) { 23 | let size = 10 24 | let view = UIView(frame: CGRect(x: 0, y: 0, width: size + padding / 2, height: size)) 25 | let imageView = UIImageView(frame: CGRect(x: padding, y: 0, width: size, height: size)) 26 | imageView.tintColor = UIColor.white 27 | imageView.image = image 28 | view.addSubview(imageView) 29 | leftView = view 30 | leftViewMode = .always 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Snapchat Clone/Nav.ControllerExt.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NavigationBar.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/13/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIViewController { 12 | 13 | func setupNavigationBar(leftImage: String?) { 14 | //: Change back button image in Navigation Bar 15 | if let backImage = leftImage { 16 | let backButtonImage = UIImage(named: backImage)?.withRenderingMode(.alwaysOriginal) 17 | self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: backButtonImage, style: .plain, target: self, action: #selector(popCurrentView)) 18 | } 19 | //: Transparent UINavigationBar 20 | self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) 21 | self.navigationController?.navigationBar.shadowImage = UIImage() 22 | self.navigationController?.navigationBar.isTranslucent = true 23 | self.navigationController?.view.backgroundColor = UIColor.clear 24 | } 25 | func popCurrentView() { 26 | //: Go to previous view controller 27 | self.navigationController?.popViewController(animated: false) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Pods/SwiftyCam/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016, Andrew Walz. 2 | 3 | Redistribution and use in source and binary forms, with or without modification, 4 | are permitted provided that the following conditions are met: 5 | 6 | 1. Redistributions of source code must retain the above copyright notice, this 7 | list of conditions and the following disclaimer. 8 | 9 | 2. Redistributions in binary form must reproduce the above copyright notice, 10 | this list of conditions and the following disclaimer in the documentation 11 | and/or other materials provided with the distribution. 12 | 13 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 14 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 15 | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 16 | SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 17 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 18 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 19 | OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 20 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 21 | OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 22 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Snapchat Clone/Pods-Snapchat Clone-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## SwiftyCam 5 | 6 | Copyright (c) 2016, Andrew Walz. 7 | 8 | Redistribution and use in source and binary forms, with or without modification, 9 | are permitted provided that the following conditions are met: 10 | 11 | 1. Redistributions of source code must retain the above copyright notice, this 12 | list of conditions and the following disclaimer. 13 | 14 | 2. Redistributions in binary form must reproduce the above copyright notice, 15 | this list of conditions and the following disclaimer in the documentation 16 | and/or other materials provided with the distribution. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 19 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 21 | SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 22 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 24 | OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 25 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 | OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 27 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | 29 | Generated by CocoaPods - https://cocoapods.org 30 | -------------------------------------------------------------------------------- /Snapchat Clone/GhostCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GhostCell.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/30/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class GhostCell: UICollectionViewCell { 13 | override init(frame: CGRect) { 14 | super.init(frame: frame) 15 | setupCell() 16 | } 17 | required init?(coder aDecoder: NSCoder) { 18 | fatalError("init(coder:) has not been implemented") 19 | } 20 | let imageView: UIImageView = { 21 | let imageView = UIImageView() 22 | //imageView.image = UIImage(named: "Cool Ghost")!.withRenderingMode(.alwaysOriginal) 23 | imageView.contentMode = .scaleAspectFit 24 | //imageView.backgroundColor = UIColor.darkGray 25 | return imageView 26 | }() 27 | let checkMark: UIImageView = { 28 | let imageView = UIImageView() 29 | imageView.image = UIImage(named: "Checkmark") 30 | imageView.contentMode = .scaleToFill 31 | imageView.clipsToBounds = true 32 | imageView.isHidden = true 33 | imageView.alpha = 0 34 | return imageView 35 | }() 36 | func setupCell() { 37 | addSubview(imageView) 38 | addSubview(checkMark) 39 | let width = self.frame.size.width / 3.2 40 | let height = self.frame.size.height / 3.2 41 | 42 | addConstraintsWithFormat(format: "H:|-\(width)-[v0]-\(width)-|", views: imageView) 43 | addConstraintsWithFormat(format: "V:|-\(height)-[v0]-\(height)-|", views: imageView) 44 | addConstraintsWithFormat(format: "H:|-8-[v0(30)]", views: checkMark) 45 | addConstraintsWithFormat(format: "V:|-8-[v0(30)]", views: checkMark) 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Snapchat Clone/PhoneValidation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhoneValidation.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/16/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | func isValidNumber(number: String) -> Bool { 12 | print("the number is:\(number)") 13 | let phoneFormat = "^\\d{3}-\\d{3}-\\d{4}$" 14 | let phonePredicate = NSPredicate(format: "SELF MATCHES %@", phoneFormat) 15 | return phonePredicate.evaluate(with: number) 16 | } 17 | func formatNumber(_ phonumbneNumber: String) -> String { 18 | var number = phonumbneNumber 19 | number = number.replacingOccurrences(of: "(", with: "") 20 | number = number.replacingOccurrences(of: ")", with: "") 21 | number = number.replacingOccurrences(of: " ", with: "") 22 | number = number.replacingOccurrences(of: "-", with: "") 23 | number = number.replacingOccurrences(of: "+", with: "") 24 | let numberLength = Int(number.count) 25 | if numberLength > 15 { 26 | let index = number.index(number.startIndex, offsetBy: 15) 27 | number = number.substring(to: index) 28 | } 29 | return number 30 | } 31 | func getLength(number: String) -> Int { 32 | var number = number 33 | number = number.replacingOccurrences(of: "(", with: "") 34 | number = number.replacingOccurrences(of: ")", with: "") 35 | number = number.replacingOccurrences(of: " ", with: "") 36 | number = number.replacingOccurrences(of: "-", with: "") 37 | number = number.replacingOccurrences(of: "+", with: "") 38 | let numberLength = Int(number.count) 39 | return numberLength 40 | } 41 | func checkNumber(phoneNumber: String) -> String { 42 | var number = phoneNumber 43 | number = number.replacingOccurrences(of: "(", with: "") 44 | number = number.replacingOccurrences(of: ") ", with: "-") 45 | return number 46 | } 47 | -------------------------------------------------------------------------------- /Snapchat Clone/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Snapchat Clone/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSContactsUsageDescription 6 | Your contacts will be uploaded to Snapchat Clone's servers so you and others can find friends, and to improve your experience. 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | NSCameraUsageDescription 26 | Use your camera to take awesome Snaps and more. 27 | NSMicrophoneUsageDescription 28 | Use your microphone to record awesome audio for Snaps and more. 29 | NSPhotoLibraryUsageDescription 30 | Save your creative Snaps to your Camera Roll and more. 31 | UILaunchStoryboardName 32 | LaunchScreen 33 | UIMainStoryboardFile 34 | Main 35 | UIRequiredDeviceCapabilities 36 | 37 | armv7 38 | 39 | UIStatusBarHidden 40 | 41 | UISupportedInterfaceOrientations 42 | 43 | UIInterfaceOrientationPortrait 44 | 45 | UISupportedInterfaceOrientations~ipad 46 | 47 | UIInterfaceOrientationPortrait 48 | UIInterfaceOrientationPortraitUpsideDown 49 | UIInterfaceOrientationLandscapeLeft 50 | UIInterfaceOrientationLandscapeRight 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /Snapchat Clone/MainNavigationController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainNavigationController.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 9/1/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class MainNavigationController: UINavigationController { 13 | let backgroundImage: UIImageView = { 14 | let backgroundImage = UIImageView(frame: UIScreen.main.bounds) 15 | backgroundImage.image = UIImage(named: "Loading Screen") 16 | backgroundImage.contentMode = .scaleAspectFit 17 | return backgroundImage 18 | }() 19 | //: MARK: - viewDidLoad 20 | override func viewDidLoad() { 21 | super.viewDidLoad() 22 | self.view.insertSubview(backgroundImage, at: 0) 23 | 24 | if isLoggedIn() { 25 | perform(#selector(showLoginController), with: nil, afterDelay: 0.70) 26 | //viewControllers = [MemoriesController()] 27 | } else { 28 | let welcomeController = WelcomeController() 29 | viewControllers = [welcomeController] 30 | } 31 | } 32 | 33 | fileprivate func isLoggedIn() -> Bool { 34 | return UserDefaults.standard.isLoggedIn() 35 | } 36 | //: MARK: - viewDidDisappear 37 | override func viewDidDisappear(_ animated: Bool) { 38 | super.viewWillDisappear(animated) 39 | backgroundImage.removeFromSuperview() 40 | } 41 | override var preferredStatusBarStyle: UIStatusBarStyle { 42 | return .lightContent 43 | } 44 | } 45 | 46 | extension UIViewController { 47 | func showLoginController() { 48 | let left = MessagesController() 49 | let middle = CameraController() 50 | let right = StoriesController() 51 | let top = ProfileController() 52 | let bottom = MemoriesController() 53 | let snapContainer = SnapContainerViewController.containerViewWith(left, middleVC: middle, rightVC: right, topVC: top, bottomVC: bottom) 54 | present(snapContainer, animated: false) { 55 | //: Maybe we'll do something here later 56 | } 57 | } 58 | } 59 | 60 | 61 | -------------------------------------------------------------------------------- /Snapchat Clone/FooterCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FooterCell.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/30/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class FooterCell: UICollectionViewCell { 13 | override init(frame: CGRect) { 14 | super.init(frame: frame) 15 | setupCell() 16 | } 17 | required init?(coder aDecoder: NSCoder) { 18 | fatalError("init(coder:) has not been implemented") 19 | } 20 | let contactsImage: UIImageView = { 21 | let imageView = UIImageView() 22 | let calenderImage = UIImage(named: "Contacts") 23 | imageView.image = calenderImage 24 | imageView.contentMode = .scaleAspectFit 25 | return imageView 26 | }() 27 | let contactsLabel: UILabel = { 28 | let label = UILabel() 29 | label.font = UIFont(name: "Avenir-Medium", size: 13.6) 30 | label.textColor = UIColor.rgb(red: 22, green: 25, blue: 28) 31 | label.text = "More Snapchatters from My Contacts" 32 | return label 33 | }() 34 | let rightArrow: UIImageView = { 35 | let imageView = UIImageView() 36 | let rightArrow = UIImage(named: "Right Arrow")?.withRenderingMode(.alwaysTemplate) 37 | imageView.image = rightArrow 38 | imageView.tintColor = UIColor.rgb(red: 142, green: 142, blue: 147) 39 | imageView.contentMode = .scaleAspectFit 40 | return imageView 41 | }() 42 | 43 | func setupCell() { 44 | addSubview(contactsImage) 45 | addSubview(contactsLabel) 46 | addSubview(rightArrow) 47 | addConstraintsWithFormat(format: "H:|-12-[v0(20)]-15-[v1]-[v2(15)]-12-|", views: contactsImage, contactsLabel, rightArrow) 48 | addConstraintsWithFormat(format: "V:[v0(20)]", views: contactsImage) 49 | addConstraintsWithFormat(format: "V:[v0(13)]", views: rightArrow) 50 | addConstraint(NSLayoutConstraint(item: contactsImage, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1, constant: 0)) 51 | addConstraint(NSLayoutConstraint(item: contactsLabel, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1, constant: 0)) 52 | addConstraint(NSLayoutConstraint(item: rightArrow, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1, constant: 0)) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Snapchat Clone/Pods-Snapchat Clone-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2016, Andrew Walz. 18 | 19 | Redistribution and use in source and binary forms, with or without modification, 20 | are permitted provided that the following conditions are met: 21 | 22 | 1. Redistributions of source code must retain the above copyright notice, this 23 | list of conditions and the following disclaimer. 24 | 25 | 2. Redistributions in binary form must reproduce the above copyright notice, 26 | this list of conditions and the following disclaimer in the documentation 27 | and/or other materials provided with the distribution. 28 | 29 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 30 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 31 | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 32 | SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 33 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 34 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 35 | OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 36 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 37 | OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 38 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 39 | 40 | License 41 | BSD 42 | Title 43 | SwiftyCam 44 | Type 45 | PSGroupSpecifier 46 | 47 | 48 | FooterText 49 | Generated by CocoaPods - https://cocoapods.org 50 | Title 51 | 52 | Type 53 | PSGroupSpecifier 54 | 55 | 56 | StringsTable 57 | Acknowledgements 58 | Title 59 | Acknowledgements 60 | 61 | 62 | -------------------------------------------------------------------------------- /Snapchat Clone/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 7/30/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 17 | // Override point for customization after application launch. 18 | 19 | //: Do what the storyboard does for you 20 | window = UIWindow(frame: UIScreen.main.bounds) 21 | window?.makeKeyAndVisible() 22 | 23 | let mainNavigationController = MainNavigationController() 24 | mainNavigationController.navigationBar.isHidden = true 25 | window?.rootViewController = mainNavigationController 26 | return true 27 | } 28 | 29 | func applicationWillResignActive(_ application: UIApplication) { 30 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 31 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 32 | } 33 | 34 | func applicationDidEnterBackground(_ application: UIApplication) { 35 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 36 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 37 | } 38 | 39 | func applicationWillEnterForeground(_ application: UIApplication) { 40 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 41 | } 42 | 43 | func applicationDidBecomeActive(_ application: UIApplication) { 44 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 45 | } 46 | 47 | func applicationWillTerminate(_ application: UIApplication) { 48 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 49 | } 50 | 51 | 52 | } 53 | 54 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/xcuserdata/michael.xcuserdatad/xcschemes/SwiftyCam.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 66 | 67 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/xcuserdata/michael.xcuserdatad/xcschemes/Pods-Snapchat Clone.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 66 | 67 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /Snapchat Clone/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /Pods/SwiftyCam/Source/PreviewView.swift: -------------------------------------------------------------------------------- 1 | /*Copyright (c) 2016, Andrew Walz. 2 | 3 | Redistribution and use in source and binary forms, with or without modification,are permitted provided that the following conditions are met: 4 | 5 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 6 | 7 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the 8 | documentation and/or other materials provided with the distribution. 9 | 10 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 11 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS 12 | BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 13 | GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 14 | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 15 | 16 | 17 | import UIKit 18 | import AVFoundation 19 | 20 | /// A function to specifty the Preview Layer's videoGravity. Indicates how the video is displayed within a player layer’s bounds rect. 21 | public enum SwiftyCamVideoGravity { 22 | 23 | /** 24 | - Specifies that the video should be stretched to fill the layer’s bounds 25 | - Corrsponds to `AVLayerVideoGravityResize` 26 | */ 27 | case resize 28 | /** 29 | - Specifies that the player should preserve the video’s aspect ratio and fit the video within the layer’s bounds. 30 | - Corresponds to `AVLayerVideoGravityResizeAspect` 31 | */ 32 | case resizeAspect 33 | /** 34 | - Specifies that the player should preserve the video’s aspect ratio and fill the layer’s bounds. 35 | - Correponds to `AVLayerVideoGravityResizeAspectFill` 36 | */ 37 | case resizeAspectFill 38 | } 39 | 40 | class PreviewView: UIView { 41 | 42 | private var gravity: SwiftyCamVideoGravity = .resizeAspect 43 | 44 | init(frame: CGRect, videoGravity: SwiftyCamVideoGravity) { 45 | gravity = videoGravity 46 | super.init(frame: frame) 47 | self.backgroundColor = UIColor.black 48 | } 49 | 50 | required init?(coder aDecoder: NSCoder) { 51 | super.init(coder: aDecoder) 52 | } 53 | 54 | var videoPreviewLayer: AVCaptureVideoPreviewLayer { 55 | let previewlayer = layer as! AVCaptureVideoPreviewLayer 56 | switch gravity { 57 | case .resize: 58 | previewlayer.videoGravity = AVLayerVideoGravityResize 59 | case .resizeAspect: 60 | previewlayer.videoGravity = AVLayerVideoGravityResizeAspect 61 | case .resizeAspectFill: 62 | previewlayer.videoGravity = AVLayerVideoGravityResizeAspectFill 63 | } 64 | return previewlayer 65 | } 66 | 67 | var session: AVCaptureSession? { 68 | get { 69 | return videoPreviewLayer.session 70 | } 71 | set { 72 | videoPreviewLayer.session = newValue 73 | } 74 | } 75 | 76 | // MARK: UIView 77 | 78 | override class var layerClass : AnyClass { 79 | return AVCaptureVideoPreviewLayer.self 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /Snapchat Clone.xcodeproj/xcuserdata/michael.xcuserdatad/xcschemes/Snapchat Clone.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /Snapchat Clone/CountryController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CountryController.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/16/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class CountryController: UITableViewController { 13 | static let cellId = "cellId" 14 | var countryCodes = [CountryCode]() 15 | 16 | override func viewDidLoad() { 17 | super.viewDidLoad() 18 | adjustNavBar() 19 | tableView.register(CountryCell.self, forCellReuseIdentifier: CountryController.cellId) 20 | 21 | //: Reading the json file will setup the countryCodes arary 22 | readFile() 23 | } 24 | 25 | //: MARK: - Read json file 26 | fileprivate func readFile() { 27 | guard let path = Bundle.main.path(forResource: "CountryCodes", ofType: "json") else { 28 | return 29 | } 30 | do { 31 | //: Write try! before the expression to disable error propagation. 32 | let jsonData = try NSData(contentsOfFile: path, options: NSData.ReadingOptions.mappedIfSafe) as Data 33 | do { 34 | let areaCode = try JSONDecoder().decode([CountryCode].self, from: jsonData) 35 | countryCodes = areaCode.sorted { $0.name < $1.name } 36 | } catch { 37 | print(error.localizedDescription) 38 | } 39 | } catch { 40 | print(error.localizedDescription) 41 | } 42 | } 43 | 44 | //: MARK: Table View methods 45 | override func numberOfSections(in tableView: UITableView) -> Int { 46 | return 1 47 | } 48 | override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 49 | return countryCodes.count 50 | } 51 | override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 52 | return 55 53 | } 54 | override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 55 | let cell = tableView.dequeueReusableCell(withIdentifier: CountryController.cellId, for: indexPath) as! CountryCell 56 | let areaCode = NSString(format:"(%@)", countryCodes[indexPath.row].dial_code) as String 57 | cell.countryLabel.text = countryCodes[indexPath.row].name + " " + areaCode 58 | return cell 59 | } 60 | override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 61 | tableView.deselectRow(at: indexPath, animated: true) 62 | let areaCode = countryCodes[indexPath.row].dial_code 63 | let text = countryCodes[indexPath.row].code + " " + areaCode 64 | PhoneController.areaCode = text 65 | popCurrentView() 66 | } 67 | 68 | //: TODO: Increase navBar height by 20 points 69 | func adjustNavBar() { 70 | setupNavigationBar(leftImage: "BackButton") 71 | guard let navController = self.navigationController else { 72 | return 73 | } 74 | navigationItem.title = "Select Country" 75 | navController.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.black, NSFontAttributeName: UIFont(name: "Avenir-Medium", size: 20)!] 76 | } 77 | 78 | //: FIXME: - Make the status bar be white 79 | override func viewWillAppear(_ animated: Bool) { 80 | super.viewWillAppear(animated) 81 | //: Change back the shadowImage to default 82 | navigationController?.navigationBar.shadowImage = nil 83 | navigationController?.navigationBar.isTranslucent = false 84 | } 85 | override func viewWillDisappear(_ animated: Bool) { 86 | super.viewWillDisappear(animated) 87 | //: Change the shadowImage to be hidden 88 | navigationController?.navigationBar.shadowImage = UIImage() 89 | navigationController?.navigationBar.isTranslucent = true 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /Snapchat Clone/MessageCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MessageCell.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/29/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class MessageCell: UICollectionViewCell { 13 | override init(frame: CGRect) { 14 | super.init(frame: frame) 15 | setupViews() 16 | } 17 | required init?(coder aDecoder: NSCoder) { 18 | fatalError("init(coder:) has not been implemented") 19 | } 20 | 21 | let statusView: UIImageView = { 22 | let statusView = UIImageView() 23 | statusView.image = UIImage(named: "Opened Sent")?.withRenderingMode(.alwaysTemplate) 24 | statusView.tintColor = UIColor.rgb(red: 14, green: 173, blue: 255) 25 | statusView.contentMode = .scaleAspectFit 26 | return statusView 27 | }() 28 | 29 | let nameLabel: UILabel = { 30 | let label = UILabel() 31 | //: Display username and received date 32 | label.numberOfLines = 2 33 | 34 | let attributedText = NSMutableAttributedString(string: "John Appleseed 🤑🤢", attributes: [NSFontAttributeName : UIFont(name: "Avenir-Medium", size: 15)!]) 35 | //: Set the received date 36 | attributedText.append(NSAttributedString(string: "\nReceived Aug 20", attributes: [NSFontAttributeName : UIFont.systemFont(ofSize: 12), NSForegroundColorAttributeName : UIColor.rgb(red: 174, green: 182, blue: 189)])) 37 | //: Increase spacing between lines 38 | let paragraphStyle = NSMutableParagraphStyle() 39 | paragraphStyle.lineSpacing = 3 40 | attributedText.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSMakeRange(0, attributedText.string.count)) 41 | label.attributedText = attributedText 42 | return label 43 | }() 44 | 45 | let borderView: UIView = { 46 | let view = UIView() 47 | view.backgroundColor = UIColor.rgb(red: 247, green: 248, blue: 249) 48 | return view 49 | }() 50 | 51 | let streaksLabel: UILabel = { 52 | let label = UILabel() 53 | label.font = UIFont(name: "Avenir-Heavy", size: 14) 54 | label.textAlignment = .right 55 | label.text = "1130🔥😎😊" 56 | return label 57 | }() 58 | 59 | override var isHighlighted: Bool { 60 | didSet { 61 | self.contentView.backgroundColor = isHighlighted ? UIColor.rgb(red: 238, green: 238, blue: 238) : .white 62 | } 63 | } 64 | 65 | func setupViews() { 66 | addSubview(statusView) 67 | addSubview(borderView) 68 | addSubview(nameLabel) 69 | addSubview(streaksLabel) 70 | backgroundColor = .white 71 | //: statusView Constraints 72 | addConstraintsWithFormat(format: "H:|-14-[v0(19)]-15-[v1][v2(100)]-12-|", views: statusView, nameLabel, streaksLabel) 73 | addConstraintsWithFormat(format: "V:[v0(20)]", views: statusView) 74 | addConstraint(NSLayoutConstraint(item: statusView, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1, constant: 0)) 75 | 76 | //: borderView constraints 77 | addConstraintsWithFormat(format: "H:|[v0]|", views: borderView) 78 | addConstraintsWithFormat(format: "V:[v0(0.5)]|", views: borderView) 79 | 80 | //: usernameLabel 81 | //addConstraintsWithFormat(format: "V:[v0(35)]", views: nameLabel) 82 | addConstraintsWithFormat(format: "V:[v0(40)]", views: nameLabel) 83 | addConstraint(NSLayoutConstraint(item: nameLabel, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1, constant: 0)) 84 | 85 | //: StreaksLabel 86 | addConstraintsWithFormat(format: "V:[v0(15)]", views: streaksLabel) 87 | addConstraint(NSLayoutConstraint(item: streaksLabel, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1, constant: 0)) 88 | 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /Snapchat Clone/PhotoMenuBar.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoMenuBar.swift 3 | // Memories 4 | // 5 | // Created by Michael Lema on 9/10/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class PhotoMenuBar: UIView, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { 12 | 13 | lazy var collectionView: UICollectionView = { 14 | let layout = UICollectionViewFlowLayout() 15 | let cv = UICollectionView(frame: .zero, collectionViewLayout: layout) 16 | cv.backgroundColor = .clear 17 | cv.dataSource = self 18 | cv.delegate = self 19 | //cv.backgroundColor = .blue 20 | return cv 21 | }() 22 | 23 | let cellId = "cellId" 24 | let labelNames = ["ALL", "SCREENSHOTS", "VIDEOS"] 25 | 26 | var cameraRollCell: CameraRollCell? 27 | 28 | override init(frame: CGRect) { 29 | super.init(frame: frame) 30 | 31 | collectionView.register(MenuCell.self, forCellWithReuseIdentifier: cellId) 32 | 33 | addSubview(collectionView) 34 | addConstraintsWithFormat(format: "H:|[v0]|", views: collectionView) 35 | addConstraint(NSLayoutConstraint(item: collectionView, attribute: .centerX, relatedBy: .equal, toItem: self, attribute: .centerX, multiplier: 1, constant: 0)) 36 | addConstraintsWithFormat(format: "V:|[v0]|", views: collectionView) 37 | 38 | let selectedIndexPath = IndexPath(item: 0, section: 0) 39 | collectionView.selectItem(at: selectedIndexPath, animated: false, scrollPosition: UICollectionViewScrollPosition()) 40 | 41 | setupHorizontalBar() 42 | } 43 | 44 | var horizontalBarLeftAnchorConstraint: NSLayoutConstraint? 45 | var horizontalBarWidthAnchorConstraint: NSLayoutConstraint? 46 | 47 | func setupHorizontalBar() { 48 | let horizontalBarView = UIView() 49 | horizontalBarView.backgroundColor = UIColor.darkGray 50 | horizontalBarView.translatesAutoresizingMaskIntoConstraints = false 51 | addSubview(horizontalBarView) 52 | 53 | //need x, y, width, height constraints 54 | horizontalBarLeftAnchorConstraint = horizontalBarView.leftAnchor.constraint(equalTo: collectionView.leftAnchor, constant: 0) 55 | horizontalBarLeftAnchorConstraint?.isActive = true 56 | horizontalBarView.bottomAnchor.constraint(equalTo: collectionView.bottomAnchor, constant: -13).isActive = true 57 | horizontalBarView.widthAnchor.constraint(equalTo: collectionView.widthAnchor, multiplier: 1/3).isActive = true 58 | horizontalBarView.heightAnchor.constraint(equalToConstant: 2).isActive = true 59 | } 60 | 61 | func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 62 | cameraRollCell?.scrollToMenuIndex(indexPath.item) 63 | } 64 | 65 | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 66 | return labelNames.count 67 | } 68 | 69 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 70 | let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! MenuCell 71 | cell.label.text = labelNames[indexPath.item] 72 | cell.label.sizeToFit() 73 | cell.label.adjustsFontSizeToFitWidth = true 74 | return cell 75 | } 76 | 77 | func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 78 | return CGSize(width: collectionView.frame.width / 3, height: frame.height) 79 | } 80 | 81 | func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { 82 | return 0 83 | } 84 | 85 | required init?(coder aDecoder: NSCoder) { 86 | fatalError("init(coder:) has not been implemented") 87 | } 88 | 89 | } 90 | 91 | -------------------------------------------------------------------------------- /Snapchat Clone/CameraRollCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CamereRollCell.swift 3 | // Memories 4 | // 5 | // Created by Michael Lema on 9/10/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class CameraRollCell: BaseCollectionViewCell, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { 12 | static let photoCellId = "photoCellId" 13 | static let screenshotCellId = "screenshotCellId" 14 | static let videoCellId = "videoCellId" 15 | let view: UIView = { 16 | let view = UIView() 17 | view.backgroundColor = .white 18 | return view 19 | }() 20 | // let containerView: UIView = { 21 | // let view = UIView() 22 | // view.backgroundColor = UIColor(red: 247/255, green: 248/255, blue: 249/255, alpha: 1) 23 | // return view 24 | // }() 25 | lazy var menuBar: PhotoMenuBar = { 26 | let mb = PhotoMenuBar() 27 | mb.cameraRollCell = self 28 | return mb 29 | }() 30 | lazy var collectionView: UICollectionView = { 31 | let layout = UICollectionViewFlowLayout() 32 | layout.scrollDirection = .horizontal 33 | layout.minimumLineSpacing = 0 34 | let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) 35 | collectionView.backgroundColor = .white 36 | collectionView.isPagingEnabled = true 37 | collectionView.delegate = self 38 | collectionView.dataSource = self 39 | collectionView.register(AllPhotosCell.self, forCellWithReuseIdentifier: photoCellId) 40 | collectionView.register(ScreenshotsCell.self, forCellWithReuseIdentifier: screenshotCellId) 41 | collectionView.register(VideosCell.self, forCellWithReuseIdentifier: videoCellId) 42 | 43 | return collectionView 44 | }() 45 | 46 | override func setupViews() { 47 | addSubview(view) 48 | addConstraintsWithFormat(format: "H:|[v0]|", views: view) 49 | addConstraintsWithFormat(format: "V:|[v0]|", views: view) 50 | view.addSubview(menuBar) 51 | view.addSubview(collectionView) 52 | view.addConstraintsWithFormat(format: "H:|[v0]|", views: menuBar) 53 | view.addConstraintsWithFormat(format: "V:|[v0(45)]-2-[v1]|", views: menuBar, collectionView) 54 | 55 | view.addConstraintsWithFormat(format: "H:|[v0]|", views: collectionView) 56 | } 57 | //: MARK: - ScrollView Methods 58 | func scrollViewDidScroll(_ scrollView: UIScrollView) { 59 | menuBar.horizontalBarLeftAnchorConstraint?.constant = (scrollView.contentOffset.x / 3) 60 | //: TODO: INCREASE the width when scrolling 61 | //menuBar.horizontalBarWidthAnchorConstraint?.constant = (scrollView.contentOffset.x / 3) 62 | } 63 | func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { 64 | 65 | let index = targetContentOffset.pointee.x / view.frame.width 66 | 67 | let indexPath = IndexPath(item: Int(index), section: 0) 68 | menuBar.collectionView.selectItem(at: indexPath, animated: true, scrollPosition: UICollectionViewScrollPosition()) 69 | } 70 | func scrollToMenuIndex(_ menuIndex: Int) { 71 | let indexPath = IndexPath(item: menuIndex, section: 0) 72 | collectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition(), animated: true) 73 | } 74 | //: MARK: CollectionView methods 75 | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 76 | return 3 77 | } 78 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 79 | let identifier: String 80 | if indexPath.item == 1 { 81 | identifier = CameraRollCell.screenshotCellId 82 | } else if indexPath.item == 2 { 83 | identifier = CameraRollCell.videoCellId 84 | } else { 85 | identifier = CameraRollCell.photoCellId 86 | } 87 | let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath) 88 | return cell 89 | } 90 | func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 91 | return CGSize(width: self.frame.width, height: collectionView.frame.height) 92 | } 93 | } 94 | 95 | -------------------------------------------------------------------------------- /Snapchat Clone/ContactCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactCell.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/30/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class ContactCell: UICollectionViewCell { 13 | override init(frame: CGRect) { 14 | super.init(frame: frame) 15 | setupCell() 16 | } 17 | required init?(coder aDecoder: NSCoder) { 18 | fatalError("init(coder:) has not been implemented") 19 | } 20 | var fullName: UILabel = { 21 | let label = UILabel() 22 | label.font = UIFont(name: "Avenir-Medium", size: 15) 23 | label.textColor = UIColor.rgb(red: 22, green: 25, blue: 28) 24 | label.textAlignment = .left 25 | label.text = "John Appleseed" 26 | return label 27 | }() 28 | var username: UILabel = { 29 | let label = UILabel() 30 | label.font = UIFont(name: "Avenir-Medium", size: 11) 31 | label.textColor = UIColor.rgb(red: 189, green: 195, blue: 201) 32 | label.textAlignment = .left 33 | label.text = "AppleseedJohn" 34 | return label 35 | }() 36 | let addTextField: UITextField = { 37 | let textField = UITextField() 38 | textField.isEnabled = false 39 | textField.isUserInteractionEnabled = false 40 | textField.layer.masksToBounds = true 41 | //: Making my own border 42 | textField.layer.cornerRadius = 14 43 | textField.layer.borderWidth = 1 44 | textField.layer.borderColor = UIColor.rgb(red: 227, green: 208, blue: 239).cgColor 45 | textField.font = UIFont(name: "Avenir-Heavy", size: 13) 46 | textField.textColor = UIColor.rgb(red: 140, green: 71, blue: 191) 47 | textField.textAlignment = .center 48 | textField.text = "Add" 49 | //textField.adjustsFontSizeToFitWidth = true 50 | textField.translatesAutoresizingMaskIntoConstraints = false 51 | return textField 52 | }() 53 | lazy var stackView: UIStackView = { 54 | let stackView = UIStackView(arrangedSubviews: [self.fullName, self.username]) 55 | stackView.axis = UILayoutConstraintAxis.vertical 56 | stackView.distribution = .fillEqually 57 | stackView.alignment = .fill 58 | stackView.spacing = 0 59 | stackView.translatesAutoresizingMaskIntoConstraints = false 60 | return stackView 61 | }() 62 | let borderView: UIView = { 63 | let view = UIView() 64 | view.backgroundColor = UIColor.rgb(red: 234, green: 237, blue: 239) 65 | return view 66 | }() 67 | 68 | func setupCell() { 69 | self.translatesAutoresizingMaskIntoConstraints = false 70 | addTextField.setLeftImage(UIImage(named: "Add Friend")!, padding: 17) 71 | addSubview(stackView) 72 | addSubview(addTextField) 73 | addSubview(borderView) 74 | //: Centering the Y position for the stackView and addTextField 75 | addConstraint(NSLayoutConstraint(item: stackView, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1, constant: 0)) 76 | addConstraint(NSLayoutConstraint(item: addTextField, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1, constant: 0)) 77 | //: Setting the left and right NSLayoutAttribute for the addTextField and stackView 78 | addConstraint(NSLayoutConstraint(item: addTextField, attribute: .right, relatedBy: .equal, toItem: self, attribute: .right, multiplier: 1, constant: -12)) 79 | addConstraint(NSLayoutConstraint(item: stackView, attribute: .left, relatedBy: .equal, toItem: self, attribute: .left, multiplier: 1, constant: 12)) 80 | //: Setting the addTextField width and height constratins 81 | addConstraint(NSLayoutConstraint(item: addTextField, attribute: .width, relatedBy: .equal, toItem: .none, attribute: .notAnAttribute, multiplier: 1, constant: 75)) 82 | addConstraint(NSLayoutConstraint(item: addTextField, attribute: .height, relatedBy: .equal, toItem: .none, attribute: .notAnAttribute, multiplier: 1, constant: 30)) 83 | //: Setting the left and right NSLayoutAttribute for the addTextField and stackView 84 | addConstraint(NSLayoutConstraint(item: stackView, attribute: .right, relatedBy: .equal, toItem: addTextField, attribute: .left, multiplier: 1, constant: 0)) 85 | addConstraint(NSLayoutConstraint(item: addTextField, attribute: .left, relatedBy: .equal, toItem: stackView, attribute: .right, multiplier: 1, constant: 0)) 86 | //: Setting the width & height constraints for the border 87 | addConstraintsWithFormat(format: "H:|[v0]|", views: borderView) 88 | addConstraintsWithFormat(format: "V:[v0(1)]|", views: borderView) 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /Snapchat Clone/PhotoViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoViewController.swift 3 | // Snapchat Clone 4 | // 5 | // Created by Michael Lema on 8/30/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class PhotoViewController: UIViewController { 13 | private var hasDownloadedImage = false 14 | 15 | let backgroundImageView: UIImageView = { 16 | let imageView = UIImageView() 17 | imageView.contentMode = .scaleAspectFill 18 | //imageView.image = nil 19 | return imageView 20 | }() 21 | let cancelButton: UIButton = { 22 | let button = UIButton(type: .custom) 23 | let cancelImage = UIImage(named: "Close")?.withRenderingMode(.alwaysOriginal) 24 | button.setImage(cancelImage, for: .normal) 25 | button.imageView?.contentMode = .scaleAspectFit 26 | button.addTarget(self, action: #selector(handleCancel), for: .touchUpInside) 27 | return button 28 | }() 29 | let downloadButton: UIButton = { 30 | let button = UIButton(type: .custom) 31 | let downloadImage = UIImage(named: "Download")?.withRenderingMode(.alwaysOriginal) 32 | button.setImage(downloadImage, for: .normal) 33 | button.imageView?.contentMode = .scaleAspectFit 34 | button.addTarget(self, action: #selector(handleDownload), for: .touchUpInside) 35 | button.adjustsImageWhenHighlighted = false 36 | return button 37 | }() 38 | 39 | //: MARK: - init 40 | init(image: UIImage) { 41 | //: This allows you to initialize your custom UIViewController without a nib or bundle. 42 | super.init(nibName: nil, bundle: nil) 43 | backgroundImageView.image = image 44 | } 45 | //: This is necessary when extending the superclass 46 | required init?(coder aDecoder: NSCoder) { 47 | fatalError("init(coder:) has not been implemented") 48 | } 49 | 50 | //: MARK: - viewDidLoad 51 | override func viewDidLoad() { 52 | super.viewDidLoad() 53 | setupViews() 54 | } 55 | 56 | func setupViews() { 57 | view.addSubview(backgroundImageView) 58 | view.addSubview(cancelButton) 59 | view.addSubview(downloadButton) 60 | //: backgroundImageView Constraints 61 | view.addConstraintsWithFormat(format: "H:|[v0]|", views: backgroundImageView) 62 | view.addConstraintsWithFormat(format: "V:|[v0]|", views: backgroundImageView) 63 | 64 | //: cancelButton Constraints 65 | view.addConstraintsWithFormat(format: "H:|-17-[v0(35)]", views: cancelButton) 66 | view.addConstraintsWithFormat(format: "V:|-21-[v0(35)]", views: cancelButton) 67 | 68 | //: downloadButton Constraints 69 | view.addConstraintsWithFormat(format: "H:|-18-[v0(35)]", views: downloadButton) 70 | view.addConstraintsWithFormat(format: "V:[v0(35)]-18-|", views: downloadButton) 71 | } 72 | 73 | //: Button actons 74 | func handleCancel() { 75 | UIView.animate(withDuration: 0.30, delay: 0, options: [.curveEaseOut], animations: { 76 | self.cancelButton.transform = CGAffineTransform(scaleX: 1.50, y: 1.50) 77 | }) { (_) in 78 | self.dismiss(animated: false, completion: nil) 79 | } 80 | } 81 | func handleDownload() { 82 | if !hasDownloadedImage { 83 | UIImageWriteToSavedPhotosAlbum(backgroundImageView.image!, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil) 84 | hasDownloadedImage = true 85 | } 86 | } 87 | 88 | func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) { 89 | if let error = error { 90 | let alert = UIAlertController(title: "Error", message: error.localizedDescription, preferredStyle: .alert) 91 | alert.addAction(UIAlertAction(title: "OK", style: .cancel)) 92 | present(alert, animated: true) 93 | hasDownloadedImage = false 94 | } else { 95 | //: We have a success 96 | let downloadedImage = #imageLiteral(resourceName: "Downloaded") 97 | UIView.animate(withDuration: 0.15, delay: 0, options: .curveEaseIn, animations: { 98 | self.downloadButton.transform = CGAffineTransform(scaleX: 0.50, y: 0.50) 99 | }, completion: { (_) in 100 | UIView.animate(withDuration: 0.4, delay: 0, options: .curveEaseOut, animations: { 101 | self.downloadButton.transform = .identity 102 | self.downloadButton.setImage(downloadedImage, for: .normal) 103 | }, completion: nil) 104 | }) 105 | } 106 | } 107 | 108 | override var prefersStatusBarHidden: Bool { 109 | return true 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /Snapchat Clone/ScreenshotsCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ScreenshotsCell.swift 3 | // Memories 4 | // 5 | // Created by Michael Lema on 9/10/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Photos 11 | 12 | class ScreenshotsCell: BaseCollectionViewCell, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { 13 | 14 | var screenshotsArray = [UIImage]() 15 | static let cellId = "cellId" 16 | lazy var collectionView: UICollectionView = { 17 | let layout = UICollectionViewFlowLayout() 18 | let cv = UICollectionView(frame: .zero, collectionViewLayout: layout) 19 | cv.delegate = self 20 | cv.dataSource = self 21 | cv.backgroundColor = .white 22 | cv.register(ImageCell.self, forCellWithReuseIdentifier: cellId) 23 | return cv 24 | }() 25 | 26 | override func setupViews() { 27 | addSubview(collectionView) 28 | addConstraintsWithFormat(format: "H:|[v0]|", views: collectionView) 29 | addConstraintsWithFormat(format: "V:|[v0]|", views: collectionView) 30 | //: Hmmm. Is this a good idea? It doesn't slow down the UI. 31 | DispatchQueue.global(qos: .background).async { 32 | // Background Thread 33 | self.collectPhotos() 34 | DispatchQueue.main.async { 35 | // Run UI Updates 36 | self.collectionView.reloadData() 37 | } 38 | } 39 | } 40 | 41 | func collectPhotos() { 42 | //let frame = collectionView.frame.width / 3 43 | let imageManager = PHImageManager.default() 44 | 45 | let requestOptions = PHImageRequestOptions() 46 | requestOptions.isSynchronous = true 47 | requestOptions.deliveryMode = .opportunistic 48 | 49 | let fetchOptions = PHFetchOptions() 50 | fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 51 | 52 | let albumsPhoto: PHFetchResult = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: nil) 53 | 54 | albumsPhoto.enumerateObjects ({ (collection, index, object) in 55 | if collection.localizedTitle == "Screenshots" { 56 | let fetchResult = PHAsset.fetchAssets(in: collection, options: fetchOptions) 57 | if fetchResult.count > 0 { 58 | for index in 0.. Int { 69 | return 1 70 | } 71 | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 72 | return screenshotsArray.count 73 | } 74 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 75 | let cell = collectionView.dequeueReusableCell(withReuseIdentifier: ScreenshotsCell.cellId, for: indexPath) as! ImageCell 76 | cell.imageView.image = screenshotsArray[indexPath.item] 77 | return cell 78 | } 79 | func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 80 | let frame = collectionView.frame.width / 3 81 | return CGSize(width: frame - 1, height: frame - 1) 82 | } 83 | func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { 84 | return 1.0 85 | } 86 | func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { 87 | return 1.0 88 | } 89 | func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 90 | //: Do something here later 91 | } 92 | } 93 | 94 | class ImageCell: BaseCollectionViewCell { 95 | let imageView: UIImageView = { 96 | let imageView = UIImageView() 97 | imageView.contentMode = .scaleAspectFill 98 | imageView.layer.masksToBounds = true 99 | return imageView 100 | }() 101 | override func setupViews() { 102 | addSubview(imageView) 103 | addConstraintsWithFormat(format: "H:|[v0]|", views: imageView) 104 | addConstraintsWithFormat(format: "V:|[v0]|", views: imageView) 105 | } 106 | } 107 | 108 | -------------------------------------------------------------------------------- /Pods/SwiftyCam/Source/SwiftyCamButton.swift: -------------------------------------------------------------------------------- 1 | /*Copyright (c) 2016, Andrew Walz. 2 | 3 | Redistribution and use in source and binary forms, with or without modification,are permitted provided that the following conditions are met: 4 | 5 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 6 | 7 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the 8 | documentation and/or other materials provided with the distribution. 9 | 10 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 11 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS 12 | BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 13 | GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 14 | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 15 | 16 | 17 | import UIKit 18 | 19 | //MARK: Public Protocol Declaration 20 | 21 | /// Delegate for SwiftyCamButton 22 | 23 | public protocol SwiftyCamButtonDelegate: class { 24 | 25 | /// Called when UITapGestureRecognizer begins 26 | 27 | func buttonWasTapped() 28 | 29 | /// Called When UILongPressGestureRecognizer enters UIGestureRecognizerState.began 30 | 31 | func buttonDidBeginLongPress() 32 | 33 | /// Called When UILongPressGestureRecognizer enters UIGestureRecognizerState.end 34 | 35 | func buttonDidEndLongPress() 36 | 37 | /// Called when the maximum duration is reached 38 | 39 | func longPressDidReachMaximumDuration() 40 | 41 | /// Sets the maximum duration of the video recording 42 | 43 | func setMaxiumVideoDuration() -> Double 44 | } 45 | 46 | // MARK: Public View Declaration 47 | 48 | 49 | /// UIButton Subclass for Capturing Photo and Video with SwiftyCamViewController 50 | 51 | open class SwiftyCamButton: UIButton { 52 | public static var isTapped = false 53 | /// Delegate variable 54 | 55 | public weak var delegate: SwiftyCamButtonDelegate? 56 | 57 | /// Maximum duration variable 58 | 59 | fileprivate var timer : Timer? 60 | 61 | /// Initialization Declaration 62 | 63 | override public init(frame: CGRect) { 64 | super.init(frame: frame) 65 | createGestureRecognizers() 66 | } 67 | 68 | /// Initialization Declaration 69 | 70 | 71 | required public init?(coder aDecoder: NSCoder) { 72 | super.init(coder: aDecoder) 73 | createGestureRecognizers() 74 | } 75 | 76 | /// UITapGestureRecognizer Function 77 | 78 | @objc fileprivate func Tap() { 79 | guard !SwiftyCamButton.isTapped else { 80 | return 81 | } 82 | SwiftyCamButton.isTapped = true 83 | delegate?.buttonWasTapped() 84 | } 85 | 86 | /// UILongPressGestureRecognizer Function 87 | @objc fileprivate func LongPress(_ sender:UILongPressGestureRecognizer!) { 88 | switch sender.state { 89 | case .began: 90 | delegate?.buttonDidBeginLongPress() 91 | startTimer() 92 | case .ended: 93 | invalidateTimer() 94 | delegate?.buttonDidEndLongPress() 95 | default: 96 | break 97 | } 98 | } 99 | 100 | /// Timer Finished 101 | 102 | @objc fileprivate func timerFinished() { 103 | invalidateTimer() 104 | delegate?.longPressDidReachMaximumDuration() 105 | } 106 | 107 | /// Start Maximum Duration Timer 108 | 109 | fileprivate func startTimer() { 110 | if let duration = delegate?.setMaxiumVideoDuration() { 111 | //Check if duration is set, and greater than zero 112 | if duration != 0.0 && duration > 0.0 { 113 | timer = Timer.scheduledTimer(timeInterval: duration, target: self, selector: #selector(SwiftyCamButton.timerFinished), userInfo: nil, repeats: false) 114 | } 115 | } 116 | } 117 | 118 | // End timer if UILongPressGestureRecognizer is ended before time has ended 119 | 120 | fileprivate func invalidateTimer() { 121 | timer?.invalidate() 122 | timer = nil 123 | } 124 | 125 | // Add Tap and LongPress gesture recognizers 126 | 127 | fileprivate func createGestureRecognizers() { 128 | let tapGesture = UITapGestureRecognizer(target: self, action: #selector(SwiftyCamButton.Tap)) 129 | let longGesture = UILongPressGestureRecognizer(target: self, action: #selector(SwiftyCamButton.LongPress)) 130 | self.addGestureRecognizer(tapGesture) 131 | self.addGestureRecognizer(longGesture) 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Snapchat Clone/Pods-Snapchat Clone-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 6 | 7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 8 | 9 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 10 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 11 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 12 | 13 | install_framework() 14 | { 15 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 16 | local source="${BUILT_PRODUCTS_DIR}/$1" 17 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 18 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 19 | elif [ -r "$1" ]; then 20 | local source="$1" 21 | fi 22 | 23 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 24 | 25 | if [ -L "${source}" ]; then 26 | echo "Symlinked..." 27 | source="$(readlink "${source}")" 28 | fi 29 | 30 | # Use filter instead of exclude so missing patterns don't throw errors. 31 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 32 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 33 | 34 | local basename 35 | basename="$(basename -s .framework "$1")" 36 | binary="${destination}/${basename}.framework/${basename}" 37 | if ! [ -r "$binary" ]; then 38 | binary="${destination}/${basename}" 39 | fi 40 | 41 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 42 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 43 | strip_invalid_archs "$binary" 44 | fi 45 | 46 | # Resign the code if required by the build settings to avoid unstable apps 47 | code_sign_if_enabled "${destination}/$(basename "$1")" 48 | 49 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 50 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 51 | local swift_runtime_libs 52 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 53 | for lib in $swift_runtime_libs; do 54 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 55 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 56 | code_sign_if_enabled "${destination}/${lib}" 57 | done 58 | fi 59 | } 60 | 61 | # Copies the dSYM of a vendored framework 62 | install_dsym() { 63 | local source="$1" 64 | if [ -r "$source" ]; then 65 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DWARF_DSYM_FOLDER_PATH}\"" 66 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DWARF_DSYM_FOLDER_PATH}" 67 | fi 68 | } 69 | 70 | # Signs a framework with the provided identity 71 | code_sign_if_enabled() { 72 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 73 | # Use the current code_sign_identitiy 74 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 75 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" 76 | 77 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 78 | code_sign_cmd="$code_sign_cmd &" 79 | fi 80 | echo "$code_sign_cmd" 81 | eval "$code_sign_cmd" 82 | fi 83 | } 84 | 85 | # Strip invalid architectures 86 | strip_invalid_archs() { 87 | binary="$1" 88 | # Get architectures for current file 89 | archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" 90 | stripped="" 91 | for arch in $archs; do 92 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 93 | # Strip non-valid architectures in-place 94 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 95 | stripped="$stripped $arch" 96 | fi 97 | done 98 | if [[ "$stripped" ]]; then 99 | echo "Stripped $binary of architectures:$stripped" 100 | fi 101 | } 102 | 103 | 104 | if [[ "$CONFIGURATION" == "Debug" ]]; then 105 | install_framework "${BUILT_PRODUCTS_DIR}/SwiftyCam/SwiftyCam.framework" 106 | fi 107 | if [[ "$CONFIGURATION" == "Release" ]]; then 108 | install_framework "${BUILT_PRODUCTS_DIR}/SwiftyCam/SwiftyCam.framework" 109 | fi 110 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 111 | wait 112 | fi 113 | -------------------------------------------------------------------------------- /Pods/SwiftyCam/Source/SwiftyCamViewControllerDelegate.swift: -------------------------------------------------------------------------------- 1 | /*Copyright (c) 2016, Andrew Walz. 2 | 3 | Redistribution and use in source and binary forms, with or without modification,are permitted provided that the following conditions are met: 4 | 5 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 6 | 7 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the 8 | documentation and/or other materials provided with the distribution. 9 | 10 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 11 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS 12 | BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 13 | GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 14 | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 15 | 16 | 17 | import UIKit 18 | 19 | // MARK: Public Protocol Declaration 20 | 21 | /// Delegate for SwiftyCamViewController 22 | 23 | public protocol SwiftyCamViewControllerDelegate: class { 24 | 25 | /** 26 | SwiftyCamViewControllerDelegate function called when the takePhoto() function is called. 27 | 28 | - Parameter swiftyCam: Current SwiftyCamViewController session 29 | - Parameter photo: UIImage captured from the current session 30 | */ 31 | 32 | func swiftyCam(_ swiftyCam: SwiftyCamViewController, didTake photo: UIImage) 33 | 34 | /** 35 | SwiftyCamViewControllerDelegate function called when SwiftyCamViewController begins recording video. 36 | 37 | - Parameter swiftyCam: Current SwiftyCamViewController session 38 | - Parameter camera: Current camera orientation 39 | */ 40 | 41 | func swiftyCam(_ swiftyCam: SwiftyCamViewController, didBeginRecordingVideo camera: SwiftyCamViewController.CameraSelection) 42 | 43 | /** 44 | SwiftyCamViewControllerDelegate function called when SwiftyCamViewController finishes recording video. 45 | 46 | - Parameter swiftyCam: Current SwiftyCamViewController session 47 | - Parameter camera: Current camera orientation 48 | */ 49 | 50 | func swiftyCam(_ swiftyCam: SwiftyCamViewController, didFinishRecordingVideo camera: SwiftyCamViewController.CameraSelection) 51 | 52 | /** 53 | SwiftyCamViewControllerDelegate function called when SwiftyCamViewController is done processing video. 54 | 55 | - Parameter swiftyCam: Current SwiftyCamViewController session 56 | - Parameter url: URL location of video in temporary directory 57 | */ 58 | 59 | func swiftyCam(_ swiftyCam: SwiftyCamViewController, didFinishProcessVideoAt url: URL) 60 | 61 | /** 62 | SwiftyCamViewControllerDelegate function called when SwiftyCamViewController switches between front or rear camera. 63 | 64 | - Parameter swiftyCam: Current SwiftyCamViewController session 65 | - Parameter camera: Current camera selection 66 | */ 67 | 68 | func swiftyCam(_ swiftyCam: SwiftyCamViewController, didSwitchCameras camera: SwiftyCamViewController.CameraSelection) 69 | 70 | /** 71 | SwiftyCamViewControllerDelegate function called when SwiftyCamViewController view is tapped and begins focusing at that point. 72 | 73 | - Parameter swiftyCam: Current SwiftyCamViewController session 74 | - Parameter point: Location in view where camera focused 75 | 76 | */ 77 | 78 | func swiftyCam(_ swiftyCam: SwiftyCamViewController, didFocusAtPoint point: CGPoint) 79 | 80 | /** 81 | SwiftyCamViewControllerDelegate function called when when SwiftyCamViewController view changes zoom level. 82 | 83 | - Parameter swiftyCam: Current SwiftyCamViewController session 84 | - Parameter zoom: Current zoom level 85 | */ 86 | 87 | func swiftyCam(_ swiftyCam: SwiftyCamViewController, didChangeZoomLevel zoom: CGFloat) 88 | } 89 | 90 | public extension SwiftyCamViewControllerDelegate { 91 | 92 | func swiftyCam(_ swiftyCam: SwiftyCamViewController, didTake photo: UIImage) { 93 | // Optional 94 | } 95 | 96 | 97 | func swiftyCam(_ swiftyCam: SwiftyCamViewController, didBeginRecordingVideo camera: SwiftyCamViewController.CameraSelection) { 98 | // Optional 99 | } 100 | 101 | 102 | func swiftyCam(_ swiftyCam: SwiftyCamViewController, didFinishRecordingVideo camera: SwiftyCamViewController.CameraSelection) { 103 | // Optional 104 | } 105 | 106 | 107 | func swiftyCam(_ swiftyCam: SwiftyCamViewController, didFinishProcessVideoAt url: URL) { 108 | // Optional 109 | } 110 | 111 | 112 | func swiftyCam(_ swiftyCam: SwiftyCamViewController, didSwitchCameras camera: SwiftyCamViewController.CameraSelection) { 113 | // Optional 114 | } 115 | 116 | 117 | func swiftyCam(_ swiftyCam: SwiftyCamViewController, didFocusAtPoint point: CGPoint) { 118 | // Optional 119 | } 120 | 121 | 122 | func swiftyCam(_ swiftyCam: SwiftyCamViewController, didChangeZoomLevel zoom: CGFloat) { 123 | // Optional 124 | } 125 | } 126 | 127 | 128 | 129 | -------------------------------------------------------------------------------- /Snapchat Clone/VerticalScrollViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MiddleScrollViewController.swift 3 | // SnapchatSwipeView 4 | // 5 | // Created by Jake Spracher on 12/14/15. 6 | // Copyright © 2015 Jake Spracher. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class VerticalScrollViewController: UIViewController, SnapContainerViewControllerDelegate { 12 | var topVc: UIViewController! 13 | var middleVc: UIViewController! 14 | var bottomVc: UIViewController! 15 | var scrollView: UIScrollView! 16 | 17 | class func verticalScrollVcWith(middleVc: UIViewController, 18 | topVc: UIViewController?=nil, 19 | bottomVc: UIViewController?=nil) -> VerticalScrollViewController { 20 | let middleScrollVc = VerticalScrollViewController() 21 | 22 | middleScrollVc.topVc = topVc 23 | middleScrollVc.middleVc = middleVc 24 | middleScrollVc.bottomVc = bottomVc 25 | return middleScrollVc 26 | } 27 | 28 | override func viewDidLoad() { 29 | super.viewDidLoad() 30 | view.backgroundColor = .white 31 | // Do any additional setup after loading the view: 32 | setupScrollView() 33 | } 34 | 35 | func setupScrollView() { 36 | scrollView = UIScrollView() 37 | scrollView.isPagingEnabled = true 38 | scrollView.showsVerticalScrollIndicator = false 39 | scrollView.bounces = false 40 | 41 | let view = ( 42 | x: self.view.bounds.origin.x, 43 | y: self.view.bounds.origin.y, 44 | width: self.view.bounds.width, 45 | height: self.view.bounds.height 46 | ) 47 | 48 | scrollView.frame = CGRect(x: view.x, y: view.y, width: view.width, height: view.height) 49 | self.view.addSubview(scrollView) 50 | } 51 | 52 | // MARK: - SnapContainerViewControllerDelegate Methods 53 | func outerScrollViewShouldScroll() -> Bool { 54 | if scrollView.contentOffset.y < middleVc.view.frame.origin.y || scrollView.contentOffset.y > 2*middleVc.view.frame.origin.y { 55 | return false 56 | } else { 57 | return true 58 | } 59 | } 60 | 61 | override func viewDidLayoutSubviews() { 62 | let view = ( 63 | x: self.view.bounds.origin.x, 64 | y: self.view.bounds.origin.y, 65 | width: self.view.bounds.width, 66 | height: self.view.bounds.height 67 | ) 68 | let scrollWidth: CGFloat = view.width 69 | var scrollHeight: CGFloat 70 | if topVc != nil && bottomVc != nil { 71 | scrollHeight = 3 * view.height 72 | topVc.view.frame = CGRect(x: 0, y: 0, width: view.width, height: view.height) 73 | middleVc.view.frame = CGRect(x: 0, y: view.height, width: view.width, height: view.height) 74 | bottomVc.view.frame = CGRect(x: 0, y: 2 * view.height, width: view.width, height: view.height) 75 | 76 | addChildViewController(topVc) 77 | addChildViewController(middleVc) 78 | addChildViewController(bottomVc) 79 | 80 | scrollView.addSubview(topVc.view) 81 | scrollView.addSubview(middleVc.view) 82 | scrollView.addSubview(bottomVc.view) 83 | 84 | topVc.didMove(toParentViewController: self) 85 | middleVc.didMove(toParentViewController: self) 86 | bottomVc.didMove(toParentViewController: self) 87 | 88 | scrollView.contentOffset.y = middleVc.view.frame.origin.y 89 | 90 | } else if topVc == nil { 91 | scrollHeight = 2 * view.height 92 | middleVc.view.frame = CGRect(x: 0, y: 0, width: view.width, height: view.height) 93 | bottomVc.view.frame = CGRect(x: 0, y: view.height, width: view.width, height: view.height) 94 | 95 | addChildViewController(middleVc) 96 | addChildViewController(bottomVc) 97 | 98 | scrollView.addSubview(middleVc.view) 99 | scrollView.addSubview(bottomVc.view) 100 | 101 | middleVc.didMove(toParentViewController: self) 102 | bottomVc.didMove(toParentViewController: self) 103 | 104 | scrollView.contentOffset.y = 0 105 | 106 | } else if bottomVc == nil { 107 | scrollHeight = 2 * view.height 108 | topVc.view.frame = CGRect(x: 0, y: 0, width: view.width, height: view.height) 109 | middleVc.view.frame = CGRect(x: 0, y: view.height, width: view.width, height: view.height) 110 | 111 | addChildViewController(topVc) 112 | addChildViewController(middleVc) 113 | 114 | scrollView.addSubview(topVc.view) 115 | scrollView.addSubview(middleVc.view) 116 | 117 | topVc.didMove(toParentViewController: self) 118 | middleVc.didMove(toParentViewController: self) 119 | 120 | scrollView.contentOffset.y = middleVc.view.frame.origin.y 121 | 122 | } else { 123 | scrollHeight = view.height 124 | middleVc.view.frame = CGRect(x: 0, y: 0, width: view.width, height: view.height) 125 | 126 | addChildViewController(middleVc) 127 | scrollView.addSubview(middleVc.view) 128 | middleVc.didMove(toParentViewController: self) 129 | } 130 | 131 | scrollView.contentSize = CGSize(width: scrollWidth, height: scrollHeight) 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /Snapchat Clone/SnapContainerViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContainerViewController.swift 3 | // SnapchatSwipeView 4 | // 5 | // Created by Jake Spracher on 8/9/15. 6 | // Copyright (c) 2015 Jake Spracher. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | protocol SnapContainerViewControllerDelegate { 12 | func outerScrollViewShouldScroll() -> Bool 13 | } 14 | 15 | class SnapContainerViewController: UIViewController, UIScrollViewDelegate { 16 | 17 | var topVc: UIViewController? 18 | var leftVc: UIViewController! 19 | var middleVc: UIViewController! 20 | var rightVc: UIViewController! 21 | var bottomVc: UIViewController? 22 | 23 | var directionLockDisabled: Bool! 24 | 25 | var horizontalViews = [UIViewController]() 26 | var veritcalViews = [UIViewController]() 27 | 28 | var initialContentOffset = CGPoint() // scrollView initial offset 29 | var middleVertScrollVc: VerticalScrollViewController! 30 | var scrollView: UIScrollView! 31 | var delegate: SnapContainerViewControllerDelegate? 32 | 33 | class func containerViewWith(_ leftVC: UIViewController, 34 | middleVC: UIViewController, 35 | rightVC: UIViewController, 36 | topVC: UIViewController?=nil, 37 | bottomVC: UIViewController?=nil, 38 | directionLockDisabled: Bool?=false) -> SnapContainerViewController { 39 | let container = SnapContainerViewController() 40 | 41 | container.directionLockDisabled = directionLockDisabled 42 | 43 | container.topVc = topVC 44 | container.leftVc = leftVC 45 | container.middleVc = middleVC 46 | container.rightVc = rightVC 47 | container.bottomVc = bottomVC 48 | return container 49 | } 50 | 51 | override func viewDidLoad() { 52 | super.viewDidLoad() 53 | setupVerticalScrollView() 54 | setupHorizontalScrollView() 55 | } 56 | 57 | func setupVerticalScrollView() { 58 | middleVertScrollVc = VerticalScrollViewController.verticalScrollVcWith(middleVc: middleVc, 59 | topVc: topVc, 60 | bottomVc: bottomVc) 61 | delegate = middleVertScrollVc 62 | } 63 | 64 | func setupHorizontalScrollView() { 65 | scrollView = UIScrollView() 66 | scrollView.isPagingEnabled = true 67 | scrollView.showsHorizontalScrollIndicator = false 68 | scrollView.bounces = false 69 | 70 | } 71 | 72 | func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { 73 | self.initialContentOffset = scrollView.contentOffset 74 | } 75 | 76 | func scrollViewDidScroll(_ scrollView: UIScrollView) { 77 | if delegate != nil && !delegate!.outerScrollViewShouldScroll() && !directionLockDisabled { 78 | let newOffset = CGPoint(x: self.initialContentOffset.x, y: self.initialContentOffset.y) 79 | 80 | // Setting the new offset to the scrollView makes it behave like a proper 81 | // directional lock, that allows you to scroll in only one direction at any given time 82 | self.scrollView!.setContentOffset(newOffset, animated: false) 83 | } 84 | } 85 | 86 | override func viewDidLayoutSubviews() { 87 | super.viewDidLayoutSubviews() 88 | let view = ( 89 | x: self.view.bounds.origin.x, 90 | y: self.view.bounds.origin.y, 91 | width: self.view.bounds.width, 92 | height: self.view.bounds.height 93 | ) 94 | 95 | scrollView.frame = CGRect(x: view.x, 96 | y: view.y, 97 | width: view.width, 98 | height: view.height 99 | ) 100 | 101 | self.view.addSubview(scrollView) 102 | 103 | let scrollWidth = 3 * view.width 104 | let scrollHeight = view.height 105 | scrollView.contentSize = CGSize(width: scrollWidth, height: scrollHeight) 106 | 107 | leftVc.view.frame = CGRect(x: 0, 108 | y: 0, 109 | width: view.width, 110 | height: view.height 111 | ) 112 | 113 | middleVertScrollVc.view.frame = CGRect(x: view.width, 114 | y: 0, 115 | width: view.width, 116 | height: view.height 117 | ) 118 | 119 | rightVc.view.frame = CGRect(x: 2 * view.width, 120 | y: 0, 121 | width: view.width, 122 | height: view.height 123 | ) 124 | 125 | addChildViewController(leftVc) 126 | addChildViewController(middleVertScrollVc) 127 | addChildViewController(rightVc) 128 | 129 | scrollView.addSubview(leftVc.view) 130 | scrollView.addSubview(middleVertScrollVc.view) 131 | scrollView.addSubview(rightVc.view) 132 | 133 | leftVc.didMove(toParentViewController: self) 134 | middleVertScrollVc.didMove(toParentViewController: self) 135 | rightVc.didMove(toParentViewController: self) 136 | 137 | scrollView.contentOffset.x = middleVertScrollVc.view.frame.origin.x 138 | scrollView.delegate = self 139 | } 140 | 141 | override var preferredStatusBarStyle: UIStatusBarStyle { 142 | return .lightContent 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Snapchat Clone/Pods-Snapchat Clone-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | XCASSET_FILES=() 10 | 11 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 12 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 13 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 14 | 15 | case "${TARGETED_DEVICE_FAMILY}" in 16 | 1,2) 17 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 18 | ;; 19 | 1) 20 | TARGET_DEVICE_ARGS="--target-device iphone" 21 | ;; 22 | 2) 23 | TARGET_DEVICE_ARGS="--target-device ipad" 24 | ;; 25 | 3) 26 | TARGET_DEVICE_ARGS="--target-device tv" 27 | ;; 28 | 4) 29 | TARGET_DEVICE_ARGS="--target-device watch" 30 | ;; 31 | *) 32 | TARGET_DEVICE_ARGS="--target-device mac" 33 | ;; 34 | esac 35 | 36 | install_resource() 37 | { 38 | if [[ "$1" = /* ]] ; then 39 | RESOURCE_PATH="$1" 40 | else 41 | RESOURCE_PATH="${PODS_ROOT}/$1" 42 | fi 43 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 44 | cat << EOM 45 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 46 | EOM 47 | exit 1 48 | fi 49 | case $RESOURCE_PATH in 50 | *.storyboard) 51 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 52 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 53 | ;; 54 | *.xib) 55 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 56 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 57 | ;; 58 | *.framework) 59 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 60 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 61 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 62 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 63 | ;; 64 | *.xcdatamodel) 65 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true 66 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 67 | ;; 68 | *.xcdatamodeld) 69 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true 70 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 71 | ;; 72 | *.xcmappingmodel) 73 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true 74 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 75 | ;; 76 | *.xcassets) 77 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 78 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 79 | ;; 80 | *) 81 | echo "$RESOURCE_PATH" || true 82 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 83 | ;; 84 | esac 85 | } 86 | 87 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 88 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 89 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 90 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 91 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 92 | fi 93 | rm -f "$RESOURCES_TO_COPY" 94 | 95 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 96 | then 97 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 98 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 99 | while read line; do 100 | if [[ $line != "${PODS_ROOT}*" ]]; then 101 | XCASSET_FILES+=("$line") 102 | fi 103 | done <<<"$OTHER_XCASSETS" 104 | 105 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 106 | fi 107 | -------------------------------------------------------------------------------- /Snapchat Clone/MenuBar.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MenuBar.swift 3 | // Memories 4 | // 5 | // Created by Michael Lema on 9/10/17. 6 | // Copyright © 2017 Michael Lema. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class MenuBar: UIView, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { 12 | 13 | lazy var collectionView: UICollectionView = { 14 | let layout = UICollectionViewFlowLayout() 15 | let cv = UICollectionView(frame: .zero, collectionViewLayout: layout) 16 | cv.backgroundColor = .clear 17 | cv.dataSource = self 18 | cv.delegate = self 19 | //cv.backgroundColor = .blue 20 | return cv 21 | }() 22 | 23 | let cellId = "cellId" 24 | let labelNames = ["SNAPS", "CAMERA ROLL"] 25 | 26 | var homeController: MemoriesController? 27 | 28 | override init(frame: CGRect) { 29 | super.init(frame: frame) 30 | 31 | collectionView.register(MenuCell.self, forCellWithReuseIdentifier: cellId) 32 | 33 | addSubview(collectionView) 34 | addConstraintsWithFormat(format: "H:[v0(200)]", views: collectionView) 35 | addConstraint(NSLayoutConstraint(item: collectionView, attribute: .centerX, relatedBy: .equal, toItem: self, attribute: .centerX, multiplier: 1, constant: 0)) 36 | addConstraintsWithFormat(format: "V:|[v0]|", views: collectionView) 37 | 38 | let selectedIndexPath = IndexPath(item: 0, section: 0) 39 | collectionView.selectItem(at: selectedIndexPath, animated: false, scrollPosition: UICollectionViewScrollPosition()) 40 | 41 | setupHorizontalBar() 42 | } 43 | 44 | var horizontalBarLeftAnchorConstraint: NSLayoutConstraint? 45 | var horizontalBarWidthAnchorConstraint: NSLayoutConstraint? 46 | 47 | func setupHorizontalBar() { 48 | let horizontalBarView = UIView() 49 | horizontalBarView.backgroundColor = UIColor(red: 230/255, green: 44/255, blue: 87/255, alpha: 1) 50 | horizontalBarView.translatesAutoresizingMaskIntoConstraints = false 51 | addSubview(horizontalBarView) 52 | 53 | //need x, y, width, height constraints 54 | // horizontalBarLeftAnchorConstraint = horizontalBarView.leftAnchor.constraint(equalTo: collectionView.leftAnchor) 55 | horizontalBarLeftAnchorConstraint = horizontalBarView.leftAnchor.constraint(equalTo: collectionView.leftAnchor, constant: 0) 56 | horizontalBarLeftAnchorConstraint?.isActive = true 57 | horizontalBarView.bottomAnchor.constraint(equalTo: collectionView.bottomAnchor, constant: -13).isActive = true 58 | horizontalBarView.widthAnchor.constraint(equalTo: collectionView.widthAnchor, multiplier: 1/2).isActive = true 59 | 60 | // let fontAttributes = [NSAttributedStringKey.font: UIFont(name: "Avenir-Heavy", size: 14)!] 61 | // let text = "SNAP" 62 | // let size = (text as NSString).size(withAttributes: fontAttributes) 63 | // horizontalBarWidthAnchorConstraint = horizontalBarView.widthAnchor.constraint(equalToConstant: size.width + 10) 64 | horizontalBarWidthAnchorConstraint?.isActive = true 65 | horizontalBarView.heightAnchor.constraint(equalToConstant: 2).isActive = true 66 | } 67 | 68 | func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 69 | homeController?.scrollToMenuIndex(indexPath.item) 70 | } 71 | 72 | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 73 | return 2 74 | } 75 | 76 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 77 | let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! MenuCell 78 | 79 | cell.label.text = labelNames[indexPath.item] 80 | cell.tintColor = UIColor(red: 204/255, green: 204/255, blue: 204/255, alpha: 1) 81 | return cell 82 | } 83 | 84 | func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 85 | return CGSize(width: collectionView.frame.width / 2, height: frame.height) 86 | } 87 | 88 | func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { 89 | return 0 90 | } 91 | 92 | required init?(coder aDecoder: NSCoder) { 93 | fatalError("init(coder:) has not been implemented") 94 | } 95 | 96 | } 97 | 98 | class MenuCell: UICollectionViewCell { 99 | 100 | override init(frame: CGRect) { 101 | super.init(frame: frame) 102 | setupViews() 103 | } 104 | 105 | required init?(coder aDecoder: NSCoder) { 106 | fatalError("init(coder:) has not been implemented") 107 | } 108 | 109 | let label: UILabel = { 110 | let label = UILabel() 111 | label.textAlignment = .center 112 | label.textColor = UIColor(red: 204/255, green: 204/255, blue: 204/255, alpha: 1) 113 | label.font = UIFont(name: "Avenir-Heavy", size: 14) 114 | label.text = "SNAPS" 115 | return label 116 | }() 117 | 118 | override var isHighlighted: Bool { 119 | didSet { 120 | let pinkColor = UIColor(red: 230/255, green: 44/255, blue: 87/255, alpha: 1) 121 | let grayColor = UIColor(red: 204/255, green: 204/255, blue: 204/255, alpha: 1) 122 | label.textColor = isHighlighted ? pinkColor : grayColor 123 | } 124 | } 125 | 126 | override var isSelected: Bool { 127 | didSet { 128 | let pinkColor = UIColor(red: 230/255, green: 44/255, blue: 87/255, alpha: 1) 129 | let grayColor = UIColor(red: 204/255, green: 204/255, blue: 204/255, alpha: 1) 130 | label.textColor = isSelected ? pinkColor : grayColor 131 | } 132 | } 133 | 134 | func setupViews() { 135 | addSubview(label) 136 | addConstraintsWithFormat(format: "H:|[v0]|", views: label) 137 | addConstraintsWithFormat(format: "V:[v0(30)]", views: label) 138 | addConstraint(NSLayoutConstraint(item: label, attribute: .centerX, relatedBy: .equal, toItem: self, attribute: .centerX, multiplier: 1, constant: 0)) 139 | addConstraint(NSLayoutConstraint(item: label, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1, constant: 0)) 140 | } 141 | 142 | } 143 | 144 | --------------------------------------------------------------------------------