Merged SideMenu into master

This commit is contained in:
Okechi Onyeje 2016-06-16 04:26:24 -04:00
commit 6536330663
110 changed files with 12757 additions and 3245 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@ -20,6 +20,9 @@ target 'Vendoo' do
pod 'FBSDKShareKit' pod 'FBSDKShareKit'
pod 'Firebase/Storage' pod 'Firebase/Storage'
pod 'TYMActivityIndicatorView' pod 'TYMActivityIndicatorView'
pod 'BSImagePicker', '~> 2.3'
pod 'SWRevealViewController'
target 'VendooTests' do target 'VendooTests' do

View File

@ -33,6 +33,10 @@ PODS:
- Bolts/AppLinks (1.7.0): - Bolts/AppLinks (1.7.0):
- Bolts/Tasks - Bolts/Tasks
- Bolts/Tasks (1.7.0) - Bolts/Tasks (1.7.0)
- BSGridCollectionViewLayout (1.1.1)
- BSImagePicker (2.3.0):
- BSGridCollectionViewLayout (~> 1.1)
- UIImageViewModeScaleAspect (~> 1.3)
- FBSDKCoreKit (4.12.0): - FBSDKCoreKit (4.12.0):
- Bolts (~> 1.7) - Bolts (~> 1.7)
- FBSDKLoginKit (4.12.0): - FBSDKLoginKit (4.12.0):
@ -90,11 +94,14 @@ PODS:
- PicoKit/Soap - PicoKit/Soap
- PicoKit/XMLWriter (0.7.2) - PicoKit/XMLWriter (0.7.2)
- SwiftyJSON (2.3.2) - SwiftyJSON (2.3.2)
- SWRevealViewController (2.3.0)
- TYMActivityIndicatorView (0.3.3) - TYMActivityIndicatorView (0.3.3)
- UIImageViewModeScaleAspect (1.3)
DEPENDENCIES: DEPENDENCIES:
- AeroGearOAuth2 - AeroGearOAuth2
- Alamofire-SwiftyJSON - Alamofire-SwiftyJSON
- BSImagePicker (~> 2.3)
- FBSDKCoreKit - FBSDKCoreKit
- FBSDKLoginKit - FBSDKLoginKit
- FBSDKShareKit - FBSDKShareKit
@ -105,6 +112,7 @@ DEPENDENCIES:
- Locksmith - Locksmith
- OAuthSwift (~> 0.5.0) - OAuthSwift (~> 0.5.0)
- PicoKit - PicoKit
- SWRevealViewController
- TYMActivityIndicatorView - TYMActivityIndicatorView
SPEC CHECKSUMS: SPEC CHECKSUMS:
@ -114,6 +122,8 @@ SPEC CHECKSUMS:
Alamofire: c19a627cefd6a95f840401c49ab1f124e07f54ee Alamofire: c19a627cefd6a95f840401c49ab1f124e07f54ee
Alamofire-SwiftyJSON: 5812bb37accc36897cc2f2dabb070d8ebcd7ac98 Alamofire-SwiftyJSON: 5812bb37accc36897cc2f2dabb070d8ebcd7ac98
Bolts: a0058fa3b331c5a1e4402d534f2dae36dbff31e4 Bolts: a0058fa3b331c5a1e4402d534f2dae36dbff31e4
BSGridCollectionViewLayout: d7304dcb35c6b3b4420c527e9f9b77ff322250f3
BSImagePicker: 591b28ce4994c44cbc4ac896717c1db9f9fadd18
FBSDKCoreKit: 6e56d5a2a64a755ad4efb5dbeee8f82fb1b99775 FBSDKCoreKit: 6e56d5a2a64a755ad4efb5dbeee8f82fb1b99775
FBSDKLoginKit: 03f68a8d48c2c8bb81d7eb8097973d483543e1f6 FBSDKLoginKit: 03f68a8d48c2c8bb81d7eb8097973d483543e1f6
FBSDKShareKit: df1491f064cffc8ebcc3fc8b71be94cc190c728e FBSDKShareKit: df1491f064cffc8ebcc3fc8b71be94cc190c728e
@ -132,8 +142,10 @@ SPEC CHECKSUMS:
OAuthSwift: 1ef042d4362e755e24a78f158d817245641a5d24 OAuthSwift: 1ef042d4362e755e24a78f158d817245641a5d24
PicoKit: 9079bce659a8d5408c8af1c45254b971df614de3 PicoKit: 9079bce659a8d5408c8af1c45254b971df614de3
SwiftyJSON: 04ccea08915aa0109039157c7974cf0298da292a SwiftyJSON: 04ccea08915aa0109039157c7974cf0298da292a
SWRevealViewController: 6d3fd97f70112fd7cef9de14df4260eacce4c63a
TYMActivityIndicatorView: ad816387ebd5952c376af129218722733044148b TYMActivityIndicatorView: ad816387ebd5952c376af129218722733044148b
UIImageViewModeScaleAspect: ec78901acfc20d3782154111a21d34390f8f71ad
PODFILE CHECKSUM: 4b7ee6fd372620e6f0ce654e3c9ceec07ad55669 PODFILE CHECKSUM: b372ee48d5c7639810a0074e34292bc3076ff7f0
COCOAPODS: 1.0.0 COCOAPODS: 1.0.0

19
Pods/BSGridCollectionViewLayout/LICENSE generated Normal file
View File

