Commit 163c8863 by Daniel Dahan

updated README and added CaptureController sample project

parent 01df8779
......@@ -36,9 +36,10 @@ class ViewController: UIViewController {
private var bar: Bar!
/// Left buttons.
private var favoriteButton: IconButton!
private var menuButton: IconButton!
/// Right buttons.
private var favoriteButton: IconButton!
private var shareButton: IconButton!
/// Title label.
......@@ -48,6 +49,7 @@ class ViewController: UIViewController {
super.viewDidLoad()
view.backgroundColor = Color.white
prepareMenuButton()
prepareFavoriteButton()
prepareShareButton()
prepareTitleLabel()
......@@ -56,6 +58,11 @@ class ViewController: UIViewController {
layoutSubviews()
}
private func prepareMenuButton() {
menuButton = IconButton(image: Icon.cm.menu, tintColor: Color.white)
menuButton.pulse.color = Color.white
}
private func prepareFavoriteButton() {
favoriteButton = IconButton(image: Icon.favorite, tintColor: Color.white)
favoriteButton.pulse.color = Color.white
......@@ -77,8 +84,8 @@ class ViewController: UIViewController {
bar = Bar()
bar.contentEdgeInsetsPreset = .square1
bar.backgroundColor = Color.blue.base
bar.leftViews = [favoriteButton]
bar.rightViews = [shareButton]
bar.leftViews = [menuButton]
bar.rightViews = [favoriteButton, shareButton]
}
private func layoutSubviews() {
......
......@@ -58,17 +58,14 @@ struct ButtonLayout {
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
prepareView()
view.backgroundColor = Color.white
prepareFlatButton()
prepareRaisedButton()
prepareFabButton()
prepareIconButton()
}
private func prepareView() {
view.backgroundColor = Color.white
}
private func prepareFlatButton() {
let button = FlatButton(title: "Flat Button", titleColor: Color.blue.base)
......
......@@ -13,6 +13,19 @@
96784F7E1D901FB90061C06C /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 96784F7C1D901FB90061C06C /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
9690B4061D99E69D00E7F42A /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
96784F701D901FB90061C06C /* CaptureController.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CaptureController.app; sourceTree = BUILT_PRODUCTS_DIR; };
96784F731D901FB90061C06C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
......@@ -71,6 +84,7 @@
96784F6C1D901FB90061C06C /* Sources */,
96784F6D1D901FB90061C06C /* Frameworks */,
96784F6E1D901FB90061C06C /* Resources */,
9690B4061D99E69D00E7F42A /* Embed Frameworks */,
);
buildRules = (
);
......@@ -248,6 +262,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = CaptureController/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = io.cosmicmind.CaptureController;
......@@ -260,6 +275,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = CaptureController/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = io.cosmicmind.CaptureController;
......@@ -287,6 +303,7 @@
96784F841D901FB90061C06C /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
......
//
// AppDelegate.swift
// CaptureController
//
// Created by Daniel Dahan on 2016-09-19.
// Copyright © 2016 CosmicMind. All rights reserved.
//
/*
* Copyright (C) 2015 - 2016, Daniel Dahan and CosmicMind, Inc. <http://cosmicmind.io>.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of CosmicMind nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import UIKit
import Material
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
func applicationDidFinishLaunching(_ application: UIApplication) {
window = UIWindow(frame: Device.bounds)
window!.rootViewController = ViewController()
window!.makeKeyAndVisible()
}
}
......@@ -2,6 +2,16 @@
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
......@@ -32,6 +42,16 @@
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
},
......@@ -59,6 +79,11 @@
"idiom" : "ipad",
"size" : "76x76",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "83.5x83.5",
"scale" : "2x"
}
],
"info" : {
......
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_camera_front_white.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_camera_front_white@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_camera_front_white@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_camera_rear_white.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_camera_rear_white@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_camera_rear_white@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_flash_auto_white.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_flash_auto_white@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_flash_auto_white@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_flash_off_white.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_flash_off_white@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_flash_off_white@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_flash_on_white.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_flash_on_white@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_flash_on_white@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_photo_camera_white_36pt.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_photo_camera_white_36pt@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_photo_camera_white_36pt@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_videocam_white_36pt.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_videocam_white_36pt@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_videocam_white_36pt@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
......@@ -2,6 +2,10 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSMicrophoneUsageDescription</key>
<string></string>
<key>NSCameraUsageDescription</key>
<string>Please allow camera use?</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
......
//
// ViewController.swift
// CaptureController
//
// Created by Daniel Dahan on 2016-09-19.
// Copyright © 2016 CosmicMind. All rights reserved.
//
/*
* Copyright (C) 2015 - 2016, Daniel Dahan and CosmicMind, Inc. <http://cosmicmind.io>.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of CosmicMind nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import UIKit
import AVFoundation
import Material
class ViewController: UIViewController {
public class ViewController: UIViewController {
internal lazy var capture: Capture = Capture()
internal var toolbar: Toolbar!
internal var cameraButton: IconButton!
internal var videoButton: IconButton!
internal var switchCamerasButton: IconButton!
internal var flashButton: IconButton!
internal var captureButton: FabButton!
open override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
view.backgroundColor = Color.black
prepareCaptureButton()
prepareCameraButton()
prepareVideoButton()
prepareSwitchCamerasButton()
prepareFlashButton()
prepareCapture()
prepareToolbar()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
private func prepareCapture() {
capture.enableTapToFocus = true
capture.enableTapToExpose = true
capture.delegate = self
capture.captureSession.delegate = self
view.layout(capture).edges()
}
private func prepareToolbar() {
toolbar = Toolbar()
toolbar.backgroundColor = Color.clear
toolbar.depthPreset = .none
toolbar.titleLabel.isHidden = true
toolbar.titleLabel.textColor = Color.white
toolbar.detailLabel.isHidden = true
toolbar.detail = "Recording"
toolbar.detailLabel.textColor = Color.red.accent1
toolbar.leftViews = [switchCamerasButton]
toolbar.rightViews = [flashButton]
view.layout(toolbar).horizontally().top(20)
}
private func prepareCaptureButton() {
captureButton = FabButton()
captureButton.width = 72
captureButton.height = 72
captureButton.pulse.color = Color.white
captureButton.backgroundColor = Color.red.darken1.withAlphaComponent(0.3)
captureButton.borderColor = Color.white
captureButton.borderWidthPreset = .border3
captureButton.depthPreset = .none
capture.captureButton = captureButton
}
private func prepareCameraButton() {
cameraButton = IconButton(image: Icon.cm.photoCamera, tintColor: Color.white)
cameraButton.width = 72
cameraButton.height = 72
cameraButton.pulse.animation = .centerRadialBeyondBounds
cameraButton.shapePreset = .circle
capture.cameraButton = cameraButton
}
private func prepareVideoButton() {
videoButton = IconButton(image: Icon.cm.videocam, tintColor: Color.white)
videoButton.width = 72
videoButton.height = 72
videoButton.pulse.animation = .centerRadialBeyondBounds
videoButton.shapePreset = .circle
capture.videoButton = videoButton
}
private func prepareSwitchCamerasButton() {
switchCamerasButton = IconButton(image: UIImage(named: "ic_camera_front_white"))
capture.switchCamerasButton = switchCamerasButton
}
private func prepareFlashButton() {
flashButton = IconButton(image: UIImage(named: "ic_flash_auto_white"))
capture.flashButton = flashButton
capture.captureSession.flashMode = .auto
}
}
/// CaptureSessionDelegate.
extension ViewController: CaptureSessionDelegate {
public func captureSessionFailedWithError(captureSession: CaptureSession, error: Error) {
print(error)
}
public func captureSessionStillImageAsynchronously(captureSession: CaptureSession, image: UIImage) {
print("captureStillImageAsynchronously")
}
public func captureSessionCreateMovieFileFailedWithError(captureSession: CaptureSession, error: Error) {
print("Capture Failed \(error)")
}
public func captureSessionDidStartRecordingToOutputFileAtURL(captureSession: CaptureSession, captureOutput: AVCaptureFileOutput, fileURL: NSURL, fromConnections connections: [Any]) {
print("Capture Started Recording \(fileURL)")
cameraButton.isHidden = true
videoButton.isHidden = true
switchCamerasButton.isHidden = true
flashButton.isHidden = true
}
public func captureSessionDidFinishRecordingToOutputFileAtURL(captureSession: CaptureSession, captureOutput: AVCaptureFileOutput, outputFileURL: NSURL, fromConnections connections: [Any], error: Error!) {
print("Capture Stopped Recording \(outputFileURL)")
cameraButton.isHidden = false
videoButton.isHidden = false
switchCamerasButton.isHidden = false
flashButton.isHidden = false
}
public func captureDidStartRecordTimer(capture: Capture) {
toolbar.titleLabel.text = "00:00:00"
toolbar.titleLabel.isHidden = false
toolbar.detailLabel.isHidden = false
}
public func captureDidUpdateRecordTimer(capture: Capture, hours: Int, minutes: Int, seconds: Int) {
toolbar.title = String(format: "%02i:%02i:%02i", arguments: [hours, minutes, seconds])
}
public func captureDidStopRecordTimer(capture: Capture, hours: Int, minutes: Int, seconds: Int) {
toolbar.titleLabel.isHidden = true
toolbar.detailLabel.isHidden = true
}
public func captureSessionWillSwitchCameras(captureSession: CaptureSession, position: AVCaptureDevicePosition) {
// ... do something
}
public func captureSessionDidSwitchCameras(captureSession: CaptureSession, position: AVCaptureDevicePosition) {
if .back == position {
capture.captureSession.flashMode = .auto
flashButton.image = UIImage(named: "ic_flash_auto_white")
switchCamerasButton.image = UIImage(named: "ic_camera_front_white")
} else {
capture.captureSession.flashMode = .off
flashButton.image = UIImage(named: "ic_flash_off_white")
switchCamerasButton.image = UIImage(named: "ic_camera_rear_white")
}
}
}
/// CaptureDelegate.
extension ViewController: CaptureDelegate {
public func captureDidPressFlashButton(capture: Capture, button: UIButton) {
guard .back == capture.captureSession.position else {
return
}
guard let b = button as? Button else {
return
}
switch capture.captureSession.flashMode {
case .off:
b.image = UIImage(named: "ic_flash_on_white")
capture.captureSession.flashMode = .on
case .on:
b.image = UIImage(named: "ic_flash_auto_white")
capture.captureSession.flashMode = .auto
case .auto:
b.image = UIImage(named: "ic_flash_off_white")
capture.captureSession.flashMode = .off
}
}
public func captureDidPressCameraButton(capture: Capture, button: UIButton) {
captureButton.backgroundColor = Color.blue.darken1.withAlphaComponent(0.3)
}
public func captureDidPressVideoButton(capture: Capture, button: UIButton) {
captureButton.backgroundColor = Color.red.darken1.withAlphaComponent(0.3)
}
public func captureDidPressCaptureButton(capture: Capture, button: UIButton) {
if .photo == capture.captureMode {
// ... do something
} else if .video == capture.captureMode {
// ... do something
}
}
public func captureDidPressSwitchCamerasButton(capture: Capture, button: UIButton) {
// ... do something
}
}
......@@ -51,7 +51,7 @@ class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = Color.grey.lighten5
view.backgroundColor = Color.white
prepareFavoriteButton()
prepareShareButton()
......
......@@ -47,7 +47,7 @@ class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = Color.grey.lighten5
view.backgroundColor = Color.white
prepareImageView()
prepareFavoriteButton()
......
......@@ -48,7 +48,7 @@ class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = Color.grey.lighten5
view.backgroundColor = Color.white
prepareImageView()
prepareFavoriteButton()
......
......@@ -17,6 +17,8 @@
96784FD81D906DCB0061C06C /* RemindersItemsCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96784FD71D906DCB0061C06C /* RemindersItemsCollectionView.swift */; };
96784FDA1D906DF60061C06C /* RemindersItemsCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96784FD91D906DF60061C06C /* RemindersItemsCollectionViewCell.swift */; };
96784FDC1D906E190061C06C /* AppNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96784FDB1D906E190061C06C /* AppNavigationController.swift */; };
9690B3F81D99DFA000E7F42A /* Material.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9690B3F71D99DFA000E7F42A /* Material.framework */; };
9690B3F91D99DFA000E7F42A /* Material.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9690B3F71D99DFA000E7F42A /* Material.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
......@@ -26,6 +28,7 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
9690B3F91D99DFA000E7F42A /* Material.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
......@@ -45,6 +48,7 @@
96784FD71D906DCB0061C06C /* RemindersItemsCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemindersItemsCollectionView.swift; sourceTree = "<group>"; };
96784FD91D906DF60061C06C /* RemindersItemsCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemindersItemsCollectionViewCell.swift; sourceTree = "<group>"; };
96784FDB1D906E190061C06C /* AppNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppNavigationController.swift; sourceTree = "<group>"; };
9690B3F71D99DFA000E7F42A /* Material.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Material.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
......@@ -52,6 +56,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
9690B3F81D99DFA000E7F42A /* Material.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
......@@ -61,6 +66,7 @@
96784F2B1D901F610061C06C = {
isa = PBXGroup;
children = (
9690B3F71D99DFA000E7F42A /* Material.framework */,
96784F361D901F610061C06C /* RemindersController */,
96784F351D901F610061C06C /* Products */,
);
......@@ -125,6 +131,7 @@
TargetAttributes = {
96784F331D901F610061C06C = {
CreatedOnToolsVersion = 8.0;
DevelopmentTeam = 9Z76XCNLGL;
ProvisioningStyle = Automatic;
};
};
......@@ -286,7 +293,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
DEVELOPMENT_TEAM = "";
DEVELOPMENT_TEAM = 9Z76XCNLGL;
INFOPLIST_FILE = RemindersController/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = io.cosmicmind.RemindersController;
......@@ -299,7 +306,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
DEVELOPMENT_TEAM = "";
DEVELOPMENT_TEAM = 9Z76XCNLGL;
INFOPLIST_FILE = RemindersController/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = io.cosmicmind.RemindersController;
......
......@@ -4,8 +4,6 @@
An animation and graphics framework for Material Design in Swift.
![App](http://www.cosmicmind.io/gifs/App.gif)
## Features
- [x] Fully Configurable UI Components
......@@ -27,7 +25,7 @@ An animation and graphics framework for Material Design in Swift.
## Requirements
* iOS 8.0+ / Mac OS X 10.9+
* Xcode 7.3+
* Xcode 8.0+
## Communication
......@@ -73,67 +71,27 @@ Try the Material Colors app to see the wonderful colors available in Material, o
Take a look at some components in Material.
#### Material Icons
#### Icons
Material Icons is a library of Google and CosmicMind icons that are available for use within your iOS applications. To help with icon choices, visit [MaterialIcon.io](http://www.materialicon.io).
![MaterialIcon](http://www.cosmicmind.io/MK/MaterialMaterialIcon.png)
#### TextField
A TextField is an excellent way to improve UX.
![TextField](http://www.cosmicmind.io/gifs/TextField.gif)
![Icon](http://www.cosmicmind.io/MK/MaterialMaterialIcon.png)
#### Buttons
Some example buttons - FlatButton, RaisedButton, FabButton, and IconButton.
![Buttons](http://www.cosmicmind.io/gifs/Buttons.gif)
#### MenuView
A MenuView manages a group of UIViews that may be animated with default and custom configurations.
![MenuView](http://www.cosmicmind.io/gifs/MenuView.gif)
#### Material Switch
Enjoy flexible switch controls to add that little extra to your application.
![Switch](http://www.cosmicmind.io/gifs/Switch.gif)
#### Grid
Grid is an extension of UIView that enables any collection of subviews to be managed in a flexible grid system.
![Grid](http://www.cosmicmind.io/gifs/Grid.gif)
#### CardViews
CardViews are flexible components that may be configured in any way you like.
![CardView](http://www.cosmicmind.io/gifs/CardView.gif)
![ImageCardView](http://www.cosmicmind.io/gifs/ImageCardView.gif)
![TableCardView](http://www.cosmicmind.io/gifs/TableCardView.gif)
#### Toolbar
Toolbars are super flexible and add excellent control to your navigation flow.
![card](http://www.cosmicmind.io/material/white/button.gif)
![Toolbar](http://www.cosmicmind.io/gifs/Toolbar.gif)
#### Card
#### SearchBar
![card](http://www.cosmicmind.io/material/white/card.gif)
SearchBars are sleek and powerful. Customize a SearchBar in any way you like.
#### ImageCard
![SearchBar](http://www.cosmicmind.io/gifs/SearchBar.gif)
![card](http://www.cosmicmind.io/material/white/image-card.gif)
#### Much More...
#### PresenterCard
So much more inside. Enjoy!
![card](http://www.cosmicmind.io/material/white/presenter-card.gif)
## License
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment