Skip to content

Commit

Permalink
Make basic collection view controller work
Browse files Browse the repository at this point in the history
  • Loading branch information
saheljalal committed Dec 19, 2020
1 parent 335e688 commit e273d9b
Show file tree
Hide file tree
Showing 20 changed files with 905 additions and 32 deletions.
143 changes: 143 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@

# Created by https://www.toptal.com/developers/gitignore/api/swift,xcode,cocoapods,macos
# Edit at https://www.toptal.com/developers/gitignore?templates=swift,xcode,cocoapods,macos

### CocoaPods ###
## CocoaPods GitIgnore Template

# CocoaPods - Only use to conserve bandwidth / Save time on Pushing
# - Also handy if you have a large number of dependant pods
# - AS PER https://guides.cocoapods.org/using/using-cocoapods.html NEVER IGNORE THE LOCK FILE
Pods/

### macOS ###
# General
.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon


# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

### Swift ###
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore

## User settings
xcuserdata/

## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
*.xcscmblueprint
*.xccheckout

## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
build/
DerivedData/
*.moved-aside
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3

## Obj-C/Swift specific
*.hmap

## App packaging
*.ipa
*.dSYM.zip
*.dSYM

## Playgrounds
timeline.xctimeline
playground.xcworkspace

# Swift Package Manager
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
# Package.pins
# Package.resolved
# *.xcodeproj
# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
# hence it is not needed unless you have added a package configuration file to your project
# .swiftpm

.build/

# CocoaPods
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
# Pods/
# Add this line if you want to avoid checking in source code from the Xcode workspace
# *.xcworkspace

# Carthage
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts

Carthage/Build/

# Accio dependency management
Dependencies/
.accio/

# fastlane
# It is recommended to not store the screenshots in the git repo.
# Instead, use fastlane to re-generate the screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control

fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output

# Code Injection
# After new code Injection tools there's a generated folder /iOSInjectionProject
# https://github.com/johnno1962/injectionforxcode

iOSInjectionProject/

### Xcode ###
# Xcode
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore




## Gcc Patch
/*.gcno

### Xcode Patch ###
*.xcodeproj/*
!*.xcodeproj/project.pbxproj
!*.xcodeproj/xcshareddata/
!*.xcworkspace/contents.xcworkspacedata
**/xcshareddata/WorkspaceSettings.xcsettings

# End of https://www.toptal.com/developers/gitignore/api/swift,xcode,cocoapods,macos
244 changes: 239 additions & 5 deletions Cellorama.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<key>Cellorama.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
<integer>4</integer>
</dict>
</dict>
</dict>
Expand Down
10 changes: 10 additions & 0 deletions Cellorama.xcworkspace/contents.xcworkspacedata

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions Cellorama.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
39 changes: 32 additions & 7 deletions Cellorama/Base.lproj/Main.storyboard
Original file line number Diff line number Diff line change
@@ -1,24 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17506" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="pFp-tm-xRF">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17505"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<!--Main View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="target" sceneMemberID="viewController">
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
<viewController id="BYZ-38-t0r" customClass="MainViewController" customModule="Cellorama" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
</view>
<navigationItem key="navigationItem" id="kxB-1x-wdV"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1130" y="451"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="Yge-EZ-4R0">
<objects>
<navigationController id="pFp-tm-xRF" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="Kk0-jt-Iwz">
<rect key="frame" x="0.0" y="44" width="414" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
<segue destination="BYZ-38-t0r" kind="relationship" relationship="rootViewController" id="52A-hs-Tc9"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="kJG-K4-Abm" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="239" y="451"/>
</scene>
</scenes>
<resources>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
</resources>
</document>
89 changes: 89 additions & 0 deletions Cellorama/Cells/CollectionCell.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
//
// CollectionCell.swift
// Cellorama
//
// Created by Sahel Jalal on 12/16/20.
//

import UIKit

class CollectionCell: UICollectionViewCell, Reusable {

weak var containerViewController: UIViewController?
var childViewController: UIViewController?

override init(frame: CGRect) {
super.init(frame: frame)

layer.cornerRadius = 10
layer.masksToBounds = false
layer.shadowColor = UIColor.black.cgColor
layer.shadowOpacity = 0.2
layer.shadowOffset = .zero
layer.shadowRadius = 5
contentView.layer.cornerRadius = 10
contentView.layer.masksToBounds = true
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func layoutSubviews() {
super.layoutSubviews()

layer.shadowPath = UIBezierPath(rect: bounds).cgPath
}

func configure(item: Item) {
configure(container: item.asContainer)
configure(element: item.asElement)
}

func configure(container: Container?) {
guard let container = container,
let containerViewController = containerViewController else { return }

let source = CollectionDataSource(container: container, containerViewController: containerViewController)
let view = CollectionView(source: source)

configure(view: view)
}

func configure(element: Element?) {
guard let element = element else { return }

let vc = ViewController(element: element)
configure(viewController: vc)
}

func configure(view: UIView) {
contentView.addSubview(view)
view.snp.makeConstraints { make in
make.edges.equalToSuperview().priority(999)
}
}

func configure(viewController: UIViewController) {
guard let containerViewController = containerViewController else { return }

containerViewController.addChild(viewController)
contentView.addSubview(viewController.view)
viewController.view.snp.makeConstraints { make in
make.edges.equalToSuperview().priority(999)
}
viewController.didMove(toParent: containerViewController)
childViewController = viewController
}

override func prepareForReuse() {
super.prepareForReuse()

guard let childViewController = childViewController else { return }

childViewController.willMove(toParent: nil)
childViewController.view.removeFromSuperview()
childViewController.removeFromParent()
}

}
20 changes: 20 additions & 0 deletions Cellorama/Cells/Reusable.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//
// Reusable.swift
// Cellorama
//
// Created by Sahel Jalal on 12/16/20.
//

import Foundation

protocol Reusable {

static var reuseIdentifier: String { get }

}

extension Reusable {

static var reuseIdentifier: String { String(describing: type(of: self)) }

}
28 changes: 28 additions & 0 deletions Cellorama/Cells/TableCell.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//
// TableCell.swift
// Cellorama
//
// Created by Sahel Jalal on 12/16/20.
//

import UIKit

class TableCell: UITableViewCell, Reusable {

enum Kind {
case container
case element
}

var kind: Kind

init(kind: Kind) {
self.kind = kind
super.init(style: .default, reuseIdentifier: TableCell.reuseIdentifier)
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

}
Loading

0 comments on commit e273d9b

Please sign in to comment.