@ -0,0 +1,19 @@
Copyright (c) 2015 Joakim Gyllstrom <joakim@backslashed.se>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -0,0 +1,284 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import UIKit
/**
Provides a grid collection view layout
*/
@objc(BSGridCollectionViewLayout)
public final class GridCollectionViewLayout: UICollectionViewLayout {
/**
Spacing between items (horizontal and vertical)
*/
public var itemSpacing: CGFloat = 0 {
didSet {
_itemSize = estimatedItemSize()
}
}
/**
Number of items per row
*/
public var itemsPerRow = 3 {
didSet {
_itemSize = estimatedItemSize()
}
}
/**
Item height ratio relative to it's width
*/
public var itemHeightRatio: CGFloat = 1 {
didSet {
_itemSize = estimatedItemSize()
}
}
/**
Size for each item
*/
public var itemSize: CGSize {
get {
return _itemSize
}
}
var items = 0
var rows = 0
var _itemSize = CGSizeZero
public override func prepareLayout() {
// Set total number of items and rows
items = estimatedNumberOfItems()
rows = items / itemsPerRow + ((items % itemsPerRow > 0) ? 1 : 0)
// Set item size
_itemSize = estimatedItemSize()
}
/**
See UICollectionViewLayout documentation
*/
public override func collectionViewContentSize() -> CGSize {
guard let collectionView = collectionView where rows > 0 else {
return CGSizeZero
}
let height = estimatedRowHeight() * CGFloat(rows)
return CGSize(width: collectionView.bounds.width, height: height)
}
/**
See UICollectionViewLayout documentation
*/
public override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
return indexPathsInRect(rect).map { (indexPath) -> UICollectionViewLayoutAttributes in
return self.layoutAttributesForItemAtIndexPath(indexPath)! // TODO: Fix forcefull unwrap
}
}
/**
See UICollectionViewLayout documentation
*/
public override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes? {
let itemIndex = flatIndex(indexPath) // index among total number of items
let rowIndex = itemIndex % itemsPerRow // index within it's row
let row = itemIndex / itemsPerRow // which row for that item
let x = (CGFloat(rowIndex) * itemSpacing) + (CGFloat(rowIndex) * itemSize.width)
let y = (CGFloat(row) * itemSpacing) + (CGFloat(row) * itemSize.height)
let width = _itemSize.width
let height = _itemSize.height
let attribute = UICollectionViewLayoutAttributes(forCellWithIndexPath: indexPath)
attribute.frame = CGRect(x: x, y: y, width: width, height: height)
return attribute
}
/**
See UICollectionViewLayout documentation
*/
public override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
return true
}
// No decoration or supplementary views
/**
See UICollectionViewLayout documentation
*/
public override func layoutAttributesForDecorationViewOfKind(elementKind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes? { return nil }
/**
See UICollectionViewLayout documentation
*/
public override func layoutAttributesForSupplementaryViewOfKind(elementKind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes? { return nil }
}
extension GridCollectionViewLayout {
/**
Calculates which index paths are within a given rect
- parameter rect: The rect which we want index paths for
- returns: An array of indexPaths for that rect
*/
func indexPathsInRect(rect: CGRect) -> [NSIndexPath] {
// Make sure we have items/rows
guard items > 0 && rows > 0 else { return [] }
let rowHeight = estimatedRowHeight()
let startRow = GridCollectionViewLayout.firstRowInRect(rect, withRowHeight: rowHeight)
let endRow = GridCollectionViewLayout.lastRowInRect(rect, withRowHeight: rowHeight, max: rows)
let startIndex = GridCollectionViewLayout.firstIndexInRow(startRow, withItemsPerRow: itemsPerRow)
let endIndex = GridCollectionViewLayout.lastIndexInRow(endRow, withItemsPerRow: itemsPerRow, numberOfItems: items)
let indexPaths = (startIndex...endIndex).map { indexPathFromFlatIndex($0) }
return indexPaths
}
/**
Calculates which row index would be first for a given rect.
- parameter rect: The rect to check
- parameter rowHeight: Height for a row
- returns: First row index
*/
static func firstRowInRect(rect: CGRect, withRowHeight rowHeight: CGFloat) -> Int {
if rect.origin.y / rowHeight < 0 {
return 0
} else {
return Int(rect.origin.y / rowHeight)
}
}
/**
Calculates which row index would be last for a given rect.
- parameter rect: The rect to check
- parameter rowHeight: Height for a row
- returns: Last row index
*/
static func lastRowInRect(rect: CGRect, withRowHeight rowHeight: CGFloat, max: Int) -> Int {
guard rect.size.height >= rowHeight else { return 0 }
if (rect.origin.y + rect.height) / rowHeight > CGFloat(max) {
return max - 1
} else {
return Int(ceil((rect.origin.y + rect.height) / rowHeight)) - 1
}
}
/**
Calculates which index would be the first for a given row.
- parameter row: Row index
- parameter itemsPerRow: How many items there can be in a row
- returns: First index
*/
static func firstIndexInRow(row: Int, withItemsPerRow itemsPerRow: Int) -> Int {
return row * itemsPerRow
}
/**
Calculates which index would be the last for a given row.
- parameter row: Row index
- parameter itemsPerRow: How many items there can be in a row
- parameter numberOfItems: The total number of items.
- returns: Last index
*/
static func lastIndexInRow(row: Int, withItemsPerRow itemsPerRow: Int, numberOfItems: Int) -> Int {
let maxIndex = (row + 1) * itemsPerRow - 1
let bounds = numberOfItems - 1
if maxIndex > bounds {
return bounds
} else {
return maxIndex
}
}
/**
Takes an index path (which are 2 dimensional) and turns it into a 1 dimensional index
- parameter indexPath: The index path we want to flatten
- returns: A flat index
*/
func flatIndex(indexPath: NSIndexPath) -> Int {
guard let collectionView = collectionView else {
return 0
}
return (0..<indexPath.section).reduce(indexPath.row) { $0 + collectionView.numberOfItemsInSection($1)}
}
/**
Converts a flat index into an index path
- parameter index: The flat index
- returns: An index path
*/
func indexPathFromFlatIndex(index: Int) -> NSIndexPath {
guard let collectionView = collectionView else {
return NSIndexPath(forItem: 0, inSection: 0)
}
var item = index
var section = 0
while(item >= collectionView.numberOfItemsInSection(section)) {
item -= collectionView.numberOfItemsInSection(section)
section += 1
}
return NSIndexPath(forItem: item, inSection: section)
}
/**
Estimated the size of the items
- returns: Estimated item size
*/
func estimatedItemSize() -> CGSize {
guard let collectionView = collectionView else {
return CGSizeZero
}
let itemWidth = (collectionView.bounds.width - CGFloat(itemsPerRow - 1) * itemSpacing) / CGFloat(itemsPerRow)
return CGSize(width: itemWidth, height: itemWidth * itemHeightRatio)
}
/**
Estimated total number of items
- returns: Total number of items
*/
func estimatedNumberOfItems() -> Int {
guard let collectionView = collectionView else {
return 0
}
return (0..<collectionView.numberOfSections()).reduce(0, combine: {$0 + collectionView.numberOfItemsInSection($1)})
}
/**
Height for each row
- returns: Row height
*/
func estimatedRowHeight() -> CGFloat {
return _itemSize.height+itemSpacing
}
}

View File

@ -0,0 +1,37 @@
# BSGridCollectionViewLayout
[![CI Status](http://img.shields.io/travis/mikaoj/BSGridCollectionViewLayout.svg?style=flat)](https://travis-ci.org/mikaoj/BSGridCollectionViewLayout)
[![Version](https://img.shields.io/cocoapods/v/BSGridCollectionViewLayout.svg?style=flat)](http://cocoapods.org/pods/BSGridCollectionViewLayout)
[![License](https://img.shields.io/cocoapods/l/BSGridCollectionViewLayout.svg?style=flat)](http://cocoapods.org/pods/BSGridCollectionViewLayout)
[![Platform](https://img.shields.io/cocoapods/p/BSGridCollectionViewLayout.svg?style=flat)](http://cocoapods.org/pods/BSGridCollectionViewLayout)
BSGridCollectionViewLayout is a simple UICollectionViewLayout. It simply displays the items in a grid. It doesn't have a concept of sections. So even if the items are in different data source / sections. They will be displayed as being in one continuous grid without any section breaks. I highly doubt that anyone besides me will use this, but I'm using it in [BSImagePicker](https://github.com/mikaoj/BSImagePicker).
## Usage
There are 3 properties for you to tweak:
* itemsPerRow - Number of items per row
* itemSpacing - Spacing between items (vertical and horizontal)
* itemHeightRatio - The item height ratio relative to it's width
To run the example project, clone the repo, and run `pod install` from the Example directory first.
## Requirements
iOS 8
## Installation
BSGridCollectionViewLayout is available through [CocoaPods](http://cocoapods.org). To install
it, simply add the following line to your Podfile:
```ruby
pod "BSGridCollectionViewLayout", "~> 1.1.0"
```
## Author
Joakim Gyllstrom, joakim@backslashed.se
## License
BSGridCollectionViewLayout is available under the MIT license. See the LICENSE file for more info.

19
Pods/BSImagePicker/LICENSE generated Normal file
View File

@ -0,0 +1,19 @@
Copyright (c) 2015 Joakim Gyllstrom <joakim@backslashed.se>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="8191" systemVersion="14F27" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8154"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="AlbumTitleView" customModule="BSImagePicker"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="iN0-l3-epB" customClass="AlbumTitleView" customModule="BSImagePicker" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="600" height="30"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="XBJ-wa-q8C">
<rect key="frame" x="8" y="0.0" width="584" height="30"/>
<state key="normal" title="Button">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="centerY" secondItem="XBJ-wa-q8C" secondAttribute="centerY" id="VNW-U1-5lq"/>
<constraint firstItem="XBJ-wa-q8C" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="8" id="Xu8-zz-8Vo"/>
<constraint firstAttribute="trailing" secondItem="XBJ-wa-q8C" secondAttribute="trailing" constant="8" id="je3-VY-t8h"/>
<constraint firstAttribute="centerX" secondItem="XBJ-wa-q8C" secondAttribute="centerX" id="yGE-8Z-sir"/>
</constraints>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<connections>
<outlet property="albumButton" destination="XBJ-wa-q8C" id="rc6-td-vgy"/>
</connections>
<point key="canvasLocation" x="920" y="547"/>
</view>
</objects>
</document>

View File

@ -0,0 +1,98 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8191" systemVersion="14F27" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="Q9l-ou-0o0">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8154"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
</dependencies>
<scenes>
<!--Albums View Controller-->
<scene sceneID="YjY-sv-0dD">
<objects>
<tableViewController id="Q9l-ou-0o0" customClass="AlbumsViewController" customModule="BSImagePicker" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" showsSelectionImmediatelyOnTouchBegin="NO" rowHeight="101" sectionHeaderHeight="22" sectionFooterHeight="22" id="6nu-Xx-FSD">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="albumCell" rowHeight="101" id="5FW-i1-aH0" customClass="AlbumCell" customModule="BSImagePicker" customModuleProvider="target">
<rect key="frame" x="0.0" y="22" width="600" height="101"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="5FW-i1-aH0" id="MpJ-Bj-9GT">
<rect key="frame" x="0.0" y="0.0" width="600" height="101"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="zMn-pp-w6a">
<rect key="frame" x="8" y="8" width="84" height="84"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="8fn-fZ-8zK">
<rect key="frame" x="0.0" y="0.0" width="79" height="79"/>
<constraints>
<constraint firstAttribute="width" constant="79" id="mDR-ZW-Xik"/>
<constraint firstAttribute="height" constant="79" id="zzb-5t-cyA"/>
</constraints>
</imageView>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="OXj-is-Xah">
<rect key="frame" x="3" y="3" width="79" height="79"/>
<constraints>
<constraint firstAttribute="height" constant="79" id="QR9-oB-sPF"/>
<constraint firstAttribute="width" constant="79" id="R7u-7Z-ogX"/>
</constraints>
</imageView>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Smy-yb-FUr">
<rect key="frame" x="5" y="5" width="79" height="79"/>
<constraints>
<constraint firstAttribute="width" constant="79" id="M2H-9X-0nF"/>
<constraint firstAttribute="height" constant="79" id="Wju-SN-T78"/>
</constraints>
</imageView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="8fn-fZ-8zK" firstAttribute="top" secondItem="zMn-pp-w6a" secondAttribute="top" id="6J5-J4-ifB"/>
<constraint firstAttribute="centerY" secondItem="OXj-is-Xah" secondAttribute="centerY" id="7dX-km-JN4"/>
<constraint firstAttribute="centerX" secondItem="OXj-is-Xah" secondAttribute="centerX" id="C6n-Nf-d9h"/>
<constraint firstAttribute="height" constant="84" id="FV5-Yn-t9n"/>
<constraint firstAttribute="width" constant="84" id="HR7-sf-Sgf"/>
<constraint firstItem="8fn-fZ-8zK" firstAttribute="leading" secondItem="zMn-pp-w6a" secondAttribute="leading" id="Q1c-pa-CcH"/>
<constraint firstAttribute="bottom" secondItem="Smy-yb-FUr" secondAttribute="bottom" id="eYM-Lf-euU"/>
<constraint firstAttribute="trailing" secondItem="Smy-yb-FUr" secondAttribute="trailing" id="qhV-0r-QOO"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uKa-te-PJZ">
<rect key="frame" x="100" y="16" width="484" height="69"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="zMn-pp-w6a" firstAttribute="leading" secondItem="MpJ-Bj-9GT" secondAttribute="leading" constant="8" id="5aF-MK-NSn"/>
<constraint firstAttribute="trailingMargin" secondItem="uKa-te-PJZ" secondAttribute="trailing" constant="8" id="BXK-YJ-FzQ"/>
<constraint firstItem="uKa-te-PJZ" firstAttribute="leading" secondItem="zMn-pp-w6a" secondAttribute="trailing" constant="8" id="Din-LT-3ZI"/>
<constraint firstItem="uKa-te-PJZ" firstAttribute="top" secondItem="MpJ-Bj-9GT" secondAttribute="topMargin" constant="8" id="O3E-nL-aDK"/>
<constraint firstItem="zMn-pp-w6a" firstAttribute="top" secondItem="MpJ-Bj-9GT" secondAttribute="topMargin" id="kJP-hC-Uuo"/>
<constraint firstAttribute="bottomMargin" secondItem="uKa-te-PJZ" secondAttribute="bottom" constant="8" id="pm0-Do-FXl"/>
</constraints>
</tableViewCellContentView>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<connections>
<outlet property="albumTitleLabel" destination="uKa-te-PJZ" id="9vB-5y-NIb"/>
<outlet property="firstImageView" destination="Smy-yb-FUr" id="6Zs-RH-PUe"/>
<outlet property="secondImageView" destination="OXj-is-Xah" id="yCp-uY-Vo7"/>
<outlet property="thirdImageView" destination="8fn-fZ-8zK" id="FWr-nj-qVY"/>
</connections>
</tableViewCell>
</prototypes>
<connections>
<outlet property="dataSource" destination="Q9l-ou-0o0" id="bZI-3d-wyC"/>
<outlet property="delegate" destination="Q9l-ou-0o0" id="D0z-pb-6qz"/>
</connections>
</tableView>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="XXK-R3-4v5" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="636" y="410"/>
</scene>
</scenes>
</document>

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="CameraCell" customModule="BSImagePicker" customModuleProvider="target"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="cameraCellIdentifier" id="dx2-jd-nta" customClass="CameraCell" customModule="BSImagePicker" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="100" height="100"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
<rect key="frame" x="0.0" y="0.0" width="100" height="100"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="40Y-IQ-I2M">
<rect key="frame" x="0.0" y="0.0" width="100" height="100"/>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
<imageView userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="qvQ-jD-B52">
<rect key="frame" x="0.0" y="0.0" width="100" height="100"/>
<animations/>
</imageView>
</subviews>
<animations/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<animations/>
<color key="backgroundColor" red="0.90196079015731812" green="0.90196079015731812" blue="0.90196079015731812" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="40Y-IQ-I2M" secondAttribute="trailing" id="0CF-25-fnk"/>
<constraint firstItem="40Y-IQ-I2M" firstAttribute="leading" secondItem="dx2-jd-nta" secondAttribute="leading" id="Le4-AF-WLH"/>
<constraint firstAttribute="trailing" secondItem="qvQ-jD-B52" secondAttribute="trailing" id="bMH-5D-RYe"/>
<constraint firstItem="qvQ-jD-B52" firstAttribute="top" secondItem="dx2-jd-nta" secondAttribute="top" id="bwE-TQ-qO6"/>
<constraint firstAttribute="bottom" secondItem="qvQ-jD-B52" secondAttribute="bottom" id="m9b-Ob-DYN"/>
<constraint firstItem="qvQ-jD-B52" firstAttribute="leading" secondItem="dx2-jd-nta" secondAttribute="leading" id="vec-jV-qy2"/>
<constraint firstItem="40Y-IQ-I2M" firstAttribute="top" secondItem="dx2-jd-nta" secondAttribute="top" id="vt7-P8-Z2b"/>
<constraint firstAttribute="bottom" secondItem="40Y-IQ-I2M" secondAttribute="bottom" id="wug-sP-OLR"/>
</constraints>
<connections>
<outlet property="cameraBackground" destination="40Y-IQ-I2M" id="K5o-kD-cfg"/>
<outlet property="imageView" destination="qvQ-jD-B52" id="On7-vu-A1y"/>
</connections>
<point key="canvasLocation" x="82" y="280"/>
</collectionViewCell>
</objects>
</document>

View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="PhotoCell" customModule="BSImagePicker" customModuleProvider="target"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="photoCellIdentifier" id="Wnb-Ja-sAy" customClass="PhotoCell" customModule="BSImagePicker">
<rect key="frame" x="0.0" y="0.0" width="100" height="100"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
<rect key="frame" x="0.0" y="0.0" width="100" height="100"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="eql-VY-cc4">
<rect key="frame" x="0.0" y="0.0" width="100" height="100"/>
<animations/>
</imageView>
<view alpha="0.0" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="vrZ-cc-3iN">
<rect key="frame" x="0.0" y="0.0" width="100" height="100"/>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
<view alpha="0.0" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ZWL-2w-R4Y" customClass="SelectionView" customModule="BSImagePicker">
<rect key="frame" x="71" y="71" width="25" height="25"/>
<animations/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="height" constant="25" id="KmA-hg-Sja"/>
<constraint firstAttribute="width" constant="25" id="Sed-si-Khu"/>
</constraints>
</view>
</subviews>
<animations/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<animations/>
<constraints>
<constraint firstItem="vrZ-cc-3iN" firstAttribute="leading" secondItem="Wnb-Ja-sAy" secondAttribute="leading" id="1k6-ja-XtL"/>
<constraint firstItem="eql-VY-cc4" firstAttribute="leading" secondItem="Wnb-Ja-sAy" secondAttribute="leading" id="6Yj-56-Ajf"/>
<constraint firstAttribute="bottom" secondItem="ZWL-2w-R4Y" secondAttribute="bottom" constant="4" id="9kI-gE-Fuo"/>
<constraint firstAttribute="trailing" secondItem="vrZ-cc-3iN" secondAttribute="trailing" id="Cpg-dZ-0Lg"/>
<constraint firstAttribute="trailing" secondItem="ZWL-2w-R4Y" secondAttribute="trailing" constant="4" id="Mxn-IB-9vl"/>
<constraint firstAttribute="bottom" secondItem="vrZ-cc-3iN" secondAttribute="bottom" id="Uh1-N4-v8c"/>
<constraint firstItem="eql-VY-cc4" firstAttribute="top" secondItem="Wnb-Ja-sAy" secondAttribute="top" id="bsa-1y-CS3"/>
<constraint firstAttribute="trailing" secondItem="eql-VY-cc4" secondAttribute="trailing" id="gn3-z2-xcM"/>
<constraint firstAttribute="bottom" secondItem="eql-VY-cc4" secondAttribute="bottom" id="lRC-Wc-2F2"/>
<constraint firstItem="vrZ-cc-3iN" firstAttribute="top" secondItem="Wnb-Ja-sAy" secondAttribute="top" id="rDa-oL-Q0g"/>
</constraints>
<connections>
<outlet property="imageView" destination="eql-VY-cc4" id="zoV-fy-Rn2"/>
<outlet property="selectionOverlayView" destination="vrZ-cc-3iN" id="nJv-4W-hIL"/>
<outlet property="selectionView" destination="ZWL-2w-R4Y" id="hKH-1U-TY9"/>
</connections>
<point key="canvasLocation" x="174" y="-76"/>
</collectionViewCell>
</objects>
</document>

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 B

View File

@ -0,0 +1,39 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import UIKit
final class AlbumsViewController: UITableViewController {
override func loadView() {
super.loadView()
// Add a little bit of blur to the background
let visualEffectView = UIVisualEffectView(effect: UIVibrancyEffect(forBlurEffect: UIBlurEffect(style: .Light)))
visualEffectView.frame = tableView.bounds
visualEffectView.autoresizingMask = [.FlexibleWidth , .FlexibleHeight]
tableView.backgroundView = visualEffectView
tableView.backgroundColor = UIColor.clearColor()
modalPresentationStyle = .Popover
preferredContentSize = CGSize(width: 320, height: 300)
}
}

View File

@ -0,0 +1,252 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import UIKit
import Photos
/**
BSImagePickerViewController.
Use settings or buttons to customize it to your needs.
*/
public class BSImagePickerViewController : UINavigationController {
/**
Object that keeps settings for the picker.
*/
public var settings: BSImagePickerSettings = Settings()
/**
Done button.
*/
public var doneButton: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Done, target: nil, action: nil)
/**
Cancel button
*/
public var cancelButton: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Cancel, target: nil, action: nil)
/**
Default selections
*/
public var defaultSelections: PHFetchResult?
/**
Fetch results.
*/
public lazy var fetchResults: [PHFetchResult] = {
let fetchOptions = PHFetchOptions()
// Camera roll fetch result
let cameraRollResult = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .SmartAlbumUserLibrary, options: fetchOptions)
// Albums fetch result
let albumResult = PHAssetCollection.fetchAssetCollectionsWithType(.Album, subtype: .Any, options: fetchOptions)
return [cameraRollResult, albumResult]
}()
var albumTitleView: AlbumTitleView = bundle.loadNibNamed("AlbumTitleView", owner: nil, options: nil).first as! AlbumTitleView
static let bundle: NSBundle = NSBundle(path: NSBundle(forClass: PhotosViewController.self).pathForResource("BSImagePicker", ofType: "bundle")!)!
lazy var photosViewController: PhotosViewController = {
let vc = PhotosViewController(fetchResults: self.fetchResults,
defaultSelections: self.defaultSelections,
settings: self.settings)
vc.doneBarButton = self.doneButton
vc.cancelBarButton = self.cancelButton
vc.albumTitleView = self.albumTitleView
return vc
}()
class func authorize(status: PHAuthorizationStatus = PHPhotoLibrary.authorizationStatus(), fromViewController: UIViewController, completion: (authorized: Bool) -> Void) {
switch status {
case .Authorized:
// We are authorized. Run block
completion(authorized: true)
case .NotDetermined:
// Ask user for permission
PHPhotoLibrary.requestAuthorization({ (status) -> Void in
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.authorize(status, fromViewController: fromViewController, completion: completion)
})
})
default: ()
dispatch_async(dispatch_get_main_queue(), { () -> Void in
completion(authorized: false)
})
}
}
/**
Sets up an classic image picker with results from camera roll and albums
*/
public init() {
super.init(nibName: nil, bundle: nil)
}
/**
https://www.youtube.com/watch?v=dQw4w9WgXcQ
*/
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
/**
Load view. See apple documentation
*/
public override func loadView() {
super.loadView()
// TODO: Settings
view.backgroundColor = UIColor.whiteColor()
// Make sure we really are authorized
if PHPhotoLibrary.authorizationStatus() == .Authorized {
setViewControllers([photosViewController], animated: false)
}
}
}
// MARK: ImagePickerSettings proxy
extension BSImagePickerViewController: BSImagePickerSettings {
/**
See BSImagePicketSettings for documentation
*/
public var maxNumberOfSelections: Int {
get {
return settings.maxNumberOfSelections
}
set {
settings.maxNumberOfSelections = newValue
}
}
/**
See BSImagePicketSettings for documentation
*/
public var selectionCharacter: Character? {
get {
return settings.selectionCharacter
}
set {
settings.selectionCharacter = newValue
}
}
/**
See BSImagePicketSettings for documentation
*/
public var selectionFillColor: UIColor {
get {
return settings.selectionFillColor
}
set {
settings.selectionFillColor = newValue
}
}
/**
See BSImagePicketSettings for documentation
*/
public var selectionStrokeColor: UIColor {
get {
return settings.selectionStrokeColor
}
set {
settings.selectionStrokeColor = newValue
}
}
/**
See BSImagePicketSettings for documentation
*/
public var selectionShadowColor: UIColor {
get {
return settings.selectionShadowColor
}
set {
settings.selectionShadowColor = newValue
}
}
/**
See BSImagePicketSettings for documentation
*/
public var selectionTextAttributes: [String: AnyObject] {
get {
return settings.selectionTextAttributes
}
set {
settings.selectionTextAttributes = newValue
}
}
/**
See BSImagePicketSettings for documentation
*/
public var cellsPerRow: (verticalSize: UIUserInterfaceSizeClass, horizontalSize: UIUserInterfaceSizeClass) -> Int {
get {
return settings.cellsPerRow
}
set {
settings.cellsPerRow = newValue
}
}
/**
See BSImagePicketSettings for documentation
*/
public var takePhotos: Bool {
get {
return settings.takePhotos
}
set {
settings.takePhotos = newValue
}
}
public var takePhotoIcon: UIImage? {
get {
return settings.takePhotoIcon
}
set {
settings.takePhotoIcon = newValue
}
}
}
// MARK: Album button
extension BSImagePickerViewController {
/**
Album button in title view
*/
public var albumButton: UIButton {
get {
return albumTitleView.albumButton
}
set {
albumTitleView.albumButton = newValue
}
}
}

View File

@ -0,0 +1,567 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import UIKit
import Photos
import BSGridCollectionViewLayout
final class PhotosViewController : UICollectionViewController {
var selectionClosure: ((asset: PHAsset) -> Void)?
var deselectionClosure: ((asset: PHAsset) -> Void)?
var cancelClosure: ((assets: [PHAsset]) -> Void)?
var finishClosure: ((assets: [PHAsset]) -> Void)?
var doneBarButton: UIBarButtonItem?
var cancelBarButton: UIBarButtonItem?
var albumTitleView: AlbumTitleView?
let expandAnimator = ZoomAnimator()
let shrinkAnimator = ZoomAnimator()
private var photosDataSource: PhotoCollectionViewDataSource?
private var albumsDataSource: AlbumTableViewDataSource
private let cameraDataSource: CameraCollectionViewDataSource
private var composedDataSource: ComposedCollectionViewDataSource?
private var defaultSelections: PHFetchResult?
let settings: BSImagePickerSettings
private var doneBarButtonTitle: String?
lazy var albumsViewController: AlbumsViewController = {
let storyboard = UIStoryboard(name: "Albums", bundle: BSImagePickerViewController.bundle)
let vc = storyboard.instantiateInitialViewController() as! AlbumsViewController
vc.tableView.dataSource = self.albumsDataSource
vc.tableView.delegate = self
return vc
}()
private lazy var previewViewContoller: PreviewViewController? = {
return PreviewViewController(nibName: nil, bundle: nil)
}()
required init(fetchResults: [PHFetchResult], defaultSelections: PHFetchResult? = nil, settings aSettings: BSImagePickerSettings) {
albumsDataSource = AlbumTableViewDataSource(fetchResults: fetchResults)
cameraDataSource = CameraCollectionViewDataSource(settings: aSettings, cameraAvailable: UIImagePickerController.isSourceTypeAvailable(.Camera))
self.defaultSelections = defaultSelections
settings = aSettings
super.init(collectionViewLayout: GridCollectionViewLayout())
PHPhotoLibrary.sharedPhotoLibrary().registerChangeObserver(self)
}
required init?(coder aDecoder: NSCoder) {
fatalError("b0rk: initWithCoder not implemented")
}
deinit {
PHPhotoLibrary.sharedPhotoLibrary().unregisterChangeObserver(self)
}
override func loadView() {
super.loadView()
// Setup collection view
collectionView?.backgroundColor = UIColor.whiteColor()
collectionView?.allowsMultipleSelection = true
// Set an empty title to get < back button
title = " "
// Set button actions and add them to navigation item
doneBarButton?.target = self
doneBarButton?.action = #selector(PhotosViewController.doneButtonPressed(_:))
cancelBarButton?.target = self
cancelBarButton?.action = #selector(PhotosViewController.cancelButtonPressed(_:))
albumTitleView?.albumButton?.addTarget(self, action: #selector(PhotosViewController.albumButtonPressed(_:)), forControlEvents: .TouchUpInside)
navigationItem.leftBarButtonItem = cancelBarButton
navigationItem.rightBarButtonItem = doneBarButton
navigationItem.titleView = albumTitleView
if let album = albumsDataSource.fetchResults.first?.firstObject as? PHAssetCollection {
initializePhotosDataSource(album, selections: defaultSelections)
updateAlbumTitle(album)
synchronizeCollectionView()
}
// Add long press recognizer
let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(PhotosViewController.collectionViewLongPressed(_:)))
longPressRecognizer.minimumPressDuration = 0.5
collectionView?.addGestureRecognizer(longPressRecognizer)
// Set navigation controller delegate
navigationController?.delegate = self
// Register cells
photosDataSource?.registerCellIdentifiersForCollectionView(collectionView)
cameraDataSource.registerCellIdentifiersForCollectionView(collectionView)
}
// MARK: Appear/Disappear
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
updateDoneButton()
}
// MARK: Button actions
func cancelButtonPressed(sender: UIBarButtonItem) {
guard let closure = cancelClosure, let photosDataSource = photosDataSource else {
dismissViewControllerAnimated(true, completion: nil)
return
}
dispatch_async(dispatch_get_global_queue(0, 0), { () -> Void in
closure(assets: photosDataSource.selections)
})
dismissViewControllerAnimated(true, completion: nil)
}
func doneButtonPressed(sender: UIBarButtonItem) {
guard let closure = finishClosure, let photosDataSource = photosDataSource else {
dismissViewControllerAnimated(true, completion: nil)
return
}
dispatch_async(dispatch_get_global_queue(0, 0), { () -> Void in
closure(assets: photosDataSource.selections)
})
dismissViewControllerAnimated(true, completion: nil)
}
func albumButtonPressed(sender: UIButton) {
guard let popVC = albumsViewController.popoverPresentationController else {
return
}
popVC.permittedArrowDirections = .Up
popVC.sourceView = sender
let senderRect = sender.convertRect(sender.frame, fromView: sender.superview)
let sourceRect = CGRect(x: senderRect.origin.x, y: senderRect.origin.y + (sender.frame.size.height / 2), width: senderRect.size.width, height: senderRect.size.height)
popVC.sourceRect = sourceRect
popVC.delegate = self
albumsViewController.tableView.reloadData()
presentViewController(albumsViewController, animated: true, completion: nil)
}
func collectionViewLongPressed(sender: UIGestureRecognizer) {
if sender.state == .Began {
// Disable recognizer while we are figuring out location and pushing preview
sender.enabled = false
collectionView?.userInteractionEnabled = false
// Calculate which index path long press came from
let location = sender.locationInView(collectionView)
let indexPath = collectionView?.indexPathForItemAtPoint(location)
if let vc = previewViewContoller, let indexPath = indexPath, let cell = collectionView?.cellForItemAtIndexPath(indexPath) as? PhotoCell, let asset = cell.asset {
// Setup fetch options to be synchronous
let options = PHImageRequestOptions()
options.synchronous = true
// Load image for preview
if let imageView = vc.imageView {
PHCachingImageManager.defaultManager().requestImageForAsset(asset, targetSize:imageView.frame.size, contentMode: .AspectFit, options: options) { (result, _) in
imageView.image = result
}
}
// Setup animation
expandAnimator.sourceImageView = cell.imageView
expandAnimator.destinationImageView = vc.imageView
shrinkAnimator.sourceImageView = vc.imageView
shrinkAnimator.destinationImageView = cell.imageView
navigationController?.pushViewController(vc, animated: true)
}
// Re-enable recognizer, after animation is done
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(expandAnimator.transitionDuration(nil) * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), { () -> Void in
sender.enabled = true
self.collectionView?.userInteractionEnabled = true
})
}
}
// MARK: Private helper methods
func updateDoneButton() {
// Find right button
if let subViews = navigationController?.navigationBar.subviews, let photosDataSource = photosDataSource {
for view in subViews {
if let btn = view as? UIButton where checkIfRightButtonItem(btn) {
// Store original title if we havn't got it
if doneBarButtonTitle == nil {
doneBarButtonTitle = btn.titleForState(.Normal)
}
// Update title
if let doneBarButtonTitle = doneBarButtonTitle {
// Special case if we have selected 1 image and that is
// the max number of allowed selections
if (photosDataSource.selections.count == 1 && self.settings.maxNumberOfSelections == 1) {
btn.bs_setTitleWithoutAnimation("\(doneBarButtonTitle)", forState: .Normal)
} else if photosDataSource.selections.count > 0 {
btn.bs_setTitleWithoutAnimation("\(doneBarButtonTitle) (\(photosDataSource.selections.count))", forState: .Normal)
} else {
btn.bs_setTitleWithoutAnimation(doneBarButtonTitle, forState: .Normal)
}
// Enabled?
doneBarButton?.enabled = photosDataSource.selections.count > 0
}
// Stop loop
break
}
}
}
}
// Check if a give UIButton is the right UIBarButtonItem in the navigation bar
// Somewhere along the road, our UIBarButtonItem gets transformed to an UINavigationButton
func checkIfRightButtonItem(btn: UIButton) -> Bool {
guard let rightButton = navigationItem.rightBarButtonItem else {
return false
}
// Store previous values
let wasRightEnabled = rightButton.enabled
let wasButtonEnabled = btn.enabled
// Set a known state for both buttons
rightButton.enabled = false
btn.enabled = false
// Change one and see if other also changes
rightButton.enabled = true
let isRightButton = btn.enabled
// Reset
rightButton.enabled = wasRightEnabled
btn.enabled = wasButtonEnabled
return isRightButton
}
func synchronizeSelectionInCollectionView(collectionView: UICollectionView) {
guard let photosDataSource = photosDataSource else {
return
}
// Get indexes of the selected assets
let mutableIndexSet = NSMutableIndexSet()
for object in photosDataSource.selections {
let index = photosDataSource.fetchResult.indexOfObject(object)
if index != NSNotFound {
mutableIndexSet.addIndex(index)
}
}
// Convert into index paths
let indexPaths = mutableIndexSet.bs_indexPathsForSection(1)
// Loop through them and set them as selected in the collection view
for indexPath in indexPaths {
collectionView.selectItemAtIndexPath(indexPath, animated: false, scrollPosition: .None)
}
}
func updateAlbumTitle(album: PHAssetCollection) {
if let title = album.localizedTitle {
// Update album title
albumTitleView?.albumTitle = title
}
}
func initializePhotosDataSource(album: PHAssetCollection, selections: PHFetchResult? = nil) {
// Set up a photo data source with album
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [
NSSortDescriptor(key: "creationDate", ascending: false)
]
fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.Image.rawValue)
initializePhotosDataSourceWithFetchResult(PHAsset.fetchAssetsInAssetCollection(album, options: fetchOptions), selections: selections)
}
func initializePhotosDataSourceWithFetchResult(fetchResult: PHFetchResult, selections: PHFetchResult? = nil) {
let newDataSource = PhotoCollectionViewDataSource(fetchResult: fetchResult, selections: selections, settings: settings)
// Transfer image size
// TODO: Move image size to settings
if let photosDataSource = photosDataSource {
newDataSource.imageSize = photosDataSource.imageSize
newDataSource.selections = photosDataSource.selections
}
photosDataSource = newDataSource
// Hook up data source
composedDataSource = ComposedCollectionViewDataSource(dataSources: [cameraDataSource, newDataSource])
collectionView?.dataSource = composedDataSource
collectionView?.delegate = self
}
func synchronizeCollectionView() {
guard let collectionView = collectionView else {
return
}
// Reload and sync selections
collectionView.reloadData()
synchronizeSelectionInCollectionView(collectionView)
}
}
// MARK: UICollectionViewDelegate
extension PhotosViewController {
override func collectionView(collectionView: UICollectionView, shouldSelectItemAtIndexPath indexPath: NSIndexPath) -> Bool {
// Camera shouldn't be selected, but pop the UIImagePickerController!
if let composedDataSource = composedDataSource where composedDataSource.dataSources[indexPath.section].isEqual(cameraDataSource) {
let cameraController = UIImagePickerController()
cameraController.allowsEditing = false
cameraController.sourceType = .Camera
cameraController.delegate = self
self.presentViewController(cameraController, animated: true, completion: nil)
return false
}
return collectionView.userInteractionEnabled && photosDataSource!.selections.count < settings.maxNumberOfSelections
}
override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
guard let photosDataSource = photosDataSource, let cell = collectionView.cellForItemAtIndexPath(indexPath) as? PhotoCell, let asset = photosDataSource.fetchResult.objectAtIndex(indexPath.row) as? PHAsset else {
return
}
// Select asset if not already selected
photosDataSource.selections.append(asset)
// Set selection number
if let selectionCharacter = settings.selectionCharacter {
cell.selectionString = String(selectionCharacter)
} else {
cell.selectionString = String(photosDataSource.selections.count)
}
// Update done button
updateDoneButton()
// Call selection closure
if let closure = selectionClosure {
dispatch_async(dispatch_get_global_queue(0, 0), { () -> Void in
closure(asset: asset)
})
}
}
override func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
guard let photosDataSource = photosDataSource, let asset = photosDataSource.fetchResult.objectAtIndex(indexPath.row) as? PHAsset, let index = photosDataSource.selections.indexOf(asset) else {
return
}
// Deselect asset
photosDataSource.selections.removeAtIndex(index)
// Update done button
updateDoneButton()
// Reload selected cells to update their selection number
if let selectedIndexPaths = collectionView.indexPathsForSelectedItems() {
UIView.setAnimationsEnabled(false)
collectionView.reloadItemsAtIndexPaths(selectedIndexPaths)
synchronizeSelectionInCollectionView(collectionView)
UIView.setAnimationsEnabled(true)
}
// Call deselection closure
if let closure = deselectionClosure {
dispatch_async(dispatch_get_global_queue(0, 0), { () -> Void in
closure(asset: asset)
})
}
}
override func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) {
guard let cell = cell as? CameraCell else {
return
}
cell.startLiveBackground() // Start live background
}
}
// MARK: UIPopoverPresentationControllerDelegate
extension PhotosViewController: UIPopoverPresentationControllerDelegate {
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
return .None
}
func popoverPresentationControllerShouldDismissPopover(popoverPresentationController: UIPopoverPresentationController) -> Bool {
return true
}
}
// MARK: UINavigationControllerDelegate
extension PhotosViewController: UINavigationControllerDelegate {
func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
if operation == .Push {
return expandAnimator
} else {
return shrinkAnimator
}
}
}
// MARK: UITableViewDelegate
extension PhotosViewController: UITableViewDelegate {
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
// Update photos data source
if let album = albumsDataSource.fetchResults[indexPath.section][indexPath.row] as? PHAssetCollection {
initializePhotosDataSource(album)
updateAlbumTitle(album)
synchronizeCollectionView()
}
// Dismiss album selection
albumsViewController.dismissViewControllerAnimated(true, completion: nil)
}
}
// MARK: Traits
extension PhotosViewController {
override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if let collectionViewFlowLayout = collectionViewLayout as? GridCollectionViewLayout {
let itemSpacing: CGFloat = 2.0
let cellsPerRow = settings.cellsPerRow(verticalSize: traitCollection.verticalSizeClass, horizontalSize: traitCollection.horizontalSizeClass)
collectionViewFlowLayout.itemSpacing = itemSpacing
collectionViewFlowLayout.itemsPerRow = cellsPerRow
photosDataSource?.imageSize = collectionViewFlowLayout.itemSize
updateDoneButton()
}
}
}
// MARK: UIImagePickerControllerDelegate
extension PhotosViewController: UIImagePickerControllerDelegate {
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else {
picker.dismissViewControllerAnimated(true, completion: nil)
return
}
var placeholder: PHObjectPlaceholder?
PHPhotoLibrary.sharedPhotoLibrary().performChanges({
let request = PHAssetChangeRequest.creationRequestForAssetFromImage(image)
placeholder = request.placeholderForCreatedAsset
}, completionHandler: { success, error in
guard let placeholder = placeholder, let asset = PHAsset.fetchAssetsWithLocalIdentifiers([placeholder.localIdentifier], options: nil).firstObject as? PHAsset where success == true else {
picker.dismissViewControllerAnimated(true, completion: nil)
return
}
dispatch_async(dispatch_get_main_queue()) {
// TODO: move to a function. this is duplicated in didSelect
self.photosDataSource?.selections.append(asset)
self.updateDoneButton()
// Call selection closure
if let closure = self.selectionClosure {
dispatch_async(dispatch_get_global_queue(0, 0), { () -> Void in
closure(asset: asset)
})
}
picker.dismissViewControllerAnimated(true, completion: nil)
}
})
}
func imagePickerControllerDidCancel(picker: UIImagePickerController) {
picker.dismissViewControllerAnimated(true, completion: nil)
}
}
// MARK: PHPhotoLibraryChangeObserver
extension PhotosViewController: PHPhotoLibraryChangeObserver {
func photoLibraryDidChange(changeInstance: PHChange) {
guard let photosDataSource = photosDataSource, let collectionView = collectionView else {
return
}
dispatch_async(dispatch_get_main_queue(), { () -> Void in
if let photosChanges = changeInstance.changeDetailsForFetchResult(photosDataSource.fetchResult) {
// Update collection view
// Alright...we get spammed with change notifications, even when there are none. So guard against it
if photosChanges.hasIncrementalChanges && (photosChanges.removedIndexes?.count > 0 || photosChanges.insertedIndexes?.count > 0 || photosChanges.changedIndexes?.count > 0) {
// Update fetch result
photosDataSource.fetchResult = photosChanges.fetchResultAfterChanges
if let removed = photosChanges.removedIndexes {
collectionView.deleteItemsAtIndexPaths(removed.bs_indexPathsForSection(1))
}
if let inserted = photosChanges.insertedIndexes {
collectionView.insertItemsAtIndexPaths(inserted.bs_indexPathsForSection(1))
}
// Changes is causing issues right now...fix me later
// Example of issue:
// 1. Take a new photo
// 2. We will get a change telling to insert that asset
// 3. While it's being inserted we get a bunch of change request for that same asset
// 4. It flickers when reloading it while being inserted
// TODO: FIX
// if let changed = photosChanges.changedIndexes {
// print("changed")
// collectionView.reloadItemsAtIndexPaths(changed.bs_indexPathsForSection(1))
// }
// Sync selection
self.synchronizeSelectionInCollectionView(collectionView)
} else if photosChanges.hasIncrementalChanges == false {
// Update fetch result
photosDataSource.fetchResult = photosChanges.fetchResultAfterChanges
collectionView.reloadData()
// Sync selection
self.synchronizeSelectionInCollectionView(collectionView)
}
}
})
// TODO: Changes in albums
}
}

View File

@ -0,0 +1,85 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import UIKit
final class PreviewViewController : UIViewController {
var imageView: UIImageView?
private var fullscreen = false
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
view.backgroundColor = UIColor.whiteColor()
imageView = UIImageView(frame: view.bounds)
imageView?.contentMode = .ScaleAspectFit
imageView?.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
view.addSubview(imageView!)
let tapRecognizer = UITapGestureRecognizer()
tapRecognizer.numberOfTapsRequired = 1
tapRecognizer.addTarget(self, action: #selector(PreviewViewController.toggleFullscreen))
view.addGestureRecognizer(tapRecognizer)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func loadView() {
super.loadView()
}
func toggleFullscreen() {
fullscreen = !fullscreen
UIView.animateWithDuration(0.3, animations: { () -> Void in
self.toggleNavigationBar()
self.toggleStatusBar()
self.toggleBackgroundColor()
})
}
func toggleNavigationBar() {
navigationController?.setNavigationBarHidden(fullscreen, animated: true)
}
func toggleStatusBar() {
self.setNeedsStatusBarAppearanceUpdate()
}
func toggleBackgroundColor() {
let aColor: UIColor
if self.fullscreen {
aColor = UIColor.blackColor()
} else {
aColor = UIColor.whiteColor()
}
self.view.backgroundColor = aColor
}
override func prefersStatusBarHidden() -> Bool {
return fullscreen
}
}

View File

@ -0,0 +1,102 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import UIKit
import UIImageViewModeScaleAspect
final class ZoomAnimator : NSObject, UIViewControllerAnimatedTransitioning {
var sourceImageView: UIImageView?
var destinationImageView: UIImageView?
func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
return 0.3
}
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
// Get to and from view controller
if let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey), let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey), let sourceImageView = sourceImageView, let destinationImageView = destinationImageView, let containerView = transitionContext.containerView() {
// Disable selection so we don't select anything while the push animation is running
fromViewController.view?.userInteractionEnabled = false
// Setup views
sourceImageView.hidden = true
destinationImageView.hidden = true
toViewController.view.alpha = 0.0
fromViewController.view.alpha = 1.0
containerView.backgroundColor = toViewController.view.backgroundColor
// Setup scaling image
let scalingFrame = containerView.convertRect(sourceImageView.frame, fromView: sourceImageView.superview)
let scalingImage = UIImageViewModeScaleAspect(frame: scalingFrame)
scalingImage.contentMode = sourceImageView.contentMode
scalingImage.image = sourceImageView.image
//Init image scale
let destinationFrame = toViewController.view.convertRect(destinationImageView.bounds, fromView: destinationImageView.superview)
if destinationImageView.contentMode == .ScaleAspectFit {
scalingImage.initToScaleAspectFitToFrame(destinationFrame)
} else {
scalingImage.initToScaleAspectFillToFrame(destinationFrame)
}
// Add views to container view
containerView.addSubview(toViewController.view)
containerView.addSubview(scalingImage)
// Animate
UIView.animateWithDuration(transitionDuration(transitionContext),
delay: 0.0,
options: UIViewAnimationOptions.TransitionNone,
animations: { () -> Void in
// Fade in
fromViewController.view.alpha = 0.0
toViewController.view.alpha = 1.0
if destinationImageView.contentMode == .ScaleAspectFit {
scalingImage.animaticToScaleAspectFit()
} else {
scalingImage.animaticToScaleAspectFill()
}
}, completion: { (finished) -> Void in
// Finish image scaling and remove image view
if destinationImageView.contentMode == .ScaleAspectFit {
scalingImage.animateFinishToScaleAspectFit()
} else {
scalingImage.animateFinishToScaleAspectFill()
}
scalingImage.removeFromSuperview()
// Unhide
destinationImageView.hidden = false
sourceImageView.hidden = false
fromViewController.view.alpha = 1.0
// Finish transition
transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
// Enable selection again
fromViewController.view?.userInteractionEnabled = true
})
}
}
}

