Skip to content

Commit 30c5ea7

Browse files
committed
Initial commit
1 parent 06be7b8 commit 30c5ea7

File tree

16 files changed

+580
-56
lines changed

16 files changed

+580
-56
lines changed

SwiftMessages.xcodeproj/project.pbxproj

+67-11
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,18 @@
88

99
/* Begin PBXBuildFile section */
1010
867E21531D4D01D500594A41 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867E21521D4D01D500594A41 /* AppDelegate.swift */; };
11-
867E21551D4D01D500594A41 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867E21541D4D01D500594A41 /* ViewController.swift */; };
11+
867E21551D4D01D500594A41 /* GalleryTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867E21541D4D01D500594A41 /* GalleryTableViewController.swift */; };
1212
867E21581D4D01D500594A41 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 867E21561D4D01D500594A41 /* Main.storyboard */; };
1313
867E215A1D4D01D500594A41 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 867E21591D4D01D500594A41 /* Assets.xcassets */; };
1414
867E215D1D4D01D500594A41 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 867E215B1D4D01D500594A41 /* LaunchScreen.storyboard */; };
1515
867E21681D4D01D500594A41 /* SwiftMessagesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867E21671D4D01D500594A41 /* SwiftMessagesTests.swift */; };
1616
867E21731D4D01D500594A41 /* SwiftMessagesUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867E21721D4D01D500594A41 /* SwiftMessagesUITests.swift */; };
17+
867E21831D4D025200594A41 /* MessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867E21821D4D025200594A41 /* MessageView.swift */; };
18+
867E21851D4D044F00594A41 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867E21841D4D044F00594A41 /* Configuration.swift */; };
19+
867E21871D4D04C600594A41 /* MessageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 867E21861D4D04C600594A41 /* MessageView.xib */; };
20+
867E21891D4D06D900594A41 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 867E21881D4D06D900594A41 /* Images.xcassets */; };
21+
867E21901D4D3E5E00594A41 /* UIView+Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867E218F1D4D3E5E00594A41 /* UIView+Message.swift */; };
22+
867E21941D4D50BB00594A41 /* Presenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867E21931D4D50BB00594A41 /* Presenter.swift */; };
1723
/* End PBXBuildFile section */
1824

1925
/* Begin PBXContainerItemProxy section */
@@ -36,7 +42,7 @@
3642
/* Begin PBXFileReference section */
3743
867E214F1D4D01D500594A41 /* SwiftMessages.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SwiftMessages.app; sourceTree = BUILT_PRODUCTS_DIR; };
3844
867E21521D4D01D500594A41 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
39-
867E21541D4D01D500594A41 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
45+
867E21541D4D01D500594A41 /* GalleryTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GalleryTableViewController.swift; sourceTree = "<group>"; };
4046
867E21571D4D01D500594A41 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
4147
867E21591D4D01D500594A41 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
4248
867E215C1D4D01D500594A41 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
@@ -47,6 +53,12 @@
4753
867E216E1D4D01D500594A41 /* SwiftMessagesUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftMessagesUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
4854
867E21721D4D01D500594A41 /* SwiftMessagesUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftMessagesUITests.swift; sourceTree = "<group>"; };
4955
867E21741D4D01D500594A41 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
56+
867E21821D4D025200594A41 /* MessageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageView.swift; sourceTree = "<group>"; };
57+
867E21841D4D044F00594A41 /* Configuration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Configuration.swift; sourceTree = "<group>"; };
58+
867E21861D4D04C600594A41 /* MessageView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MessageView.xib; sourceTree = "<group>"; };
59+
867E21881D4D06D900594A41 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
60+
867E218F1D4D3E5E00594A41 /* UIView+Message.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+Message.swift"; sourceTree = "<group>"; };
61+
867E21931D4D50BB00594A41 /* Presenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Presenter.swift; sourceTree = "<group>"; };
5062
/* End PBXFileReference section */
5163