View File

@ -0,0 +1,42 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import Foundation
/**
Extension for creating index paths from an index set
*/
extension NSIndexSet {
/**
- parameter section: The section for the created NSIndexPaths
- return: An array with NSIndexPaths
*/
func bs_indexPathsForSection(section: Int) -> [NSIndexPath] {
var indexPaths: [NSIndexPath] = []
enumerateIndexesUsingBlock { (index, _) -> Void in
indexPaths.append(NSIndexPath(forItem: index, inSection: section))
}
return indexPaths
}
}

View File

@ -0,0 +1,45 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import UIKit
/**
Extension on UIButton for settings the title without an animation
*/
extension UIButton {
/**
Sets title without an animation
- parameter title: The String to use as title
- parameter forState: Which state it applies to
*/
func bs_setTitleWithoutAnimation(title: String?, forState state: UIControlState) {
// Disable/enable animations
UIView.setAnimationsEnabled(false)
// Set title without the default animation
self.setTitle(title, forState: state)
self.layoutIfNeeded()
// Enable animations
UIView.setAnimationsEnabled(true)
}
}

View File

@ -0,0 +1,56 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import UIKit
import Photos
/**
Extension on UIViewController to simply presentation of BSImagePicker
*/
public extension UIViewController {
/**
Present a given image picker with closures, any of the closures can be nil.
- parameter imagePicker: a BSImagePickerViewController to present
- parameter animated: To animate the presentation or not
- parameter select: Closure to call when user selects an asset or nil
- parameter deselect: Closure to call when user deselects an asset or nil
- parameter cancel: Closure to call when user cancels or nil
- parameter finish: Closure to call when user finishes or nil
- parameter completion: presentation completed closure or nil
*/
func bs_presentImagePickerController(imagePicker: BSImagePickerViewController, animated: Bool, select: ((asset: PHAsset) -> Void)?, deselect: ((asset: PHAsset) -> Void)?, cancel: (([PHAsset]) -> Void)?, finish: (([PHAsset]) -> Void)?, completion: (() -> Void)?) {
BSImagePickerViewController.authorize(fromViewController: self) { (authorized) -> Void in
// Make sure we are authorized before proceding
guard authorized == true else { return }
// Set blocks
imagePicker.photosViewController.selectionClosure = select
imagePicker.photosViewController.deselectionClosure = deselect
imagePicker.photosViewController.cancelClosure = cancel
imagePicker.photosViewController.finishClosure = finish
// Present
self.presentViewController(imagePicker, animated: animated, completion: completion)
}
}
}

View File

@ -0,0 +1,98 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import UIKit
import Photos
/**
Implements the UITableViewDataSource protocol with a data source and cell factory
*/
final class AlbumTableViewDataSource : NSObject, UITableViewDataSource {
let fetchResults: [PHFetchResult]
private let albumCellIdentifier = "albumCell"
init(fetchResults: [PHFetchResult]) {
self.fetchResults = fetchResults
super.init()
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return fetchResults.count
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return fetchResults[section].count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(albumCellIdentifier, forIndexPath: indexPath) as! AlbumCell
let cachingManager = PHCachingImageManager.defaultManager() as? PHCachingImageManager
cachingManager?.allowsCachingHighQualityImages = false
// Fetch album
if let album = fetchResults[indexPath.section][indexPath.row] as? PHAssetCollection {
// Title
cell.albumTitleLabel.text = album.localizedTitle
// Selection style
cell.selectionStyle = .None
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [
NSSortDescriptor(key: "creationDate", ascending: false)
]
fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.Image.rawValue)
let result = PHAsset.fetchAssetsInAssetCollection(album, options: fetchOptions)
result.enumerateObjectsUsingBlock { (object, idx, stop) in
if let asset = object as? PHAsset {
let imageSize = CGSize(width: 79, height: 79)
let imageContentMode: PHImageContentMode = .AspectFill
switch idx {
case 0:
PHCachingImageManager.defaultManager().requestImageForAsset(asset, targetSize: imageSize, contentMode: imageContentMode, options: nil) { (result, _) in
cell.firstImageView.image = result
cell.secondImageView.image = result
cell.thirdImageView.image = result
}
case 1:
PHCachingImageManager.defaultManager().requestImageForAsset(asset, targetSize: imageSize, contentMode: imageContentMode, options: nil) { (result, _) in
cell.secondImageView.image = result
cell.thirdImageView.image = result
}
case 2:
PHCachingImageManager.defaultManager().requestImageForAsset(asset, targetSize: imageSize, contentMode: imageContentMode, options: nil) { (result, _) in
cell.thirdImageView.image = result
}
default:
// Stop enumeration
stop.initialize(true)
}
}
}
}
return cell
}
}

View File

@ -0,0 +1,58 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import UIKit
/**
Data source for the camera cell. Will not show up if your device doesn't support camera or you have turned it off in settings
*/
final class CameraCollectionViewDataSource: NSObject, UICollectionViewDataSource {
let cameraCellIdentifier = "cameraCellIdentifier"
let cameraAvailable: Bool
let settings: BSImagePickerSettings
init(settings: BSImagePickerSettings, cameraAvailable: Bool) {
self.settings = settings
self.cameraAvailable = cameraAvailable
super.init()
}
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return Int(cameraAvailable && settings.takePhotos)
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return Int(cameraAvailable && settings.takePhotos)
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cameraCell = collectionView.dequeueReusableCellWithReuseIdentifier(cameraCellIdentifier, forIndexPath: indexPath) as! CameraCell
cameraCell.takePhotoIcon = settings.takePhotoIcon
return cameraCell
}
func registerCellIdentifiersForCollectionView(collectionView: UICollectionView?) {
collectionView?.registerNib(UINib(nibName: "CameraCell", bundle: BSImagePickerViewController.bundle), forCellWithReuseIdentifier: cameraCellIdentifier)
}
}

View File

@ -0,0 +1,48 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import UIKit
/**
Takes multiple UICollectionViewDataSources and joins them into one section
*/
class ComposedCollectionViewDataSource: NSObject, UICollectionViewDataSource {
let dataSources: [UICollectionViewDataSource]
init(dataSources: [UICollectionViewDataSource]) {
self.dataSources = dataSources
super.init()
}
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return dataSources.count
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return dataSources[section].collectionView(collectionView, numberOfItemsInSection: 0)
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
return dataSources[indexPath.section].collectionView(collectionView, cellForItemAtIndexPath: NSIndexPath(forItem: indexPath.row, inSection: 0))
}
}

View File

@ -0,0 +1,106 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import UIKit
import Photos
/**
Gives UICollectionViewDataSource functionality with a given data source and cell factory
*/
final class PhotoCollectionViewDataSource : NSObject, UICollectionViewDataSource {
var selections = [PHAsset]()
var fetchResult: PHFetchResult
private let photoCellIdentifier = "photoCellIdentifier"
private let photosManager = PHCachingImageManager.defaultManager()
private let imageContentMode: PHImageContentMode = .AspectFill
let settings: BSImagePickerSettings?
var imageSize: CGSize = CGSizeZero
init(fetchResult: PHFetchResult, selections: PHFetchResult? = nil, settings: BSImagePickerSettings?) {
self.fetchResult = fetchResult
self.settings = settings
if let selections = selections {
var selectionsArray = [PHAsset]()
selections.enumerateObjectsUsingBlock { (asset, idx, stop) -> Void in
if let asset = asset as? PHAsset {
selectionsArray.append(asset)
}
}
self.selections = selectionsArray
}
super.init()
}
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return fetchResult.count
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
UIView.setAnimationsEnabled(false)
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(photoCellIdentifier, forIndexPath: indexPath) as! PhotoCell
if let settings = settings {
cell.settings = settings
}
// Cancel any pending image requests
if cell.tag != 0 {
photosManager.cancelImageRequest(PHImageRequestID(cell.tag))
}
if let asset = fetchResult[indexPath.row] as? PHAsset {
cell.asset = asset
// Request image
cell.tag = Int(photosManager.requestImageForAsset(asset, targetSize: imageSize, contentMode: imageContentMode, options: nil) { (result, _) in
cell.imageView.image = result
})
// Set selection number
if let asset = fetchResult[indexPath.row] as? PHAsset, let index = selections.indexOf(asset) {
if let character = settings?.selectionCharacter {
cell.selectionString = String(character)
} else {
cell.selectionString = String(index+1)
}
cell.selected = true
} else {
cell.selected = false
}
}
UIView.setAnimationsEnabled(true)
return cell
}
func registerCellIdentifiersForCollectionView(collectionView: UICollectionView?) {
collectionView?.registerNib(UINib(nibName: "PhotoCell", bundle: BSImagePickerViewController.bundle), forCellWithReuseIdentifier: photoCellIdentifier)
}
}

View File

@ -0,0 +1,60 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import UIKit
/**
The settings object that gets passed around between classes for keeping...settings
*/
final class Settings : BSImagePickerSettings {
var maxNumberOfSelections: Int = Int.max
var selectionCharacter: Character? = nil
var selectionFillColor: UIColor = UIView().tintColor
var selectionStrokeColor: UIColor = UIColor.whiteColor()
var selectionShadowColor: UIColor = UIColor.blackColor()
var selectionTextAttributes: [String: AnyObject] = {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineBreakMode = .ByTruncatingTail
paragraphStyle.alignment = .Center
return [
NSFontAttributeName: UIFont.boldSystemFontOfSize(10.0),
NSParagraphStyleAttributeName: paragraphStyle,
NSForegroundColorAttributeName: UIColor.whiteColor()
]
}()
var cellsPerRow: (verticalSize: UIUserInterfaceSizeClass, horizontalSize: UIUserInterfaceSizeClass) -> Int = {(verticalSize: UIUserInterfaceSizeClass, horizontalSize: UIUserInterfaceSizeClass) -> Int in
switch (verticalSize, horizontalSize) {
case (.Compact, .Regular): // iPhone5-6 portrait
return 3
case (.Compact, .Compact): // iPhone5-6 landscape
return 5
case (.Regular, .Regular): // iPad portrait/landscape
return 7
default:
return 3
}
}
var takePhotos: Bool = false
var takePhotoIcon: UIImage? = UIImage(named: "add_photo", inBundle: BSImagePickerViewController.bundle, compatibleWithTraitCollection: nil)
}

View File

@ -0,0 +1,74 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import Photos
/**
BSImagePicker settings. Tweaks these to make BSImagePicker fit your needs
*/
public protocol BSImagePickerSettings {
/**
Max number of images user can select
*/
var maxNumberOfSelections: Int { get set }
/**
Character to use for selection. If nil, selection number will be used
*/
var selectionCharacter: Character? { get set }
/**
Inner circle color
*/
var selectionFillColor: UIColor { get set }
/**
Outer circle color
*/
var selectionStrokeColor: UIColor { get set }
/**
Shadow color
*/
var selectionShadowColor: UIColor { get set }
/**
Attributes for text inside circle. Color, font, etc
*/
var selectionTextAttributes: [String: AnyObject] { get set }
/**
Return how many cells per row you want to show for the given size classes
*/
var cellsPerRow: (verticalSize: UIUserInterfaceSizeClass, horizontalSize: UIUserInterfaceSizeClass) -> Int { get set }
/**
Toggle take photos
*/
var takePhotos: Bool { get set }
/**
Icon to show in take photo cell.
If you use a black image tint color will be applied to it.
*/
var takePhotoIcon: UIImage? { get set }
}

View File

@ -0,0 +1,56 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import UIKit
/**
Cell for photo albums in the albums drop down menu
*/
final class AlbumCell: UITableViewCell {
@IBOutlet weak var firstImageView: UIImageView!
@IBOutlet weak var secondImageView: UIImageView!
@IBOutlet weak var thirdImageView: UIImageView!
@IBOutlet weak var albumTitleLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Add a little shadow to images views
for imageView in [firstImageView, secondImageView, thirdImageView] {
imageView.layer.shadowColor = UIColor.whiteColor().CGColor
imageView.layer.shadowRadius = 1.0
imageView.layer.shadowOffset = CGSize(width: 0.5, height: -0.5)
imageView.layer.shadowOpacity = 1.0
}
}
override var selected: Bool {
didSet {
// Selection checkmark
if selected == true {
accessoryType = .Checkmark
} else {
accessoryType = .None
}
}
}
}

View File

@ -0,0 +1,72 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import UIKit
/**
The navigation title view with album name and a button for activating the drop down.
*/
final class AlbumTitleView: UIView {
@IBOutlet weak var albumButton: UIButton!
private var context = 0
var albumTitle = "" {
didSet {
if let imageView = self.albumButton?.imageView, let titleLabel = self.albumButton?.titleLabel {
// Set title on button
albumButton?.setTitle(self.albumTitle, forState: .Normal)
// Also set title directly to label, since it isn't done right away when setting button title
// And we need to know its width to calculate insets
titleLabel.text = self.albumTitle
titleLabel.sizeToFit()
// Adjust insets to right align image
albumButton?.titleEdgeInsets = UIEdgeInsets(top: 0, left: -imageView.bounds.size.width, bottom: 0, right: imageView.bounds.size.width)
albumButton?.imageEdgeInsets = UIEdgeInsets(top: 0, left: titleLabel.bounds.size.width + 4, bottom: 0, right: -(titleLabel.bounds.size.width + 4))
}
}
}
override func awakeFromNib() {
super.awakeFromNib()
// Set image
albumButton?.setImage(arrowDownImage, forState: .Normal)
}
lazy var arrowDownImage: UIImage? = {
// Get path for BSImagePicker bundle
let bundlePath = NSBundle(forClass: PhotosViewController.self).pathForResource("BSImagePicker", ofType: "bundle")
let bundle: NSBundle?
// Load bundle
if let bundlePath = bundlePath {
bundle = NSBundle(path: bundlePath)
} else {
bundle = nil
}
return UIImage(named: "arrow_down", inBundle: bundle, compatibleWithTraitCollection: nil)
}()
}

View File

@ -0,0 +1,78 @@
//
// CameraCell.swift
// Pods
//
// Created by Joakim Gyllström on 2015-09-26.
//
//
import UIKit
import AVFoundation
/**
*/
final class CameraCell: UICollectionViewCell {
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var cameraBackground: UIView!
var takePhotoIcon: UIImage? {
didSet {
imageView.image = takePhotoIcon
// Apply tint to image
imageView.image = imageView.image?.imageWithRenderingMode(.AlwaysTemplate)
}
}
var session: AVCaptureSession?
var captureLayer: AVCaptureVideoPreviewLayer?
let sessionQueue = dispatch_queue_create("AVCaptureVideoPreviewLayer", nil)
override func awakeFromNib() {
super.awakeFromNib()
// Don't trigger camera access for the background
guard AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo) == .Authorized else {
return
}
do {
// Prepare avcapture session
session = AVCaptureSession()
session?.sessionPreset = AVCaptureSessionPresetMedium
// Hook upp device
let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
let input = try AVCaptureDeviceInput(device: device)
session?.addInput(input)
// Setup capture layer
if let captureLayer = AVCaptureVideoPreviewLayer(session: session) {
captureLayer.frame = bounds
captureLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
cameraBackground.layer.addSublayer(captureLayer)
self.captureLayer = captureLayer
}
} catch {
session = nil
}
}
override func layoutSubviews() {
super.layoutSubviews()
captureLayer?.frame = bounds
}
func startLiveBackground() {
dispatch_async(sessionQueue) { () -> Void in
self.session?.startRunning()
}
}
func stopLiveBackground() {
dispatch_async(sessionQueue) { () -> Void in
self.session?.stopRunning()
}
}
}

View File

@ -0,0 +1,91 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import UIKit
import Photos
/**
The photo cell.
*/
final class PhotoCell: UICollectionViewCell {
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var selectionOverlayView: UIView!
@IBOutlet weak var selectionView: SelectionView!
weak var asset: PHAsset?
var settings: BSImagePickerSettings {
get {
return selectionView.settings
}
set {
selectionView.settings = newValue
}
}
var selectionString: String {
get {
return selectionView.selectionString
}
set {
selectionView.selectionString = newValue
}
}
override var selected: Bool {
get {
return super.selected
}
set {
let hasChanged = selected != newValue
super.selected = newValue
if UIView.areAnimationsEnabled() && hasChanged {
UIView.animateWithDuration(NSTimeInterval(0.1), animations: { () -> Void in
// Set alpha for views
self.updateAlpha(newValue)
// Scale all views down a little
self.transform = CGAffineTransformMakeScale(0.95, 0.95)
}) { (finished: Bool) -> Void in
UIView.animateWithDuration(NSTimeInterval(0.1), animations: { () -> Void in
// And then scale them back upp again to give a bounce effect
self.transform = CGAffineTransformMakeScale(1.0, 1.0)
}, completion: nil)
}
} else {
updateAlpha(newValue)
}
}
}
private func updateAlpha(selected: Bool) {
if selected == true {
self.selectionView.alpha = 1.0
self.selectionOverlayView.alpha = 0.3
} else {
self.selectionView.alpha = 0.0
self.selectionOverlayView.alpha = 0.0
}
}
}

View File

@ -0,0 +1,90 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Joakim Gyllström
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import UIKit
/**
Used as an overlay on selected cells
*/
@IBDesignable final class SelectionView: UIView {
var selectionString: String = "" {
didSet {
if selectionString != oldValue {
setNeedsDisplay()
}
}
}
var settings: BSImagePickerSettings = Settings()
override func drawRect(rect: CGRect) {
//// General Declarations
let context = UIGraphicsGetCurrentContext()
//// Color Declarations
//// Shadow Declarations
let shadow2Offset = CGSize(width: 0.1, height: -0.1);
let shadow2BlurRadius: CGFloat = 2.5;
//// Frames
let checkmarkFrame = bounds;
//// Subframes
let group = CGRect(x: CGRectGetMinX(checkmarkFrame) + 3, y: CGRectGetMinY(checkmarkFrame) + 3, width: CGRectGetWidth(checkmarkFrame) - 6, height: CGRectGetHeight(checkmarkFrame) - 6)
//// CheckedOval Drawing
let checkedOvalPath = UIBezierPath(ovalInRect: CGRectMake(CGRectGetMinX(group) + floor(CGRectGetWidth(group) * 0.0 + 0.5), CGRectGetMinY(group) + floor(CGRectGetHeight(group) * 0.0 + 0.5), floor(CGRectGetWidth(group) * 1.0 + 0.5) - floor(CGRectGetWidth(group) * 0.0 + 0.5), floor(CGRectGetHeight(group) * 1.0 + 0.5) - floor(CGRectGetHeight(group) * 0.0 + 0.5)))
CGContextSaveGState(context)
CGContextSetShadowWithColor(context, shadow2Offset, shadow2BlurRadius, settings.selectionShadowColor.CGColor)
settings.selectionFillColor.setFill()
checkedOvalPath.fill()
CGContextRestoreGState(context)
settings.selectionStrokeColor.setStroke()
checkedOvalPath.lineWidth = 1
checkedOvalPath.stroke()
CGContextSetFillColorWithColor(context, UIColor.whiteColor().CGColor)
//// Check mark for single assets
if (settings.maxNumberOfSelections == 1) {
CGContextSetStrokeColorWithColor(context, UIColor.whiteColor().CGColor)
let checkPath = UIBezierPath()
checkPath.moveToPoint(CGPoint(x: 7, y: 12.5))
checkPath.addLineToPoint(CGPoint(x: 11, y: 16))
checkPath.addLineToPoint(CGPoint(x: 17.5, y: 9.5))
checkPath.stroke()
return;
}
//// Bezier Drawing (Picture Number)
let size = selectionString.sizeWithAttributes(settings.selectionTextAttributes)
selectionString.drawInRect(CGRectMake(CGRectGetMidX(checkmarkFrame) - size.width / 2.0,
CGRectGetMidY(checkmarkFrame) - size.height / 2.0,
size.width,
size.height), withAttributes: settings.selectionTextAttributes)
}
}

70
Pods/BSImagePicker/README.md generated Normal file
View File

@ -0,0 +1,70 @@
# BSImagePicker
[![CI Status](http://img.shields.io/travis/mikaoj/BSImagePicker.svg?style=flat)](https://travis-ci.org/mikaoj/BSImagePicker)
[![Version](https://img.shields.io/cocoapods/v/BSImagePicker.svg?style=flat)](http://cocoapods.org/pods/BSImagePicker)
[![License](https://img.shields.io/cocoapods/l/BSImagePicker.svg?style=flat)](http://cocoapods.org/pods/BSImagePicker)
[![Platform](https://img.shields.io/cocoapods/p/BSImagePicker.svg?style=flat)](http://cocoapods.org/pods/BSImagePicker)
[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
![alt text](Misc/Gif/demo.gif "Demo gif")
A mix between the native iOS 8 gallery and facebooks image picker. It is intended as a replacement for UIImagePickerController for both selecting and taking photos.
## Usage
To run the example project, clone the repo, and run `pod install` from the Example directory first.<br />
To use it in you own project
###### Swift
```swift
let vc = BSImagePickerViewController()
bs_presentImagePickerController(vc, animated: true,
select: { (asset: PHAsset) -> Void in
// User selected an asset.
// Do something with it, start upload perhaps?
}, deselect: { (asset: PHAsset) -> Void in
// User deselected an assets.
// Do something, cancel upload?
}, cancel: { (assets: [PHAsset]) -> Void in
// User cancelled. And this where the assets currently selected.
}, finish: { (assets: [PHAsset]) -> Void in
// User finished with these assets
}, completion: nil)
```
## Features
* Multiple selection.
* Fullscreen preview
* Switch albums.
* No localization needed (uses icons or system localizations).
* Take photos (it isn't enabled by default, so set takePhotos to true if you want it).
* Customizable - check out BSImagePickerSettings to see what you can tweak.
## Customization
You have access to the cancel, album and done button. Customize them as you would with any other UIBarButtonItem (cancel & finish) or UIButton (album).<br />
There are also a few other settings you can tweak. They are documented in BSImagePickerSettings.<br />
[Documentation @ cocoadocs](http://cocoadocs.org/docsets/BSImagePicker/)
## Custom fetch results
Not happy with the fetch results (camera roll and albums) that BSImagePicker uses as default? Set the fetchResults property.
## Requirements
iOS 8
## Installation
BSImagePicker is available through [CocoaPods](http://cocoapods.org). To install
it, simply add the following line to your Podfile:
```ruby
pod "BSImagePicker", "~> 2.3"
```
## Author
Joakim Gyllström, joakim@backslashed.se
## License
BSImagePicker is available under the MIT license. See the LICENSE file for more info.

14
Pods/Manifest.lock generated
View File

@ -33,6 +33,10 @@ PODS:
- Bolts/AppLinks (1.7.0): - Bolts/AppLinks (1.7.0):
- Bolts/Tasks - Bolts/Tasks
- Bolts/Tasks (1.7.0) - Bolts/Tasks (1.7.0)
- BSGridCollectionViewLayout (1.1.1)
- BSImagePicker (2.3.0):
- BSGridCollectionViewLayout (~> 1.1)
- UIImageViewModeScaleAspect (~> 1.3)
- FBSDKCoreKit (4.12.0): - FBSDKCoreKit (4.12.0):
- Bolts (~> 1.7) - Bolts (~> 1.7)
- FBSDKLoginKit (4.12.0): - FBSDKLoginKit (4.12.0):
@ -90,11 +94,14 @@ PODS:
- PicoKit/Soap - PicoKit/Soap
- PicoKit/XMLWriter (0.7.2) - PicoKit/XMLWriter (0.7.2)
- SwiftyJSON (2.3.2) - SwiftyJSON (2.3.2)
- SWRevealViewController (2.3.0)
- TYMActivityIndicatorView (0.3.3) - TYMActivityIndicatorView (0.3.3)
- UIImageViewModeScaleAspect (1.3)
DEPENDENCIES: DEPENDENCIES:
- AeroGearOAuth2 - AeroGearOAuth2
- Alamofire-SwiftyJSON - Alamofire-SwiftyJSON
- BSImagePicker (~> 2.3)
- FBSDKCoreKit - FBSDKCoreKit
- FBSDKLoginKit - FBSDKLoginKit
- FBSDKShareKit - FBSDKShareKit
@ -105,6 +112,7 @@ DEPENDENCIES:
- Locksmith - Locksmith
- OAuthSwift (~> 0.5.0) - OAuthSwift (~> 0.5.0)
- PicoKit - PicoKit
- SWRevealViewController
- TYMActivityIndicatorView - TYMActivityIndicatorView
SPEC CHECKSUMS: SPEC CHECKSUMS:
@ -114,6 +122,8 @@ SPEC CHECKSUMS:
Alamofire: c19a627cefd6a95f840401c49ab1f124e07f54ee Alamofire: c19a627cefd6a95f840401c49ab1f124e07f54ee
Alamofire-SwiftyJSON: 5812bb37accc36897cc2f2dabb070d8ebcd7ac98 Alamofire-SwiftyJSON: 5812bb37accc36897cc2f2dabb070d8ebcd7ac98
Bolts: a0058fa3b331c5a1e4402d534f2dae36dbff31e4 Bolts: a0058fa3b331c5a1e4402d534f2dae36dbff31e4
BSGridCollectionViewLayout: d7304dcb35c6b3b4420c527e9f9b77ff322250f3
BSImagePicker: 591b28ce4994c44cbc4ac896717c1db9f9fadd18
FBSDKCoreKit: 6e56d5a2a64a755ad4efb5dbeee8f82fb1b99775 FBSDKCoreKit: 6e56d5a2a64a755ad4efb5dbeee8f82fb1b99775
FBSDKLoginKit: 03f68a8d48c2c8bb81d7eb8097973d483543e1f6 FBSDKLoginKit: 03f68a8d48c2c8bb81d7eb8097973d483543e1f6
FBSDKShareKit: df1491f064cffc8ebcc3fc8b71be94cc190c728e FBSDKShareKit: df1491f064cffc8ebcc3fc8b71be94cc190c728e
@ -132,8 +142,10 @@ SPEC CHECKSUMS:
OAuthSwift: 1ef042d4362e755e24a78f158d817245641a5d24 OAuthSwift: 1ef042d4362e755e24a78f158d817245641a5d24
PicoKit: 9079bce659a8d5408c8af1c45254b971df614de3 PicoKit: 9079bce659a8d5408c8af1c45254b971df614de3
SwiftyJSON: 04ccea08915aa0109039157c7974cf0298da292a SwiftyJSON: 04ccea08915aa0109039157c7974cf0298da292a
SWRevealViewController: 6d3fd97f70112fd7cef9de14df4260eacce4c63a
TYMActivityIndicatorView: ad816387ebd5952c376af129218722733044148b TYMActivityIndicatorView: ad816387ebd5952c376af129218722733044148b
UIImageViewModeScaleAspect: ec78901acfc20d3782154111a21d34390f8f71ad
PODFILE CHECKSUM: 4b7ee6fd372620e6f0ce654e3c9ceec07ad55669 PODFILE CHECKSUM: b372ee48d5c7639810a0074e34292bc3076ff7f0
COCOAPODS: 1.0.0 COCOAPODS: 1.0.0

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0700"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = 'primary'
BlueprintIdentifier = '8AA3DDB8797222294E1288CB197A8347'
BlueprintName = 'BSGridCollectionViewLayout'
ReferencedContainer = 'container:Pods.xcodeproj'
BuildableName = 'BSGridCollectionViewLayout.framework'>
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0700"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = 'primary'
BlueprintIdentifier = 'F7DE5171AA3C53DA4E4A078B795C78EE'
BlueprintName = 'BSImagePicker-BSImagePicker'
ReferencedContainer = 'container:Pods.xcodeproj'
BuildableName = 'BSImagePicker.bundle'>
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0700"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = 'primary'
BlueprintIdentifier = 'C59EE95662AD4757E7FCE220DB1AFA41'
BlueprintName = 'BSImagePicker'
ReferencedContainer = 'container:Pods.xcodeproj'
BuildableName = 'BSImagePicker.framework'>
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -14,7 +14,7 @@
buildForAnalyzing = "YES"> buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "9C2A95ACEDED78B3E880CC29AA0AF79D" BlueprintIdentifier = "9AAFED731A7D62458AD19F177724048B"
BuildableName = "Pods_Vendoo.framework" BuildableName = "Pods_Vendoo.framework"
BlueprintName = "Pods-Vendoo" BlueprintName = "Pods-Vendoo"
ReferencedContainer = "container:Pods.xcodeproj"> ReferencedContainer = "container:Pods.xcodeproj">
@ -45,7 +45,7 @@
<MacroExpansion> <MacroExpansion>
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "9C2A95ACEDED78B3E880CC29AA0AF79D" BlueprintIdentifier = "9AAFED731A7D62458AD19F177724048B"
BuildableName = "Pods_Vendoo.framework" BuildableName = "Pods_Vendoo.framework"
BlueprintName = "Pods-Vendoo" BlueprintName = "Pods-Vendoo"
ReferencedContainer = "container:Pods.xcodeproj"> ReferencedContainer = "container:Pods.xcodeproj">

View File

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0700"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = 'primary'
BlueprintIdentifier = '0D52FE07CEB8B5458F3C73BB37A484FB'
BlueprintName = 'SWRevealViewController'
ReferencedContainer = 'container:Pods.xcodeproj'
BuildableName = 'SWRevealViewController.framework'>
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -14,7 +14,7 @@
buildForArchiving = "YES"> buildForArchiving = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = 'primary' BuildableIdentifier = 'primary'
BlueprintIdentifier = '0B68DE0F8EFE4B4B7B829F7B37E213F0' BlueprintIdentifier = '31CABCBBC4853F0A3523D99FE6D41F17'
BlueprintName = 'TYMActivityIndicatorView' BlueprintName = 'TYMActivityIndicatorView'
ReferencedContainer = 'container:Pods.xcodeproj' ReferencedContainer = 'container:Pods.xcodeproj'
BuildableName = 'TYMActivityIndicatorView.framework'> BuildableName = 'TYMActivityIndicatorView.framework'>

View File

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0700"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = 'primary'
BlueprintIdentifier = '0FF38C485BD8E73F614C919F834D6EAB'
BlueprintName = 'UIImageViewModeScaleAspect'
ReferencedContainer = 'container:Pods.xcodeproj'
BuildableName = 'UIImageViewModeScaleAspect.framework'>
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -29,6 +29,21 @@
<key>isShown</key> <key>isShown</key>
<false/> <false/>
</dict> </dict>
<key>BSGridCollectionViewLayout.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>BSImagePicker-BSImagePicker.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>BSImagePicker.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>Bolts.xcscheme</key> <key>Bolts.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
@ -84,6 +99,11 @@
<key>isShown</key> <key>isShown</key>
<false/> <false/>
</dict> </dict>
<key>SWRevealViewController.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>SwiftyJSON.xcscheme</key> <key>SwiftyJSON.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
@ -94,10 +114,15 @@
<key>isShown</key> <key>isShown</key>
<false/> <false/>
</dict> </dict>
<key>UIImageViewModeScaleAspect.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
</dict> </dict>
<key>SuppressBuildableAutocreation</key> <key>SuppressBuildableAutocreation</key>
<dict> <dict>
<key>0B68DE0F8EFE4B4B7B829F7B37E213F0</key> <key>0D52FE07CEB8B5458F3C73BB37A484FB</key>
<dict> <dict>
<key>primary</key> <key>primary</key>
<true/> <true/>
@ -107,6 +132,11 @@
<key>primary</key> <key>primary</key>
<true/> <true/>
</dict> </dict>
<key>0FF38C485BD8E73F614C919F834D6EAB</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>2AA2F4091B94E46EEE3AD6055CB49C7D</key> <key>2AA2F4091B94E46EEE3AD6055CB49C7D</key>
<dict> <dict>
<key>primary</key> <key>primary</key>
@ -117,6 +147,11 @@
<key>primary</key> <key>primary</key>
<true/> <true/>
</dict> </dict>
<key>31CABCBBC4853F0A3523D99FE6D41F17</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>3C34098A7DACA89F52BF902062730F50</key> <key>3C34098A7DACA89F52BF902062730F50</key>
<dict> <dict>
<key>primary</key> <key>primary</key>
@ -157,6 +192,11 @@
<key>primary</key> <key>primary</key>
<true/> <true/>
</dict> </dict>
<key>8AA3DDB8797222294E1288CB197A8347</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>8E87CBA9EBF6671AAFD3A8CCD2C3875B</key> <key>8E87CBA9EBF6671AAFD3A8CCD2C3875B</key>
<dict> <dict>
<key>primary</key> <key>primary</key>
@ -167,7 +207,7 @@
<key>primary</key> <key>primary</key>
<true/> <true/>
</dict> </dict>
<key>9C2A95ACEDED78B3E880CC29AA0AF79D</key> <key>9AAFED731A7D62458AD19F177724048B</key>
<dict> <dict>
<key>primary</key> <key>primary</key>
<true/> <true/>
@ -187,6 +227,16 @@
<key>primary</key> <key>primary</key>
<true/> <true/>
</dict> </dict>
<key>C59EE95662AD4757E7FCE220DB1AFA41</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>F7DE5171AA3C53DA4E4A078B795C78EE</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict> </dict>
</dict> </dict>
</plist> </plist>

21
Pods/SWRevealViewController/LICENSE.txt generated Executable file
View File

@ -0,0 +1,21 @@
Copyright (c) 2013 Joan Lluch <joan.lluch@sweetwilliamsl.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
Early code inspired on a similar class by Philip Kluz (Philip.Kluz@zuui.org)

167
Pods/SWRevealViewController/README.md generated Normal file
View File

@ -0,0 +1,167 @@
# SWRevealViewController
A UIViewController subclass for revealing a rear (left and/or right) view controller behind a front controller, inspired by the Facebook app, done right!
## NOTE ( Version 2.3)
* This version fixes an old bug that caused an incorrect initialization of the class on particular scenarios.
* The old RevealControllerStoryboardExample has been removed from the report as it was deprecated, please look at the newest RevealControllerStoryboardExample2 instead.
## NOTE ( Upgrading to Version 2.1)
This version incorporates a new approach to Story Boards support.
* There are now two different segue classes, SWRevealViewControllerSegueSetController and SWRevealViewControllerSeguePushController. The first one is meant to set the revealViewController with the initial controllers from the story board. The second one is used to push controllers to the front with animation. The former SWRevealViewControllerSegue still works but it has been deprecated.
* A new StoryBoard example, RevealControllerStoryBoardExample2, has been added to demonstrate the use of the new segue classes. More responsability has been moved to the Story Board design while simplifying the SWRevealViewController implementation.
## IMPORTANT NOTE: (Upgrading to Version 2.0)
A number of changes have been made on version 2.0 that may break your existing project. In case you are not ready to upgrade you can continue using previous versions. The last commit before 2.0.0 was tagged v1.1.3. The important changes that affect 2.0.0 are described next.
* Dropped support for iOS6 and earlier. This version will only work on iOS7
* The method `setFrontViewController:animated:` does no longer behave as previously. Particularly, it does not perform a full reveal animation. Instead it just replaces the frontViewController at its current position with optional animation. Use the new `pushFrontViewController:animated:` method as a replacement for your previous calls to `setFrontViewController:animated:`.
* Added support for animated replacement of child controllers. The methods `setRearViewController`, `setFrontViewController`, `setRightViewController` now all have animated versions. The default animation is a Cross Dissolve effect. You can set the duration of the view controller replacement animation with `replaceViewAnimationDuration`
* You can create custom viewController transition animations by providing an object implementing the `UIViewControllerAnimatedTransitioning` protocol.
* Added the following new delegate methods
```
- (void)revealController:(SWRevealViewController *)revealController willAddViewController:(UIViewController *)viewController forOperation:(SWRevealControllerOperation)operation animated:(BOOL)animated;
- (void)revealController:(SWRevealViewController *)revealController didAddViewController:(UIViewController *)viewController forOperation:(SWRevealControllerOperation)operation animated:(BOOL)animated;
- (id<UIViewControllerAnimatedTransitioning>)revealController:(SWRevealViewController *)revealController animationControllerForOperation:(SWRevealControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC;
```
* The examples have been updated to demonstrate the new features. All animated calls to `setFrontViewController:animated:` have been replaced by calls to `pushFrontViewController:animated:`. The RevealControllerProject example implements a custom Animation Controller (`UIViewControllerAnimatedTransitioning`) to perform a slide up transition on replacement of the rightViewController. The RevealControllerProject3 example uses the default Cross Dissolve animation to set the Front Controller.
## Features
* A Reveal view controller implemented using view controller containment.
* Support for custom viewController transition animations through UIViewControllerAnimatedTransitioning protocol
* API easier than a UINavigationController.
* Support for any combination of left/right rear controllers.
* Correct handling of appearance methods on its child controllers that you can rely on.
* Correct handling of rotations.
* Can be embedded as a child view controller of other controllers or deployed as the rootViewController.
* Plays nicely with any child view controllers or parent controllers.
* Can be deployed as a child of itself to create cascade-like, hierarchical interfaces.
* Seamless integration of pan gesture recognizer, behaving as smooth as silk.
* A category method on UIViewController, `revealViewController`, to get the parent `SWRevealViewController` of any child controller, similar to the UIViewController's property `navigationController`.
* Comprehensive set of delegate methods for getting full state of the controller and implementing your own code hooks for customizing behavior.
* Lightweight, clean, easy-to-read, self-documenting code that you will enjoy using in your projects.
## YouTube Video
[http://youtu.be/8qYxGRJ3ZdA](http://youtu.be/8qYxGRJ3ZdA)
## Examples
The repo includes the following example projects that can be used as templates or for testing purposes
* RevealControllerProject.xcodeproj
* RevealControllerProject2.xcodeproj
* RevealControllerProject3.xcodeproj
* RevealControllerStoryboardExample.xcodeproj
![Image](https://raw.github.com/John-Lluch/SWRevealViewController/master/RevealControllerProject.png)
                   
![Image](https://raw.github.com/John-Lluch/SWRevealViewController/master/RevealControllerProject3_b.png)
## Requirements
* iOS 7.0 or later.
* ARC memory management.
## Usage
The SWRevealViewController repository attempts to provide an updated cocoaPods file and consistent tag versioning, but it is not actively updated on the cocoapods-specs repository.
The easiest way to install it is by copying the following to your project:
* SWRevealViewController.h
* SWRevealViewController.m
On your project:
* Initialize an instance of a SWRevealViewController passing in a "rear" and a "front" view controllers.
* Optionaly add a "right" view controller or pass nil as the "rear" view controller.
* Use the SWRevealViewController instance in your code as you would use any view controller.
* Deploy as the application window rootViewController, or as a child of other containment controllers.
* Get the panGestureRecognized and tapGestureRecognizer provided by the SWRevealViewController. You can leave them as they are for the default behavior or you can add them to a suitable view on your "front" view controller. For example add the panGestureRecognizer to a navigationBar on the viewDidLoad method of your front controller.
* At any time, you can reveal, conceal the "rear" or "right" views or replace any of the view controllers, programmatically or based on user actions, with or without animations enabled
## Basic API Description
Initializing a SWRevealViewController:
- (id)initWithRearViewController:(UIViewController *)rearViewController frontViewController:(UIViewController *)frontViewController;
Setting a right view controller:
@property (strong, nonatomic) UIViewController *rightViewController;
Animated setting of the front view controller:
- (void)pushFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated;
Animating the position of the front view controller. Position can be: `FrontViewPositionLeftSideMostRemoved`, `FrontViewPositionLeftSideMost`, `FrontViewPositionLeftSide`, `FrontViewPositionLeft`, `FrontViewPositionRight`, `FrontViewPositionRightMost` or `FrontViewPositionRightMostRemoved`
- (void)setFrontViewPosition:(FrontViewPosition)frontViewPosition animated:(BOOL)animated;
Creating and obtaining a pan gesture recognizer:
- (UIPanGestureRecognizer*)panGestureRecognizer;
Creating and obtaining a tap gesture recognizer:
- (UITapGestureRecognizer*)tapGestureRecognizer;
Other methods are documented in the SWRevealViewController.h header file.
## Release Notes
As of November 15, 2013 Release Notes are updated on the class main header file. Please see `SWRevealViewController.h`
## Tutorials
* Some time ago the guys at AppCoda published an online tutorial featuring the SWRevealViewController: "How To Add a Slide-out Sidebar Menu in Your Apps" (thanks for that). You will find it at http://www.appcoda.com/ios-programming-sidebar-navigation-menu/ . Not updated to the last SWRevealViewController version but still worth a read.
* Tammy Coron on Ray Wenderlich blog made an excelent tutorial on "how to build a slide-out navigation panel". She recomends the SWRevealViewController in case you do not want to implement one yourself. http://www.raywenderlich.com/32054/how-to-create-a-slide-out-navigation-like-facebook-and-path
* You can also check "Drawer View iOS App with SWRevealViewController" at http://bcdilumonline.blogspot.com.es/2014/03/drawer-view-ios-app-with.html for step by step instructions on how to install and use the controller. Worth a read for those who do not quite feel at home with storyboards :-)
* I also found this one in Spanish "Sidebar o menú lateral mediante SWRevealViewController" by wikimovil.es at http://wikimovil.es/sidebar-o-menu-lateral-mediante-swrevealviewcontroller-parte-1/ which is doing a good job with detailed explanations on how to implement it using Story Boards (before V2.1)
## Xamarin Binding
Thanks to Jesper Vandborg for having contributed with a Xamarin Binding project for this controller that is available for download at https://github.com/Vandborg/SWRevealViewController-XamarinBinding.
## Special Mentions
A Special Thank you to Joan Martin who formely worked at http://www.sweetwilliamsl.com and has recently been developing an app for http://www.citizen.tv. He had the original idea and implemented code for generic view deployment/undeployment and replacement of view controllers used in the class.
Early code and api was inspired on a similar class by Philip Kluz (Philip.Kluz@zuui.org)
## License
Copyright (c) 2013 Joan Lluch <joan.lluch@sweetwilliamsl.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -0,0 +1,418 @@
/*
Copyright (c) 2013 Joan Lluch <joan.lluch@sweetwilliamsl.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
Early code inspired on a similar class by Philip Kluz (Philip.Kluz@zuui.org)
*/
/*
RELEASE NOTES
Version 2.3.0 (Current Version)
- StoryBoard initializing bug fix
- Minor Code refactoring
Version 2.2.0
- State Restoration support.
- Reverted panGestureRecognizer implementation to before v2.1.0 (works better).
- New properties 'toggleAnimationType', 'springDampingRatio'. Default reveal animation is 'Spring'
- New property 'frontViewShadowColor'
- New properties 'clipsViewsToBounds' and '_extendedPointInsideHit'
- New delegate methods for finer control of front view location in the overdraw area, as long as deprecation note on former delegate methods
- Other minor changes that should not affect current implementations
Version 2.1.0
- Removed SWDirectionPanGestureRecognizer. Horizontal panning is filtered on the shouldBegin delegate. This is cleaner, I hope it does not break previous funcionality
- Took a cleaner approach to storyboard support. SWRevealViewControllerSegue is now deprecated and you should use SWRevealViewControllerSegueSetController and SWRevealViewControllerSeguePushController instead.
- A minor change on the autoresizingMask of the internal views to fix a glitch on iOS8. This should not affect iOS7
Version 2.0.2
- Added new delegates for better control of gesture recognizers
Version 2.0.1
- Fix: draggableBorderWidth now correctly handles the cases where one of the rear controllers is not provided
- Fix: the shadow related properties are now granted at any time after view load, not just after initialization.
Version 2.0.0
- Dropped support for iOS6 and earlier. This version will only work on iOS7
- The method setFrontViewController:animated: does not longer perform a full reveal animation. Instead it just replaces the frontViewController in
its current position. Use the new pushFrontViewController:animated: method to perform a replacement of the front controlles with reveal animation
as in the previous version
IMPORTANT: You must replace all calls to setFrontViewController:animated by calls to pushFrontViewController:animated to prevent breaking
functionality on existing projects.
- Added support for animated replacement of child controllers: setRearViewController, setFrontViewController, setRightViewController now have animated versions.
- The new 'replaceViewAnimationDuration' property sets the default duration of child viewController replacement.
- Added the following new delegate methods
revealController:willAddViewController:forOperation:animated:
revealController:didAddViewController:forOperation:animated:
- The class also supports custom UIViewControllerAnimatedTransitioning related with the replacement of child viewControllers.
You can implement the following new delegate method: revealController:animationControllerForOperation:fromViewController:toViewController:
and provide an object conforming to UIViewControllerAnimatedTransitioning to implement custom animations.
Version 1.1.3
- Reverted the supportedInterfaceOrientations to the default behavior. This is consistent with Apple provided controllers
- The presentFrontViewHierarchically now dynamically takes into account the smaller header height of bars on iPhone landscape orientation
Version 1.1.2
- The status bar style and appearance are now handled in sync with the class animations.
You can implement the methods preferredStatusBarStyle and prefersStatusBarHidden on your child controllers to define the desired appearance
- The loadView method now calls a method, loadStoryboardControllers, just for the purpose of loading child controllers from a storyboard.
You can override this method and remove the @try @catch statements if you want the debugger not to stop at them in case you have set an exception breakpoint.
Version 1.1.1
- You can now get a tapGestureRecognizer from the class. See the tapGestureRecognizer method for more information.
- Both the panGestureRecognizer and the tapGestureRecognizer are now attached to the revealViewController's front content view
by default, so they will start working just by calling their access methods even if you do not attach them to any of your views.
This enables you to dissable interactions on your views -for example based on position- without breaking normal gesture behavior.
- Corrected a bug that caused a crash on iOS6 and earlier.
Version 1.1.0
- The method setFrontViewController:animated now performs the correct animations both for left and right controllers.
- The class now automatically handles the status bar appearance depending on the currently shown child controller.
Version 1.0.8
- Support for constant width frontView by setting a negative value to reveal widths. See properties rearViewRevealWidth and rightViewRevealWidth
- Support for draggableBorderWidth. See property of the same name.
- The Pan gesture recongnizer can be disabled by implementing the following delegate method and returning NO
revealControllerPanGestureShouldBegin:
- Added the ability to track pan gesture reveal progress through the following new delegate methods
revealController:panGestureBeganFromLocation:progress:
revealController:panGestureMovedToLocation:progress:
revealController:panGestureEndedToLocation:progress:
Previous Versions
- No release notes were updated for previous versions.
*/
#import <UIKit/UIKit.h>
@class SWRevealViewController;
@protocol SWRevealViewControllerDelegate;
#pragma mark - SWRevealViewController Class
// Enum values for setFrontViewPosition:animated:
typedef NS_ENUM( NSInteger, FrontViewPosition)
{
// Front controller is removed from view. Animated transitioning from this state will cause the same
// effect than animating from FrontViewPositionLeftSideMost. Use this instead of FrontViewPositionLeftSideMost when
// you want to remove the front view controller view from the view hierarchy.
FrontViewPositionLeftSideMostRemoved,
// Left most position, front view is presented left-offseted by rightViewRevealWidth+rigthViewRevealOverdraw
FrontViewPositionLeftSideMost,
// Left position, front view is presented left-offseted by rightViewRevealWidth
FrontViewPositionLeftSide,
// Center position, rear view is hidden behind front controller
FrontViewPositionLeft,
// Right possition, front view is presented right-offseted by rearViewRevealWidth
FrontViewPositionRight,
// Right most possition, front view is presented right-offseted by rearViewRevealWidth+rearViewRevealOverdraw
FrontViewPositionRightMost,
// Front controller is removed from view. Animated transitioning from this state will cause the same
// effect than animating from FrontViewPositionRightMost. Use this instead of FrontViewPositionRightMost when
// you intent to remove the front controller view from the view hierarchy.
FrontViewPositionRightMostRemoved,
};
// Enum values for toggleAnimationType
typedef NS_ENUM(NSInteger, SWRevealToggleAnimationType)
{
SWRevealToggleAnimationTypeSpring, // <- produces a spring based animation
SWRevealToggleAnimationTypeEaseOut, // <- produces an ease out curve animation
};
@interface SWRevealViewController : UIViewController
/* Basic API */
// Object instance init and rear view setting
- (id)initWithRearViewController:(UIViewController *)rearViewController frontViewController:(UIViewController *)frontViewController;
// Rear view controller, can be nil if not used
@property (nonatomic) UIViewController *rearViewController;
- (void)setRearViewController:(UIViewController *)rearViewController animated:(BOOL)animated;
// Optional right view controller, can be nil if not used
@property (nonatomic) UIViewController *rightViewController;
- (void)setRightViewController:(UIViewController *)rightViewController animated:(BOOL)animated;
// Front view controller, can be nil on initialization but must be supplied by the time the view is loaded
@property (nonatomic) UIViewController *frontViewController;
- (void)setFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated;
// Sets the frontViewController using a default set of chained animations consisting on moving the
// presented frontViewController to the right most possition, replacing it, and moving it back to the left position
- (void)pushFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated;
// Sets the frontViewController position. You can call the animated version several times with different
// positions to obtain a set of animations that will be performed in order one after the other.
@property (nonatomic) FrontViewPosition frontViewPosition;
- (void)setFrontViewPosition:(FrontViewPosition)frontViewPosition animated:(BOOL)animated;
// The following methods are meant to be directly connected to the action method of a button
// to perform user triggered postion change of the controller views. This is ussually added to a
// button on top left or right of the frontViewController
- (IBAction)revealToggle:(id)sender;
- (IBAction)rightRevealToggle:(id)sender; // <-- simetric implementation of the above for the rightViewController
// Toogles the current state of the front controller between Left or Right and fully visible
// Use setFrontViewPosition to set a particular position
- (void)revealToggleAnimated:(BOOL)animated;
- (void)rightRevealToggleAnimated:(BOOL)animated; // <-- simetric implementation of the above for the rightViewController
// The following method will provide a panGestureRecognizer suitable to be added to any view
// in order to perform usual drag and swipe gestures to reveal the rear views. This is usually added to the top bar
// of a front controller, but it can be added to your frontViewController view or to the reveal controller view to provide full screen panning.
// By default, the panGestureRecognizer is added to the view containing the front controller view. To keep this default behavior
// you still need to call this method, just don't add it to any of your views. The default setup allows you to dissable
// user interactions on your controller views without affecting the recognizer.
- (UIPanGestureRecognizer*)panGestureRecognizer;
// The following method will provide a tapGestureRecognizer suitable to be added to any view on the frontController
// for concealing the rear views. By default no tap recognizer is created or added to any view, however if you call this method after
// the controller's view has been loaded the recognizer is added to the reveal controller's front container view.
// Thus, you can disable user interactions on your frontViewController view without affecting the tap recognizer.
- (UITapGestureRecognizer*)tapGestureRecognizer;
/* The following properties are provided for further customization, they are set to default values on initialization,
you do not generally have to set them */
// Defines how much of the rear or right view is shown, default is 260.
// Negative values indicate that the reveal width should be computed by substracting the full front view width,
// so the revealed frontView width is kept constant when bounds change as opposed to the rear or right width.
@property (nonatomic) CGFloat rearViewRevealWidth;
@property (nonatomic) CGFloat rightViewRevealWidth; // <-- simetric implementation of the above for the rightViewController
// Defines how much of an overdraw can occur when dragging further than 'rearViewRevealWidth', default is 60.
@property (nonatomic) CGFloat rearViewRevealOverdraw;
@property (nonatomic) CGFloat rightViewRevealOverdraw; // <-- simetric implementation of the above for the rightViewController
// Defines how much displacement is applied to the rear view when animating or dragging the front view, default is 40.
@property (nonatomic) CGFloat rearViewRevealDisplacement;
@property (nonatomic) CGFloat rightViewRevealDisplacement; // <-- simetric implementation of the above for the rightViewController
// Defines a width on the border of the view attached to the panGesturRecognizer where the gesture is allowed,
// default is 0 which means no restriction.
@property (nonatomic) CGFloat draggableBorderWidth;
// If YES (the default) the controller will bounce to the Left position when dragging further than 'rearViewRevealWidth'
@property (nonatomic) BOOL bounceBackOnOverdraw;
@property (nonatomic) BOOL bounceBackOnLeftOverdraw; // <-- simetric implementation of the above for the rightViewController
// If YES (default is NO) the controller will allow permanent dragging up to the rightMostPosition
@property (nonatomic) BOOL stableDragOnOverdraw;
@property (nonatomic) BOOL stableDragOnLeftOverdraw; // <-- simetric implementation of the above for the rightViewController
// If YES (default is NO) the front view controller will be ofsseted vertically by the height of a navigation bar.
// Use this on iOS7 when you add an instance of RevealViewController as a child of a UINavigationController (or another SWRevealViewController)
// and you want the front view controller to be presented below the navigation bar of its UINavigationController grand parent.
// The rearViewController will still appear full size and blurred behind the navigation bar of its UINavigationController grand parent
@property (nonatomic) BOOL presentFrontViewHierarchically;
// Velocity required for the controller to toggle its state based on a swipe movement, default is 250
@property (nonatomic) CGFloat quickFlickVelocity;
// Duration for the revealToggle animation, default is 0.25
@property (nonatomic) NSTimeInterval toggleAnimationDuration;
// Animation type, default is SWRevealToggleAnimationTypeSpring
@property (nonatomic) SWRevealToggleAnimationType toggleAnimationType;
// When animation type is SWRevealToggleAnimationTypeSpring determines the damping ratio, default is 1
@property (nonatomic) CGFloat springDampingRatio;
// Duration for animated replacement of view controllers
@property (nonatomic) NSTimeInterval replaceViewAnimationDuration;
// Defines the radius of the front view's shadow, default is 2.5f
@property (nonatomic) CGFloat frontViewShadowRadius;
// Defines the radius of the front view's shadow offset default is {0.0f,2.5f}
@property (nonatomic) CGSize frontViewShadowOffset;
// Defines the front view's shadow opacity, default is 1.0f
@property (nonatomic) CGFloat frontViewShadowOpacity;
// Defines the front view's shadow color, default is blackColor
@property (nonatomic) UIColor *frontViewShadowColor;
// Defines whether the controller should clip subviews to its view bounds. Default is NO.
// Set this to YES when you are presenting this controller as a non full-screen child of a
// custom container controller which does not explicitly clips its subviews.
@property (nonatomic) BOOL clipsViewsToBounds;
// Defines whether your views clicable area extends beyond the bounds of this controller. Default is NO.
// Set this to YES if you are presenting this controller as a non full-screen child of a custom container and you are not
// clipping your front view to this controller bounds.
@property (nonatomic) BOOL extendsPointInsideHit;
/* The class properly handles all the relevant calls to appearance methods on the contained controllers.
Moreover you can assign a delegate to let the class inform you on positions and animation activity */
// Delegate
@property (nonatomic,weak) id<SWRevealViewControllerDelegate> delegate;
@end
#pragma mark - SWRevealViewControllerDelegate Protocol
typedef enum
{
SWRevealControllerOperationNone,
SWRevealControllerOperationReplaceRearController,
SWRevealControllerOperationReplaceFrontController,
SWRevealControllerOperationReplaceRightController,
} SWRevealControllerOperation;
@protocol SWRevealViewControllerDelegate<NSObject>
@optional
// The following delegate methods will be called before and after the front view moves to a position
- (void)revealController:(SWRevealViewController *)revealController willMoveToPosition:(FrontViewPosition)position;
- (void)revealController:(SWRevealViewController *)revealController didMoveToPosition:(FrontViewPosition)position;
// This will be called inside the reveal animation, thus you can use it to place your own code that will be animated in sync
- (void)revealController:(SWRevealViewController *)revealController animateToPosition:(FrontViewPosition)position;
// Implement this to return NO when you want the pan gesture recognizer to be ignored
- (BOOL)revealControllerPanGestureShouldBegin:(SWRevealViewController *)revealController;
// Implement this to return NO when you want the tap gesture recognizer to be ignored
- (BOOL)revealControllerTapGestureShouldBegin:(SWRevealViewController *)revealController;
// Implement this to return YES if you want other gesture recognizer to share touch events with the pan gesture
- (BOOL)revealController:(SWRevealViewController *)revealController
panGestureRecognizerShouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
// Implement this to return YES if you want other gesture recognizer to share touch events with the tap gesture
- (BOOL)revealController:(SWRevealViewController *)revealController
tapGestureRecognizerShouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
// Called when the gestureRecognizer began and ended
- (void)revealControllerPanGestureBegan:(SWRevealViewController *)revealController;
- (void)revealControllerPanGestureEnded:(SWRevealViewController *)revealController;
// The following methods provide a means to track the evolution of the gesture recognizer.
// The 'location' parameter is the X origin coordinate of the front view as the user drags it
// The 'progress' parameter is a number ranging from 0 to 1 indicating the front view location relative to the
// rearRevealWidth or rightRevealWidth. 1 is fully revealed, dragging ocurring in the overDraw region will result in values above 1.
// The 'overProgress' parameter is a number ranging from 0 to 1 indicating the front view location relative to the
// overdraw region. 0 is fully revealed, 1 is fully overdrawn. Negative values occur inside the normal reveal region
- (void)revealController:(SWRevealViewController *)revealController panGestureBeganFromLocation:(CGFloat)location progress:(CGFloat)progress overProgress:(CGFloat)overProgress;
- (void)revealController:(SWRevealViewController *)revealController panGestureMovedToLocation:(CGFloat)location progress:(CGFloat)progress overProgress:(CGFloat)overProgress;
- (void)revealController:(SWRevealViewController *)revealController panGestureEndedToLocation:(CGFloat)location progress:(CGFloat)progress overProgress:(CGFloat)overProgress;
// Notification of child controller replacement
- (void)revealController:(SWRevealViewController *)revealController willAddViewController:(UIViewController *)viewController
forOperation:(SWRevealControllerOperation)operation animated:(BOOL)animated;
- (void)revealController:(SWRevealViewController *)revealController didAddViewController:(UIViewController *)viewController
forOperation:(SWRevealControllerOperation)operation animated:(BOOL)animated;
// Support for custom transition animations while replacing child controllers. If implemented, it will be fired in response
// to calls to 'setXXViewController' methods
- (id<UIViewControllerAnimatedTransitioning>)revealController:(SWRevealViewController *)revealController
animationControllerForOperation:(SWRevealControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC;
// DEPRECATED - The following delegate methods will be removed some time in the future
- (void)revealController:(SWRevealViewController *)revealController panGestureBeganFromLocation:(CGFloat)location progress:(CGFloat)progress; // (DEPRECATED)
- (void)revealController:(SWRevealViewController *)revealController panGestureMovedToLocation:(CGFloat)location progress:(CGFloat)progress; // (DEPRECATED)
- (void)revealController:(SWRevealViewController *)revealController panGestureEndedToLocation:(CGFloat)location progress:(CGFloat)progress; // (DEPRECATED)
@end
#pragma mark - UIViewController(SWRevealViewController) Category
// A category of UIViewController to let childViewControllers easily access their parent SWRevealViewController
@interface UIViewController(SWRevealViewController)
- (SWRevealViewController*)revealViewController;
@end
#pragma mark - StoryBoard support Classes
/* StoryBoard support */
// String identifiers to be applied to segues on a storyboard
extern NSString* const SWSegueRearIdentifier; // this is @"sw_rear"
extern NSString* const SWSegueFrontIdentifier; // this is @"sw_front"
extern NSString* const SWSegueRightIdentifier; // this is @"sw_right"
/* This will allow the class to be defined on a storyboard */
// Use this along with one of the above segue identifiers to segue to the initial state
@interface SWRevealViewControllerSegueSetController : UIStoryboardSegue
@end
// Use this to push a view controller
@interface SWRevealViewControllerSeguePushController : UIStoryboardSegue
@end
//#pragma mark - SWRevealViewControllerSegue (DEPRECATED)
//
//@interface SWRevealViewControllerSegue : UIStoryboardSegue // DEPRECATED: USE SWRevealViewControllerSegueSetController instead
//@property (nonatomic, strong) void(^performBlock)( SWRevealViewControllerSegue* segue, UIViewController* svc, UIViewController* dvc );
//@end

File diff suppressed because it is too large Load Diff

View File

@ -77,7 +77,7 @@ if let userName = json[999999]["wrong_key"]["wrong_name"].string {
## Requirements ## Requirements
- iOS 7.0+ / OS X 10.9+ - iOS 7.0+ / Mac OS X 10.9+
- Xcode 7 - Xcode 7
##Integration ##Integration
@ -100,22 +100,6 @@ You can use [Carthage](https://github.com/Carthage/Carthage) to install `SwiftyJ
github "SwiftyJSON/SwiftyJSON" github "SwiftyJSON/SwiftyJSON"
``` ```
####Swift Package Manager
You can use [The Swift Package Manager](https://swift.org/package-manager) to install `SwiftyJSON` by adding the proper description to your `Package.swift` file:
```swift
import PackageDescription
let package = Package(
name: "YOUR_PROJECT_NAME",
targets: [],
dependencies: [
.Package(url: "https://github.com/SwiftyJSON/SwiftyJSON.git", versions: "2.3.3" ..< Version.max)
]
)
```
Note that the [Swift Package Manager](https://swift.org/package-manager) is still in early design and development, for more infomation checkout its [GitHub Page](https://github.com/apple/swift-package-manager)
####Manually (iOS 7+, OS X 10.9+) ####Manually (iOS 7+, OS X 10.9+)
To use this library in your project manually you may: To use this library in your project manually you may:

View File

@ -118,7 +118,7 @@ public struct JSON {
- returns: The created JSON - returns: The created JSON
*/ */
public init(_ jsonDictionary:[String: JSON]) { public init(_ jsonDictionary:[String: JSON]) {
var dictionary = [String: AnyObject](minimumCapacity: jsonDictionary.count) var dictionary = [String: AnyObject]()
for (key, json) in jsonDictionary { for (key, json) in jsonDictionary {
dictionary[key] = json.object dictionary[key] = json.object
} }
@ -235,7 +235,7 @@ extension JSON : Swift.CollectionType, Swift.SequenceType, Swift.Indexable {
} }
} }
/// If `type` is `.Array` or `.Dictionary`, return `array.isEmpty` or `dictonary.isEmpty` otherwise return `true`. /// If `type` is `.Array` or `.Dictionary`, return `array.empty` or `dictonary.empty` otherwise return `true`.
public var isEmpty: Bool { public var isEmpty: Bool {
get { get {
switch self.type { switch self.type {
@ -396,9 +396,7 @@ public struct JSONGenerator : GeneratorType {
switch self.type { switch self.type {
case .Array: case .Array:
if let o = self.arrayGenerate?.next() { if let o = self.arrayGenerate?.next() {
let i = self.arrayIndex return (String(self.arrayIndex++), JSON(o))
self.arrayIndex += 1
return (String(i), JSON(o))
} else { } else {
return nil return nil
} }
@ -442,7 +440,7 @@ extension String: JSONSubscriptType {
extension JSON { extension JSON {
/// If `type` is `.Array`, return json whose object is `array[index]`, otherwise return null json with error. /// If `type` is `.Array`, return json which's object is `array[index]`, otherwise return null json with error.
private subscript(index index: Int) -> JSON { private subscript(index index: Int) -> JSON {
get { get {
if self.type != .Array { if self.type != .Array {
@ -466,7 +464,7 @@ extension JSON {
} }
} }
/// If `type` is `.Dictionary`, return json whose object is `dictionary[key]` , otherwise return null json with error. /// If `type` is `.Dictionary`, return json which's object is `dictionary[key]` , otherwise return null json with error.
private subscript(key key: String) -> JSON { private subscript(key key: String) -> JSON {
get { get {
var r = JSON.null var r = JSON.null
@ -537,7 +535,7 @@ extension JSON {
} }
/** /**
Find a json in the complex data structures by using the Int/String's array. Find a json in the complex data structuresby using the Int/String's array.
- parameter path: The target json's path. Example: - parameter path: The target json's path. Example:
@ -598,7 +596,7 @@ extension JSON: Swift.FloatLiteralConvertible {
extension JSON: Swift.DictionaryLiteralConvertible { extension JSON: Swift.DictionaryLiteralConvertible {
public init(dictionaryLiteral elements: (String, AnyObject)...) { public init(dictionaryLiteral elements: (String, AnyObject)...) {
self.init(elements.reduce([String : AnyObject](minimumCapacity: elements.count)){(dictionary: [String : AnyObject], element:(String, AnyObject)) -> [String : AnyObject] in self.init(elements.reduce([String : AnyObject]()){(dictionary: [String : AnyObject], element:(String, AnyObject)) -> [String : AnyObject] in
var d = dictionary var d = dictionary
d[element.0] = element.1 d[element.0] = element.1
return d return d
@ -733,7 +731,7 @@ extension JSON {
//Optional [String : JSON] //Optional [String : JSON]
public var dictionary: [String : JSON]? { public var dictionary: [String : JSON]? {
if self.type == .Dictionary { if self.type == .Dictionary {
return self.rawDictionary.reduce([String : JSON](minimumCapacity: count)) { (dictionary: [String : JSON], element: (String, AnyObject)) -> [String : JSON] in return self.rawDictionary.reduce([String : JSON]()) { (dictionary: [String : JSON], element: (String, AnyObject)) -> [String : JSON] in
var d = dictionary var d = dictionary
d[element.0] = JSON(element.1) d[element.0] = JSON(element.1)
return d return d
@ -906,7 +904,7 @@ extension JSON {
self.object = NSNull() self.object = NSNull()
} }
} }
public func exists() -> Bool{ public func isExists() -> Bool{
if let errorValue = error where errorValue.code == ErrorNotExist{ if let errorValue = error where errorValue.code == ErrorNotExist{
return false return false
} }

View File

@ -0,0 +1,5 @@
#import <Foundation/Foundation.h>
@interface PodsDummy_BSGridCollectionViewLayout : NSObject
@end
@implementation PodsDummy_BSGridCollectionViewLayout
@end

View File

@ -0,0 +1,4 @@
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#endif

View File

@ -0,0 +1,6 @@
#import <UIKit/UIKit.h>
FOUNDATION_EXPORT double BSGridCollectionViewLayoutVersionNumber;
FOUNDATION_EXPORT const unsigned char BSGridCollectionViewLayoutVersionString[];

View File

@ -0,0 +1,6 @@
framework module BSGridCollectionViewLayout {
umbrella header "BSGridCollectionViewLayout-umbrella.h"
export *
module * { export * }
}

View File

@ -0,0 +1,9 @@
CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/BSGridCollectionViewLayout
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseStorage" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities"
OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS"
PODS_BUILD_DIR = $BUILD_DIR
PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES

View File

@ -0,0 +1,26 @@
<?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>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.1.1</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${CURRENT_PROJECT_VERSION}</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

View File

@ -0,0 +1,5 @@
#import <Foundation/Foundation.h>
@interface PodsDummy_BSImagePicker : NSObject
@end
@implementation PodsDummy_BSImagePicker
@end

View File

@ -0,0 +1,4 @@
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#endif

View File

@ -0,0 +1,6 @@
#import <UIKit/UIKit.h>
FOUNDATION_EXPORT double BSImagePickerVersionNumber;
FOUNDATION_EXPORT const unsigned char BSImagePickerVersionString[];

View File

@ -0,0 +1,6 @@
framework module BSImagePicker {
umbrella header "BSImagePicker-umbrella.h"
export *
module * { export * }
}

View File

@ -0,0 +1,11 @@
CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/BSImagePicker
FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/BSGridCollectionViewLayout" "$PODS_CONFIGURATION_BUILD_DIR/UIImageViewModeScaleAspect"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseStorage" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities"
OTHER_LDFLAGS = -framework "Photos" -framework "UIKit"
OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS"
PODS_BUILD_DIR = $BUILD_DIR
PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES

View File

@ -0,0 +1,26 @@
<?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>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>2.3.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${CURRENT_PROJECT_VERSION}</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

View File

@ -0,0 +1,24 @@
<?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>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleIdentifier</key>
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>2.3.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

View File

@ -482,6 +482,52 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. THE SOFTWARE.
## BSGridCollectionViewLayout
Copyright (c) 2015 Joakim Gyllstrom <joakim@backslashed.se>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
## BSImagePicker
Copyright (c) 2015 Joakim Gyllstrom <joakim@backslashed.se>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
## Bolts ## Bolts
BSD License BSD License
@ -896,6 +942,30 @@ SOFTWARE.
## SWRevealViewController
Copyright (c) 2013 Joan Lluch <joan.lluch@sweetwilliamsl.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
Early code inspired on a similar class by Philip Kluz (Philip.Kluz@zuui.org)
## SwiftyJSON ## SwiftyJSON
The MIT License (MIT) The MIT License (MIT)
@ -944,4 +1014,26 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
## UIImageViewModeScaleAspect
Copyright (c) 2013 Vivien Cormier (http://www.viviencormier.fr/)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
Generated by CocoaPods - https://cocoapods.org Generated by CocoaPods - https://cocoapods.org

View File

@ -513,6 +513,60 @@ THE SOFTWARE.
<key>Type</key> <key>Type</key>
<string>PSGroupSpecifier</string> <string>PSGroupSpecifier</string>
</dict> </dict>
<dict>
<key>FooterText</key>
<string>Copyright (c) 2015 Joakim Gyllstrom &lt;joakim@backslashed.se&gt;
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
</string>
<key>Title</key>
<string>BSGridCollectionViewLayout</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>Copyright (c) 2015 Joakim Gyllstrom &lt;joakim@backslashed.se&gt;
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
</string>
<key>Title</key>
<string>BSImagePicker</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict> <dict>
<key>FooterText</key> <key>FooterText</key>
<string>BSD License <string>BSD License
@ -999,6 +1053,34 @@ SOFTWARE.
<key>Type</key> <key>Type</key>
<string>PSGroupSpecifier</string> <string>PSGroupSpecifier</string>
</dict> </dict>
<dict>
<key>FooterText</key>
<string> Copyright (c) 2013 Joan Lluch &lt;joan.lluch@sweetwilliamsl.com&gt;
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
Early code inspired on a similar class by Philip Kluz (Philip.Kluz@zuui.org)</string>
<key>Title</key>
<string>SWRevealViewController</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict> <dict>
<key>FooterText</key> <key>FooterText</key>
<string>The MIT License (MIT) <string>The MIT License (MIT)
@ -1056,6 +1138,32 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
<key>Type</key> <key>Type</key>
<string>PSGroupSpecifier</string> <string>PSGroupSpecifier</string>
</dict> </dict>
<dict>
<key>FooterText</key>
<string>Copyright (c) 2013 Vivien Cormier (http://www.viviencormier.fr/)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.</string>
<key>Title</key>
<string>UIImageViewModeScaleAspect</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict> <dict>
<key>FooterText</key> <key>FooterText</key>
<string>Generated by CocoaPods - https://cocoapods.org</string> <string>Generated by CocoaPods - https://cocoapods.org</string>

View File

@ -89,6 +89,8 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then
install_framework "$BUILT_PRODUCTS_DIR/AeroGearOAuth2/AeroGearOAuth2.framework" install_framework "$BUILT_PRODUCTS_DIR/AeroGearOAuth2/AeroGearOAuth2.framework"
install_framework "$BUILT_PRODUCTS_DIR/Alamofire/Alamofire.framework" install_framework "$BUILT_PRODUCTS_DIR/Alamofire/Alamofire.framework"
install_framework "$BUILT_PRODUCTS_DIR/Alamofire-SwiftyJSON/Alamofire_SwiftyJSON.framework" install_framework "$BUILT_PRODUCTS_DIR/Alamofire-SwiftyJSON/Alamofire_SwiftyJSON.framework"
install_framework "$BUILT_PRODUCTS_DIR/BSGridCollectionViewLayout/BSGridCollectionViewLayout.framework"
install_framework "$BUILT_PRODUCTS_DIR/BSImagePicker/BSImagePicker.framework"
install_framework "$BUILT_PRODUCTS_DIR/Bolts/Bolts.framework" install_framework "$BUILT_PRODUCTS_DIR/Bolts/Bolts.framework"
install_framework "$BUILT_PRODUCTS_DIR/FBSDKCoreKit/FBSDKCoreKit.framework" install_framework "$BUILT_PRODUCTS_DIR/FBSDKCoreKit/FBSDKCoreKit.framework"
install_framework "$BUILT_PRODUCTS_DIR/FBSDKLoginKit/FBSDKLoginKit.framework" install_framework "$BUILT_PRODUCTS_DIR/FBSDKLoginKit/FBSDKLoginKit.framework"
@ -97,8 +99,10 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then
install_framework "$BUILT_PRODUCTS_DIR/Locksmith/Locksmith.framework" install_framework "$BUILT_PRODUCTS_DIR/Locksmith/Locksmith.framework"
install_framework "$BUILT_PRODUCTS_DIR/OAuthSwift/OAuthSwift.framework" install_framework "$BUILT_PRODUCTS_DIR/OAuthSwift/OAuthSwift.framework"
install_framework "$BUILT_PRODUCTS_DIR/PicoKit/PicoKit.framework" install_framework "$BUILT_PRODUCTS_DIR/PicoKit/PicoKit.framework"
install_framework "$BUILT_PRODUCTS_DIR/SWRevealViewController/SWRevealViewController.framework"
install_framework "$BUILT_PRODUCTS_DIR/SwiftyJSON/SwiftyJSON.framework" install_framework "$BUILT_PRODUCTS_DIR/SwiftyJSON/SwiftyJSON.framework"
install_framework "$BUILT_PRODUCTS_DIR/TYMActivityIndicatorView/TYMActivityIndicatorView.framework" install_framework "$BUILT_PRODUCTS_DIR/TYMActivityIndicatorView/TYMActivityIndicatorView.framework"
install_framework "$BUILT_PRODUCTS_DIR/UIImageViewModeScaleAspect/UIImageViewModeScaleAspect.framework"
fi fi
if [[ "$CONFIGURATION" == "Release" ]]; then if [[ "$CONFIGURATION" == "Release" ]]; then
install_framework "$BUILT_PRODUCTS_DIR/AFNetworking/AFNetworking.framework" install_framework "$BUILT_PRODUCTS_DIR/AFNetworking/AFNetworking.framework"
@ -106,6 +110,8 @@ if [[ "$CONFIGURATION" == "Release" ]]; then
install_framework "$BUILT_PRODUCTS_DIR/AeroGearOAuth2/AeroGearOAuth2.framework" install_framework "$BUILT_PRODUCTS_DIR/AeroGearOAuth2/AeroGearOAuth2.framework"
install_framework "$BUILT_PRODUCTS_DIR/Alamofire/Alamofire.framework" install_framework "$BUILT_PRODUCTS_DIR/Alamofire/Alamofire.framework"
install_framework "$BUILT_PRODUCTS_DIR/Alamofire-SwiftyJSON/Alamofire_SwiftyJSON.framework" install_framework "$BUILT_PRODUCTS_DIR/Alamofire-SwiftyJSON/Alamofire_SwiftyJSON.framework"
install_framework "$BUILT_PRODUCTS_DIR/BSGridCollectionViewLayout/BSGridCollectionViewLayout.framework"
install_framework "$BUILT_PRODUCTS_DIR/BSImagePicker/BSImagePicker.framework"
install_framework "$BUILT_PRODUCTS_DIR/Bolts/Bolts.framework" install_framework "$BUILT_PRODUCTS_DIR/Bolts/Bolts.framework"
install_framework "$BUILT_PRODUCTS_DIR/FBSDKCoreKit/FBSDKCoreKit.framework" install_framework "$BUILT_PRODUCTS_DIR/FBSDKCoreKit/FBSDKCoreKit.framework"
install_framework "$BUILT_PRODUCTS_DIR/FBSDKLoginKit/FBSDKLoginKit.framework" install_framework "$BUILT_PRODUCTS_DIR/FBSDKLoginKit/FBSDKLoginKit.framework"
@ -114,6 +120,8 @@ if [[ "$CONFIGURATION" == "Release" ]]; then
install_framework "$BUILT_PRODUCTS_DIR/Locksmith/Locksmith.framework" install_framework "$BUILT_PRODUCTS_DIR/Locksmith/Locksmith.framework"
install_framework "$BUILT_PRODUCTS_DIR/OAuthSwift/OAuthSwift.framework" install_framework "$BUILT_PRODUCTS_DIR/OAuthSwift/OAuthSwift.framework"
install_framework "$BUILT_PRODUCTS_DIR/PicoKit/PicoKit.framework" install_framework "$BUILT_PRODUCTS_DIR/PicoKit/PicoKit.framework"
install_framework "$BUILT_PRODUCTS_DIR/SWRevealViewController/SWRevealViewController.framework"
install_framework "$BUILT_PRODUCTS_DIR/SwiftyJSON/SwiftyJSON.framework" install_framework "$BUILT_PRODUCTS_DIR/SwiftyJSON/SwiftyJSON.framework"
install_framework "$BUILT_PRODUCTS_DIR/TYMActivityIndicatorView/TYMActivityIndicatorView.framework" install_framework "$BUILT_PRODUCTS_DIR/TYMActivityIndicatorView/TYMActivityIndicatorView.framework"
install_framework "$BUILT_PRODUCTS_DIR/UIImageViewModeScaleAspect/UIImageViewModeScaleAspect.framework"
fi fi

View File

@ -1,10 +1,10 @@
EMBEDDED_CONTENT_CONTAINS_SWIFT = YES EMBEDDED_CONTENT_CONTAINS_SWIFT = YES
FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/Bolts" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit" "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML" "$PODS_CONFIGURATION_BUILD_DIR/Locksmith" "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift" "$PODS_CONFIGURATION_BUILD_DIR/PicoKit" "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/FirebaseAuth/Frameworks" "${PODS_ROOT}/FirebaseDatabase/Frameworks" "${PODS_ROOT}/FirebaseInstanceID/Frameworks" "${PODS_ROOT}/FirebaseStorage/Frameworks" "${PODS_ROOT}/GoogleInterchangeUtilities/Frameworks" "${PODS_ROOT}/GoogleNetworkingUtilities/Frameworks" "${PODS_ROOT}/GoogleSymbolUtilities/Frameworks" "${PODS_ROOT}/GoogleUtilities/Frameworks" FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/BSGridCollectionViewLayout" "$PODS_CONFIGURATION_BUILD_DIR/BSImagePicker" "$PODS_CONFIGURATION_BUILD_DIR/Bolts" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit" "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML" "$PODS_CONFIGURATION_BUILD_DIR/Locksmith" "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift" "$PODS_CONFIGURATION_BUILD_DIR/PicoKit" "$PODS_CONFIGURATION_BUILD_DIR/SWRevealViewController" "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView" "$PODS_CONFIGURATION_BUILD_DIR/UIImageViewModeScaleAspect" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/FirebaseAuth/Frameworks" "${PODS_ROOT}/FirebaseDatabase/Frameworks" "${PODS_ROOT}/FirebaseInstanceID/Frameworks" "${PODS_ROOT}/FirebaseStorage/Frameworks" "${PODS_ROOT}/GoogleInterchangeUtilities/Frameworks" "${PODS_ROOT}/GoogleNetworkingUtilities/Frameworks" "${PODS_ROOT}/GoogleSymbolUtilities/Frameworks" "${PODS_ROOT}/GoogleUtilities/Frameworks"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) ${PODS_ROOT}/Firebase/Headers $(SDKROOT)/usr/include/libxml2 $(PODS_ROOT)/GDataXML-HTML/libxml $(SDKROOT)/usr/include/libxml2 $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseStorage" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities" HEADER_SEARCH_PATHS = $(inherited) ${PODS_ROOT}/Firebase/Headers $(SDKROOT)/usr/include/libxml2 $(PODS_ROOT)/GDataXML-HTML/libxml $(SDKROOT)/usr/include/libxml2 $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseStorage" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities"
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking/AFNetworking.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp/AeroGearHttp.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2/AeroGearOAuth2.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON/Alamofire_SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Bolts/Bolts.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit/FBSDKCoreKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit/FBSDKLoginKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit/FBSDKShareKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML/GDataXML_HTML.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Locksmith/Locksmith.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift/OAuthSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PicoKit/PicoKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON/SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView/TYMActivityIndicatorView.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseDatabase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseStorage" -isystem "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleUtilities" OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking/AFNetworking.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp/AeroGearHttp.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2/AeroGearOAuth2.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON/Alamofire_SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/BSGridCollectionViewLayout/BSGridCollectionViewLayout.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/BSImagePicker/BSImagePicker.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Bolts/Bolts.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit/FBSDKCoreKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit/FBSDKLoginKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit/FBSDKShareKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML/GDataXML_HTML.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Locksmith/Locksmith.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift/OAuthSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PicoKit/PicoKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SWRevealViewController/SWRevealViewController.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON/SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView/TYMActivityIndicatorView.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/UIImageViewModeScaleAspect/UIImageViewModeScaleAspect.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseDatabase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseStorage" -isystem "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleUtilities"
OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"icucore" -l"sqlite3" -l"z" -framework "AFNetworking" -framework "AdSupport" -framework "AddressBook" -framework "AeroGearHttp" -framework "AeroGearOAuth2" -framework "Alamofire" -framework "Alamofire_SwiftyJSON" -framework "Bolts" -framework "CFNetwork" -framework "CoreGraphics" -framework "FBSDKCoreKit" -framework "FBSDKLoginKit" -framework "FBSDKShareKit" -framework "FirebaseAnalytics" -framework "FirebaseAuth" -framework "FirebaseDatabase" -framework "FirebaseInstanceID" -framework "FirebaseStorage" -framework "GDataXML_HTML" -framework "GoogleInterchangeUtilities" -framework "GoogleNetworkingUtilities" -framework "GoogleSymbolUtilities" -framework "GoogleUtilities" -framework "Locksmith" -framework "MobileCoreServices" -framework "OAuthSwift" -framework "PicoKit" -framework "SafariServices" -framework "Security" -framework "StoreKit" -framework "SwiftyJSON" -framework "SystemConfiguration" -framework "TYMActivityIndicatorView" OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"icucore" -l"sqlite3" -l"z" -framework "AFNetworking" -framework "AdSupport" -framework "AddressBook" -framework "AeroGearHttp" -framework "AeroGearOAuth2" -framework "Alamofire" -framework "Alamofire_SwiftyJSON" -framework "BSGridCollectionViewLayout" -framework "BSImagePicker" -framework "Bolts" -framework "CFNetwork" -framework "CoreGraphics" -framework "FBSDKCoreKit" -framework "FBSDKLoginKit" -framework "FBSDKShareKit" -framework "FirebaseAnalytics" -framework "FirebaseAuth" -framework "FirebaseDatabase" -framework "FirebaseInstanceID" -framework "FirebaseStorage" -framework "GDataXML_HTML" -framework "GoogleInterchangeUtilities" -framework "GoogleNetworkingUtilities" -framework "GoogleSymbolUtilities" -framework "GoogleUtilities" -framework "Locksmith" -framework "MobileCoreServices" -framework "OAuthSwift" -framework "PicoKit" -framework "SWRevealViewController" -framework "SafariServices" -framework "Security" -framework "StoreKit" -framework "SwiftyJSON" -framework "SystemConfiguration" -framework "TYMActivityIndicatorView" -framework "UIImageViewModeScaleAspect"
OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS"
PODS_BUILD_DIR = $BUILD_DIR PODS_BUILD_DIR = $BUILD_DIR
PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

View File

@ -1,10 +1,10 @@
EMBEDDED_CONTENT_CONTAINS_SWIFT = YES EMBEDDED_CONTENT_CONTAINS_SWIFT = YES
FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/Bolts" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit" "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML" "$PODS_CONFIGURATION_BUILD_DIR/Locksmith" "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift" "$PODS_CONFIGURATION_BUILD_DIR/PicoKit" "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/FirebaseAuth/Frameworks" "${PODS_ROOT}/FirebaseDatabase/Frameworks" "${PODS_ROOT}/FirebaseInstanceID/Frameworks" "${PODS_ROOT}/FirebaseStorage/Frameworks" "${PODS_ROOT}/GoogleInterchangeUtilities/Frameworks" "${PODS_ROOT}/GoogleNetworkingUtilities/Frameworks" "${PODS_ROOT}/GoogleSymbolUtilities/Frameworks" "${PODS_ROOT}/GoogleUtilities/Frameworks" FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/BSGridCollectionViewLayout" "$PODS_CONFIGURATION_BUILD_DIR/BSImagePicker" "$PODS_CONFIGURATION_BUILD_DIR/Bolts" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit" "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML" "$PODS_CONFIGURATION_BUILD_DIR/Locksmith" "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift" "$PODS_CONFIGURATION_BUILD_DIR/PicoKit" "$PODS_CONFIGURATION_BUILD_DIR/SWRevealViewController" "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView" "$PODS_CONFIGURATION_BUILD_DIR/UIImageViewModeScaleAspect" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/FirebaseAuth/Frameworks" "${PODS_ROOT}/FirebaseDatabase/Frameworks" "${PODS_ROOT}/FirebaseInstanceID/Frameworks" "${PODS_ROOT}/FirebaseStorage/Frameworks" "${PODS_ROOT}/GoogleInterchangeUtilities/Frameworks" "${PODS_ROOT}/GoogleNetworkingUtilities/Frameworks" "${PODS_ROOT}/GoogleSymbolUtilities/Frameworks" "${PODS_ROOT}/GoogleUtilities/Frameworks"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) ${PODS_ROOT}/Firebase/Headers $(SDKROOT)/usr/include/libxml2 $(PODS_ROOT)/GDataXML-HTML/libxml $(SDKROOT)/usr/include/libxml2 $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseStorage" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities" HEADER_SEARCH_PATHS = $(inherited) ${PODS_ROOT}/Firebase/Headers $(SDKROOT)/usr/include/libxml2 $(PODS_ROOT)/GDataXML-HTML/libxml $(SDKROOT)/usr/include/libxml2 $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseStorage" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities"
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking/AFNetworking.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp/AeroGearHttp.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2/AeroGearOAuth2.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON/Alamofire_SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Bolts/Bolts.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit/FBSDKCoreKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit/FBSDKLoginKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit/FBSDKShareKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML/GDataXML_HTML.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Locksmith/Locksmith.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift/OAuthSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PicoKit/PicoKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON/SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView/TYMActivityIndicatorView.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseDatabase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseStorage" -isystem "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleUtilities" OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking/AFNetworking.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp/AeroGearHttp.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2/AeroGearOAuth2.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON/Alamofire_SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/BSGridCollectionViewLayout/BSGridCollectionViewLayout.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/BSImagePicker/BSImagePicker.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Bolts/Bolts.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit/FBSDKCoreKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit/FBSDKLoginKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit/FBSDKShareKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML/GDataXML_HTML.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Locksmith/Locksmith.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift/OAuthSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PicoKit/PicoKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SWRevealViewController/SWRevealViewController.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON/SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView/TYMActivityIndicatorView.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/UIImageViewModeScaleAspect/UIImageViewModeScaleAspect.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseDatabase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseStorage" -isystem "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleUtilities"
OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"icucore" -l"sqlite3" -l"z" -framework "AFNetworking" -framework "AdSupport" -framework "AddressBook" -framework "AeroGearHttp" -framework "AeroGearOAuth2" -framework "Alamofire" -framework "Alamofire_SwiftyJSON" -framework "Bolts" -framework "CFNetwork" -framework "CoreGraphics" -framework "FBSDKCoreKit" -framework "FBSDKLoginKit" -framework "FBSDKShareKit" -framework "FirebaseAnalytics" -framework "FirebaseAuth" -framework "FirebaseDatabase" -framework "FirebaseInstanceID" -framework "FirebaseStorage" -framework "GDataXML_HTML" -framework "GoogleInterchangeUtilities" -framework "GoogleNetworkingUtilities" -framework "GoogleSymbolUtilities" -framework "GoogleUtilities" -framework "Locksmith" -framework "MobileCoreServices" -framework "OAuthSwift" -framework "PicoKit" -framework "SafariServices" -framework "Security" -framework "StoreKit" -framework "SwiftyJSON" -framework "SystemConfiguration" -framework "TYMActivityIndicatorView" OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"icucore" -l"sqlite3" -l"z" -framework "AFNetworking" -framework "AdSupport" -framework "AddressBook" -framework "AeroGearHttp" -framework "AeroGearOAuth2" -framework "Alamofire" -framework "Alamofire_SwiftyJSON" -framework "BSGridCollectionViewLayout" -framework "BSImagePicker" -framework "Bolts" -framework "CFNetwork" -framework "CoreGraphics" -framework "FBSDKCoreKit" -framework "FBSDKLoginKit" -framework "FBSDKShareKit" -framework "FirebaseAnalytics" -framework "FirebaseAuth" -framework "FirebaseDatabase" -framework "FirebaseInstanceID" -framework "FirebaseStorage" -framework "GDataXML_HTML" -framework "GoogleInterchangeUtilities" -framework "GoogleNetworkingUtilities" -framework "GoogleSymbolUtilities" -framework "GoogleUtilities" -framework "Locksmith" -framework "MobileCoreServices" -framework "OAuthSwift" -framework "PicoKit" -framework "SWRevealViewController" -framework "SafariServices" -framework "Security" -framework "StoreKit" -framework "SwiftyJSON" -framework "SystemConfiguration" -framework "TYMActivityIndicatorView" -framework "UIImageViewModeScaleAspect"
OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS"
PODS_BUILD_DIR = $BUILD_DIR PODS_BUILD_DIR = $BUILD_DIR
PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

View File

@ -1,8 +1,8 @@
FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/Bolts" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit" "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML" "$PODS_CONFIGURATION_BUILD_DIR/Locksmith" "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift" "$PODS_CONFIGURATION_BUILD_DIR/PicoKit" "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView" FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/BSGridCollectionViewLayout" "$PODS_CONFIGURATION_BUILD_DIR/BSImagePicker" "$PODS_CONFIGURATION_BUILD_DIR/Bolts" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit" "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML" "$PODS_CONFIGURATION_BUILD_DIR/Locksmith" "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift" "$PODS_CONFIGURATION_BUILD_DIR/PicoKit" "$PODS_CONFIGURATION_BUILD_DIR/SWRevealViewController" "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView" "$PODS_CONFIGURATION_BUILD_DIR/UIImageViewModeScaleAspect"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseStorage" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities" HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseStorage" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities"
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking/AFNetworking.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp/AeroGearHttp.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2/AeroGearOAuth2.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON/Alamofire_SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Bolts/Bolts.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit/FBSDKCoreKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit/FBSDKLoginKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit/FBSDKShareKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML/GDataXML_HTML.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Locksmith/Locksmith.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift/OAuthSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PicoKit/PicoKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON/SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView/TYMActivityIndicatorView.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseDatabase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseStorage" -isystem "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleUtilities" OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking/AFNetworking.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp/AeroGearHttp.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2/AeroGearOAuth2.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON/Alamofire_SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/BSGridCollectionViewLayout/BSGridCollectionViewLayout.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/BSImagePicker/BSImagePicker.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Bolts/Bolts.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit/FBSDKCoreKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit/FBSDKLoginKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit/FBSDKShareKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML/GDataXML_HTML.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Locksmith/Locksmith.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift/OAuthSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PicoKit/PicoKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SWRevealViewController/SWRevealViewController.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON/SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView/TYMActivityIndicatorView.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/UIImageViewModeScaleAspect/UIImageViewModeScaleAspect.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseDatabase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseStorage" -isystem "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleUtilities"
PODS_BUILD_DIR = $BUILD_DIR PODS_BUILD_DIR = $BUILD_DIR
PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}/Pods PODS_ROOT = ${SRCROOT}/Pods

View File

@ -1,8 +1,8 @@
FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/Bolts" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit" "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML" "$PODS_CONFIGURATION_BUILD_DIR/Locksmith" "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift" "$PODS_CONFIGURATION_BUILD_DIR/PicoKit" "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView" FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/BSGridCollectionViewLayout" "$PODS_CONFIGURATION_BUILD_DIR/BSImagePicker" "$PODS_CONFIGURATION_BUILD_DIR/Bolts" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit" "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML" "$PODS_CONFIGURATION_BUILD_DIR/Locksmith" "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift" "$PODS_CONFIGURATION_BUILD_DIR/PicoKit" "$PODS_CONFIGURATION_BUILD_DIR/SWRevealViewController" "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView" "$PODS_CONFIGURATION_BUILD_DIR/UIImageViewModeScaleAspect"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseStorage" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities" HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseStorage" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities"
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking/AFNetworking.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp/AeroGearHttp.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2/AeroGearOAuth2.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON/Alamofire_SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Bolts/Bolts.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit/FBSDKCoreKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit/FBSDKLoginKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit/FBSDKShareKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML/GDataXML_HTML.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Locksmith/Locksmith.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift/OAuthSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PicoKit/PicoKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON/SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView/TYMActivityIndicatorView.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseDatabase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseStorage" -isystem "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleUtilities" OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking/AFNetworking.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp/AeroGearHttp.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2/AeroGearOAuth2.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON/Alamofire_SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/BSGridCollectionViewLayout/BSGridCollectionViewLayout.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/BSImagePicker/BSImagePicker.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Bolts/Bolts.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit/FBSDKCoreKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit/FBSDKLoginKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit/FBSDKShareKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML/GDataXML_HTML.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Locksmith/Locksmith.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift/OAuthSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PicoKit/PicoKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SWRevealViewController/SWRevealViewController.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON/SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView/TYMActivityIndicatorView.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/UIImageViewModeScaleAspect/UIImageViewModeScaleAspect.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseDatabase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseStorage" -isystem "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleUtilities"
PODS_BUILD_DIR = $BUILD_DIR PODS_BUILD_DIR = $BUILD_DIR
PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}/Pods PODS_ROOT = ${SRCROOT}/Pods

View File

@ -1,8 +1,8 @@
FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/Bolts" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit" "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML" "$PODS_CONFIGURATION_BUILD_DIR/Locksmith" "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift" "$PODS_CONFIGURATION_BUILD_DIR/PicoKit" "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView" FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/BSGridCollectionViewLayout" "$PODS_CONFIGURATION_BUILD_DIR/BSImagePicker" "$PODS_CONFIGURATION_BUILD_DIR/Bolts" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit" "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML" "$PODS_CONFIGURATION_BUILD_DIR/Locksmith" "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift" "$PODS_CONFIGURATION_BUILD_DIR/PicoKit" "$PODS_CONFIGURATION_BUILD_DIR/SWRevealViewController" "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView" "$PODS_CONFIGURATION_BUILD_DIR/UIImageViewModeScaleAspect"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseStorage" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities" HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseStorage" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities"
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking/AFNetworking.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp/AeroGearHttp.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2/AeroGearOAuth2.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON/Alamofire_SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Bolts/Bolts.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit/FBSDKCoreKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit/FBSDKLoginKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit/FBSDKShareKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML/GDataXML_HTML.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Locksmith/Locksmith.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift/OAuthSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PicoKit/PicoKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON/SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView/TYMActivityIndicatorView.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseDatabase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseStorage" -isystem "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleUtilities" OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking/AFNetworking.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp/AeroGearHttp.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2/AeroGearOAuth2.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON/Alamofire_SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/BSGridCollectionViewLayout/BSGridCollectionViewLayout.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/BSImagePicker/BSImagePicker.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Bolts/Bolts.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit/FBSDKCoreKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit/FBSDKLoginKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit/FBSDKShareKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML/GDataXML_HTML.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Locksmith/Locksmith.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift/OAuthSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PicoKit/PicoKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SWRevealViewController/SWRevealViewController.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON/SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView/TYMActivityIndicatorView.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/UIImageViewModeScaleAspect/UIImageViewModeScaleAspect.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseDatabase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseStorage" -isystem "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleUtilities"
PODS_BUILD_DIR = $BUILD_DIR PODS_BUILD_DIR = $BUILD_DIR
PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}/Pods PODS_ROOT = ${SRCROOT}/Pods

View File

@ -1,8 +1,8 @@
FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/Bolts" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit" "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML" "$PODS_CONFIGURATION_BUILD_DIR/Locksmith" "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift" "$PODS_CONFIGURATION_BUILD_DIR/PicoKit" "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView" FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp" "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/BSGridCollectionViewLayout" "$PODS_CONFIGURATION_BUILD_DIR/BSImagePicker" "$PODS_CONFIGURATION_BUILD_DIR/Bolts" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit" "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit" "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML" "$PODS_CONFIGURATION_BUILD_DIR/Locksmith" "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift" "$PODS_CONFIGURATION_BUILD_DIR/PicoKit" "$PODS_CONFIGURATION_BUILD_DIR/SWRevealViewController" "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON" "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView" "$PODS_CONFIGURATION_BUILD_DIR/UIImageViewModeScaleAspect"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseStorage" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities" HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseStorage" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities"
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking/AFNetworking.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp/AeroGearHttp.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2/AeroGearOAuth2.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON/Alamofire_SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Bolts/Bolts.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit/FBSDKCoreKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit/FBSDKLoginKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit/FBSDKShareKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML/GDataXML_HTML.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Locksmith/Locksmith.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift/OAuthSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PicoKit/PicoKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON/SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView/TYMActivityIndicatorView.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseDatabase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseStorage" -isystem "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleUtilities" OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking/AFNetworking.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearHttp/AeroGearHttp.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/AeroGearOAuth2/AeroGearOAuth2.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire-SwiftyJSON/Alamofire_SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/BSGridCollectionViewLayout/BSGridCollectionViewLayout.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/BSImagePicker/BSImagePicker.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Bolts/Bolts.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKCoreKit/FBSDKCoreKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKLoginKit/FBSDKLoginKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSDKShareKit/FBSDKShareKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GDataXML-HTML/GDataXML_HTML.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Locksmith/Locksmith.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/OAuthSwift/OAuthSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PicoKit/PicoKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SWRevealViewController/SWRevealViewController.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON/SwiftyJSON.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/TYMActivityIndicatorView/TYMActivityIndicatorView.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/UIImageViewModeScaleAspect/UIImageViewModeScaleAspect.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseDatabase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseStorage" -isystem "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleUtilities"
PODS_BUILD_DIR = $BUILD_DIR PODS_BUILD_DIR = $BUILD_DIR
PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}/Pods PODS_ROOT = ${SRCROOT}/Pods

View File

@ -0,0 +1,26 @@
<?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>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>2.3.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${CURRENT_PROJECT_VERSION}</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

View File

@ -0,0 +1,5 @@
#import <Foundation/Foundation.h>
@interface PodsDummy_SWRevealViewController : NSObject
@end
@implementation PodsDummy_SWRevealViewController
@end

View File

@ -0,0 +1,4 @@
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#endif

View File

@ -0,0 +1,7 @@
#import <UIKit/UIKit.h>
#import "SWRevealViewController.h"
FOUNDATION_EXPORT double SWRevealViewControllerVersionNumber;
FOUNDATION_EXPORT const unsigned char SWRevealViewControllerVersionString[];

View File

@ -0,0 +1,6 @@
framework module SWRevealViewController {
umbrella header "SWRevealViewController-umbrella.h"
export *
module * { export * }
}

View File

@ -0,0 +1,9 @@
CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/SWRevealViewController
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseStorage" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities"
OTHER_LDFLAGS = -framework "CoreGraphics"
PODS_BUILD_DIR = $BUILD_DIR
PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES

View File

@ -0,0 +1,26 @@
<?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>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.3.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${CURRENT_PROJECT_VERSION}</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

View File

@ -0,0 +1,5 @@
#import <Foundation/Foundation.h>
@interface PodsDummy_UIImageViewModeScaleAspect : NSObject
@end
@implementation PodsDummy_UIImageViewModeScaleAspect
@end

View File

@ -0,0 +1,4 @@
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#endif

View File

@ -0,0 +1,7 @@
#import <UIKit/UIKit.h>
#import "UIImageViewModeScaleAspect.h"
FOUNDATION_EXPORT double UIImageViewModeScaleAspectVersionNumber;
FOUNDATION_EXPORT const unsigned char UIImageViewModeScaleAspectVersionString[];

View File

@ -0,0 +1,6 @@
framework module UIImageViewModeScaleAspect {
umbrella header "UIImageViewModeScaleAspect-umbrella.h"
export *
module * { export * }
}

View File

@ -0,0 +1,8 @@
CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/UIImageViewModeScaleAspect
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseStorage" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities"
PODS_BUILD_DIR = $BUILD_DIR
PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES

19
Pods/UIImageViewModeScaleAspect/LICENCE generated Normal file
View File

@ -0,0 +1,19 @@
Copyright (c) 2013 Vivien Cormier (http://www.viviencormier.fr/)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -0,0 +1,88 @@
UIImageViewModeScaleAspect (1.2)
================================
<p>Create animation of a UIImageView between two contentMode ( UIViewContentModeScaleAspectFill / UIViewContentModeScaleAspectFit )</p>
<a href="http://www.viviencormier.fr/" target="_blank">My WebSite</a> - <a href="https://twitter.com/VivienCormier" target="_blank">My Twitter</a>
Screenshot & Demo Video
-----------------------
<p>To see a demo video, click <a href="http://www.youtube.com/watch?v=vZYbQ0Yt8eQ" target="_blank">here</a></p>
<a href="http://www.youtube.com/watch?v=vZYbQ0Yt8eQ" target="_blank">
<img alt="ScreenShot Demo Video" src="https://github.com/VivienCormier/UIImageViewModeScaleAspect/blob/master/Example/UIImageViewModeScaleAspect/UIImageViewModeScaleAspect/example_1.png?raw=true" width="500" height="391" />
<img alt="ScreenShot Demo Video" src="https://github.com/VivienCormier/UIImageViewModeScaleAspect/blob/master/Example/UIImageViewModeScaleAspect/UIImageViewModeScaleAspect/example_2.png?raw=true" width="500" height="391" />
</a>
How To Get Started
------------------
<p>Use Pod (or download and add "UIImageViewModeScaleAspect.h" and "UIImageViewModeScaleAspect.m" in your xcodeprojet.) : </p>
``` objective-c
pod 'UIImageViewModeScaleAspect'
```
<p>Import the .h file :</p>
``` objective-c
#import "UIImageViewModeScaleAspect.h"
```
<p>Init the UIImageViewModeScaleAspect. Important ! Do not forget to init the contentMode :</p>
``` objective-c
UIImageViewModeScaleAspect *myImage = [[UIImageViewModeScaleAspect alloc]initWithFrame:CGRectMake(0, 100, 200, 100)];
myImage.contentMode = UIViewContentModeScaleAspectFill; // Add the first contentMode
myImage.image = [UIImage imageNamed:@"becomeapanda_tumblr_com"];
[self.view addSubview:myImage];
```
Automatic animation
-------------------
<p>For convert UIViewContentModeScaleAspectFill to UIViewContentModeScaleAspectFit :</p>
``` objective-c
[myImage animateToScaleAspectFitToFrame:CGRectMake(0, 0, 200, 200) WithDuration:0.4f afterDelay:0.0f];
```
<p>For convert UIViewContentModeScaleAspectFit to UIViewContentModeScaleAspectFill :</p>
``` objective-c
[myImage animateToScaleAspectFillToFrame:CGRectMake(0, 0, 200, 200) WithDuration:0.4f afterDelay:0.0f];
```
Manual animation
----------------
<p>For convert UIViewContentModeScaleAspectFill to UIViewContentModeScaleAspectFit :</p>
``` objective-c
[myImage initToScaleAspectFillToFrame:CGRectMake(0, 100, 200, 100)];
[UIView animateWithDuration:0.4f delay:0.0f options:UIViewAnimationOptionAllowUserInteraction
animations:^{
//
// Others Animation
//
[myImage animaticToScaleAspectFill];
//
// Others Animation
//
} completion:^(BOOL finished) {
[myImage animateFinishToScaleAspectFill];
}];
```
<p>For convert UIViewContentModeScaleAspectFit to UIViewContentModeScaleAspectFill :</p>
``` objective-c
[myImage initToScaleAspectFitToFrame:CGRectMake(0, 0, 200, 200)];
[UIView animateWithDuration:0.4f delay:0.0f options:UIViewAnimationOptionAllowUserInteraction
animations:^{
//
// Others Animation
//
[myImage animaticToScaleAspectFit];
//
// Others Animation
//
} completion:^(BOOL finished) {
[myImage animateFinishToScaleAspectFit];
}];
```

View File

@ -0,0 +1,108 @@
//
// UIImageViewModeScaleAspect.m
//
// http://www.viviencormier.fr/
//
// Created by Vivien Cormier on 02/05/13.
// Copyright (c) 2013 Vivien Cormier. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface UIImageViewModeScaleAspect : UIView
@property(nonatomic, strong) UIImage *image;
#pragma mark - Automatic Animate
/**
* Automatic Animate Fill to Fit
*
* @param frame
* @param duration
* @param delay
*/
- (void)animateToScaleAspectFitToFrame:(CGRect)frame
WithDuration:(float)duration
afterDelay:(float)delay;
/**
* Automatic Animate Fit to Fill
*
* @param frame
* @param duration
* @param delay
*/
- (void)animateToScaleAspectFillToFrame:(CGRect)frame
WithDuration:(float)duration
afterDelay:(float)delay;
/**
* Automatic Animate Fill to Fit with completion
*
* @param frame
* @param duration
* @param delay
* @param completion
*/
- (void)animateToScaleAspectFitToFrame:(CGRect)frame
WithDuration:(float)duration
afterDelay:(float)delay
completion:(void (^)(BOOL finished))completion;
/**
* Automatic Animate Fit to Fill with completion
*
* @param frame
* @param duration
* @param delay
* @param completion
*/
- (void)animateToScaleAspectFillToFrame:(CGRect)frame
WithDuration:(float)duration
afterDelay:(float)delay
completion:(void (^)(BOOL finished))completion;
#pragma mark - Manual Animate
#pragma mark - - Init Function
/**
* Init Manual Function Fit
*
* @param newFrame
*/
- (void)initToScaleAspectFitToFrame:(CGRect)newFrame;
/**
* Init Manual Function Fill
*
* @param newFrame
*/
- (void)initToScaleAspectFillToFrame:(CGRect)newFrame;
#pragma mark - - Animatic Function
/**
* Animatic Fucntion Fit
*/
- (void)animaticToScaleAspectFit;
/**
* Animatic Function Fill
*/
- (void)animaticToScaleAspectFill;
#pragma mark - - Last Function
/**
* Last Function Fit
*/
- (void)animateFinishToScaleAspectFit;
/**
* Last Function Fill
*/
- (void)animateFinishToScaleAspectFill;
@end

View File

@ -0,0 +1,346 @@
//
// UIImageViewModeScaleAspect.m
//
// http://www.viviencormier.fr/
//
// Created by Vivien Cormier on 02/05/13.
// Copyright (c) 2013 Vivien Cormier. All rights reserved.
//
#import "UIImageViewModeScaleAspect.h"
@interface UIImageViewModeScaleAspect ()
@property (readwrite, nonatomic) CGRect newFrameWrapper;
@property (readwrite, nonatomic) CGRect newFrameImg;
@property (strong, nonatomic) UIImageView *img;
@end
@implementation UIImageViewModeScaleAspect
#pragma mark - Lifecycle
/**
* Init self
*
* @return self
*/
- (id)init{
self = [super init];
if (self) {
self.img = [[UIImageView alloc]init];
self.img.contentMode = UIViewContentModeCenter;
[self addSubview:_img];
self.clipsToBounds = YES;
}
return self;
}
/**
* Init self with frame
*
* @param frame
*
* @return self
*/
- (id)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
self.img = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
self.img.contentMode = UIViewContentModeCenter;
[self addSubview:_img];
self.clipsToBounds = YES;
}
return self;
}
#pragma mark - Automatic Animate
/**
* Automatic Animate Fill to Fit
*
* @param frame
* @param duration
* @param delay
*/
- (void)animateToScaleAspectFitToFrame:(CGRect)frame WithDuration:(float)duration afterDelay:(float)delay{
if (![self UIImageIsEmpty]) {
[self initToScaleAspectFitToFrame:frame];
[UIView animateWithDuration:duration delay:delay options:UIViewAnimationOptionAllowUserInteraction
animations:^{
[self animaticToScaleAspectFit];
} completion:nil];
}else{
NSLog(@"ERROR, UIImageView %@ don't have UIImage",self);
}
}
/**
* Automatic Animate Fit to Fill
*
* @param frame
* @param duration
* @param delay
*/
- (void)animateToScaleAspectFillToFrame:(CGRect)frame WithDuration:(float)duration afterDelay:(float)delay{
if (![self UIImageIsEmpty]) {
[self initToScaleAspectFillToFrame:frame];
[UIView animateWithDuration:duration delay:delay options:UIViewAnimationOptionAllowUserInteraction
animations:^{
[self animaticToScaleAspectFill];
} completion:^(BOOL finished) {
[self animateFinishToScaleAspectFill];
}];
}else{
NSLog(@"ERROR, UIImageView %@ don't have UIImage",self);
}
}
/**
* Automatic Animate Fill to Fit with completion
*
* @param frame
* @param duration
* @param delay
* @param completion
*/
- (void)animateToScaleAspectFitToFrame:(CGRect)frame WithDuration:(float)duration afterDelay:(float)delay completion:(void (^)(BOOL finished))completion{
if (![self UIImageIsEmpty]) {
[self initToScaleAspectFitToFrame:frame];
[UIView animateWithDuration:duration delay:delay options:UIViewAnimationOptionAllowUserInteraction
animations:^{
[self animaticToScaleAspectFit];
} completion:^(BOOL finished) {
if (completion) {
completion(YES);
}
}];
}else{
if (completion) {
completion(YES);
}
NSLog(@"ERROR, UIImageView %@ don't have UIImage",self);
}
}
/**
* Automatic Animate Fit to Fill with completion
*
* @param frame
* @param duration
* @param delay
* @param completion
*/
- (void)animateToScaleAspectFillToFrame:(CGRect)frame WithDuration:(float)duration afterDelay:(float)delay completion:(void (^)(BOOL finished))completion{
if (![self UIImageIsEmpty]) {
[self initToScaleAspectFillToFrame:frame];
[UIView animateWithDuration:duration delay:delay options:UIViewAnimationOptionAllowUserInteraction
animations:^{
[self animaticToScaleAspectFill];
} completion:^(BOOL finished) {
[self animateFinishToScaleAspectFill];
if (completion) {
completion(YES);
}
}];
}else{
if (completion) {
completion(YES);
}
NSLog(@"ERROR, UIImageView %@ don't have UIImage",self);
}
}
#pragma mark - Manual Animate
#pragma mark - - Init Function
/**
* Init Manual Function Fit
*
* @param newFrame
*/
- (void)initToScaleAspectFitToFrame:(CGRect)newFrame{
if (![self UIImageIsEmpty]) {
float ratioImg = (_img.image.size.width) / (_img.image.size.height);
if ([self choiseFunctionWithRationImg:ratioImg ForFrame:self.frame]) {
self.img.frame = CGRectMake( - (self.frame.size.height * ratioImg - self.frame.size.width) / 2.0f, 0, self.frame.size.height * ratioImg, self.frame.size.height);
}else{
self.img.frame = CGRectMake(0, - (self.frame.size.width / ratioImg - self.frame.size.height) / 2.0f, self.frame.size.width, self.frame.size.width / ratioImg);
}
}else{
NSLog(@"ERROR, UIImageView %@ don't have UIImage",self);
}
_img.contentMode = UIViewContentModeScaleAspectFit;
self.newFrameImg = CGRectMake(0, 0, newFrame.size.width, newFrame.size.height);
self.newFrameWrapper = newFrame;
}
/**
* Init Manual Function Fill
*
* @param newFrame
*/
- (void)initToScaleAspectFillToFrame:(CGRect)newFrame{
if (![self UIImageIsEmpty]) {
float ratioImg = (_img.image.size.width) / (_img.image.size.height);
if ([self choiseFunctionWithRationImg:ratioImg ForFrame:newFrame]) {
self.newFrameImg = CGRectMake( - (newFrame.size.height * ratioImg - newFrame.size.width) / 2.0f, 0, newFrame.size.height * ratioImg, newFrame.size.height);
}else{
self.newFrameImg = CGRectMake(0, - (newFrame.size.width / ratioImg - newFrame.size.height) / 2.0f, newFrame.size.width, newFrame.size.width / ratioImg);
}
}else{
NSLog(@"ERROR, UIImageView %@ don't have UIImage",self);
}
self.newFrameWrapper = newFrame;
}
#pragma mark - - Animatic Function
/**
* Animatic Fucntion Fit
*/
- (void)animaticToScaleAspectFit{
self.img.frame = _newFrameImg;
[self setFrameWrapper:_newFrameWrapper];
}
/**
* Animatic Function Fill
*/
- (void)animaticToScaleAspectFill{
self.img.frame = _newFrameImg;
[self setFrameWrapper:_newFrameWrapper];
}
#pragma mark - - Last Function
/**
* Last Function Fit
*/
- (void)animateFinishToScaleAspectFit{
//
// Fake function
//
}
/**
* Last Function Fill
*/
- (void)animateFinishToScaleAspectFill{
self.img.contentMode = UIViewContentModeScaleAspectFill;
self.img.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
}
#pragma mark - Rewrite Setter / Getter
- (void)setImage:(UIImage *)image{
self.img.image = image;
}
- (UIImage *)image{
return _img.image;
}
- (void)setContentMode:(UIViewContentMode)contentMode{
self.img.contentMode = contentMode;
}
- (UIViewContentMode)contentMode{
return _img.contentMode;
}
- (void)setFrame:(CGRect)frame{
[super setFrame:frame];
self.img.frame = CGRectMake(0, 0, frame.size.width, frame.size.height);
}
- (void)setFrameWrapper:(CGRect)frame{
[super setFrame:frame];
}
#pragma marf - Private
- (BOOL)UIImageIsEmpty{
CGImageRef cgref = [_img.image CGImage];
CIImage *cim = [_img.image CIImage];
if (cim == nil && cgref == NULL)
{
return true;
}else{
return false;
}
}
- (BOOL)choiseFunctionWithRationImg:(float)ratioImg ForFrame:(CGRect)newFrame{
BOOL resultat = false;
float ratioSelf = (newFrame.size.width) / (newFrame.size.height);
if (ratioImg < 1) {
if (ratioImg > ratioSelf ) resultat = true;
}else{
if (ratioImg > ratioSelf ) resultat = true;
}
return resultat;
}
@end

View File

@ -9,11 +9,13 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
1BD4D4EBDE19E2FBA2CCB40C /* Pods_VendooUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8FACABBA7656B6698731A6B0 /* Pods_VendooUITests.framework */; }; 1BD4D4EBDE19E2FBA2CCB40C /* Pods_VendooUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8FACABBA7656B6698731A6B0 /* Pods_VendooUITests.framework */; };
3E0F76FC1D01B2D7004A0159 /* Listing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E0F76FB1D01B2D7004A0159 /* Listing.swift */; }; 3E0F76FC1D01B2D7004A0159 /* Listing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E0F76FB1D01B2D7004A0159 /* Listing.swift */; };
3E1AA4301D0D9B3F005FCCBB /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3E1AA42F1D0D9B3F005FCCBB /* Main.storyboard */; };
3E1AA4321D0DA071005FCCBB /* MenuPanelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E1AA4311D0DA071005FCCBB /* MenuPanelViewController.swift */; };
3E1AA4351D0DD173005FCCBB /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E1AA4341D0DD173005FCCBB /* SettingsViewController.swift */; };
3E4897D11D0067030069F742 /* FirebaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E4897D01D0067030069F742 /* FirebaseManager.swift */; }; 3E4897D11D0067030069F742 /* FirebaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E4897D01D0067030069F742 /* FirebaseManager.swift */; };
3E6CC3571CF2A94B00E00A70 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E6CC3561CF2A94B00E00A70 /* AppDelegate.swift */; }; 3E6CC3571CF2A94B00E00A70 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E6CC3561CF2A94B00E00A70 /* AppDelegate.swift */; };
3E6CC3591CF2A94B00E00A70 /* SignInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E6CC3581CF2A94B00E00A70 /* SignInViewController.swift */; }; 3E6CC3591CF2A94B00E00A70 /* SignInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E6CC3581CF2A94B00E00A70 /* SignInViewController.swift */; };
3E6CC35B1CF2A94B00E00A70 /* SignUpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E6CC35A1CF2A94B00E00A70 /* SignUpViewController.swift */; }; 3E6CC35B1CF2A94B00E00A70 /* SignUpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E6CC35A1CF2A94B00E00A70 /* SignUpViewController.swift */; };
3E6CC35E1CF2A94B00E00A70 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3E6CC35C1CF2A94B00E00A70 /* Main.storyboard */; };
3E6CC3601CF2A94B00E00A70 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3E6CC35F1CF2A94B00E00A70 /* Assets.xcassets */; }; 3E6CC3601CF2A94B00E00A70 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3E6CC35F1CF2A94B00E00A70 /* Assets.xcassets */; };
3E6CC3631CF2A94B00E00A70 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3E6CC3611CF2A94B00E00A70 /* LaunchScreen.storyboard */; }; 3E6CC3631CF2A94B00E00A70 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3E6CC3611CF2A94B00E00A70 /* LaunchScreen.storyboard */; };
3E6CC36E1CF2A94B00E00A70 /* VendooTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E6CC36D1CF2A94B00E00A70 /* VendooTests.swift */; }; 3E6CC36E1CF2A94B00E00A70 /* VendooTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E6CC36D1CF2A94B00E00A70 /* VendooTests.swift */; };
@ -23,8 +25,7 @@
3E7CF4011CF6366300F486B2 /* EtsyRESTAPIManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E7CF4001CF6366300F486B2 /* EtsyRESTAPIManager.swift */; }; 3E7CF4011CF6366300F486B2 /* EtsyRESTAPIManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E7CF4001CF6366300F486B2 /* EtsyRESTAPIManager.swift */; };
3E7CF4041CF6450D00F486B2 /* ListingObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E7CF4031CF6450D00F486B2 /* ListingObject.swift */; }; 3E7CF4041CF6450D00F486B2 /* ListingObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E7CF4031CF6450D00F486B2 /* ListingObject.swift */; };
3EA6689F1D0278E900EE57A8 /* TradingProxy in Resources */ = {isa = PBXBuildFile; fileRef = 3EA6689E1D0278E900EE57A8 /* TradingProxy */; }; 3EA6689F1D0278E900EE57A8 /* TradingProxy in Resources */ = {isa = PBXBuildFile; fileRef = 3EA6689E1D0278E900EE57A8 /* TradingProxy */; };
3EA668A11D02836C00EE57A8 /* EbayWebServiceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA668A01D02836C00EE57A8 /* EbayWebServiceManager.swift */; settings = {COMPILER_FLAGS = "-fvisibility=default"; }; }; 3EA668A11D02836C00EE57A8 /* EbayWebServiceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA668A01D02836C00EE57A8 /* EbayWebServiceManager.swift */; };
3EA668A31D02ECB100EE57A8 /* libicucore.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 3EA668A21D02ECB100EE57A8 /* libicucore.tbd */; };
3EB2F5161CF442CF002E6D2C /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3EB2F5151CF442CF002E6D2C /* Security.framework */; }; 3EB2F5161CF442CF002E6D2C /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3EB2F5151CF442CF002E6D2C /* Security.framework */; };
3EC325111CF703A600626C48 /* ItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EC325101CF703A600626C48 /* ItemCell.swift */; }; 3EC325111CF703A600626C48 /* ItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EC325101CF703A600626C48 /* ItemCell.swift */; };
3EC325151CF7104300626C48 /* ItemTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EC325141CF7104300626C48 /* ItemTableViewController.swift */; }; 3EC325151CF7104300626C48 /* ItemTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EC325141CF7104300626C48 /* ItemTableViewController.swift */; };
@ -36,6 +37,7 @@
3EC3252D1CF894C400626C48 /* ItemImagePickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EC3252C1CF894C400626C48 /* ItemImagePickerViewController.swift */; }; 3EC3252D1CF894C400626C48 /* ItemImagePickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EC3252C1CF894C400626C48 /* ItemImagePickerViewController.swift */; };
3EC3252F1CF894E500626C48 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3EC3252E1CF894E500626C48 /* AVFoundation.framework */; }; 3EC3252F1CF894E500626C48 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3EC3252E1CF894E500626C48 /* AVFoundation.framework */; };
3ECEDB871CF9C722003566B3 /* ListingPreviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ECEDB861CF9C722003566B3 /* ListingPreviewViewController.swift */; }; 3ECEDB871CF9C722003566B3 /* ListingPreviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ECEDB861CF9C722003566B3 /* ListingPreviewViewController.swift */; };
3EFB0E331D0B968300A05D7A /* SideMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EFB0E321D0B968300A05D7A /* SideMenuView.swift */; };
CA20AB81F709511F1A8C7963 /* Pods_VendooTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D05AEDAE485B93305CC629B5 /* Pods_VendooTests.framework */; }; CA20AB81F709511F1A8C7963 /* Pods_VendooTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D05AEDAE485B93305CC629B5 /* Pods_VendooTests.framework */; };
D5995A6D02C7FCA4F561AAB3 /* Pods_Vendoo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8F69918E43DC1276F42551F /* Pods_Vendoo.framework */; }; D5995A6D02C7FCA4F561AAB3 /* Pods_Vendoo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8F69918E43DC1276F42551F /* Pods_Vendoo.framework */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
@ -62,12 +64,14 @@
1B0AD5D22E5B4D8197481769 /* Pods-VendooTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VendooTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-VendooTests/Pods-VendooTests.release.xcconfig"; sourceTree = "<group>"; }; 1B0AD5D22E5B4D8197481769 /* Pods-VendooTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VendooTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-VendooTests/Pods-VendooTests.release.xcconfig"; sourceTree = "<group>"; };
368DE81C9F5991477528A929 /* Pods-VendooUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VendooUITests.release.xcconfig"; path = "Pods/Target Support Files/Pods-VendooUITests/Pods-VendooUITests.release.xcconfig"; sourceTree = "<group>"; }; 368DE81C9F5991477528A929 /* Pods-VendooUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VendooUITests.release.xcconfig"; path = "Pods/Target Support Files/Pods-VendooUITests/Pods-VendooUITests.release.xcconfig"; sourceTree = "<group>"; };
3E0F76FB1D01B2D7004A0159 /* Listing.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Listing.swift; sourceTree = "<group>"; }; 3E0F76FB1D01B2D7004A0159 /* Listing.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Listing.swift; sourceTree = "<group>"; };
3E1AA42F1D0D9B3F005FCCBB /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
3E1AA4311D0DA071005FCCBB /* MenuPanelViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenuPanelViewController.swift; sourceTree = "<group>"; };
3E1AA4341D0DD173005FCCBB /* SettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = "<group>"; };
3E4897D01D0067030069F742 /* FirebaseManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FirebaseManager.swift; sourceTree = "<group>"; }; 3E4897D01D0067030069F742 /* FirebaseManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FirebaseManager.swift; sourceTree = "<group>"; };
3E6CC3531CF2A94B00E00A70 /* Vendoo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Vendoo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 3E6CC3531CF2A94B00E00A70 /* Vendoo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Vendoo.app; sourceTree = BUILT_PRODUCTS_DIR; };
3E6CC3561CF2A94B00E00A70 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 3E6CC3561CF2A94B00E00A70 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
3E6CC3581CF2A94B00E00A70 /* SignInViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInViewController.swift; sourceTree = "<group>"; }; 3E6CC3581CF2A94B00E00A70 /* SignInViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInViewController.swift; sourceTree = "<group>"; };
3E6CC35A1CF2A94B00E00A70 /* SignUpViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpViewController.swift; sourceTree = "<group>"; }; 3E6CC35A1CF2A94B00E00A70 /* SignUpViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpViewController.swift; sourceTree = "<group>"; };
3E6CC35D1CF2A94B00E00A70 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
3E6CC35F1CF2A94B00E00A70 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 3E6CC35F1CF2A94B00E00A70 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
3E6CC3621CF2A94B00E00A70 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 3E6CC3621CF2A94B00E00A70 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
3E6CC3641CF2A94B00E00A70 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 3E6CC3641CF2A94B00E00A70 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@ -96,6 +100,7 @@
3EC3252C1CF894C400626C48 /* ItemImagePickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemImagePickerViewController.swift; sourceTree = "<group>"; }; 3EC3252C1CF894C400626C48 /* ItemImagePickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemImagePickerViewController.swift; sourceTree = "<group>"; };
3EC3252E1CF894E500626C48 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; 3EC3252E1CF894E500626C48 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
3ECEDB861CF9C722003566B3 /* ListingPreviewViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListingPreviewViewController.swift; sourceTree = "<group>"; }; 3ECEDB861CF9C722003566B3 /* ListingPreviewViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListingPreviewViewController.swift; sourceTree = "<group>"; };
3EFB0E321D0B968300A05D7A /* SideMenuView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SideMenuView.swift; sourceTree = "<group>"; };
6979B7B8AF7AC049C2F23196 /* Pods-Vendoo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Vendoo.release.xcconfig"; path = "Pods/Target Support Files/Pods-Vendoo/Pods-Vendoo.release.xcconfig"; sourceTree = "<group>"; }; 6979B7B8AF7AC049C2F23196 /* Pods-Vendoo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Vendoo.release.xcconfig"; path = "Pods/Target Support Files/Pods-Vendoo/Pods-Vendoo.release.xcconfig"; sourceTree = "<group>"; };
8FACABBA7656B6698731A6B0 /* Pods_VendooUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_VendooUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8FACABBA7656B6698731A6B0 /* Pods_VendooUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_VendooUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
C9F6F7897E53ED9583C965E3 /* Pods-Vendoo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Vendoo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Vendoo/Pods-Vendoo.debug.xcconfig"; sourceTree = "<group>"; }; C9F6F7897E53ED9583C965E3 /* Pods-Vendoo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Vendoo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Vendoo/Pods-Vendoo.debug.xcconfig"; sourceTree = "<group>"; };
@ -109,7 +114,6 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
3EA668A31D02ECB100EE57A8 /* libicucore.tbd in Frameworks */,
3EC3252F1CF894E500626C48 /* AVFoundation.framework in Frameworks */, 3EC3252F1CF894E500626C48 /* AVFoundation.framework in Frameworks */,
3EB2F5161CF442CF002E6D2C /* Security.framework in Frameworks */, 3EB2F5161CF442CF002E6D2C /* Security.framework in Frameworks */,
D5995A6D02C7FCA4F561AAB3 /* Pods_Vendoo.framework in Frameworks */, D5995A6D02C7FCA4F561AAB3 /* Pods_Vendoo.framework in Frameworks */,
@ -135,6 +139,14 @@
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
3E1AA4331D0DD0B2005FCCBB /* Settings */ = {
isa = PBXGroup;
children = (
3E1AA4341D0DD173005FCCBB /* SettingsViewController.swift */,
);
name = Settings;
sourceTree = "<group>";
};
3E4897CE1D0062860069F742 /* Services */ = { 3E4897CE1D0062860069F742 /* Services */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -179,13 +191,14 @@
3E6CC3551CF2A94B00E00A70 /* Vendoo */ = { 3E6CC3551CF2A94B00E00A70 /* Vendoo */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
3EFB0E2F1D0B95B200A05D7A /* Menu */,
3E4897CE1D0062860069F742 /* Services */, 3E4897CE1D0062860069F742 /* Services */,
3EC3252B1CF8944800626C48 /* NewItemPostingSession */, 3EC3252B1CF8944800626C48 /* NewItemPostingSession */,
3EC325211CF7D91100626C48 /* TabbedScreens */, 3EC325211CF7D91100626C48 /* TabbedScreens */,
3EC3250C1CF7026C00626C48 /* AppAuthentication */, 3EC3250C1CF7026C00626C48 /* AppAuthentication */,
3E6CC3561CF2A94B00E00A70 /* AppDelegate.swift */, 3E6CC3561CF2A94B00E00A70 /* AppDelegate.swift */,
3E6CC35C1CF2A94B00E00A70 /* Main.storyboard */,
3E6CC35F1CF2A94B00E00A70 /* Assets.xcassets */, 3E6CC35F1CF2A94B00E00A70 /* Assets.xcassets */,
3E1AA42F1D0D9B3F005FCCBB /* Main.storyboard */,
3E6CC3611CF2A94B00E00A70 /* LaunchScreen.storyboard */, 3E6CC3611CF2A94B00E00A70 /* LaunchScreen.storyboard */,
3E6CC3641CF2A94B00E00A70 /* Info.plist */, 3E6CC3641CF2A94B00E00A70 /* Info.plist */,
3E7CF3FD1CF5FF8200F486B2 /* GoogleService-Info.plist */, 3E7CF3FD1CF5FF8200F486B2 /* GoogleService-Info.plist */,
@ -303,6 +316,16 @@
name = NewItemPostingSession; name = NewItemPostingSession;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
3EFB0E2F1D0B95B200A05D7A /* Menu */ = {
isa = PBXGroup;
children = (
3E1AA4331D0DD0B2005FCCBB /* Settings */,
3EFB0E321D0B968300A05D7A /* SideMenuView.swift */,
3E1AA4311D0DA071005FCCBB /* MenuPanelViewController.swift */,
);
name = Menu;
sourceTree = "<group>";
};
58601EFD2871BD1BB6866596 /* Pods */ = { 58601EFD2871BD1BB6866596 /* Pods */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -444,8 +467,8 @@
3EC325281CF86B5400626C48 /* Services.plist in Resources */, 3EC325281CF86B5400626C48 /* Services.plist in Resources */,
3E6CC3631CF2A94B00E00A70 /* LaunchScreen.storyboard in Resources */, 3E6CC3631CF2A94B00E00A70 /* LaunchScreen.storyboard in Resources */,
3E7CF3FE1CF5FF8200F486B2 /* GoogleService-Info.plist in Resources */, 3E7CF3FE1CF5FF8200F486B2 /* GoogleService-Info.plist in Resources */,
3E1AA4301D0D9B3F005FCCBB /* Main.storyboard in Resources */,
3E6CC3601CF2A94B00E00A70 /* Assets.xcassets in Resources */, 3E6CC3601CF2A94B00E00A70 /* Assets.xcassets in Resources */,
3E6CC35E1CF2A94B00E00A70 /* Main.storyboard in Resources */,
3EA6689F1D0278E900EE57A8 /* TradingProxy in Resources */, 3EA6689F1D0278E900EE57A8 /* TradingProxy in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@ -595,7 +618,9 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
3E6CC35B1CF2A94B00E00A70 /* SignUpViewController.swift in Sources */, 3E6CC35B1CF2A94B00E00A70 /* SignUpViewController.swift in Sources */,
3E1AA4321D0DA071005FCCBB /* MenuPanelViewController.swift in Sources */,
3E4897D11D0067030069F742 /* FirebaseManager.swift in Sources */, 3E4897D11D0067030069F742 /* FirebaseManager.swift in Sources */,
3E1AA4351D0DD173005FCCBB /* SettingsViewController.swift in Sources */,
3E0F76FC1D01B2D7004A0159 /* Listing.swift in Sources */, 3E0F76FC1D01B2D7004A0159 /* Listing.swift in Sources */,
3E7CF4041CF6450D00F486B2 /* ListingObject.swift in Sources */, 3E7CF4041CF6450D00F486B2 /* ListingObject.swift in Sources */,
3E6CC3571CF2A94B00E00A70 /* AppDelegate.swift in Sources */, 3E6CC3571CF2A94B00E00A70 /* AppDelegate.swift in Sources */,
@ -610,6 +635,7 @@
3EC3252D1CF894C400626C48 /* ItemImagePickerViewController.swift in Sources */, 3EC3252D1CF894C400626C48 /* ItemImagePickerViewController.swift in Sources */,
3E7CF4011CF6366300F486B2 /* EtsyRESTAPIManager.swift in Sources */, 3E7CF4011CF6366300F486B2 /* EtsyRESTAPIManager.swift in Sources */,
3EC325151CF7104300626C48 /* ItemTableViewController.swift in Sources */, 3EC325151CF7104300626C48 /* ItemTableViewController.swift in Sources */,
3EFB0E331D0B968300A05D7A /* SideMenuView.swift in Sources */,
3E6CC3591CF2A94B00E00A70 /* SignInViewController.swift in Sources */, 3E6CC3591CF2A94B00E00A70 /* SignInViewController.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@ -646,14 +672,6 @@
/* End PBXTargetDependency section */ /* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */ /* Begin PBXVariantGroup section */
3E6CC35C1CF2A94B00E00A70 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
3E6CC35D1CF2A94B00E00A70 /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
3E6CC3611CF2A94B00E00A70 /* LaunchScreen.storyboard */ = { 3E6CC3611CF2A94B00E00A70 /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup; isa = PBXVariantGroup;
children = ( children = (
@ -711,6 +729,7 @@
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
USER_HEADER_SEARCH_PATHS = "Pods/**"; USER_HEADER_SEARCH_PATHS = "Pods/**";
VALID_ARCHS = "arm64 armv7 armv7s";
}; };
name = Debug; name = Debug;
}; };
@ -753,6 +772,7 @@
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
USER_HEADER_SEARCH_PATHS = "Pods/**"; USER_HEADER_SEARCH_PATHS = "Pods/**";
VALIDATE_PRODUCT = YES; VALIDATE_PRODUCT = YES;
VALID_ARCHS = "arm64 armv7 armv7s";
}; };
name = Release; name = Release;
}; };
@ -764,13 +784,13 @@
ARCHS = "$(ARCHS_STANDARD)"; ARCHS = "$(ARCHS_STANDARD)";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
GCC_SYMBOLS_PRIVATE_EXTERN = YES; GCC_SYMBOLS_PRIVATE_EXTERN = YES;
INCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES = "Vendoo/**"; INCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES = "\"Vendoo/**\" \"Pods/**\"";
INFOPLIST_FILE = Vendoo/Info.plist; INFOPLIST_FILE = Vendoo/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
New_Setting = ""; New_Setting = "";
ONLY_ACTIVE_ARCH = NO;
OTHER_LDFLAGS = ( OTHER_LDFLAGS = (
"$(inherited)", "$(inherited)",
"-ObjC",
"-l\"c++\"", "-l\"c++\"",
"-l\"icucore\"", "-l\"icucore\"",
"-l\"sqlite3\"", "-l\"sqlite3\"",
@ -847,7 +867,7 @@
SWIFT_INCLUDE_PATHS = ""; SWIFT_INCLUDE_PATHS = "";
SWIFT_OBJC_BRIDGING_HEADER = "Vendoo/Vendoo-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Vendoo/Vendoo-Bridging-Header.h";
USER_HEADER_SEARCH_PATHS = "\"Vendoo/**\" \"Pods/**\""; USER_HEADER_SEARCH_PATHS = "\"Vendoo/**\" \"Pods/**\"";
VALID_ARCHS = "arm64 armv7 armv7s"; VALID_ARCHS = "arm64 armv7 armv7";
}; };
name = Debug; name = Debug;
}; };
@ -859,14 +879,13 @@
ARCHS = "$(ARCHS_STANDARD)"; ARCHS = "$(ARCHS_STANDARD)";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
GCC_SYMBOLS_PRIVATE_EXTERN = YES; GCC_SYMBOLS_PRIVATE_EXTERN = YES;
INCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES = "Vendoo/**"; INCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES = "\"Vendoo/**\" \"Pods/**\"";
INFOPLIST_FILE = Vendoo/Info.plist; INFOPLIST_FILE = Vendoo/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
New_Setting = ""; New_Setting = "";
ONLY_ACTIVE_ARCH = NO; ONLY_ACTIVE_ARCH = NO;
OTHER_LDFLAGS = ( OTHER_LDFLAGS = (
"$(inherited)", "$(inherited)",
"-ObjC",
"-l\"c++\"", "-l\"c++\"",
"-l\"icucore\"", "-l\"icucore\"",
"-l\"sqlite3\"", "-l\"sqlite3\"",
@ -943,7 +962,7 @@
SWIFT_INCLUDE_PATHS = ""; SWIFT_INCLUDE_PATHS = "";
SWIFT_OBJC_BRIDGING_HEADER = "Vendoo/Vendoo-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Vendoo/Vendoo-Bridging-Header.h";
USER_HEADER_SEARCH_PATHS = "\"Vendoo/**\" \"Pods/**\""; USER_HEADER_SEARCH_PATHS = "\"Vendoo/**\" \"Pods/**\"";
VALID_ARCHS = "arm64 armv7 armv7s"; VALID_ARCHS = "arm64 armv7 armv7";
}; };
name = Release; name = Release;
}; };