5264
/* Begin PBXFrameworksBuildPhase section */
@@ -97,12 +109,10 @@
97109
867E21511D4D01D500594A41 /* SwiftMessages */ = {
98110
isa = PBXGroup;
99111
children = (
100-
867E21521D4D01D500594A41 /* AppDelegate.swift */,
101-
867E21541D4D01D500594A41 /* ViewController.swift */,
102-
867E21561D4D01D500594A41 /* Main.storyboard */,
103-
867E21591D4D01D500594A41 /* Assets.xcassets */,
104-
867E215B1D4D01D500594A41 /* LaunchScreen.storyboard */,
105-
867E215E1D4D01D500594A41 /* Info.plist */,
112+
867E21841D4D044F00594A41 /* Configuration.swift */,
113+
867E218A1D4D3CCC00594A41 /* Message Views */,
114+
867E218E1D4D3DFD00594A41 /* Internal */,
115+
867E21811D4D021A00594A41 /* Demo */,
106116
);
107117
path = SwiftMessages;
108118
sourceTree = "<group>";
@@ -125,6 +135,46 @@
125135
path = SwiftMessagesUITests;
126136
sourceTree = "<group>";
127137
};
138+
867E21811D4D021A00594A41 /* Demo */ = {
139+
isa = PBXGroup;
140+
children = (
141+
867E21521D4D01D500594A41 /* AppDelegate.swift */,
142+
867E21541D4D01D500594A41 /* GalleryTableViewController.swift */,
143+
867E21561D4D01D500594A41 /* Main.storyboard */,
144+
867E21591D4D01D500594A41 /* Assets.xcassets */,
145+
867E215B1D4D01D500594A41 /* LaunchScreen.storyboard */,
146+
867E215E1D4D01D500594A41 /* Info.plist */,
147+
);
148+
name = Demo;
149+
sourceTree = "<group>";
150+
};
151+
867E218A1D4D3CCC00594A41 /* Message Views */ = {
152+
isa = PBXGroup;
153+
children = (
154+
867E21881D4D06D900594A41 /* Images.xcassets */,
155+
867E218B1D4D3CD700594A41 /* Default */,
156+
);
157+
name = "Message Views";
158+
sourceTree = "<group>";
159+
};
160+
867E218B1D4D3CD700594A41 /* Default */ = {
161+
isa = PBXGroup;
162+
children = (
163+
867E21821D4D025200594A41 /* MessageView.swift */,
164+
867E21861D4D04C600594A41 /* MessageView.xib */,
165+
);
166+
name = Default;
167+
sourceTree = "<group>";
168+
};
169+
867E218E1D4D3DFD00594A41 /* Internal */ = {
170+
isa = PBXGroup;
171+
children = (
172+
867E21931D4D50BB00594A41 /* Presenter.swift */,
173+
867E218F1D4D3E5E00594A41 /* UIView+Message.swift */,
174+
);
175+
name = Internal;
176+
sourceTree = "<group>";
177+
};
128178
/* End PBXGroup section */
129179

130180
/* Begin PBXNativeTarget section */
@@ -229,6 +279,8 @@
229279
isa = PBXResourcesBuildPhase;
230280
buildActionMask = 2147483647;
231281
files = (
282+
867E21871D4D04C600594A41 /* MessageView.xib in Resources */,
283+
867E21891D4D06D900594A41 /* Images.xcassets in Resources */,
232284
867E215D1D4D01D500594A41 /* LaunchScreen.storyboard in Resources */,
233285
867E215A1D4D01D500594A41 /* Assets.xcassets in Resources */,
234286
867E21581D4D01D500594A41 /* Main.storyboard in Resources */,
@@ -256,8 +308,12 @@
256308
isa = PBXSourcesBuildPhase;
257309
buildActionMask = 2147483647;
258310
files = (
259-
867E21551D4D01D500594A41 /* ViewController.swift in Sources */,
311+
867E21831D4D025200594A41 /* MessageView.swift in Sources */,
312+
867E21551D4D01D500594A41 /* GalleryTableViewController.swift in Sources */,
313+
867E21851D4D044F00594A41 /* Configuration.swift in Sources */,
314+
867E21941D4D50BB00594A41 /* Presenter.swift in Sources */,
260315
867E21531D4D01D500594A41 /* AppDelegate.swift in Sources */,
316+
867E21901D4D3E5E00594A41 /* UIView+Message.swift in Sources */,
261317
);
262318
runOnlyForDeploymentPostprocessing = 0;
263319
};
@@ -349,7 +405,7 @@
349405
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
350406
GCC_WARN_UNUSED_FUNCTION = YES;
351407
GCC_WARN_UNUSED_VARIABLE = YES;
352-
IPHONEOS_DEPLOYMENT_TARGET = 9.3;
408+
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
353409
MTL_ENABLE_DEBUG_INFO = YES;
354410
ONLY_ACTIVE_ARCH = YES;
355411
SDKROOT = iphoneos;
@@ -388,7 +444,7 @@
388444
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
389445
GCC_WARN_UNUSED_FUNCTION = YES;
390446
GCC_WARN_UNUSED_VARIABLE = YES;
391-
IPHONEOS_DEPLOYMENT_TARGET = 9.3;
447+
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
392448
MTL_ENABLE_DEBUG_INFO = NO;
393449
SDKROOT = iphoneos;
394450
VALIDATE_PRODUCT = YES;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<Bucket
3+
type = "1"
4+
version = "2.0">
5+
</Bucket>