View File

@ -0,0 +1,30 @@
{
"DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "A19E30B46E376221BA857AAEF4A8709E78AC4F1E",
"DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : {
},
"DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : {
"2079FCD6EC349AEFB6C50B82CE5C2C9BE898E484" : 0,
"A19E30B46E376221BA857AAEF4A8709E78AC4F1E" : 0
},
"DVTSourceControlWorkspaceBlueprintIdentifierKey" : "ABB61D7B-98E4-4514-A26A-4F2C83856662",
"DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : {
"2079FCD6EC349AEFB6C50B82CE5C2C9BE898E484" : "..\/Vendoo",
"A19E30B46E376221BA857AAEF4A8709E78AC4F1E" : "Vendoo\/"
},
"DVTSourceControlWorkspaceBlueprintNameKey" : "Vendoo",
"DVTSourceControlWorkspaceBlueprintVersion" : 204,
"DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "Vendoo.xcworkspace",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [
{
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/kroleo\/Vendoo.git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "2079FCD6EC349AEFB6C50B82CE5C2C9BE898E484"
},
{
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/bitbucket.org\/vendoo\/vendoo_v1.0",
"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "A19E30B46E376221BA857AAEF4A8709E78AC4F1E"
}
]
}

View File

@ -9,13 +9,13 @@
shouldBeEnabled = "Yes" shouldBeEnabled = "Yes"
ignoreCount = "0" ignoreCount = "0"
continueAfterRunningActions = "No" continueAfterRunningActions = "No"
filePath = "Vendoo/ListingPreviewViewController.swift" filePath = "Vendoo/ItemImagePickerViewController.swift"
timestampString = "486703832.801617" timestampString = "487758106.283634"
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "174" startingLineNumber = "125"
endingLineNumber = "174" endingLineNumber = "125"
landmarkName = "publishItem(_:)" landmarkName = "takePicture()"
landmarkType = "5"> landmarkType = "5">
</BreakpointContent> </BreakpointContent>
</BreakpointProxy> </BreakpointProxy>
@ -25,45 +25,13 @@
shouldBeEnabled = "Yes" shouldBeEnabled = "Yes"
ignoreCount = "0" ignoreCount = "0"
continueAfterRunningActions = "No" continueAfterRunningActions = "No"
filePath = "Vendoo/FacebookGraphAPIManager.swift" filePath = "Vendoo/ItemImagePickerViewController.swift"
timestampString = "486687305.253962" timestampString = "487758106.283634"
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "176" startingLineNumber = "58"
endingLineNumber = "176" endingLineNumber = "58"
landmarkName = "makePOSTResquest(_:params:)" landmarkName = "viewDidLoad()"
landmarkType = "5">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Vendoo/FacebookGraphAPIManager.swift"
timestampString = "486687305.253962"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "190"
endingLineNumber = "190"
landmarkName = "makePOSTResquest(_:params:)"
landmarkType = "5">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Vendoo/FacebookGraphAPIManager.swift"
timestampString = "486687305.253962"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "186"
endingLineNumber = "186"
landmarkName = "makePOSTResquest(_:params:)"
landmarkType = "5"> landmarkType = "5">
</BreakpointContent> </BreakpointContent>
</BreakpointProxy> </BreakpointProxy>
@ -74,91 +42,12 @@
ignoreCount = "0" ignoreCount = "0"
continueAfterRunningActions = "No" continueAfterRunningActions = "No"
filePath = "Vendoo/ListingPreviewViewController.swift" filePath = "Vendoo/ListingPreviewViewController.swift"
timestampString = "486685960.664377" timestampString = "487757808.448492"
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "94" startingLineNumber = "210"
endingLineNumber = "94" endingLineNumber = "210"
landmarkName = "listingUploadedFB(_:)" landmarkName = "editListing(_:)"
landmarkType = "5">
<Locations>
<Location
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
symbolName = "Vendoo.ListingPreviewViewController.listingUploadedFB (Swift.String) -&gt; ()"
moduleName = "Vendoo"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/okechi/Documents/iOs%20Practice/Vendoo/Vendoo_bb/Vendoo/Vendoo/ListingPreviewViewController.swift"
timestampString = "486703838.796592"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "96"
endingLineNumber = "96"
offsetFromSymbolStart = "27">
</Location>
<Location
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
symbolName = "protocol witness for Vendoo.FacebookGraphAPIManagerDelegate.listingUploadedFB (Swift.String) -&gt; () in conformance Vendoo.ListingPreviewViewController : Vendoo.FacebookGraphAPIManagerDelegate in Vendoo"
moduleName = "Vendoo"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/okechi/Documents/iOs%20Practice/Vendoo/Vendoo_bb/Vendoo/Vendoo/ListingPreviewViewController.swift"
timestampString = "486703838.796724"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "94"
endingLineNumber = "94"
offsetFromSymbolStart = "4">
</Location>
<Location
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
symbolName = "dynamic Vendoo.ListingPreviewViewController.listingUploadedFB (Swift.String) -&gt; ()"
moduleName = "Vendoo"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/okechi/Documents/iOs%20Practice/Vendoo/Vendoo_bb/Vendoo/Vendoo/ListingPreviewViewController.swift"
timestampString = "486703838.796828"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "94"
endingLineNumber = "94"
offsetFromSymbolStart = "4">
</Location>
</Locations>
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Vendoo/FacebookGraphAPIManager.swift"
timestampString = "486687305.253962"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "189"
endingLineNumber = "189"
landmarkName = "makePOSTResquest(_:params:)"
landmarkType = "5">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Vendoo/EbayWebServiceManager.swift"
timestampString = "486728972.41436"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "40"
endingLineNumber = "40"
landmarkName = "authorizeApp()"
landmarkType = "5"> landmarkType = "5">
</BreakpointContent> </BreakpointContent>
</BreakpointProxy> </BreakpointProxy>