SwiftMessages/AppDelegate.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
// AppDelegate.swift
33
// SwiftMessages
44
//
5-
// Created by Tim Moose on 7/30/16.
6-
// Copyright © 2016 SwiftKick Mobile. All rights reserved.
5+
// Created by Timothy Moose on 7/30/16.
6+
// Copyright © 2016 SwiftKick Mobile LLC. All rights reserved.
77
//
88

99
import UIKit
+55-14
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,66 @@
11
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2-
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6211" systemVersion="14A298i" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
2+
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15G31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="oaw-0K-s4O">
33
<dependencies>
4-
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6204"/>
4+
<deployment identifier="iOS"/>
5+
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
56
</dependencies>
67
<scenes>
7-
<!--View Controller-->
8-
<scene sceneID="tne-QT-ifu">
8+
<!--Gallery Table View Controller-->
9+
<scene sceneID="eYi-9A-oPG">
910
<objects>
10-
<viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="target" sceneMemberID="viewController">
11-
<layoutGuides>
12-
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
13-
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
14-
</layoutGuides>
15-
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
11+
<tableViewController id="oaw-0K-s4O" customClass="GalleryTableViewController" customModule="SwiftMessages" customModuleProvider="target" sceneMemberID="viewController">
12+
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" id="CeH-1g-aiP">
1613
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
1714
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
18-
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
19-
</view>
20-
</viewController>
21-
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
15+
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
16+
<sections>
17+
<tableViewSection id="3c3-BJ-STl">
18+
<cells>
19+
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" textLabel="Ub5-ad-NKx" style="IBUITableViewCellStyleDefault" id="wRc-zV-nAW">
20+
<rect key="frame" x="0.0" y="0.0" width="600" height="44"/>
21+
<autoresizingMask key="autoresizingMask"/>
22+
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="wRc-zV-nAW" id="EIE-6J-j36">
23+
<rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
24+
<autoresizingMask key="autoresizingMask"/>
25+
<subviews>
26+
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Message view" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Ub5-ad-NKx">
27+
<rect key="frame" x="15" y="0.0" width="570" height="43.5"/>
28+
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
29+
<fontDescription key="fontDescription" type="system" pointSize="16"/>
30+
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
31+
<nil key="highlightedColor"/>
32+
</label>
33+
</subviews>
34+
</tableViewCellContentView>
35+
</tableViewCell>
36+
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="mPH-Rg-nNZ">
37+
<rect key="frame" x="0.0" y="44" width="600" height="44"/>
38+
<autoresizingMask key="autoresizingMask"/>
39+
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="mPH-Rg-nNZ" id="Ss1-lS-zUb">
40+
<rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
41+
<autoresizingMask key="autoresizingMask"/>
42+
</tableViewCellContentView>
43+
</tableViewCell>
44+
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="yKs-Sh-qBq">
45+
<rect key="frame" x="0.0" y="88" width="600" height="44"/>
46+
<autoresizingMask key="autoresizingMask"/>
47+
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="yKs-Sh-qBq" id="e7e-HL-xhs">
48+
<rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
49+
<autoresizingMask key="autoresizingMask"/>
50+
</tableViewCellContentView>
51+
</tableViewCell>
52+
</cells>
53+
</tableViewSection>
54+
</sections>
55+
<connections>
56+
<outlet property="dataSource" destination="oaw-0K-s4O" id="YS8-Dq-G7h"/>
57+
<outlet property="delegate" destination="oaw-0K-s4O" id="nPe-9F-k5g"/>
58+
</connections>
59+
</tableView>
60+
</tableViewController>
61+
<placeholder placeholderIdentifier="IBFirstResponder" id="dms-c8-K0q" userLabel="First Responder" sceneMemberID="firstResponder"/>
2262
</objects>
63+
<point key="canvasLocation" x="491" y="368"/>
2364
</scene>
2465
</scenes>
2566
</document>

SwiftMessages/Configuration.swift

+111
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
//
2+
// Configuration.swift
3+
// SwiftMessages
4+
//
5+
// Created by Timothy Moose on 7/30/16.
6+
// Copyright © 2016 SwiftKick Mobile LLC. All rights reserved.
7+
//
8+
9+
import UIKit
10+
11+
public enum PresentationContext {
12+
case InKeyWindow
13+
case InWindow(_: UIWindow)
14+
case OverWindow(windowLevel: UIWindowLevel)
15+
case InViewController(_: UIViewController)
16+
case InTopViewController(_: UIWindow)
17+
}
18+
19+
public enum PresentationStyle {
20+
case Top
21+
case Bottom
22+
}
23+
24+
//public enum AnimationStyle {
25+
//
26+
// public static var defaultAnimationStyle = AnimationStyle.Default(showDuration: 0.5, hideDuration: 0.5)
27+
// public static var springAnimationStyle = AnimationStyle.Spring(showDuration: 0.5, hideDuration: 0.5)
28+
//
29+
// case Default(showDuration: NSTimeInterval, hideDuration: NSTimeInterval)
30+
// case Spring(showDuration: NSTimeInterval, hideDuration: NSTimeInterval)
31+
//
32+
// public typealias Animator = (animationBlockCallback: () -> Void) -> Void
33+
// case Custom(showAnimator: Animator, hideAnimator: Animator)
34+
//}
35+
36+
public enum Icon {
37+
38+
case Error
39+
case Warning
40+
case Info
41+
case GrinningFace
42+
case GrimacingFace
43+
case ThinkingFace
44+
case ImageName(name: String)
45+
case Text(text: String)
46+
47+
public var image: UIImage? {
48+
let name: String?
49+
switch self {
50+
case .Error:
51+
name = "errorIcon"
52+
case .ImageName(let foundName):
53+
name = foundName
54+
default:
55+
name = nil
56+
}
57+
guard let foundName = name else { return nil }
58+
return UIImage(named: foundName)
59+
}
60+
61+
public var text: String? {
62+
switch self {
63+
case .GrinningFace:
64+
return "😀"
65+
case .GrimacingFace:
66+
return "😬"
67+
case .ThinkingFace:
68+
return "🤔"
69+
case .Text(let text):
70+
return text
71+
default:
72+
return nil
73+
}
74+
}
75+
}
76+
77+
enum Error: ErrorType {
78+
case CannotLoadViewFromNib(nibName: String)
79+
case CannotFindContainer
80+
}
81+
82+
public struct Configuration<V: UIView> {
83+
84+
public typealias ViewConfiguration = (view: V) -> Void
85+
86+
public var viewConfigurations: [ViewConfiguration] = []
87+
88+
public init() {
89+
self.viewConfigurations = []
90+
}
91+
92+
public init(viewConfiguration: ViewConfiguration) {
93+
self.viewConfigurations = [viewConfiguration]
94+
}
95+
96+
public init(viewConfigurations: [ViewConfiguration]) {
97+
self.viewConfigurations = viewConfigurations
98+
}
99+
100+
public func show() throws {
101+
try Presenter(configuration: self).show()
102+
}
103+
104+
public var nibName: String?
105+
106+
public var presentationStyle = PresentationStyle.Top
107+
108+
// public var animationStyle = AnimationStyle.defaultAnimationStyle
109+
110+
public var presentationContext = PresentationContext.InKeyWindow
111+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//
2+
// GalleryTableViewController.swift
3+
// SwiftMessages
4+
//
5+
// Created by Timothy Moose on 7/30/16.
6+
// Copyright © 2016 SwiftKick Mobile LLC. All rights reserved.
7+
//
8+
9+
import UIKit
10+
11+
class GalleryTableViewController: UITableViewController {
12+
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
13+
let style = MessageView.errorConfiguration()
14+
let content = MessageView.contentConfiguration(title: "My Title", body: "This is my body message.")
15+
let config = Configuration<MessageView>(viewConfigurations: [style, content])
16+
try! config.show()
17+
}
18+
}
19+

0 commit comments

Comments
 (0)