BIN
Vendoo/.DS_Store vendored

Binary file not shown.

View File

@ -60,6 +60,28 @@ extension AppDelegate {
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool { func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
if (url.host == "oauth-callback") { if (url.host == "oauth-callback") {
print(url)
let components = NSURLComponents(URL: url, resolvingAgainstBaseURL: false)
var token:String?
var verifier:String?
if let queryItems = components?.queryItems
{
for queryItem in queryItems
{
if (queryItem.name.lowercaseString == "oauth_token")
{
token = queryItem.value
print(token!)
}
if (queryItem.name.lowercaseString == "oauth_verifier")
{
verifier = queryItem.value
print(verifier)
}
}
}
OAuthSwift.handleOpenURL(url) OAuthSwift.handleOpenURL(url)
} }
return true return true

View File

@ -20,15 +20,14 @@ class EbayWebServiceManager: NSObject {
private var apiSecret: String! private var apiSecret: String!
private var userEmail:String = (NSUserDefaults.standardUserDefaults().objectForKey("email") as? String)! private var userEmail:String = (NSUserDefaults.standardUserDefaults().objectForKey("email") as? String)!
var isAuthorized: Bool = NSUserDefaults.standardUserDefaults().boolForKey("ebayAuthorized") var isAuthorized: Bool = NSUserDefaults.standardUserDefaults().boolForKey("ebayAuthorized")
//static let tradingClient = EBayTradingServiceClient.sharedClient() //let tradingClient = EBayTradingServiceClient.sharedClient()
//---------------------------------------------// //---------------------------------------------//
override init(){ override init(){
super.init() super.init()
//EbayWebServiceManager.tradingClient.debug = true // self.tradingClient.debug = true
} }
} }
@ -41,14 +40,34 @@ extension EbayWebServiceManager {
/* /*
let sessionRequest = Trading_GetSessionIDRequestType.init() let sessionRequest = Trading_GetSessionIDRequestType.init()
sessionRequest.ruName = "Kroleo-Kroleo-Vendoo-S-ktqeobkk" sessionRequest.ruName = "Kroleo-Kroleo-Vendoo-S-ktqeobkk"
EbayWebServiceManager.tradingClient.getSessionID(sessionRequest, success: ({
(response: Trading_GetSessionIDResponseType!) -> Void in self.tradingClient.getSessionID(sessionRequest,
success: ({
(response: Trading_GetSessionIDResponseType!) -> Void in
let requestToken = Trading_FetchTokenRequestType.init()
requestToken.sessionID = response.sessionID
(self.tradingClient.fetchToken(requestToken,
success: ({
(response: Trading_FetchTokenResponseType!) -> Void in
print(response.eBayAuthToken)
print(response.restToken)
}),
failure: ({
(error: NSError!, bindable: PicoBindable!) -> Void in
}), failure: ({ })
(error: NSError!, bindable: PicoBindable!) -> Void in ))
})) }),
*/ failure: ({
(error: NSError!, bindable: PicoBindable!) -> Void in
})
)
*/
} }
func deauthorizeApp(){ func deauthorizeApp(){

View File

@ -12,6 +12,8 @@ import Foundation
import SwiftyJSON import SwiftyJSON
import OAuthSwift import OAuthSwift
import Locksmith import Locksmith
import AFNetworking
typealias ServiceResponse = (JSON, NSError?) -> Void typealias ServiceResponse = (JSON, NSError?) -> Void
@ -43,11 +45,15 @@ class EtsyRESTAPIManager: NSObject {
self.apiKey = ((dict["Etsy"] as! Dictionary<String, AnyObject>)["consumerKey"] as! String) self.apiKey = ((dict["Etsy"] as! Dictionary<String, AnyObject>)["consumerKey"] as! String)
self.apiSecret = ((dict["Etsy"] as! Dictionary<String, AnyObject>)["consumerSecret"] as! String) self.apiSecret = ((dict["Etsy"] as! Dictionary<String, AnyObject>)["consumerSecret"] as! String)
oauthswift = OAuth1Swift(parameters: ["consumerKey":self.apiKey,"consumerSecret":self.apiSecret, "requestTokenUrl" : "https://openapi.etsy.com/v2/oauth/request_token?scope=listings_w%20listings_r%20listings_d%20transactions_r%20transactions_w", oauthswift = OAuth1Swift(parameters: ["consumerKey":self.apiKey,"consumerSecret":self.apiSecret, "requestTokenUrl" : "https://openapi.etsy.com/v2/oauth/request_token?scope=listings_w%20listings_r%20listings_d%20transactions_r%20transactions_w",
"authorizeUrl": "https://www.etsy.com/oauth/signin?", "authorizeUrl": "https://www.etsy.com/oauth/signin?",
"accessTokenUrl": "https://openapi.etsy.com/v2/oauth/access_token?", "accessTokenUrl": "https://openapi.etsy.com/v2/oauth/access_token?",
"responseType": "token"]) "responseType": "token"])
//something is wrong when here when logging back in with a diff user
if(self.isAuthorized){ if(self.isAuthorized){
let dictionary = Locksmith.loadDataForUserAccount(self.userEmail, inService: "vendoo_oauth_etsy") let dictionary = Locksmith.loadDataForUserAccount(self.userEmail, inService: "vendoo_oauth_etsy")
let oauthDictionary = dictionary?["etsy_oauth"] as? Dictionary<String, AnyObject!> let oauthDictionary = dictionary?["etsy_oauth"] as? Dictionary<String, AnyObject!>
@ -56,7 +62,7 @@ class EtsyRESTAPIManager: NSObject {
self.oauthswift.client.credential.oauth_token_secret = (oauthDictionary?["secret"] as? String!)! self.oauthswift.client.credential.oauth_token_secret = (oauthDictionary?["secret"] as? String!)!
} }
/*scope=listings_w%20listings_r%20listings_d%20transactions_r%20transactions_w"*/
} }
@ -72,86 +78,109 @@ extension EtsyRESTAPIManager {
//makes application ready for use with users etsy account //makes application ready for use with users etsy account
func authorizeApp(viewcontroller: UIViewController){ func authorizeApp(viewcontroller: UIViewController){
var boolResult: Bool! var boolResult: Bool!
if(!isAuthorized){ if(!isAuthorized){
oauthswift!.authorize_url_handler = SafariURLHandler(viewController: viewcontroller) oauthswift!.authorize_url_handler = SafariURLHandler(viewController: viewcontroller)
oauthswift!.client.get("https://openapi.etsy.com/v2/oauth/request_token?scope=listings_w%20listings_r%20listings_d%20transactions_r%20transactions_w", /*
success: { let authRequest = self.oauthswift.client.makeRequest("https://openapi.etsy.com/v2/oauth/request_token?", method: OAuthSwiftHTTPRequest.Method.GET, parameters: ["scope":"listings_w%20listings_r%20listings_d%20transactions_r%20transactions_w"] , headers: nil)
data, response in
let dataString = NSString(data: data, encoding: NSUTF8StringEncoding)
print(dataString!)
print(response)
//getting error here when trying to retrieve the login url from the response
//var dataDictionary = self.convertStringToDictionary(dataString! as String)
//print(dataDictionary!["login_url"])
}
, failure: { error in
print(error)
}
)
dispatch_async(dispatch_get_main_queue(), {() -> Void in do{
try authRequest?.makeRequest()
self.oauthswift!.authorizeWithCallbackURL( NSURL(string: "vendoo://oauth-callback/etsy")!, success: { }catch{
credential, response, parameters in (error)
print(credential.oauth_token) }
print(credential.oauth_token_secret) */
print(response) /*["scope":"listings_w%20listings_r%20listings_d%20transactions_r%20transactions_w"]*/
boolResult = false self.oauthswift!.client.get("https://openapi.etsy.com/v2/oauth/request_token?scope=listings_w%20listings_r%20listings_d%20transactions_r%20transactions_w",
success: {
data, response in
}, failure: { error in
print(error)
dispatch_async(dispatch_get_main_queue(), {() -> Void in let dataString = NSString(data: data, encoding: NSUTF8StringEncoding)
print(self.oauthswift!.client.credential.oauth_token)
print(self.oauthswift!.client.credential.oauth_token_secret)
//save data to keychain
let creds = self.oauthswift?.client.credential //print(response.allHeaderFields)
let oauth: Dictionary<String, AnyObject!>? = [ "token" : creds!.oauth_token, "secret" : creds!.oauth_token_secret ] //print(dataSting)
do{ let json = JSON(data)
try Locksmith.saveData(["etsy_oauth" : oauth!], forUserAccount: self.userEmail, inService: "vendoo_oauth_etsy") print(json)
print("account credentials saved") print(dataString)
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "etsyAuthorized")
self.isAuthorized = true
boolResult = true
self.oauthswift!.authorizeWithCallbackURL( NSURL(string: "vendoo://oauth-callback/etsy")!, success: {
credential, response, parameters in
print(credential.oauth_token)
print(credential.oauth_token_secret)
print(response)
boolResult = false
}, failure: { error in
//print(error)
self.oauthswift!.client.get("https://openapi.etsy.com/v2/oauth/scopes", dispatch_async(dispatch_get_main_queue(), {() -> Void in
success: { print(self.oauthswift!.client.credential.oauth_token)
data, response in print(self.oauthswift!.client.credential.oauth_token_secret)
let dataString = NSString(data: data, encoding: NSUTF8StringEncoding) print(self.oauthswift.allowMissingOauthVerifier = true)
print(dataString) //save data to keychain
let creds = self.oauthswift?.client.credential
let oauth: Dictionary<String, AnyObject!>? = [ "token" : creds!.oauth_token, "secret" : creds!.oauth_token_secret ]
do{
try Locksmith.saveData(["etsy_oauth" : oauth!], forUserAccount: self.userEmail, inService: "vendoo_oauth_etsy")
print("account credentials saved")
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "etsyAuthorized")
self.isAuthorized = true
boolResult = true boolResult = true
self.oauthswift!.client.get("https://openapi.etsy.com/v2/oauth/scopes",
success: {
data, response in
let dataString = NSString(data: data, encoding: NSUTF8StringEncoding)
print(dataString)
boolResult = true
}
, failure: { error in
print(error)
boolResult = true
}
)
} }
, failure: { error in catch{
(error)
print(error) print(error)
boolResult = true //could not save data to keychain
print("account credentials could not be saved")
boolResult = false
} }
)
} //return boolResult
catch{
(error) })
print(error)
//could not save data to keychain
print("account credentials could not be saved")
boolResult = false
}
//return boolResult
}) })
})
}) //getting error here when trying to retrieve the login url from the response
//var dataDictionary = self.convertStringToDictionary(dataString! as String)
//print(dataDictionary!["login_url"])
}
, failure: { error in
print(error)
}
)
} }

View File

@ -58,6 +58,12 @@
<true/> <true/>
<key>NSAppTransportSecurity</key> <key>NSAppTransportSecurity</key>
<dict> <dict>
<key>NSIncludeSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
<key>NSAllowsArbitraryLoads</key> <key>NSAllowsArbitraryLoads</key>
<true/> <true/>
</dict> </dict>

Some files were not shown because too many files have changed in this diff Show More