From dc695f8606855554ae4342c9e9bcd77f95506755 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sr=C4=91an=20Stanic=CC=81?= Date: Wed, 25 Jan 2017 22:40:07 +0100 Subject: [PATCH 001/227] Prevents a loss of a message. Before this change, if a message is shown while the message of the same type is being dismissed, the second message will simply be discarded. After this change, the second message will be properly queued. --- SwiftMessages/Presenter.swift | 5 ++++- SwiftMessages/SwiftMessages.swift | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/SwiftMessages/Presenter.swift b/SwiftMessages/Presenter.swift index 96719f04..25039de0 100644 --- a/SwiftMessages/Presenter.swift +++ b/SwiftMessages/Presenter.swift @@ -277,7 +277,10 @@ class Presenter: NSObject, UIGestureRecognizerDelegate { } } + var isHiding = false + func hide(completion: @escaping (_ completed: Bool) -> Void) { + isHiding = true self.config.eventListeners.forEach { $0(.willHide) } switch config.presentationStyle { case .top, .bottom: @@ -311,7 +314,7 @@ class Presenter: NSObject, UIGestureRecognizerDelegate { // completion(completed: completed) // }) } - + func undim() { UIView.animate(withDuration: 0.2, animations: { self.maskingView.backgroundColor = UIColor.clear diff --git a/SwiftMessages/SwiftMessages.swift b/SwiftMessages/SwiftMessages.swift index d4b4ae58..4d8b5fa1 100644 --- a/SwiftMessages/SwiftMessages.swift +++ b/SwiftMessages/SwiftMessages.swift @@ -366,7 +366,7 @@ open class SwiftMessages: PresenterDelegate { func enqueue(presenter: Presenter) { if presenter.config.ignoreDuplicates, let id = presenter.id { - if current?.id == id { return } + if current?.id == id && current?.isHiding == false { return } if queue.filter({ $0.id == id }).count > 0 { return } } queue.append(presenter) From fe5c39f51e844431f6dfa19e6a33c18e32859e2b Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Sat, 4 Mar 2017 16:45:32 -0600 Subject: [PATCH 002/227] Add unknown duration option --- CHANGELOG.md | 9 + Demo/Podfile.lock | 8 +- .../Local Podspecs/SwiftMessages.podspec.json | 4 +- Demo/Pods/Manifest.lock | 8 +- Demo/Pods/Pods.xcodeproj/project.pbxproj | 413 +++++++++--------- .../Pods-Demo/Pods-Demo-frameworks.sh | 12 +- .../Pods-Demo/Pods-Demo-resources.sh | 3 + .../Pods-Demo/Pods-Demo-umbrella.h | 8 + .../Pods-Demo/Pods-Demo.debug.xcconfig | 1 - .../Pods-Demo/Pods-Demo.release.xcconfig | 1 - .../SwiftMessages/Info.plist | 2 +- .../ResourceBundle-SwiftMessages-Info.plist | 2 +- .../SwiftMessages/SwiftMessages-prefix.pch | 8 + .../SwiftMessages/SwiftMessages-umbrella.h | 8 + .../SwiftMessages/SwiftMessages.xcconfig | 1 + SwiftMessages.podspec | 4 +- SwiftMessages/Presenter.swift | 27 +- SwiftMessages/SwiftMessages.swift | 87 +++- 18 files changed, 370 insertions(+), 236 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea342f00..15430367 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ # Change Log All notable changes to this project will be documented in this file. +## [3.2.0](https://github.com/SwiftKickMobile/SwiftMessages/releases/tag/3.2.0) + +### Features +* Added the ability to display messages for an unknown duration while enforcing a minimum duration using `Duration.unknown(delay:minimum)`. + +This option is useful for displaying a message when a process is taking too long but you don't want to display the message if the process completes in a reasonable amount of time. + +For example, if a URL load is expected to complete in 2 seconds, you may use the value `unknown(delay: 2, minimum 1)` to ensure that the message will not be displayed most of the time, but will be displayed for at least 1 second if the operation takes longer. By specifying a minimum duration, you can avoid hiding the message too fast if the operation happens to complete right after the delay. + ## [3.1.5](https://github.com/SwiftKickMobile/SwiftMessages/releases/tag/3.1.5) ### Bug Fixes diff --git a/Demo/Podfile.lock b/Demo/Podfile.lock index 254dff49..c8136646 100644 --- a/Demo/Podfile.lock +++ b/Demo/Podfile.lock @@ -1,16 +1,16 @@ PODS: - - SwiftMessages (3.0.3) + - SwiftMessages (3.1.5) DEPENDENCIES: - SwiftMessages (from `../`) EXTERNAL SOURCES: SwiftMessages: - :path: ../ + :path: "../" SPEC CHECKSUMS: - SwiftMessages: 06669bc36f8aef5883932db29d36e4292979d915 + SwiftMessages: e183a3541844cf450dc0983034bbfe7cc22dcaa7 PODFILE CHECKSUM: 6431c980c9207084d738b6ba87b2101dd9eb5097 -COCOAPODS: 1.1.1 +COCOAPODS: 1.2.0 diff --git a/Demo/Pods/Local Podspecs/SwiftMessages.podspec.json b/Demo/Pods/Local Podspecs/SwiftMessages.podspec.json index 71ac2ce5..8efa892b 100644 --- a/Demo/Pods/Local Podspecs/SwiftMessages.podspec.json +++ b/Demo/Pods/Local Podspecs/SwiftMessages.podspec.json @@ -1,6 +1,6 @@ { "name": "SwiftMessages", - "version": "3.0.3", + "version": "3.1.5", "license": { "type": "MIT" }, @@ -11,7 +11,7 @@ "summary": "A very flexible message bar for iOS written in Swift.", "source": { "git": "https://github.com/SwiftKickMobile/SwiftMessages.git", - "tag": "3.0.3" + "tag": "3.1.5" }, "platforms": { "ios": "8.0" diff --git a/Demo/Pods/Manifest.lock b/Demo/Pods/Manifest.lock index 254dff49..c8136646 100644 --- a/Demo/Pods/Manifest.lock +++ b/Demo/Pods/Manifest.lock @@ -1,16 +1,16 @@ PODS: - - SwiftMessages (3.0.3) + - SwiftMessages (3.1.5) DEPENDENCIES: - SwiftMessages (from `../`) EXTERNAL SOURCES: SwiftMessages: - :path: ../ + :path: "../" SPEC CHECKSUMS: - SwiftMessages: 06669bc36f8aef5883932db29d36e4292979d915 + SwiftMessages: e183a3541844cf450dc0983034bbfe7cc22dcaa7 PODFILE CHECKSUM: 6431c980c9207084d738b6ba87b2101dd9eb5097 -COCOAPODS: 1.1.1 +COCOAPODS: 1.2.0 diff --git a/Demo/Pods/Pods.xcodeproj/project.pbxproj b/Demo/Pods/Pods.xcodeproj/project.pbxproj index 10b86081..ad8ae2b7 100644 --- a/Demo/Pods/Pods.xcodeproj/project.pbxproj +++ b/Demo/Pods/Pods.xcodeproj/project.pbxproj @@ -7,51 +7,51 @@ objects = { /* Begin PBXBuildFile section */ - 033755DFF1EAA8845C3A4400F7CABD73 /* MessageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCBA1D883DEEB0334782E5EDB718DDB /* MessageView.xib */; }; - 0D01BFD56C1BEA74B1DD7F669383C02E /* CardView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 935AF4ECA81CC2678E76B92FF03E4CD1 /* CardView.xib */; }; - 0ECE6B9AA78CD7C4640C3ED1F63C28C0 /* StatusLine.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CB2A7DC83E6F1CB8B9EA75D6C97CBED /* StatusLine.xib */; }; - 3508BE5270089E984127E6DA9200D6EB /* SwiftMessages-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A863D0F2536D769707B46871EBA897B /* SwiftMessages-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 361B87DFD5711CC17EA526078D6AE7BF /* NSBundle+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 464E0975C3D038A42E7D5B43E27DB23B /* NSBundle+Utils.swift */; }; - 37CE3EEAFCF317B15AF9A9496983E43D /* Array+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FAD0CA526C80FBFB3BA8A5C07559FEF /* Array+Utils.swift */; }; - 4A7E56B569DF6C7681E72ECC1F54CC46 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 616BEB51ECCAD129BDBCB7A956B56CC6 /* Foundation.framework */; }; - 4C93067366FED28F560E04E6D497E3F8 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51AF6A2CED446E4872B522299E5F5D10 /* Error.swift */; }; - 4E9B81CE7D381F180D054D2D1583B6D2 /* TabView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B158478428D475305ADAF5828351240 /* TabView.xib */; }; - 55B1ED48905476533300C59DD70C1204 /* PassthroughWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63D213FF475BB82B12655CE24416B7F4 /* PassthroughWindow.swift */; }; - 623E3DF2F6D0B976C165A00D6EA1D55E /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63A5295EC116F9FD3E06892F71998C9A /* Theme.swift */; }; - 6B58CA72D169E768CA259C48AAED3AD1 /* BaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B22FC3EB8475C3D4FA73110FD742497 /* BaseView.swift */; }; - 7CEBD10BD22E92DCD0B7454A87293DB6 /* Pods-Demo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 03EA1E60232BFA05817BC26ACB8E68BA /* Pods-Demo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9B95A220914D3BC576D1F179029605CF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 616BEB51ECCAD129BDBCB7A956B56CC6 /* Foundation.framework */; }; - 9BD977BD90B8240559AD9D461E66C814 /* Pods-Demo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C5BC86D40B890A7B0844F888209CA06F /* Pods-Demo-dummy.m */; }; - 9F63C90369D73BF39DDB112F66EBFE9A /* UIViewController+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 749543C80A60DDE16A18B30833E939C8 /* UIViewController+Utils.swift */; }; - A0BB3AFC78CAEB0955389592B2345BEF /* MessageViewIOS8.xib in Resources */ = {isa = PBXBuildFile; fileRef = EE0DA5FBD33716312680D2F857D3BFF1 /* MessageViewIOS8.xib */; }; - B521592325469EC120D284763CE632C8 /* BackgroundViewable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8736DDECB493A056A2AB7B962D5A1C36 /* BackgroundViewable.swift */; }; - B884D515F9A27C2F421B298EC82FACA5 /* WindowViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F631B93A4E963F8E97CD304126E81B8 /* WindowViewController.swift */; }; - BCC3C8587F2CF0A9B533B67CD039FAF6 /* Presenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B591B99259586710CB1B7B262B07E78 /* Presenter.swift */; }; - C375636BF954217E7663BD78163ECC1F /* Identifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E520F85C9F3D333AEF256ADBD7C5981 /* Identifiable.swift */; }; - C3BD696FE64625B4EC84D330BF03FC6E /* SwiftMessages.bundle in Resources */ = {isa = PBXBuildFile; fileRef = EDA8A9CFB00CA35B42F93F216EB7DA9B /* SwiftMessages.bundle */; }; - C4F47992FAA181DCA6EA8FBFD5651A21 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0A4D9DDC91358D2E2437AB30046E9553 /* Images.xcassets */; }; - C7C26AB011E621CC61016EA8BB38CFE3 /* SwiftMessages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFB0B18866A37CD24FE04F785992F2B /* SwiftMessages.swift */; }; - D2C2509012B61DEEF0851D49431A8037 /* PassthroughView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3520E8580FD3906F08FFE47E8F0D3EA /* PassthroughView.swift */; }; - D2EC6EE885103DECF483741F6272EC48 /* MarginAdjustable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3CC8CF7417590860536205EF5C33255 /* MarginAdjustable.swift */; }; - D9F06A51095F1AFE92D70FFB0AFB72B5 /* MessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BBB29F0DA5F0FF9535944F1F59935CF /* MessageView.swift */; }; - DC0C70D1D189212417E59E066A77B052 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7EC994CDC2D681BA26389F78A7E4B325 /* UIKit.framework */; }; - FA1B968C19EDF9104062DB1FF562AA90 /* SwiftMessages-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DAFFA5D242D0AAB9518D5D81A208B79D /* SwiftMessages-dummy.m */; }; + 00D9F36D9E9DAE829E23F49571B809EE /* CardView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 935AF4ECA81CC2678E76B92FF03E4CD1 /* CardView.xib */; }; + 041A5D5326E219387AC44FB900D72021 /* NSBundle+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 464E0975C3D038A42E7D5B43E27DB23B /* NSBundle+Utils.swift */; }; + 358AED3638D5FB91ABB994B2AA33515C /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63A5295EC116F9FD3E06892F71998C9A /* Theme.swift */; }; + 379034C9D27F4371D0CCB174CF40AF69 /* SwiftMessages-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DAFFA5D242D0AAB9518D5D81A208B79D /* SwiftMessages-dummy.m */; }; + 3B0F59739F3A812B1C5207B2F74AFAFB /* BaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B22FC3EB8475C3D4FA73110FD742497 /* BaseView.swift */; }; + 4132E1E95DC870D51852FF6B0742299D /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51AF6A2CED446E4872B522299E5F5D10 /* Error.swift */; }; + 41B040D3FC26BC6F3228A39ADC06A4AE /* PassthroughWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63D213FF475BB82B12655CE24416B7F4 /* PassthroughWindow.swift */; }; + 4BCB35E002D829BE676049EFDF0F3C33 /* Array+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FAD0CA526C80FBFB3BA8A5C07559FEF /* Array+Utils.swift */; }; + 5718E412292E48E433FE9C9CCD2016AF /* PassthroughView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3520E8580FD3906F08FFE47E8F0D3EA /* PassthroughView.swift */; }; + 618A1194E767E29ECE46557DD4F6B8AE /* Identifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E520F85C9F3D333AEF256ADBD7C5981 /* Identifiable.swift */; }; + 70BD7B7D6AAFB14AC5AF96A028A75496 /* MessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BBB29F0DA5F0FF9535944F1F59935CF /* MessageView.swift */; }; + 7AAB19F2F518FAFEFCC099693B8B8BA9 /* Pods-Demo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C5BC86D40B890A7B0844F888209CA06F /* Pods-Demo-dummy.m */; }; + 7D5F7A9E1E71C362D5348DBA25F9000B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 616BEB51ECCAD129BDBCB7A956B56CC6 /* Foundation.framework */; }; + 83A07526DFFFF2A912BF9B7042A9EBC1 /* MessageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCBA1D883DEEB0334782E5EDB718DDB /* MessageView.xib */; }; + 94655FE0F915EAB6FEC181D1D3F9BA5F /* Presenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B591B99259586710CB1B7B262B07E78 /* Presenter.swift */; }; + 99C742D2CA19765B6535CAC0432BAAE2 /* SwiftMessages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFB0B18866A37CD24FE04F785992F2B /* SwiftMessages.swift */; }; + A0DA50804F4D0578FA0F9ADB8E127D55 /* SwiftMessages.bundle in Resources */ = {isa = PBXBuildFile; fileRef = EDA8A9CFB00CA35B42F93F216EB7DA9B /* SwiftMessages.bundle */; }; + A9EB9FEA84BC1577826FAAEF040C3046 /* StatusLine.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CB2A7DC83E6F1CB8B9EA75D6C97CBED /* StatusLine.xib */; }; + AE35A5DE7A5FFBD132BEE9CEA4E80A15 /* UIViewController+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 749543C80A60DDE16A18B30833E939C8 /* UIViewController+Utils.swift */; }; + BBEBA8609EABA0DF5C164270441C6CF7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 616BEB51ECCAD129BDBCB7A956B56CC6 /* Foundation.framework */; }; + BC2BA13F0070A8D9152D40C9546366F7 /* SwiftMessages-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A863D0F2536D769707B46871EBA897B /* SwiftMessages-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C776870E6955A90021B06F9CAF6D822F /* MarginAdjustable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3CC8CF7417590860536205EF5C33255 /* MarginAdjustable.swift */; }; + C8CE8C0863C7BCFC6780AAB21F5A6133 /* WindowViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F631B93A4E963F8E97CD304126E81B8 /* WindowViewController.swift */; }; + CB41EFE1EFF32D80C8664D6F638C95FD /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7EC994CDC2D681BA26389F78A7E4B325 /* UIKit.framework */; }; + D5668553CA32C33B35F97CFDB0B36FB1 /* BackgroundViewable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8736DDECB493A056A2AB7B962D5A1C36 /* BackgroundViewable.swift */; }; + D6D588014F2839A41EA785088F871EA0 /* TabView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B158478428D475305ADAF5828351240 /* TabView.xib */; }; + E419242BA8C2F8D2E62D138D70DA4744 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0A4D9DDC91358D2E2437AB30046E9553 /* Images.xcassets */; }; + E9F211145EAEC09D0A0A33E46BB2059E /* Pods-Demo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 03EA1E60232BFA05817BC26ACB8E68BA /* Pods-Demo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EA3DC76EB957CF8E96C2F01C07991B5B /* MessageViewIOS8.xib in Resources */ = {isa = PBXBuildFile; fileRef = EE0DA5FBD33716312680D2F857D3BFF1 /* MessageViewIOS8.xib */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 45EF838C81A9FDB837D9733ABAAA0CA6 /* PBXContainerItemProxy */ = { + 0438E7913777CD6A66011D799CA00D46 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 6E57A87EDA4AA3721FA3CEB34CC36F3A; - remoteInfo = SwiftMessages; + remoteGlobalIDString = DDFEBB329EB85E918AB95108908D2359; + remoteInfo = "SwiftMessages-SwiftMessages"; }; - DC9CAF286ADBC369745000328E9F5779 /* PBXContainerItemProxy */ = { + 675789773D701882FB0E8EF4A75D7EBE /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 87FAE22F1196DDE6C5E9CF0810E33725; - remoteInfo = "SwiftMessages-SwiftMessages"; + remoteGlobalIDString = 15059A686928BCAC2F63840DE5CDEA54; + remoteInfo = SwiftMessages; }; /* End PBXContainerItemProxy section */ @@ -59,15 +59,15 @@ 03EA1E60232BFA05817BC26ACB8E68BA /* Pods-Demo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Demo-umbrella.h"; sourceTree = ""; }; 0A4D9DDC91358D2E2437AB30046E9553 /* Images.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 2A863D0F2536D769707B46871EBA897B /* SwiftMessages-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftMessages-umbrella.h"; sourceTree = ""; }; - 322419E99883B306EE7EC77959FCC8DF /* Pods-Demo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-Demo.modulemap"; sourceTree = ""; }; + 322419E99883B306EE7EC77959FCC8DF /* Pods-Demo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-Demo.modulemap"; sourceTree = ""; }; 3CD5A30239C90F1B549B4AB9299ECF16 /* Pods-Demo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Demo-frameworks.sh"; sourceTree = ""; }; 3D653C9DA16200D75AD14323AA830C6B /* Pods-Demo-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Demo-resources.sh"; sourceTree = ""; }; 464E0975C3D038A42E7D5B43E27DB23B /* NSBundle+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "NSBundle+Utils.swift"; sourceTree = ""; }; 4CB2A7DC83E6F1CB8B9EA75D6C97CBED /* StatusLine.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = StatusLine.xib; sourceTree = ""; }; 4CFB0B18866A37CD24FE04F785992F2B /* SwiftMessages.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SwiftMessages.swift; sourceTree = ""; }; 51AF6A2CED446E4872B522299E5F5D10 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = ""; }; - 5259A068CBCD8780234A0D70629C1271 /* SwiftMessages.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftMessages.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5A26502335E6CC635672E16466F8C0EE /* SwiftMessages.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = SwiftMessages.modulemap; sourceTree = ""; }; + 5259A068CBCD8780234A0D70629C1271 /* SwiftMessages.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SwiftMessages.framework; path = SwiftMessages.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5A26502335E6CC635672E16466F8C0EE /* SwiftMessages.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = SwiftMessages.modulemap; sourceTree = ""; }; 5B591B99259586710CB1B7B262B07E78 /* Presenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Presenter.swift; sourceTree = ""; }; 616BEB51ECCAD129BDBCB7A956B56CC6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 63A5295EC116F9FD3E06892F71998C9A /* Theme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; @@ -82,9 +82,9 @@ 8736DDECB493A056A2AB7B962D5A1C36 /* BackgroundViewable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BackgroundViewable.swift; sourceTree = ""; }; 8B22FC3EB8475C3D4FA73110FD742497 /* BaseView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseView.swift; sourceTree = ""; }; 935AF4ECA81CC2678E76B92FF03E4CD1 /* CardView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = CardView.xib; sourceTree = ""; }; - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 9F631B93A4E963F8E97CD304126E81B8 /* WindowViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = WindowViewController.swift; sourceTree = ""; }; - BFCD7E7BC43700342D2ECDA704620869 /* Pods_Demo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Demo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BFCD7E7BC43700342D2ECDA704620869 /* Pods_Demo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_Demo.framework; path = "Pods-Demo.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; C3520E8580FD3906F08FFE47E8F0D3EA /* PassthroughView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PassthroughView.swift; sourceTree = ""; }; C5BC86D40B890A7B0844F888209CA06F /* Pods-Demo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Demo-dummy.m"; sourceTree = ""; }; CA19694C0AC41D598DE4ABFEB300E619 /* Pods-Demo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Demo-acknowledgements.plist"; sourceTree = ""; }; @@ -95,7 +95,7 @@ E56520D015ED5615EF53801D8894ED54 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; E68F8C86FB3267A3C87983DA9E269889 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; EADFEC8806C084547A9B8D3999011AD3 /* SwiftMessages-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftMessages-prefix.pch"; sourceTree = ""; }; - EDA8A9CFB00CA35B42F93F216EB7DA9B /* SwiftMessages.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftMessages.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + EDA8A9CFB00CA35B42F93F216EB7DA9B /* SwiftMessages.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = SwiftMessages.bundle; path = SwiftMessages.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; EE0DA5FBD33716312680D2F857D3BFF1 /* MessageViewIOS8.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = MessageViewIOS8.xib; sourceTree = ""; }; F08242889B058791110330C1D95B6032 /* SwiftMessages.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftMessages.xcconfig; sourceTree = ""; }; F3CC8CF7417590860536205EF5C33255 /* MarginAdjustable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = MarginAdjustable.swift; sourceTree = ""; }; @@ -103,27 +103,27 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 498DB15259537BA06EFE828A427CD8B4 /* Frameworks */ = { + 558AFEABC3E016AD529BBD829E7F3650 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9B95A220914D3BC576D1F179029605CF /* Foundation.framework in Frameworks */, - DC0C70D1D189212417E59E066A77B052 /* UIKit.framework in Frameworks */, + 7D5F7A9E1E71C362D5348DBA25F9000B /* Foundation.framework in Frameworks */, + CB41EFE1EFF32D80C8664D6F638C95FD /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8AEDA58AB3CF2CF29D7B8B4CD6725062 /* Frameworks */ = { + E5750B0A5CACDB93B8E3B8112801D0D6 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BBEBA8609EABA0DF5C164270441C6CF7 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - ED81D8C9CD17F825987E610677CA67B2 /* Frameworks */ = { + E91BEACBF4240D4C99B76EFD369464A8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4A7E56B569DF6C7681E72ECC1F54CC46 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -204,6 +204,7 @@ 4CB2A7DC83E6F1CB8B9EA75D6C97CBED /* StatusLine.xib */, 7B158478428D475305ADAF5828351240 /* TabView.xib */, ); + name = Resources; path = Resources; sourceTree = ""; }; @@ -212,6 +213,7 @@ children = ( 82971C2C4FC60B9F62E1B400A07548C5 /* Resources */, ); + name = SwiftMessages; path = SwiftMessages; sourceTree = ""; }; @@ -234,6 +236,7 @@ 749543C80A60DDE16A18B30833E939C8 /* UIViewController+Utils.swift */, 9F631B93A4E963F8E97CD304126E81B8 /* WindowViewController.swift */, ); + name = SwiftMessages; path = SwiftMessages; sourceTree = ""; }; @@ -282,69 +285,69 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 24E60D8DEFBB230A9FC577B40F10F1CD /* Headers */ = { + 779303AA623CD0E2238047E4D74DB2C1 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 3508BE5270089E984127E6DA9200D6EB /* SwiftMessages-umbrella.h in Headers */, + BC2BA13F0070A8D9152D40C9546366F7 /* SwiftMessages-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8F9C13EDC0FC0492D8DCB1575B22C8DB /* Headers */ = { + A2F829DBA2F4AC8A65D72A61FF89EB2F /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 7CEBD10BD22E92DCD0B7454A87293DB6 /* Pods-Demo-umbrella.h in Headers */, + E9F211145EAEC09D0A0A33E46BB2059E /* Pods-Demo-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 18A7B303EA25F60ED7928C09C7D23D7B /* Pods-Demo */ = { + 15059A686928BCAC2F63840DE5CDEA54 /* SwiftMessages */ = { isa = PBXNativeTarget; - buildConfigurationList = 7676FBFFE6A190CE823040D6E856EED7 /* Build configuration list for PBXNativeTarget "Pods-Demo" */; + buildConfigurationList = 8A16D1503F6C16384CD89016550368FC /* Build configuration list for PBXNativeTarget "SwiftMessages" */; buildPhases = ( - 9135C864A18AC99ED68484EC7AD73856 /* Sources */, - ED81D8C9CD17F825987E610677CA67B2 /* Frameworks */, - 8F9C13EDC0FC0492D8DCB1575B22C8DB /* Headers */, + 078BDA365ED9B87A8E58886E995B7B5E /* Sources */, + 558AFEABC3E016AD529BBD829E7F3650 /* Frameworks */, + A71C7940AD91593112CD3B1F284D67E5 /* Resources */, + 779303AA623CD0E2238047E4D74DB2C1 /* Headers */, ); buildRules = ( ); dependencies = ( - BA59837BC38C56DBDC6CC9F9AE779265 /* PBXTargetDependency */, + 6F15F4DE8198D3F2C277833D9562D217 /* PBXTargetDependency */, ); - name = "Pods-Demo"; - productName = "Pods-Demo"; - productReference = BFCD7E7BC43700342D2ECDA704620869 /* Pods_Demo.framework */; + name = SwiftMessages; + productName = SwiftMessages; + productReference = 5259A068CBCD8780234A0D70629C1271 /* SwiftMessages.framework */; productType = "com.apple.product-type.framework"; }; - 6E57A87EDA4AA3721FA3CEB34CC36F3A /* SwiftMessages */ = { + 4B7F568DF46A97E1E47FBBC0DAE96062 /* Pods-Demo */ = { isa = PBXNativeTarget; - buildConfigurationList = 740976A81ABF41C22FD2F45BFD7C0323 /* Build configuration list for PBXNativeTarget "SwiftMessages" */; + buildConfigurationList = 5807A4CFC63FFCBE06FD9EC1B73C4541 /* Build configuration list for PBXNativeTarget "Pods-Demo" */; buildPhases = ( - B5520873975FDBC72CCC819CD01EB650 /* Sources */, - 498DB15259537BA06EFE828A427CD8B4 /* Frameworks */, - 73CD7ADB06D858AE793E20D67BBEF205 /* Resources */, - 24E60D8DEFBB230A9FC577B40F10F1CD /* Headers */, + C7FBE9003244C43CF1443AB01559A139 /* Sources */, + E5750B0A5CACDB93B8E3B8112801D0D6 /* Frameworks */, + A2F829DBA2F4AC8A65D72A61FF89EB2F /* Headers */, ); buildRules = ( ); dependencies = ( - A8FCCB2ACAFB3C4206FD1BC959C58270 /* PBXTargetDependency */, + 38C412DE51D0A790AF0DE9AC7ABD82D1 /* PBXTargetDependency */, ); - name = SwiftMessages; - productName = SwiftMessages; - productReference = 5259A068CBCD8780234A0D70629C1271 /* SwiftMessages.framework */; + name = "Pods-Demo"; + productName = "Pods-Demo"; + productReference = BFCD7E7BC43700342D2ECDA704620869 /* Pods_Demo.framework */; productType = "com.apple.product-type.framework"; }; - 87FAE22F1196DDE6C5E9CF0810E33725 /* SwiftMessages-SwiftMessages */ = { + DDFEBB329EB85E918AB95108908D2359 /* SwiftMessages-SwiftMessages */ = { isa = PBXNativeTarget; - buildConfigurationList = B67C03EDE53862551C4B0A06352CA5F2 /* Build configuration list for PBXNativeTarget "SwiftMessages-SwiftMessages" */; + buildConfigurationList = D1982E9931F36C16035623E777DCE705 /* Build configuration list for PBXNativeTarget "SwiftMessages-SwiftMessages" */; buildPhases = ( - E9B652E79625C5A2F503FEDEADA5DF33 /* Sources */, - 8AEDA58AB3CF2CF29D7B8B4CD6725062 /* Frameworks */, - 07DFA5BC61D0562368824F8C765DDC90 /* Resources */, + F08614BD38C701F3AADA90C9947DC76A /* Sources */, + E91BEACBF4240D4C99B76EFD369464A8 /* Frameworks */, + 64EB04EC5BDD9386E95F1E66547CFCBE /* Resources */, ); buildRules = ( ); @@ -376,70 +379,70 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 18A7B303EA25F60ED7928C09C7D23D7B /* Pods-Demo */, - 6E57A87EDA4AA3721FA3CEB34CC36F3A /* SwiftMessages */, - 87FAE22F1196DDE6C5E9CF0810E33725 /* SwiftMessages-SwiftMessages */, + 4B7F568DF46A97E1E47FBBC0DAE96062 /* Pods-Demo */, + 15059A686928BCAC2F63840DE5CDEA54 /* SwiftMessages */, + DDFEBB329EB85E918AB95108908D2359 /* SwiftMessages-SwiftMessages */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 07DFA5BC61D0562368824F8C765DDC90 /* Resources */ = { + 64EB04EC5BDD9386E95F1E66547CFCBE /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0D01BFD56C1BEA74B1DD7F669383C02E /* CardView.xib in Resources */, - C4F47992FAA181DCA6EA8FBFD5651A21 /* Images.xcassets in Resources */, - 033755DFF1EAA8845C3A4400F7CABD73 /* MessageView.xib in Resources */, - A0BB3AFC78CAEB0955389592B2345BEF /* MessageViewIOS8.xib in Resources */, - 0ECE6B9AA78CD7C4640C3ED1F63C28C0 /* StatusLine.xib in Resources */, - 4E9B81CE7D381F180D054D2D1583B6D2 /* TabView.xib in Resources */, + 00D9F36D9E9DAE829E23F49571B809EE /* CardView.xib in Resources */, + E419242BA8C2F8D2E62D138D70DA4744 /* Images.xcassets in Resources */, + 83A07526DFFFF2A912BF9B7042A9EBC1 /* MessageView.xib in Resources */, + EA3DC76EB957CF8E96C2F01C07991B5B /* MessageViewIOS8.xib in Resources */, + A9EB9FEA84BC1577826FAAEF040C3046 /* StatusLine.xib in Resources */, + D6D588014F2839A41EA785088F871EA0 /* TabView.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 73CD7ADB06D858AE793E20D67BBEF205 /* Resources */ = { + A71C7940AD91593112CD3B1F284D67E5 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C3BD696FE64625B4EC84D330BF03FC6E /* SwiftMessages.bundle in Resources */, + A0DA50804F4D0578FA0F9ADB8E127D55 /* SwiftMessages.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 9135C864A18AC99ED68484EC7AD73856 /* Sources */ = { + 078BDA365ED9B87A8E58886E995B7B5E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 9BD977BD90B8240559AD9D461E66C814 /* Pods-Demo-dummy.m in Sources */, + 4BCB35E002D829BE676049EFDF0F3C33 /* Array+Utils.swift in Sources */, + D5668553CA32C33B35F97CFDB0B36FB1 /* BackgroundViewable.swift in Sources */, + 3B0F59739F3A812B1C5207B2F74AFAFB /* BaseView.swift in Sources */, + 4132E1E95DC870D51852FF6B0742299D /* Error.swift in Sources */, + 618A1194E767E29ECE46557DD4F6B8AE /* Identifiable.swift in Sources */, + C776870E6955A90021B06F9CAF6D822F /* MarginAdjustable.swift in Sources */, + 70BD7B7D6AAFB14AC5AF96A028A75496 /* MessageView.swift in Sources */, + 041A5D5326E219387AC44FB900D72021 /* NSBundle+Utils.swift in Sources */, + 5718E412292E48E433FE9C9CCD2016AF /* PassthroughView.swift in Sources */, + 41B040D3FC26BC6F3228A39ADC06A4AE /* PassthroughWindow.swift in Sources */, + 94655FE0F915EAB6FEC181D1D3F9BA5F /* Presenter.swift in Sources */, + 379034C9D27F4371D0CCB174CF40AF69 /* SwiftMessages-dummy.m in Sources */, + 99C742D2CA19765B6535CAC0432BAAE2 /* SwiftMessages.swift in Sources */, + 358AED3638D5FB91ABB994B2AA33515C /* Theme.swift in Sources */, + AE35A5DE7A5FFBD132BEE9CEA4E80A15 /* UIViewController+Utils.swift in Sources */, + C8CE8C0863C7BCFC6780AAB21F5A6133 /* WindowViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - B5520873975FDBC72CCC819CD01EB650 /* Sources */ = { + C7FBE9003244C43CF1443AB01559A139 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 37CE3EEAFCF317B15AF9A9496983E43D /* Array+Utils.swift in Sources */, - B521592325469EC120D284763CE632C8 /* BackgroundViewable.swift in Sources */, - 6B58CA72D169E768CA259C48AAED3AD1 /* BaseView.swift in Sources */, - 4C93067366FED28F560E04E6D497E3F8 /* Error.swift in Sources */, - C375636BF954217E7663BD78163ECC1F /* Identifiable.swift in Sources */, - D2EC6EE885103DECF483741F6272EC48 /* MarginAdjustable.swift in Sources */, - D9F06A51095F1AFE92D70FFB0AFB72B5 /* MessageView.swift in Sources */, - 361B87DFD5711CC17EA526078D6AE7BF /* NSBundle+Utils.swift in Sources */, - D2C2509012B61DEEF0851D49431A8037 /* PassthroughView.swift in Sources */, - 55B1ED48905476533300C59DD70C1204 /* PassthroughWindow.swift in Sources */, - BCC3C8587F2CF0A9B533B67CD039FAF6 /* Presenter.swift in Sources */, - FA1B968C19EDF9104062DB1FF562AA90 /* SwiftMessages-dummy.m in Sources */, - C7C26AB011E621CC61016EA8BB38CFE3 /* SwiftMessages.swift in Sources */, - 623E3DF2F6D0B976C165A00D6EA1D55E /* Theme.swift in Sources */, - 9F63C90369D73BF39DDB112F66EBFE9A /* UIViewController+Utils.swift in Sources */, - B884D515F9A27C2F421B298EC82FACA5 /* WindowViewController.swift in Sources */, + 7AAB19F2F518FAFEFCC099693B8B8BA9 /* Pods-Demo-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - E9B652E79625C5A2F503FEDEADA5DF33 /* Sources */ = { + F08614BD38C701F3AADA90C9947DC76A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -449,24 +452,24 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - A8FCCB2ACAFB3C4206FD1BC959C58270 /* PBXTargetDependency */ = { + 38C412DE51D0A790AF0DE9AC7ABD82D1 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "SwiftMessages-SwiftMessages"; - target = 87FAE22F1196DDE6C5E9CF0810E33725 /* SwiftMessages-SwiftMessages */; - targetProxy = DC9CAF286ADBC369745000328E9F5779 /* PBXContainerItemProxy */; + name = SwiftMessages; + target = 15059A686928BCAC2F63840DE5CDEA54 /* SwiftMessages */; + targetProxy = 675789773D701882FB0E8EF4A75D7EBE /* PBXContainerItemProxy */; }; - BA59837BC38C56DBDC6CC9F9AE779265 /* PBXTargetDependency */ = { + 6F15F4DE8198D3F2C277833D9562D217 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = SwiftMessages; - target = 6E57A87EDA4AA3721FA3CEB34CC36F3A /* SwiftMessages */; - targetProxy = 45EF838C81A9FDB837D9733ABAAA0CA6 /* PBXContainerItemProxy */; + name = "SwiftMessages-SwiftMessages"; + target = DDFEBB329EB85E918AB95108908D2359 /* SwiftMessages-SwiftMessages */; + targetProxy = 0438E7913777CD6A66011D799CA00D46 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 038EF418B52D0441E52F8B539396E4A7 /* Release */ = { + 0AD30BF88B51771AE23630A3C54F13EF /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F08242889B058791110330C1D95B6032 /* SwiftMessages.xcconfig */; + baseConfigurationReference = DAB0701F8F25395B1ED46510ED4B9797 /* Pods-Demo.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -479,22 +482,58 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-Demo/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Demo/Pods-Demo.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_Demo; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 0B52DA1E3E3B655D2B1DB46AD2A31CF4 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F08242889B058791110330C1D95B6032 /* SwiftMessages.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_PREFIX_HEADER = "Target Support Files/SwiftMessages/SwiftMessages-prefix.pch"; INFOPLIST_FILE = "Target Support Files/SwiftMessages/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/SwiftMessages/SwiftMessages.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_NAME = SwiftMessages; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; 13E96A645A77DAD1FD4F541F18F5DDBF /* Debug */ = { isa = XCBuildConfiguration; @@ -540,7 +579,7 @@ }; name = Debug; }; - 50382DD1C8323F8B7FC65393FE1CEE2C /* Debug */ = { + 16C76C11C5F44BBFE957FB7ECB49DA6E /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = F08242889B058791110330C1D95B6032 /* SwiftMessages.xcconfig */; buildSettings = { @@ -557,6 +596,42 @@ }; name = Debug; }; + 222EAB2DA07CB23DF82D7A0D41B36E8F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CC6A59B0ADA6CB2F51DAE6508E437829 /* Pods-Demo.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-Demo/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Demo/Pods-Demo.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_Demo; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; 862AF3139CD84E18D34FAF2F43CD0DA6 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -597,7 +672,7 @@ }; name = Release; }; - 86F0F6ED2042D8FD70956747E3C780FB /* Debug */ = { + A9EC56CB8A12915F20F428F6D8B5B5B4 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = F08242889B058791110330C1D95B6032 /* SwiftMessages.xcconfig */; buildSettings = { @@ -605,7 +680,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -618,90 +693,18 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/SwiftMessages/SwiftMessages.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; + MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = SwiftMessages; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; - }; - 9E47B28B4C9823162CBB3549A0727181 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = CC6A59B0ADA6CB2F51DAE6508E437829 /* Pods-Demo.debug.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-Demo/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-Demo/Pods-Demo.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_Demo; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - DD72B4EDFEB88BBCDEFEC1C509D991A7 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = DAB0701F8F25395B1ED46510ED4B9797 /* Pods-Demo.release.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-Demo/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-Demo/Pods-Demo.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_Demo; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; name = Release; }; - EE91522C8B14CE7AA0F098A883A5AB84 /* Release */ = { + B183EFBB9DFD7B5A4B9147C0BF6A96CB /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = F08242889B058791110330C1D95B6032 /* SwiftMessages.xcconfig */; buildSettings = { @@ -730,29 +733,29 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 740976A81ABF41C22FD2F45BFD7C0323 /* Build configuration list for PBXNativeTarget "SwiftMessages" */ = { + 5807A4CFC63FFCBE06FD9EC1B73C4541 /* Build configuration list for PBXNativeTarget "Pods-Demo" */ = { isa = XCConfigurationList; buildConfigurations = ( - 86F0F6ED2042D8FD70956747E3C780FB /* Debug */, - 038EF418B52D0441E52F8B539396E4A7 /* Release */, + 222EAB2DA07CB23DF82D7A0D41B36E8F /* Debug */, + 0AD30BF88B51771AE23630A3C54F13EF /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 7676FBFFE6A190CE823040D6E856EED7 /* Build configuration list for PBXNativeTarget "Pods-Demo" */ = { + 8A16D1503F6C16384CD89016550368FC /* Build configuration list for PBXNativeTarget "SwiftMessages" */ = { isa = XCConfigurationList; buildConfigurations = ( - 9E47B28B4C9823162CBB3549A0727181 /* Debug */, - DD72B4EDFEB88BBCDEFEC1C509D991A7 /* Release */, + 0B52DA1E3E3B655D2B1DB46AD2A31CF4 /* Debug */, + A9EC56CB8A12915F20F428F6D8B5B5B4 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - B67C03EDE53862551C4B0A06352CA5F2 /* Build configuration list for PBXNativeTarget "SwiftMessages-SwiftMessages" */ = { + D1982E9931F36C16035623E777DCE705 /* Build configuration list for PBXNativeTarget "SwiftMessages-SwiftMessages" */ = { isa = XCConfigurationList; buildConfigurations = ( - 50382DD1C8323F8B7FC65393FE1CEE2C /* Debug */, - EE91522C8B14CE7AA0F098A883A5AB84 /* Release */, + 16C76C11C5F44BBFE957FB7ECB49DA6E /* Debug */, + B183EFBB9DFD7B5A4B9147C0BF6A96CB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo-frameworks.sh b/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo-frameworks.sh index c187ce22..727aa62b 100755 --- a/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo-frameworks.sh +++ b/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo-frameworks.sh @@ -59,8 +59,13 @@ code_sign_if_enabled() { if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then # Use the current code_sign_identitiy echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\"" - /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" fi } @@ -89,3 +94,6 @@ fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "$BUILT_PRODUCTS_DIR/SwiftMessages/SwiftMessages.framework" fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo-resources.sh b/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo-resources.sh index 25e9d377..4602c68a 100755 --- a/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo-resources.sh +++ b/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo-resources.sh @@ -18,6 +18,9 @@ case "${TARGETED_DEVICE_FAMILY}" in 2) TARGET_DEVICE_ARGS="--target-device ipad" ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; *) TARGET_DEVICE_ARGS="--target-device mac" ;; diff --git a/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo-umbrella.h b/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo-umbrella.h index 354852dc..6ccb7f7e 100644 --- a/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo-umbrella.h +++ b/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo-umbrella.h @@ -1,5 +1,13 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo.debug.xcconfig b/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo.debug.xcconfig index 211c3a5b..88afb5fd 100644 --- a/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo.debug.xcconfig +++ b/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo.debug.xcconfig @@ -1,5 +1,4 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -EMBEDDED_CONTENT_CONTAINS_SWIFT = YES FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/SwiftMessages" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' diff --git a/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo.release.xcconfig b/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo.release.xcconfig index 211c3a5b..88afb5fd 100644 --- a/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo.release.xcconfig +++ b/Demo/Pods/Target Support Files/Pods-Demo/Pods-Demo.release.xcconfig @@ -1,5 +1,4 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -EMBEDDED_CONTENT_CONTAINS_SWIFT = YES FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/SwiftMessages" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' diff --git a/Demo/Pods/Target Support Files/SwiftMessages/Info.plist b/Demo/Pods/Target Support Files/SwiftMessages/Info.plist index b3ee339e..c1aea25c 100644 --- a/Demo/Pods/Target Support Files/SwiftMessages/Info.plist +++ b/Demo/Pods/Target Support Files/SwiftMessages/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.0.3 + 3.1.5 CFBundleSignature ???? CFBundleVersion diff --git a/Demo/Pods/Target Support Files/SwiftMessages/ResourceBundle-SwiftMessages-Info.plist b/Demo/Pods/Target Support Files/SwiftMessages/ResourceBundle-SwiftMessages-Info.plist index 87f1d46d..ffcbc53a 100644 --- a/Demo/Pods/Target Support Files/SwiftMessages/ResourceBundle-SwiftMessages-Info.plist +++ b/Demo/Pods/Target Support Files/SwiftMessages/ResourceBundle-SwiftMessages-Info.plist @@ -13,7 +13,7 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 3.0.3 + 3.1.5 CFBundleSignature ???? CFBundleVersion diff --git a/Demo/Pods/Target Support Files/SwiftMessages/SwiftMessages-prefix.pch b/Demo/Pods/Target Support Files/SwiftMessages/SwiftMessages-prefix.pch index aa992a4a..beb2a244 100644 --- a/Demo/Pods/Target Support Files/SwiftMessages/SwiftMessages-prefix.pch +++ b/Demo/Pods/Target Support Files/SwiftMessages/SwiftMessages-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Demo/Pods/Target Support Files/SwiftMessages/SwiftMessages-umbrella.h b/Demo/Pods/Target Support Files/SwiftMessages/SwiftMessages-umbrella.h index 7b316e52..9aa634f0 100644 --- a/Demo/Pods/Target Support Files/SwiftMessages/SwiftMessages-umbrella.h +++ b/Demo/Pods/Target Support Files/SwiftMessages/SwiftMessages-umbrella.h @@ -1,5 +1,13 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Demo/Pods/Target Support Files/SwiftMessages/SwiftMessages.xcconfig b/Demo/Pods/Target Support Files/SwiftMessages/SwiftMessages.xcconfig index f822dcc5..624c3c8a 100644 --- a/Demo/Pods/Target Support Files/SwiftMessages/SwiftMessages.xcconfig +++ b/Demo/Pods/Target Support Files/SwiftMessages/SwiftMessages.xcconfig @@ -6,5 +6,6 @@ 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} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/SwiftMessages.podspec b/SwiftMessages.podspec index bd05d23a..1cd8e26f 100644 --- a/SwiftMessages.podspec +++ b/SwiftMessages.podspec @@ -1,11 +1,11 @@ Pod::Spec.new do |spec| spec.name = 'SwiftMessages' - spec.version = '3.1.5' + spec.version = '3.2.0' spec.license = { :type => 'MIT' } spec.homepage = 'https://github.com/SwiftKickMobile/SwiftMessages' spec.authors = { 'Timothy Moose' => 'tim@swiftkick.it' } spec.summary = 'A very flexible message bar for iOS written in Swift.' - spec.source = {:git => 'https://github.com/SwiftKickMobile/SwiftMessages.git', :tag => '3.1.5'} + spec.source = {:git => 'https://github.com/SwiftKickMobile/SwiftMessages.git', :tag => '3.2.0'} spec.platform = :ios, '8.0' spec.ios.deployment_target = '8.0' spec.source_files = 'SwiftMessages/**/*.swift' diff --git a/SwiftMessages/Presenter.swift b/SwiftMessages/Presenter.swift index 25039de0..36de81a7 100644 --- a/SwiftMessages/Presenter.swift +++ b/SwiftMessages/Presenter.swift @@ -74,15 +74,34 @@ class Presenter: NSObject, UIGestureRecognizerDelegate { let duration: TimeInterval? switch self.config.duration { case .automatic: - duration = 2.0 + duration = 2 case .seconds(let seconds): duration = seconds - case .forever: + case .forever, .unknown: duration = nil } return duration } - + + var showDate: Date? + + private var interactivelyHidden = false; + + var delayShow: TimeInterval? { + if case .unknown(let opts) = config.duration { return opts.delay } + return nil + } + + /// Returns the required delay for hiding based on time shown + var delayHide: TimeInterval? { + if interactivelyHidden { return 0 } + if case .unknown(let opts) = config.duration, let showDate = showDate { + let timeIntervalShown = -showDate.timeIntervalSinceNow + return max(0, opts.minimum - timeIntervalShown) + } + return nil + } + func show(completion: @escaping (_ completed: Bool) -> Void) throws { try presentationContext = getPresentationContext() install() @@ -194,6 +213,7 @@ class Presenter: NSObject, UIGestureRecognizerDelegate { if interactive { maskingView.tappedHander = { [weak self] in guard let strongSelf = self else { return } + strongSelf.interactivelyHidden = true self?.delegate?.hide(presenter: strongSelf) } } else { @@ -376,6 +396,7 @@ class Presenter: NSObject, UIGestureRecognizerDelegate { panTranslationY = translation.y case .ended, .cancelled: if closeSpeed > 750.0 || closePercent > 0.33 { + interactivelyHidden = true delegate?.hide(presenter: self) } else { closing = false diff --git a/SwiftMessages/SwiftMessages.swift b/SwiftMessages/SwiftMessages.swift index 4d8b5fa1..1dd76c7f 100644 --- a/SwiftMessages/SwiftMessages.swift +++ b/SwiftMessages/SwiftMessages.swift @@ -97,6 +97,38 @@ open class SwiftMessages: PresenterDelegate { - Parameter seconds: The number of seconds. */ case seconds(seconds: TimeInterval) + + /** + The `unknown` option is similar to `forever` in the sense that + the message view will not be automatically hidden. However, it + provides two options that can be useful in some scenarios: + + - `delay`: wait the specified time interval before displaying + the message. If you hide the message during the delay + interval by calling either `hideAll()` or `hide(id:)`, the + message will not be displayed. This is not the case for + `hide()`, which only acts on a visible message. Delayed messages + do not block subsequent messages during the delay interval. + - `minimum`: if the message is displayed, ensure that it is displayed + for a minimum time interval. If you explicitly hide the + during this intewrval, the message will be hidden at the + end of the interval. + + Delayed messages must be hidden using `SwiftMessages.hide(id:)` because + + This option is useful for displaying a message when a process is taking + too long but you don't want to display the message if the process completes + in a reasonable amount of time. The value `unknown(delay: 0, minimum: 0)` + is equivalent to `forever`. + + For example, if a URL load is expected to complete in 2 seconds, you may use + the value `unknown(delay: 2, minimum 1)` to ensure that the message will not + be displayed most of the time, but will be displayed for at least 1 second if + the operation takes longer. By specifying a minimum duration, you can avoid + hiding the message too fast if the operation happens to complete right after + the delay. + */ + case unknown(delay: TimeInterval, minimum: TimeInterval) } /** @@ -113,8 +145,8 @@ open class SwiftMessages: PresenterDelegate { /** Dim the background behind the message view a gray color. - - Parameter interactive: Specifies whether or not tapping the - dimmed area dismisses the message view. + - `interactive`: Specifies whether or not tapping the + dimmed area dismisses the message view. */ case gray(interactive: Bool) @@ -123,9 +155,9 @@ open class SwiftMessages: PresenterDelegate { SwiftMessages does not apply alpha transparency to the color, so any alpha must be baked into the `UIColor` instance. - - Parameter color: The color of the dim view. - - Parameter interactive: Specifies whether or not tapping the - dimmed area dismisses the message view. + - `color`: The color of the dim view. + - `interactive`: Specifies whether or not tapping the + dimmed area dismisses the message view. */ case color(color: UIColor, interactive: Bool) } @@ -318,6 +350,7 @@ open class SwiftMessages: PresenterDelegate { syncQueue.async { [weak self] in guard let strongSelf = self else { return } strongSelf.queue.removeAll() + strongSelf.delays.ids.removeAll() strongSelf.hideCurrent() } } @@ -335,6 +368,7 @@ open class SwiftMessages: PresenterDelegate { strongSelf.hideCurrent() } strongSelf.queue = strongSelf.queue.filter { $0.id != id } + strongSelf.delays.ids.remove(id) } } @@ -349,9 +383,27 @@ open class SwiftMessages: PresenterDelegate { and showing the next. Default is 0.5 seconds. */ open var pauseBetweenMessages: TimeInterval = 0.5 - + + /// Type for keeping track of delayed presentations + class Delays { + + var ids = Set() + + func add(presenter: Presenter) { + guard let id = presenter.id else { return } + ids.insert(id) + } + + func remove(presenter: Presenter) -> Bool { + guard let id = presenter.id, ids.contains(id) else { return false } + ids.remove(id) + return true + } + } + let syncQueue = DispatchQueue(label: "it.swiftkick.SwiftMessages", attributes: []) var queue: [Presenter] = [] + var delays = Delays() var current: Presenter? = nil { didSet { if oldValue != nil { @@ -363,14 +415,26 @@ open class SwiftMessages: PresenterDelegate { } } } - + func enqueue(presenter: Presenter) { if presenter.config.ignoreDuplicates, let id = presenter.id { if current?.id == id && current?.isHiding == false { return } if queue.filter({ $0.id == id }).count > 0 { return } } - queue.append(presenter) - dequeueNext() + func doEnqueue() { + queue.append(presenter) + dequeueNext() + } + if let delay = presenter.delayShow { + delays.add(presenter: presenter) + syncQueue.asyncAfter(deadline: .now() + delay) { + // Don't enqueue if the view has been hidden during the delay window. + if !self.delays.remove(presenter: presenter) { return } + doEnqueue() + } + } else { + doEnqueue() + } } func dequeueNext() { @@ -378,6 +442,7 @@ open class SwiftMessages: PresenterDelegate { guard queue.count > 0 else { return } let current = queue.removeFirst() self.current = current + current.showDate = Date() DispatchQueue.main.async { [weak self] in guard let strongSelf = self else { return } do { @@ -400,7 +465,8 @@ open class SwiftMessages: PresenterDelegate { func hideCurrent() { guard let current = current else { return } - DispatchQueue.main.async { [weak self] in + let delay = current.delayHide ?? 0 + DispatchQueue.main.asyncAfter(deadline: .now() + delay) { [weak self] in current.hide { (completed) in guard completed else { return } guard let strongSelf = self else { return } @@ -439,6 +505,7 @@ open class SwiftMessages: PresenterDelegate { strongSelf.hideCurrent() } strongSelf.queue = strongSelf.queue.filter { $0 !== presenter } + strongSelf.delays.remove(presenter: presenter) } } From 345b4390e4991c2ce9835b029a17c6e0f377d1c2 Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Sun, 5 Mar 2017 10:02:55 -0600 Subject: [PATCH 003/227] Rename unknown to indefinite --- CHANGELOG.md | 4 ++-- SwiftMessages/Presenter.swift | 6 +++--- SwiftMessages/SwiftMessages.swift | 30 ++++++++++++++---------------- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15430367..ac0553d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,11 @@ All notable changes to this project will be documented in this file. ## [3.2.0](https://github.com/SwiftKickMobile/SwiftMessages/releases/tag/3.2.0) ### Features -* Added the ability to display messages for an unknown duration while enforcing a minimum duration using `Duration.unknown(delay:minimum)`. +* Added the ability to display messages for an indefinite duration while enforcing a minimum duration using `Duration.indefinite(delay:minimum)`. This option is useful for displaying a message when a process is taking too long but you don't want to display the message if the process completes in a reasonable amount of time. -For example, if a URL load is expected to complete in 2 seconds, you may use the value `unknown(delay: 2, minimum 1)` to ensure that the message will not be displayed most of the time, but will be displayed for at least 1 second if the operation takes longer. By specifying a minimum duration, you can avoid hiding the message too fast if the operation happens to complete right after the delay. +For example, if a URL load is expected to complete in 2 seconds, you may use the value `unknown(delay: 2, minimum 1)` to ensure that the message will not be displayed most of the time, but will be displayed for at least 1 second if the operation takes longer than 2 seconds. By specifying a minimum duration, you can avoid hiding the message too fast if the operation finishes right after the delay interval. ## [3.1.5](https://github.com/SwiftKickMobile/SwiftMessages/releases/tag/3.1.5) diff --git a/SwiftMessages/Presenter.swift b/SwiftMessages/Presenter.swift index 36de81a7..2b48c55e 100644 --- a/SwiftMessages/Presenter.swift +++ b/SwiftMessages/Presenter.swift @@ -77,7 +77,7 @@ class Presenter: NSObject, UIGestureRecognizerDelegate { duration = 2 case .seconds(let seconds): duration = seconds - case .forever, .unknown: + case .forever, .indefinite: duration = nil } return duration @@ -88,14 +88,14 @@ class Presenter: NSObject, UIGestureRecognizerDelegate { private var interactivelyHidden = false; var delayShow: TimeInterval? { - if case .unknown(let opts) = config.duration { return opts.delay } + if case .indefinite(let opts) = config.duration { return opts.delay } return nil } /// Returns the required delay for hiding based on time shown var delayHide: TimeInterval? { if interactivelyHidden { return 0 } - if case .unknown(let opts) = config.duration, let showDate = showDate { + if case .indefinite(let opts) = config.duration, let showDate = showDate { let timeIntervalShown = -showDate.timeIntervalSinceNow return max(0, opts.minimum - timeIntervalShown) } diff --git a/SwiftMessages/SwiftMessages.swift b/SwiftMessages/SwiftMessages.swift index 1dd76c7f..0fd33b3a 100644 --- a/SwiftMessages/SwiftMessages.swift +++ b/SwiftMessages/SwiftMessages.swift @@ -99,36 +99,34 @@ open class SwiftMessages: PresenterDelegate { case seconds(seconds: TimeInterval) /** - The `unknown` option is similar to `forever` in the sense that + The `indefinite` option is similar to `forever` in the sense that the message view will not be automatically hidden. However, it provides two options that can be useful in some scenarios: - `delay`: wait the specified time interval before displaying - the message. If you hide the message during the delay - interval by calling either `hideAll()` or `hide(id:)`, the - message will not be displayed. This is not the case for - `hide()`, which only acts on a visible message. Delayed messages - do not block subsequent messages during the delay interval. + the message. If you hide the message during the delay + interval by calling either `hideAll()` or `hide(id:)`, + the message will not be displayed. This is not the case for + `hide()` because it only acts on a visible message. Messages + shown during another message's delay window are displayed first. - `minimum`: if the message is displayed, ensure that it is displayed for a minimum time interval. If you explicitly hide the - during this intewrval, the message will be hidden at the + during this interval, the message will be hidden at the end of the interval. - - Delayed messages must be hidden using `SwiftMessages.hide(id:)` because This option is useful for displaying a message when a process is taking too long but you don't want to display the message if the process completes - in a reasonable amount of time. The value `unknown(delay: 0, minimum: 0)` + in a reasonable amount of time. The value `indefinite(delay: 0, minimum: 0)` is equivalent to `forever`. For example, if a URL load is expected to complete in 2 seconds, you may use - the value `unknown(delay: 2, minimum 1)` to ensure that the message will not - be displayed most of the time, but will be displayed for at least 1 second if - the operation takes longer. By specifying a minimum duration, you can avoid - hiding the message too fast if the operation happens to complete right after - the delay. + the value `indefinite(delay: 2, minimum 1)` to ensure that the message will not + be displayed in most cases, but will be displayed for at least 1 second if + the operation takes longer than 2 seconds. By specifying a minimum duration, + you can avoid hiding the message too fast if the operation finishes right + after the delay interval. */ - case unknown(delay: TimeInterval, minimum: TimeInterval) + case indefinite(delay: TimeInterval, minimum: TimeInterval) } /** From dfafdf4f6bb774bebe465e7e62fc2b022fd4eae3 Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Sun, 5 Mar 2017 10:57:46 -0600 Subject: [PATCH 004/227] Fix accessibility behavior when using dim views --- SwiftMessages/Presenter.swift | 18 +++++++++++++++--- SwiftMessages/SwiftMessages.swift | 2 +- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/SwiftMessages/Presenter.swift b/SwiftMessages/Presenter.swift index 2b48c55e..5585b648 100644 --- a/SwiftMessages/Presenter.swift +++ b/SwiftMessages/Presenter.swift @@ -147,7 +147,7 @@ class Presenter: NSObject, UIGestureRecognizerDelegate { func install() { guard let containerView = presentationContext.viewValue() else { return } if let windowViewController = presentationContext.viewControllerValue() as? WindowViewController { - windowViewController.install(becomeKey: config.becomeKeyWindow) + windowViewController.install(becomeKey: becomeKeyWindow) } do { maskingView.translatesAutoresizingMaskIntoConstraints = false @@ -221,8 +221,8 @@ class Presenter: NSObject, UIGestureRecognizerDelegate { // a tap handler prevents interaction with underlying views. maskingView.tappedHander = { } } + maskingView.accessibilityViewIsModal = true } - switch config.dimMode { case .none: break @@ -233,7 +233,19 @@ class Presenter: NSObject, UIGestureRecognizerDelegate { } } } - + + private var becomeKeyWindow: Bool { + if config.becomeKeyWindow == .some(true) { return true } + switch config.dimMode { + case .gray, .color: + // Should become key window in modal presentation style + // for proper voice over handling. + return true + case .none: + return false + } + } + private func viewInterferesWithStatusBar(_ view: UIView) -> Bool { guard let window = view.window else { return false } let statusBarFrame = UIApplication.shared.statusBarFrame diff --git a/SwiftMessages/SwiftMessages.swift b/SwiftMessages/SwiftMessages.swift index 0fd33b3a..eaf8cb4b 100644 --- a/SwiftMessages/SwiftMessages.swift +++ b/SwiftMessages/SwiftMessages.swift @@ -259,7 +259,7 @@ open class SwiftMessages: PresenterDelegate { > Most of the time, your app’s main window is the key window, but UIKit > may designate a different window as needed. */ - public var becomeKeyWindow = false + public var becomeKeyWindow: Bool? } /** From 28a2589f9c3c606ddf9b39dd6a5c37b19c345280 Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Sun, 5 Mar 2017 11:15:15 -0600 Subject: [PATCH 005/227] Prevent tap on message view from dismissing modal --- SwiftMessages/MessageView.swift | 13 ++++++++++- SwiftMessages/PassthroughView.swift | 31 +++++++++++++++------------ SwiftMessages/PassthroughWindow.swift | 1 + 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/SwiftMessages/MessageView.swift b/SwiftMessages/MessageView.swift index 51767cab..4e225c85 100644 --- a/SwiftMessages/MessageView.swift +++ b/SwiftMessages/MessageView.swift @@ -23,7 +23,18 @@ open class MessageView: BaseView, Identifiable { func buttonTapped(_ button: UIButton) { buttonTapHandler?(button) } - + + /* + MARK: - Touch handling + */ + + open override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { + // Only accept touches within the background view. Anything outside of the + // background view's bounds should be transparent and does not need to receive + // touches. This helps with tap dismissal when using `DimMode.gray` and `DimMode.color`. + return backgroundView.point(inside: point, with: event) + } + /* MARK: - IB outlets */ diff --git a/SwiftMessages/PassthroughView.swift b/SwiftMessages/PassthroughView.swift index e6a97863..d76da24b 100644 --- a/SwiftMessages/PassthroughView.swift +++ b/SwiftMessages/PassthroughView.swift @@ -8,21 +8,24 @@ import UIKit -class PassthroughView: UIView { - - var tapRecognizer: UITapGestureRecognizer? - - var tappedHander: (() -> Void)? { - didSet { - if let tap = tapRecognizer { - removeGestureRecognizer(tap) - } - if tappedHander == nil { return } - let tap = UITapGestureRecognizer(target: self, action: #selector(PassthroughView.tapped)) - addGestureRecognizer(tap) - } +class PassthroughView: UIControl { + + var tappedHander: (() -> Void)? + + override init(frame: CGRect) { + super.init(frame: frame) + initCommon() } - + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + initCommon() + } + + private func initCommon() { + addTarget(self, action: #selector(tapped), for: .touchUpInside) + } + @objc func tapped() { tappedHander?() } diff --git a/SwiftMessages/PassthroughWindow.swift b/SwiftMessages/PassthroughWindow.swift index e1336fc0..5ed5ac70 100644 --- a/SwiftMessages/PassthroughWindow.swift +++ b/SwiftMessages/PassthroughWindow.swift @@ -9,6 +9,7 @@ import UIKit class PassthroughWindow: UIWindow { + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { let view = super.hitTest(point, with: event) return view == self ? nil : view From 6b99a8ad2fb8300d7a83a77395ca043203ad7bf6 Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Sun, 5 Mar 2017 11:34:08 -0600 Subject: [PATCH 006/227] Fix memory leak of single message view --- CHANGELOG.md | 5 +++++ SwiftMessages/Presenter.swift | 2 +- SwiftMessages/SwiftMessages.swift | 6 +++--- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac0553d7..921fbbce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,11 @@ This option is useful for displaying a message when a process is taking too long For example, if a URL load is expected to complete in 2 seconds, you may use the value `unknown(delay: 2, minimum 1)` to ensure that the message will not be displayed most of the time, but will be displayed for at least 1 second if the operation takes longer than 2 seconds. By specifying a minimum duration, you can avoid hiding the message too fast if the operation finishes right after the delay interval. +### Bug Fixes +* Prevent views below the dim view from receiving accessibility focus. +* Prevent taps in the message view from hiding when using interactive dim mode. +* Fix memory leak of single message view + ## [3.1.5](https://github.com/SwiftKickMobile/SwiftMessages/releases/tag/3.1.5) ### Bug Fixes diff --git a/SwiftMessages/Presenter.swift b/SwiftMessages/Presenter.swift index 5585b648..197ff955 100644 --- a/SwiftMessages/Presenter.swift +++ b/SwiftMessages/Presenter.swift @@ -214,7 +214,7 @@ class Presenter: NSObject, UIGestureRecognizerDelegate { maskingView.tappedHander = { [weak self] in guard let strongSelf = self else { return } strongSelf.interactivelyHidden = true - self?.delegate?.hide(presenter: strongSelf) + strongSelf.delegate?.hide(presenter: strongSelf) } } else { // There's no action to take, but the presence of diff --git a/SwiftMessages/SwiftMessages.swift b/SwiftMessages/SwiftMessages.swift index eaf8cb4b..b8ccfc6b 100644 --- a/SwiftMessages/SwiftMessages.swift +++ b/SwiftMessages/SwiftMessages.swift @@ -476,15 +476,15 @@ open class SwiftMessages: PresenterDelegate { } } - fileprivate var autohideToken: AnyObject? + fileprivate weak var autohideToken: AnyObject? fileprivate func queueAutoHide() { guard let current = current else { return } autohideToken = current if let pauseDuration = current.pauseDuration { let delayTime = DispatchTime.now() + pauseDuration - syncQueue.asyncAfter(deadline: delayTime, execute: { [weak self] in - guard let strongSelf = self else { return } + syncQueue.asyncAfter(deadline: delayTime, execute: { [weak self, weak current] in + guard let strongSelf = self, let current = current else { return } // Make sure we've still got a green light to auto-hide. if strongSelf.autohideToken !== current { return } strongSelf.hide(presenter: current) From 9ea34c51c3ff48075d51fbae37b789ecbcdf0bf8 Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Sun, 5 Mar 2017 11:43:01 -0600 Subject: [PATCH 007/227] Fix unused result warning --- SwiftMessages/SwiftMessages.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/SwiftMessages/SwiftMessages.swift b/SwiftMessages/SwiftMessages.swift index b8ccfc6b..49da3749 100644 --- a/SwiftMessages/SwiftMessages.swift +++ b/SwiftMessages/SwiftMessages.swift @@ -392,6 +392,7 @@ open class SwiftMessages: PresenterDelegate { ids.insert(id) } + @discardableResult func remove(presenter: Presenter) -> Bool { guard let id = presenter.id, ids.contains(id) else { return false } ids.remove(id) From a7d259f8ccfaf1c9ead436102547a7e6bdacd3a3 Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Mon, 6 Mar 2017 06:09:29 -0600 Subject: [PATCH 008/227] Fix infinite loop bug --- SwiftMessages/MessageView.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SwiftMessages/MessageView.swift b/SwiftMessages/MessageView.swift index 4e225c85..6000ca2b 100644 --- a/SwiftMessages/MessageView.swift +++ b/SwiftMessages/MessageView.swift @@ -32,7 +32,9 @@ open class MessageView: BaseView, Identifiable { // Only accept touches within the background view. Anything outside of the // background view's bounds should be transparent and does not need to receive // touches. This helps with tap dismissal when using `DimMode.gray` and `DimMode.color`. - return backgroundView.point(inside: point, with: event) + return backgroundView == self + ? super.point(inside: point, with: event) + : backgroundView.point(inside: point, with: event) } /* From f4933009b2cfd30a978f6d8ae083dd39e575380e Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Mon, 6 Mar 2017 06:12:29 -0600 Subject: [PATCH 009/227] Update podspec --- CHANGELOG.md | 5 +++++ SwiftMessages.podspec | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 921fbbce..ed786cd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ # Change Log All notable changes to this project will be documented in this file. +## [3.2.1](https://github.com/SwiftKickMobile/SwiftMessages/releases/tag/3.2.1) + +### Bug Fixes +* Fix infinite loop bug introduced in 3.2.0. + ## [3.2.0](https://github.com/SwiftKickMobile/SwiftMessages/releases/tag/3.2.0) ### Features diff --git a/SwiftMessages.podspec b/SwiftMessages.podspec index 1cd8e26f..c82c145c 100644 --- a/SwiftMessages.podspec +++ b/SwiftMessages.podspec @@ -1,11 +1,11 @@ Pod::Spec.new do |spec| spec.name = 'SwiftMessages' - spec.version = '3.2.0' + spec.version = '3.2.1' spec.license = { :type => 'MIT' } spec.homepage = 'https://github.com/SwiftKickMobile/SwiftMessages' spec.authors = { 'Timothy Moose' => 'tim@swiftkick.it' } spec.summary = 'A very flexible message bar for iOS written in Swift.' - spec.source = {:git => 'https://github.com/SwiftKickMobile/SwiftMessages.git', :tag => '3.2.0'} + spec.source = {:git => 'https://github.com/SwiftKickMobile/SwiftMessages.git', :tag => '3.2.1'} spec.platform = :ios, '8.0' spec.ios.deployment_target = '8.0' spec.source_files = 'SwiftMessages/**/*.swift' From 8448eac94b7fdf75af17f958dcc3cd349bdc206c Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Sun, 12 Mar 2017 14:17:19 -0500 Subject: [PATCH 010/227] Add VoiceOver support --- CHANGELOG.md | 5 + Demo/Demo.xcodeproj/project.pbxproj | 2 + Demo/Podfile.lock | 4 +- .../Local Podspecs/SwiftMessages.podspec.json | 4 +- Demo/Pods/Manifest.lock | 4 +- Demo/Pods/Pods.xcodeproj/project.pbxproj | 282 +++++++++--------- .../SwiftMessages/Info.plist | 2 +- .../ResourceBundle-SwiftMessages-Info.plist | 2 +- README.md | 12 + SwiftMessages.podspec | 4 +- SwiftMessages.xcodeproj/project.pbxproj | 8 + SwiftMessages/AccessibleMessage.swift | 20 ++ SwiftMessages/MaskingView.swift | 28 ++ SwiftMessages/MessageView.swift | 30 +- SwiftMessages/Presenter.swift | 87 ++++-- SwiftMessages/SwiftMessages.swift | 26 ++ 16 files changed, 349 insertions(+), 171 deletions(-) create mode 100644 SwiftMessages/AccessibleMessage.swift create mode 100644 SwiftMessages/MaskingView.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index ed786cd5..5fce723e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ # Change Log All notable changes to this project will be documented in this file. +## [3.3.0](https://github.com/SwiftKickMobile/SwiftMessages/releases/tag/3.3.0) + +### Features +* Add proper support for VoiceOver. See the [Accessibility section](README.md#accessibility) of the readme. + ## [3.2.1](https://github.com/SwiftKickMobile/SwiftMessages/releases/tag/3.2.1) ### Bug Fixes diff --git a/Demo/Demo.xcodeproj/project.pbxproj b/Demo/Demo.xcodeproj/project.pbxproj index 7507ff4d..149df712 100644 --- a/Demo/Demo.xcodeproj/project.pbxproj +++ b/Demo/Demo.xcodeproj/project.pbxproj @@ -346,6 +346,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = Demo/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = it.swiftkick.Demo; @@ -360,6 +361,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = Demo/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = it.swiftkick.Demo; diff --git a/Demo/Podfile.lock b/Demo/Podfile.lock index c8136646..a2731806 100644 --- a/Demo/Podfile.lock +++ b/Demo/Podfile.lock @@ -1,5 +1,5 @@ PODS: - - SwiftMessages (3.1.5) + - SwiftMessages (3.3.0) DEPENDENCIES: - SwiftMessages (from `../`) @@ -9,7 +9,7 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - SwiftMessages: e183a3541844cf450dc0983034bbfe7cc22dcaa7 + SwiftMessages: 1e6f8140374c014befafcbf3149da86b323b0575 PODFILE CHECKSUM: 6431c980c9207084d738b6ba87b2101dd9eb5097 diff --git a/Demo/Pods/Local Podspecs/SwiftMessages.podspec.json b/Demo/Pods/Local Podspecs/SwiftMessages.podspec.json index 8efa892b..764c8c7f 100644 --- a/Demo/Pods/Local Podspecs/SwiftMessages.podspec.json +++ b/Demo/Pods/Local Podspecs/SwiftMessages.podspec.json @@ -1,6 +1,6 @@ { "name": "SwiftMessages", - "version": "3.1.5", + "version": "3.3.0", "license": { "type": "MIT" }, @@ -11,7 +11,7 @@ "summary": "A very flexible message bar for iOS written in Swift.", "source": { "git": "https://github.com/SwiftKickMobile/SwiftMessages.git", - "tag": "3.1.5" + "tag": "3.3.0" }, "platforms": { "ios": "8.0" diff --git a/Demo/Pods/Manifest.lock b/Demo/Pods/Manifest.lock index c8136646..a2731806 100644 --- a/Demo/Pods/Manifest.lock +++ b/Demo/Pods/Manifest.lock @@ -1,5 +1,5 @@ PODS: - - SwiftMessages (3.1.5) + - SwiftMessages (3.3.0) DEPENDENCIES: - SwiftMessages (from `../`) @@ -9,7 +9,7 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - SwiftMessages: e183a3541844cf450dc0983034bbfe7cc22dcaa7 + SwiftMessages: 1e6f8140374c014befafcbf3149da86b323b0575 PODFILE CHECKSUM: 6431c980c9207084d738b6ba87b2101dd9eb5097 diff --git a/Demo/Pods/Pods.xcodeproj/project.pbxproj b/Demo/Pods/Pods.xcodeproj/project.pbxproj index ad8ae2b7..e021a05e 100644 --- a/Demo/Pods/Pods.xcodeproj/project.pbxproj +++ b/Demo/Pods/Pods.xcodeproj/project.pbxproj @@ -7,35 +7,37 @@ objects = { /* Begin PBXBuildFile section */ - 00D9F36D9E9DAE829E23F49571B809EE /* CardView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 935AF4ECA81CC2678E76B92FF03E4CD1 /* CardView.xib */; }; - 041A5D5326E219387AC44FB900D72021 /* NSBundle+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 464E0975C3D038A42E7D5B43E27DB23B /* NSBundle+Utils.swift */; }; - 358AED3638D5FB91ABB994B2AA33515C /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63A5295EC116F9FD3E06892F71998C9A /* Theme.swift */; }; - 379034C9D27F4371D0CCB174CF40AF69 /* SwiftMessages-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DAFFA5D242D0AAB9518D5D81A208B79D /* SwiftMessages-dummy.m */; }; - 3B0F59739F3A812B1C5207B2F74AFAFB /* BaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B22FC3EB8475C3D4FA73110FD742497 /* BaseView.swift */; }; - 4132E1E95DC870D51852FF6B0742299D /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51AF6A2CED446E4872B522299E5F5D10 /* Error.swift */; }; - 41B040D3FC26BC6F3228A39ADC06A4AE /* PassthroughWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63D213FF475BB82B12655CE24416B7F4 /* PassthroughWindow.swift */; }; - 4BCB35E002D829BE676049EFDF0F3C33 /* Array+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FAD0CA526C80FBFB3BA8A5C07559FEF /* Array+Utils.swift */; }; - 5718E412292E48E433FE9C9CCD2016AF /* PassthroughView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3520E8580FD3906F08FFE47E8F0D3EA /* PassthroughView.swift */; }; - 618A1194E767E29ECE46557DD4F6B8AE /* Identifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E520F85C9F3D333AEF256ADBD7C5981 /* Identifiable.swift */; }; - 70BD7B7D6AAFB14AC5AF96A028A75496 /* MessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BBB29F0DA5F0FF9535944F1F59935CF /* MessageView.swift */; }; + 00D9F36D9E9DAE829E23F49571B809EE /* CardView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0CCCAE90EF5A193A8E7504800108BEEE /* CardView.xib */; }; + 295619F382C5E91656A6E96F53F542E5 /* NSBundle+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6B4284360885D5409B0B8FA2A40467F /* NSBundle+Utils.swift */; }; + 2CA0040994E7E1299A62736C54ED0E7C /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8686B482871711B9B9F9E7A003A2499 /* Theme.swift */; }; + 398CC054BD6C74FD02297202F635BB3F /* MessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE16A05C144B13C5294B8F0CD01ECE5 /* MessageView.swift */; }; + 3C599E1727A52197A6D307DCB7777433 /* SwiftMessages-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A4FE1475B5BAD9F07A14C82D57AAC092 /* SwiftMessages-dummy.m */; }; + 4781B59A397CCEE9C6C9A1471A0BB269 /* AccessibleMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFA6D79DAD2B1B9A25868DAFE171BA0F /* AccessibleMessage.swift */; }; + 5179726BE70C9945C37CF9F3CD992F1E /* BaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0838F470F7C5C45ED14B787719CC913 /* BaseView.swift */; }; + 63D462720463155221D237492501DF95 /* PassthroughView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D1FD7B51AEDEF5CAFFD32B40BE5BA7 /* PassthroughView.swift */; }; + 66F4159354E6271C54803C13947F6FAE /* Identifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFFC32A4712412A126E1A2E840D3BA36 /* Identifiable.swift */; }; 7AAB19F2F518FAFEFCC099693B8B8BA9 /* Pods-Demo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C5BC86D40B890A7B0844F888209CA06F /* Pods-Demo-dummy.m */; }; + 7C466B3F001FBE13754A42AC9641F4A3 /* MaskingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBC6197F4A18AA39315DF53DA3C4BB64 /* MaskingView.swift */; }; 7D5F7A9E1E71C362D5348DBA25F9000B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 616BEB51ECCAD129BDBCB7A956B56CC6 /* Foundation.framework */; }; - 83A07526DFFFF2A912BF9B7042A9EBC1 /* MessageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCBA1D883DEEB0334782E5EDB718DDB /* MessageView.xib */; }; - 94655FE0F915EAB6FEC181D1D3F9BA5F /* Presenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B591B99259586710CB1B7B262B07E78 /* Presenter.swift */; }; - 99C742D2CA19765B6535CAC0432BAAE2 /* SwiftMessages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFB0B18866A37CD24FE04F785992F2B /* SwiftMessages.swift */; }; + 7F7370E89961BA5AC8A1E7F89ED7D6E9 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E3B65851A82824600DFA99A6F632802 /* Error.swift */; }; + 8304F5AB47FF2A045B4E4F18AA8942FE /* SwiftMessages.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEF53085A45F0C9D4221BB9E06B7B4EF /* SwiftMessages.swift */; }; + 83A07526DFFFF2A912BF9B7042A9EBC1 /* MessageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5CCEA0660237739E043B81E09965DBC5 /* MessageView.xib */; }; + 8C98B5AF65CE5513ADFEE0E8322142AB /* PassthroughWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4979914A67F2C4B2F2F1DD0A1A3E313 /* PassthroughWindow.swift */; }; + 95D9331F7FBA5AF09D0F290485EDAF8A /* WindowViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D46333CC0579FAB8C2E7237E209D9F1 /* WindowViewController.swift */; }; A0DA50804F4D0578FA0F9ADB8E127D55 /* SwiftMessages.bundle in Resources */ = {isa = PBXBuildFile; fileRef = EDA8A9CFB00CA35B42F93F216EB7DA9B /* SwiftMessages.bundle */; }; - A9EB9FEA84BC1577826FAAEF040C3046 /* StatusLine.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CB2A7DC83E6F1CB8B9EA75D6C97CBED /* StatusLine.xib */; }; - AE35A5DE7A5FFBD132BEE9CEA4E80A15 /* UIViewController+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 749543C80A60DDE16A18B30833E939C8 /* UIViewController+Utils.swift */; }; + A9EB9FEA84BC1577826FAAEF040C3046 /* StatusLine.xib in Resources */ = {isa = PBXBuildFile; fileRef = 16C12316BEE416D162E1C94F102E7342 /* StatusLine.xib */; }; + B165F0E46CD0326339016913DF12ACB3 /* UIViewController+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBA3CB2BFD290BECD0A28F29A114492B /* UIViewController+Utils.swift */; }; BBEBA8609EABA0DF5C164270441C6CF7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 616BEB51ECCAD129BDBCB7A956B56CC6 /* Foundation.framework */; }; - BC2BA13F0070A8D9152D40C9546366F7 /* SwiftMessages-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A863D0F2536D769707B46871EBA897B /* SwiftMessages-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C776870E6955A90021B06F9CAF6D822F /* MarginAdjustable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3CC8CF7417590860536205EF5C33255 /* MarginAdjustable.swift */; }; - C8CE8C0863C7BCFC6780AAB21F5A6133 /* WindowViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F631B93A4E963F8E97CD304126E81B8 /* WindowViewController.swift */; }; + BC2BA13F0070A8D9152D40C9546366F7 /* SwiftMessages-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2218149865D8753CDE29A66262EDBE11 /* SwiftMessages-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; CB41EFE1EFF32D80C8664D6F638C95FD /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7EC994CDC2D681BA26389F78A7E4B325 /* UIKit.framework */; }; - D5668553CA32C33B35F97CFDB0B36FB1 /* BackgroundViewable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8736DDECB493A056A2AB7B962D5A1C36 /* BackgroundViewable.swift */; }; - D6D588014F2839A41EA785088F871EA0 /* TabView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B158478428D475305ADAF5828351240 /* TabView.xib */; }; - E419242BA8C2F8D2E62D138D70DA4744 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0A4D9DDC91358D2E2437AB30046E9553 /* Images.xcassets */; }; + D20DF9E0AA424241C67ACF42A5FE3F17 /* MarginAdjustable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A17919D96147502CED1DA4042A7C7DCF /* MarginAdjustable.swift */; }; + D6D588014F2839A41EA785088F871EA0 /* TabView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 265EDA40F4F5B2176F952C02A734FE30 /* TabView.xib */; }; + D87C1394C26D7E9D2EF36057B4DB8846 /* Array+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2ED3A684B2E12548C589872426B8EC3 /* Array+Utils.swift */; }; + E0B52723410482D2458DAC747E79382E /* BackgroundViewable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DA194FBAF8040E065BF3FA69847F063 /* BackgroundViewable.swift */; }; + E419242BA8C2F8D2E62D138D70DA4744 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 94EBF9C95D8FDBECD298A7924E9DE956 /* Images.xcassets */; }; + E5A11C52C73345CE5C0FB68AF76BA6DD /* Presenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DE4C32E1EC988E47E67374B2899D45A /* Presenter.swift */; }; E9F211145EAEC09D0A0A33E46BB2059E /* Pods-Demo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 03EA1E60232BFA05817BC26ACB8E68BA /* Pods-Demo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EA3DC76EB957CF8E96C2F01C07991B5B /* MessageViewIOS8.xib in Resources */ = {isa = PBXBuildFile; fileRef = EE0DA5FBD33716312680D2F857D3BFF1 /* MessageViewIOS8.xib */; }; + EA3DC76EB957CF8E96C2F01C07991B5B /* MessageViewIOS8.xib in Resources */ = {isa = PBXBuildFile; fileRef = D57F59D56C67DB8C2115242BF5A26937 /* MessageViewIOS8.xib */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -56,50 +58,52 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 03D3A4B4E5C69D6264959E6FE343F48D /* SwiftMessages.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftMessages.xcconfig; sourceTree = ""; }; 03EA1E60232BFA05817BC26ACB8E68BA /* Pods-Demo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Demo-umbrella.h"; sourceTree = ""; }; - 0A4D9DDC91358D2E2437AB30046E9553 /* Images.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 2A863D0F2536D769707B46871EBA897B /* SwiftMessages-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftMessages-umbrella.h"; sourceTree = ""; }; + 0AE9177757864A6B2DCB6250C8F70311 /* ResourceBundle-SwiftMessages-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-SwiftMessages-Info.plist"; sourceTree = ""; }; + 0CCCAE90EF5A193A8E7504800108BEEE /* CardView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = CardView.xib; sourceTree = ""; }; + 16C12316BEE416D162E1C94F102E7342 /* StatusLine.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = StatusLine.xib; sourceTree = ""; }; + 1E3B65851A82824600DFA99A6F632802 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = ""; }; + 2218149865D8753CDE29A66262EDBE11 /* SwiftMessages-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftMessages-umbrella.h"; sourceTree = ""; }; + 265EDA40F4F5B2176F952C02A734FE30 /* TabView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = TabView.xib; sourceTree = ""; }; + 2FE16A05C144B13C5294B8F0CD01ECE5 /* MessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = MessageView.swift; sourceTree = ""; }; 322419E99883B306EE7EC77959FCC8DF /* Pods-Demo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-Demo.modulemap"; sourceTree = ""; }; 3CD5A30239C90F1B549B4AB9299ECF16 /* Pods-Demo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Demo-frameworks.sh"; sourceTree = ""; }; 3D653C9DA16200D75AD14323AA830C6B /* Pods-Demo-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Demo-resources.sh"; sourceTree = ""; }; - 464E0975C3D038A42E7D5B43E27DB23B /* NSBundle+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "NSBundle+Utils.swift"; sourceTree = ""; }; - 4CB2A7DC83E6F1CB8B9EA75D6C97CBED /* StatusLine.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = StatusLine.xib; sourceTree = ""; }; - 4CFB0B18866A37CD24FE04F785992F2B /* SwiftMessages.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SwiftMessages.swift; sourceTree = ""; }; - 51AF6A2CED446E4872B522299E5F5D10 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = ""; }; 5259A068CBCD8780234A0D70629C1271 /* SwiftMessages.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SwiftMessages.framework; path = SwiftMessages.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5A26502335E6CC635672E16466F8C0EE /* SwiftMessages.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = SwiftMessages.modulemap; sourceTree = ""; }; - 5B591B99259586710CB1B7B262B07E78 /* Presenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Presenter.swift; sourceTree = ""; }; + 5CCEA0660237739E043B81E09965DBC5 /* MessageView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = MessageView.xib; sourceTree = ""; }; + 5D46333CC0579FAB8C2E7237E209D9F1 /* WindowViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = WindowViewController.swift; sourceTree = ""; }; + 5DA194FBAF8040E065BF3FA69847F063 /* BackgroundViewable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BackgroundViewable.swift; sourceTree = ""; }; 616BEB51ECCAD129BDBCB7A956B56CC6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 63A5295EC116F9FD3E06892F71998C9A /* Theme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; - 63D213FF475BB82B12655CE24416B7F4 /* PassthroughWindow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PassthroughWindow.swift; sourceTree = ""; }; - 6BBB29F0DA5F0FF9535944F1F59935CF /* MessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = MessageView.swift; sourceTree = ""; }; - 6E520F85C9F3D333AEF256ADBD7C5981 /* Identifiable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Identifiable.swift; sourceTree = ""; }; 71940C1CEB7995DC34CFE54CAF1AEF88 /* Pods-Demo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Demo-acknowledgements.markdown"; sourceTree = ""; }; - 749543C80A60DDE16A18B30833E939C8 /* UIViewController+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIViewController+Utils.swift"; sourceTree = ""; }; - 7B158478428D475305ADAF5828351240 /* TabView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = TabView.xib; sourceTree = ""; }; + 7DE4C32E1EC988E47E67374B2899D45A /* Presenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Presenter.swift; sourceTree = ""; }; 7EC994CDC2D681BA26389F78A7E4B325 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - 7FAD0CA526C80FBFB3BA8A5C07559FEF /* Array+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Array+Utils.swift"; sourceTree = ""; }; - 8736DDECB493A056A2AB7B962D5A1C36 /* BackgroundViewable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BackgroundViewable.swift; sourceTree = ""; }; - 8B22FC3EB8475C3D4FA73110FD742497 /* BaseView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseView.swift; sourceTree = ""; }; - 935AF4ECA81CC2678E76B92FF03E4CD1 /* CardView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = CardView.xib; sourceTree = ""; }; + 816D7BB25A5F5DA0815E25B3C57D947C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8A1E36F06AC7E04150A204739849622A /* SwiftMessages-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftMessages-prefix.pch"; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9F631B93A4E963F8E97CD304126E81B8 /* WindowViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = WindowViewController.swift; sourceTree = ""; }; + 94EBF9C95D8FDBECD298A7924E9DE956 /* Images.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 9FD9F59735ACBB069C7E4152736EB20C /* SwiftMessages.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = SwiftMessages.modulemap; sourceTree = ""; }; + A17919D96147502CED1DA4042A7C7DCF /* MarginAdjustable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = MarginAdjustable.swift; sourceTree = ""; }; + A4FE1475B5BAD9F07A14C82D57AAC092 /* SwiftMessages-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SwiftMessages-dummy.m"; sourceTree = ""; }; + B4979914A67F2C4B2F2F1DD0A1A3E313 /* PassthroughWindow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PassthroughWindow.swift; sourceTree = ""; }; + BBC6197F4A18AA39315DF53DA3C4BB64 /* MaskingView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = MaskingView.swift; sourceTree = ""; }; BFCD7E7BC43700342D2ECDA704620869 /* Pods_Demo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_Demo.framework; path = "Pods-Demo.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - C3520E8580FD3906F08FFE47E8F0D3EA /* PassthroughView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PassthroughView.swift; sourceTree = ""; }; C5BC86D40B890A7B0844F888209CA06F /* Pods-Demo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Demo-dummy.m"; sourceTree = ""; }; + C9D1FD7B51AEDEF5CAFFD32B40BE5BA7 /* PassthroughView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PassthroughView.swift; sourceTree = ""; }; CA19694C0AC41D598DE4ABFEB300E619 /* Pods-Demo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Demo-acknowledgements.plist"; sourceTree = ""; }; - CBCBA1D883DEEB0334782E5EDB718DDB /* MessageView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = MessageView.xib; sourceTree = ""; }; CC6A59B0ADA6CB2F51DAE6508E437829 /* Pods-Demo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Demo.debug.xcconfig"; sourceTree = ""; }; + D2ED3A684B2E12548C589872426B8EC3 /* Array+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Array+Utils.swift"; sourceTree = ""; }; + D57F59D56C67DB8C2115242BF5A26937 /* MessageViewIOS8.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = MessageViewIOS8.xib; sourceTree = ""; }; + D8686B482871711B9B9F9E7A003A2499 /* Theme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; DAB0701F8F25395B1ED46510ED4B9797 /* Pods-Demo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Demo.release.xcconfig"; sourceTree = ""; }; - DAFFA5D242D0AAB9518D5D81A208B79D /* SwiftMessages-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SwiftMessages-dummy.m"; sourceTree = ""; }; - E56520D015ED5615EF53801D8894ED54 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + DEF53085A45F0C9D4221BB9E06B7B4EF /* SwiftMessages.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SwiftMessages.swift; sourceTree = ""; }; + DFA6D79DAD2B1B9A25868DAFE171BA0F /* AccessibleMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AccessibleMessage.swift; sourceTree = ""; }; + DFFC32A4712412A126E1A2E840D3BA36 /* Identifiable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Identifiable.swift; sourceTree = ""; }; E68F8C86FB3267A3C87983DA9E269889 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - EADFEC8806C084547A9B8D3999011AD3 /* SwiftMessages-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftMessages-prefix.pch"; sourceTree = ""; }; + E6B4284360885D5409B0B8FA2A40467F /* NSBundle+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "NSBundle+Utils.swift"; sourceTree = ""; }; + EBA3CB2BFD290BECD0A28F29A114492B /* UIViewController+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIViewController+Utils.swift"; sourceTree = ""; }; EDA8A9CFB00CA35B42F93F216EB7DA9B /* SwiftMessages.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = SwiftMessages.bundle; path = SwiftMessages.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - EE0DA5FBD33716312680D2F857D3BFF1 /* MessageViewIOS8.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = MessageViewIOS8.xib; sourceTree = ""; }; - F08242889B058791110330C1D95B6032 /* SwiftMessages.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftMessages.xcconfig; sourceTree = ""; }; - F3CC8CF7417590860536205EF5C33255 /* MarginAdjustable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = MarginAdjustable.swift; sourceTree = ""; }; - FD5810E2F88EF29CCA9B7E188B460508 /* ResourceBundle-SwiftMessages-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-SwiftMessages-Info.plist"; sourceTree = ""; }; + F0838F470F7C5C45ED14B787719CC913 /* BaseView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -130,12 +134,29 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 15EC86D4E42688E0ACF8DFD479D81DEB /* Resources */ = { + 10650CF44D37C8B9A765F8764331504A /* SwiftMessages */ = { isa = PBXGroup; children = ( - 921FD2BED344FC79AEC78DE48E9CEECD /* SwiftMessages */, + DFA6D79DAD2B1B9A25868DAFE171BA0F /* AccessibleMessage.swift */, + D2ED3A684B2E12548C589872426B8EC3 /* Array+Utils.swift */, + 5DA194FBAF8040E065BF3FA69847F063 /* BackgroundViewable.swift */, + F0838F470F7C5C45ED14B787719CC913 /* BaseView.swift */, + 1E3B65851A82824600DFA99A6F632802 /* Error.swift */, + DFFC32A4712412A126E1A2E840D3BA36 /* Identifiable.swift */, + A17919D96147502CED1DA4042A7C7DCF /* MarginAdjustable.swift */, + BBC6197F4A18AA39315DF53DA3C4BB64 /* MaskingView.swift */, + 2FE16A05C144B13C5294B8F0CD01ECE5 /* MessageView.swift */, + E6B4284360885D5409B0B8FA2A40467F /* NSBundle+Utils.swift */, + C9D1FD7B51AEDEF5CAFFD32B40BE5BA7 /* PassthroughView.swift */, + B4979914A67F2C4B2F2F1DD0A1A3E313 /* PassthroughWindow.swift */, + 7DE4C32E1EC988E47E67374B2899D45A /* Presenter.swift */, + DEF53085A45F0C9D4221BB9E06B7B4EF /* SwiftMessages.swift */, + D8686B482871711B9B9F9E7A003A2499 /* Theme.swift */, + EBA3CB2BFD290BECD0A28F29A114492B /* UIViewController+Utils.swift */, + 5D46333CC0579FAB8C2E7237E209D9F1 /* WindowViewController.swift */, ); - name = Resources; + name = SwiftMessages; + path = SwiftMessages; sourceTree = ""; }; 1D74C48A5F5DFA0096A4D3FF179106C1 /* Products */ = { @@ -148,17 +169,6 @@ name = Products; sourceTree = ""; }; - 3D0EB5CD3C73C142233F68A71727F1B8 /* SwiftMessages */ = { - isa = PBXGroup; - children = ( - 15EC86D4E42688E0ACF8DFD479D81DEB /* Resources */, - ED223EF5C8C46CAC2F4E5A0CA078617B /* Support Files */, - CBF70BC86833603ADADCC2B154F9E906 /* SwiftMessages */, - ); - name = SwiftMessages; - path = ../..; - sourceTree = ""; - }; 433CD3331B6C3787F473C941B61FC68F /* Frameworks */ = { isa = PBXGroup; children = ( @@ -178,7 +188,7 @@ 7A5DB11FD5464933475796D843C9E397 /* Development Pods */ = { isa = PBXGroup; children = ( - 3D0EB5CD3C73C142233F68A71727F1B8 /* SwiftMessages */, + B3E34B071D07BD1387448BDAB9A4F76A /* SwiftMessages */, ); name = "Development Pods"; sourceTree = ""; @@ -194,50 +204,38 @@ ); sourceTree = ""; }; - 82971C2C4FC60B9F62E1B400A07548C5 /* Resources */ = { + B3E34B071D07BD1387448BDAB9A4F76A /* SwiftMessages */ = { isa = PBXGroup; children = ( - 935AF4ECA81CC2678E76B92FF03E4CD1 /* CardView.xib */, - 0A4D9DDC91358D2E2437AB30046E9553 /* Images.xcassets */, - CBCBA1D883DEEB0334782E5EDB718DDB /* MessageView.xib */, - EE0DA5FBD33716312680D2F857D3BFF1 /* MessageViewIOS8.xib */, - 4CB2A7DC83E6F1CB8B9EA75D6C97CBED /* StatusLine.xib */, - 7B158478428D475305ADAF5828351240 /* TabView.xib */, + C569BC1F4C1398561F4C2E5CD0A35035 /* Resources */, + C7C5E83F6AE885D248FFEB76F15BE3AD /* Support Files */, + 10650CF44D37C8B9A765F8764331504A /* SwiftMessages */, ); - name = Resources; - path = Resources; + name = SwiftMessages; + path = ../..; sourceTree = ""; }; - 921FD2BED344FC79AEC78DE48E9CEECD /* SwiftMessages */ = { + C569BC1F4C1398561F4C2E5CD0A35035 /* Resources */ = { isa = PBXGroup; children = ( - 82971C2C4FC60B9F62E1B400A07548C5 /* Resources */, + E8E1B6D25383B75B467DD3D1816157CC /* SwiftMessages */, ); - name = SwiftMessages; - path = SwiftMessages; + name = Resources; sourceTree = ""; }; - CBF70BC86833603ADADCC2B154F9E906 /* SwiftMessages */ = { + C7C5E83F6AE885D248FFEB76F15BE3AD /* Support Files */ = { isa = PBXGroup; children = ( - 7FAD0CA526C80FBFB3BA8A5C07559FEF /* Array+Utils.swift */, - 8736DDECB493A056A2AB7B962D5A1C36 /* BackgroundViewable.swift */, - 8B22FC3EB8475C3D4FA73110FD742497 /* BaseView.swift */, - 51AF6A2CED446E4872B522299E5F5D10 /* Error.swift */, - 6E520F85C9F3D333AEF256ADBD7C5981 /* Identifiable.swift */, - F3CC8CF7417590860536205EF5C33255 /* MarginAdjustable.swift */, - 6BBB29F0DA5F0FF9535944F1F59935CF /* MessageView.swift */, - 464E0975C3D038A42E7D5B43E27DB23B /* NSBundle+Utils.swift */, - C3520E8580FD3906F08FFE47E8F0D3EA /* PassthroughView.swift */, - 63D213FF475BB82B12655CE24416B7F4 /* PassthroughWindow.swift */, - 5B591B99259586710CB1B7B262B07E78 /* Presenter.swift */, - 4CFB0B18866A37CD24FE04F785992F2B /* SwiftMessages.swift */, - 63A5295EC116F9FD3E06892F71998C9A /* Theme.swift */, - 749543C80A60DDE16A18B30833E939C8 /* UIViewController+Utils.swift */, - 9F631B93A4E963F8E97CD304126E81B8 /* WindowViewController.swift */, + 816D7BB25A5F5DA0815E25B3C57D947C /* Info.plist */, + 0AE9177757864A6B2DCB6250C8F70311 /* ResourceBundle-SwiftMessages-Info.plist */, + 9FD9F59735ACBB069C7E4152736EB20C /* SwiftMessages.modulemap */, + 03D3A4B4E5C69D6264959E6FE343F48D /* SwiftMessages.xcconfig */, + A4FE1475B5BAD9F07A14C82D57AAC092 /* SwiftMessages-dummy.m */, + 8A1E36F06AC7E04150A204739849622A /* SwiftMessages-prefix.pch */, + 2218149865D8753CDE29A66262EDBE11 /* SwiftMessages-umbrella.h */, ); - name = SwiftMessages; - path = SwiftMessages; + name = "Support Files"; + path = "Demo/Pods/Target Support Files/SwiftMessages"; sourceTree = ""; }; E6EE98446B568159EE277B68FD442AF0 /* iOS */ = { @@ -249,6 +247,29 @@ name = iOS; sourceTree = ""; }; + E770BA0B1789D579676001F0770F62C9 /* Resources */ = { + isa = PBXGroup; + children = ( + 0CCCAE90EF5A193A8E7504800108BEEE /* CardView.xib */, + 94EBF9C95D8FDBECD298A7924E9DE956 /* Images.xcassets */, + 5CCEA0660237739E043B81E09965DBC5 /* MessageView.xib */, + D57F59D56C67DB8C2115242BF5A26937 /* MessageViewIOS8.xib */, + 16C12316BEE416D162E1C94F102E7342 /* StatusLine.xib */, + 265EDA40F4F5B2176F952C02A734FE30 /* TabView.xib */, + ); + name = Resources; + path = Resources; + sourceTree = ""; + }; + E8E1B6D25383B75B467DD3D1816157CC /* SwiftMessages */ = { + isa = PBXGroup; + children = ( + E770BA0B1789D579676001F0770F62C9 /* Resources */, + ); + name = SwiftMessages; + path = SwiftMessages; + sourceTree = ""; + }; ECC58720C5754A079F9A150E40E2FCDD /* Pods-Demo */ = { isa = PBXGroup; children = ( @@ -267,21 +288,6 @@ path = "Target Support Files/Pods-Demo"; sourceTree = ""; }; - ED223EF5C8C46CAC2F4E5A0CA078617B /* Support Files */ = { - isa = PBXGroup; - children = ( - E56520D015ED5615EF53801D8894ED54 /* Info.plist */, - FD5810E2F88EF29CCA9B7E188B460508 /* ResourceBundle-SwiftMessages-Info.plist */, - 5A26502335E6CC635672E16466F8C0EE /* SwiftMessages.modulemap */, - F08242889B058791110330C1D95B6032 /* SwiftMessages.xcconfig */, - DAFFA5D242D0AAB9518D5D81A208B79D /* SwiftMessages-dummy.m */, - EADFEC8806C084547A9B8D3999011AD3 /* SwiftMessages-prefix.pch */, - 2A863D0F2536D769707B46871EBA897B /* SwiftMessages-umbrella.h */, - ); - name = "Support Files"; - path = "Demo/Pods/Target Support Files/SwiftMessages"; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -308,7 +314,7 @@ isa = PBXNativeTarget; buildConfigurationList = 8A16D1503F6C16384CD89016550368FC /* Build configuration list for PBXNativeTarget "SwiftMessages" */; buildPhases = ( - 078BDA365ED9B87A8E58886E995B7B5E /* Sources */, + FD538C5526F7FEB87F663686CD3D9F32 /* Sources */, 558AFEABC3E016AD529BBD829E7F3650 /* Frameworks */, A71C7940AD91593112CD3B1F284D67E5 /* Resources */, 779303AA623CD0E2238047E4D74DB2C1 /* Headers */, @@ -411,41 +417,43 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 078BDA365ED9B87A8E58886E995B7B5E /* Sources */ = { + C7FBE9003244C43CF1443AB01559A139 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4BCB35E002D829BE676049EFDF0F3C33 /* Array+Utils.swift in Sources */, - D5668553CA32C33B35F97CFDB0B36FB1 /* BackgroundViewable.swift in Sources */, - 3B0F59739F3A812B1C5207B2F74AFAFB /* BaseView.swift in Sources */, - 4132E1E95DC870D51852FF6B0742299D /* Error.swift in Sources */, - 618A1194E767E29ECE46557DD4F6B8AE /* Identifiable.swift in Sources */, - C776870E6955A90021B06F9CAF6D822F /* MarginAdjustable.swift in Sources */, - 70BD7B7D6AAFB14AC5AF96A028A75496 /* MessageView.swift in Sources */, - 041A5D5326E219387AC44FB900D72021 /* NSBundle+Utils.swift in Sources */, - 5718E412292E48E433FE9C9CCD2016AF /* PassthroughView.swift in Sources */, - 41B040D3FC26BC6F3228A39ADC06A4AE /* PassthroughWindow.swift in Sources */, - 94655FE0F915EAB6FEC181D1D3F9BA5F /* Presenter.swift in Sources */, - 379034C9D27F4371D0CCB174CF40AF69 /* SwiftMessages-dummy.m in Sources */, - 99C742D2CA19765B6535CAC0432BAAE2 /* SwiftMessages.swift in Sources */, - 358AED3638D5FB91ABB994B2AA33515C /* Theme.swift in Sources */, - AE35A5DE7A5FFBD132BEE9CEA4E80A15 /* UIViewController+Utils.swift in Sources */, - C8CE8C0863C7BCFC6780AAB21F5A6133 /* WindowViewController.swift in Sources */, + 7AAB19F2F518FAFEFCC099693B8B8BA9 /* Pods-Demo-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - C7FBE9003244C43CF1443AB01559A139 /* Sources */ = { + F08614BD38C701F3AADA90C9947DC76A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7AAB19F2F518FAFEFCC099693B8B8BA9 /* Pods-Demo-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - F08614BD38C701F3AADA90C9947DC76A /* Sources */ = { + FD538C5526F7FEB87F663686CD3D9F32 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4781B59A397CCEE9C6C9A1471A0BB269 /* AccessibleMessage.swift in Sources */, + D87C1394C26D7E9D2EF36057B4DB8846 /* Array+Utils.swift in Sources */, + E0B52723410482D2458DAC747E79382E /* BackgroundViewable.swift in Sources */, + 5179726BE70C9945C37CF9F3CD992F1E /* BaseView.swift in Sources */, + 7F7370E89961BA5AC8A1E7F89ED7D6E9 /* Error.swift in Sources */, + 66F4159354E6271C54803C13947F6FAE /* Identifiable.swift in Sources */, + D20DF9E0AA424241C67ACF42A5FE3F17 /* MarginAdjustable.swift in Sources */, + 7C466B3F001FBE13754A42AC9641F4A3 /* MaskingView.swift in Sources */, + 398CC054BD6C74FD02297202F635BB3F /* MessageView.swift in Sources */, + 295619F382C5E91656A6E96F53F542E5 /* NSBundle+Utils.swift in Sources */, + 63D462720463155221D237492501DF95 /* PassthroughView.swift in Sources */, + 8C98B5AF65CE5513ADFEE0E8322142AB /* PassthroughWindow.swift in Sources */, + E5A11C52C73345CE5C0FB68AF76BA6DD /* Presenter.swift in Sources */, + 3C599E1727A52197A6D307DCB7777433 /* SwiftMessages-dummy.m in Sources */, + 8304F5AB47FF2A045B4E4F18AA8942FE /* SwiftMessages.swift in Sources */, + 2CA0040994E7E1299A62736C54ED0E7C /* Theme.swift in Sources */, + B165F0E46CD0326339016913DF12ACB3 /* UIViewController+Utils.swift in Sources */, + 95D9331F7FBA5AF09D0F290485EDAF8A /* WindowViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -504,7 +512,7 @@ }; 0B52DA1E3E3B655D2B1DB46AD2A31CF4 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F08242889B058791110330C1D95B6032 /* SwiftMessages.xcconfig */; + baseConfigurationReference = 03D3A4B4E5C69D6264959E6FE343F48D /* SwiftMessages.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -581,7 +589,7 @@ }; 16C76C11C5F44BBFE957FB7ECB49DA6E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F08242889B058791110330C1D95B6032 /* SwiftMessages.xcconfig */; + baseConfigurationReference = 03D3A4B4E5C69D6264959E6FE343F48D /* SwiftMessages.xcconfig */; buildSettings = { CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SwiftMessages"; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -674,7 +682,7 @@ }; A9EC56CB8A12915F20F428F6D8B5B5B4 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F08242889B058791110330C1D95B6032 /* SwiftMessages.xcconfig */; + baseConfigurationReference = 03D3A4B4E5C69D6264959E6FE343F48D /* SwiftMessages.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -706,7 +714,7 @@ }; B183EFBB9DFD7B5A4B9147C0BF6A96CB /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F08242889B058791110330C1D95B6032 /* SwiftMessages.xcconfig */; + baseConfigurationReference = 03D3A4B4E5C69D6264959E6FE343F48D /* SwiftMessages.xcconfig */; buildSettings = { CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SwiftMessages"; ENABLE_STRICT_OBJC_MSGSEND = YES; diff --git a/Demo/Pods/Target Support Files/SwiftMessages/Info.plist b/Demo/Pods/Target Support Files/SwiftMessages/Info.plist index c1aea25c..3ac477e6 100644 --- a/Demo/Pods/Target Support Files/SwiftMessages/Info.plist +++ b/Demo/Pods/Target Support Files/SwiftMessages/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.1.5 + 3.3.0 CFBundleSignature ???? CFBundleVersion diff --git a/Demo/Pods/Target Support Files/SwiftMessages/ResourceBundle-SwiftMessages-Info.plist b/Demo/Pods/Target Support Files/SwiftMessages/ResourceBundle-SwiftMessages-Info.plist index ffcbc53a..e79f0130 100644 --- a/Demo/Pods/Target Support Files/SwiftMessages/ResourceBundle-SwiftMessages-Info.plist +++ b/Demo/Pods/Target Support Files/SwiftMessages/ResourceBundle-SwiftMessages-Info.plist @@ -13,7 +13,7 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 3.1.5 + 3.3.0 CFBundleSignature ???? CFBundleVersion diff --git a/README.md b/README.md index da149dd5..6f485fed 100644 --- a/README.md +++ b/README.md @@ -147,6 +147,18 @@ config.duration = .forever SwiftMessages.show(config: config, view: view) ```` +### Accessibility + +SwiftMessages provides excellent VoiceOver support out-of-the-box. + +* The title and body of the message are combined into a single announcement when the message is shown. The `MessageView.accessibilityPrefix` property can be set to prepend additional clarifying text to the announcement. + + Sometimes, a message may contain important visual cues that aren't captured in the title or body. For example, a message may rely on a yellow background to convey a warning rather than having the word "warning" in the title or body. In this case, it might be helpful to set `MessageView.accessibilityPrefix = "warning"`. + +* If the message is shown with a dim view using `config.dimMode`, elements below the dim view are not focusable until the message is hidden. If `config.dimMode.interactive == true`, the dim view itself will be focusable and read out "dismiss" followed by "button". The former text can be customized by setting the `config.dimModeAccessibilityLabel` property. + +See the `AccessibleMessage` protocol for implementing proper accessibility support in custom views. + ### Customization `MessageView` provides the following UI elements, exposed as public, optional `@IBOutlets`: diff --git a/SwiftMessages.podspec b/SwiftMessages.podspec index c82c145c..c3d19dc6 100644 --- a/SwiftMessages.podspec +++ b/SwiftMessages.podspec @@ -1,11 +1,11 @@ Pod::Spec.new do |spec| spec.name = 'SwiftMessages' - spec.version = '3.2.1' + spec.version = '3.3.0' spec.license = { :type => 'MIT' } spec.homepage = 'https://github.com/SwiftKickMobile/SwiftMessages' spec.authors = { 'Timothy Moose' => 'tim@swiftkick.it' } spec.summary = 'A very flexible message bar for iOS written in Swift.' - spec.source = {:git => 'https://github.com/SwiftKickMobile/SwiftMessages.git', :tag => '3.2.1'} + spec.source = {:git => 'https://github.com/SwiftKickMobile/SwiftMessages.git', :tag => '3.3.0'} spec.platform = :ios, '8.0' spec.ios.deployment_target = '8.0' spec.source_files = 'SwiftMessages/**/*.swift' diff --git a/SwiftMessages.xcodeproj/project.pbxproj b/SwiftMessages.xcodeproj/project.pbxproj index f9c14afe..cfa420c6 100644 --- a/SwiftMessages.xcodeproj/project.pbxproj +++ b/SwiftMessages.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 22E01F641E74EC8B00ACE19A /* MaskingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22E01F631E74EC8B00ACE19A /* MaskingView.swift */; }; + 22E307FF1E74C5B100E35893 /* AccessibleMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22E307FE1E74C5B100E35893 /* AccessibleMessage.swift */; }; 86589D471D64B6E40041676C /* BaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86589D461D64B6E40041676C /* BaseView.swift */; }; 86589D911D692B1C0041676C /* TabView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 86589D901D692B1B0041676C /* TabView.xib */; }; 867BED211D622793005212E3 /* BackgroundViewable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867BED201D622793005212E3 /* BackgroundViewable.swift */; }; @@ -44,6 +46,8 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 22E01F631E74EC8B00ACE19A /* MaskingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MaskingView.swift; sourceTree = ""; }; + 22E307FE1E74C5B100E35893 /* AccessibleMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccessibleMessage.swift; sourceTree = ""; }; 862C0C6A1D58E93300D06168 /* SwiftMessages.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; fileEncoding = 4; path = SwiftMessages.podspec; sourceTree = SOURCE_ROOT; }; 862C0CB01D5911C100D06168 /* NSBundle+Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSBundle+Utils.swift"; sourceTree = ""; }; 862C0CD91D5A397F00D06168 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Resources/Images.xcassets; sourceTree = ""; }; @@ -114,6 +118,7 @@ 867BED201D622793005212E3 /* BackgroundViewable.swift */, 864495551D4F7C390056EB2A /* Identifiable.swift */, 86AAF81D1D5549680031EE32 /* MarginAdjustable.swift */, + 22E307FE1E74C5B100E35893 /* AccessibleMessage.swift */, 86AAF82A1D580DD70031EE32 /* Error.swift */, 86DBE0031D75BE800071E51D /* Array+Utils.swift */, ); @@ -143,6 +148,7 @@ children = ( 867E21931D4D50BB00594A41 /* Presenter.swift */, 86AAF8171D54F0650031EE32 /* PassthroughView.swift */, + 22E01F631E74EC8B00ACE19A /* MaskingView.swift */, 86AAF8191D54F0850031EE32 /* PassthroughWindow.swift */, 8644955C1D4FAF7C0056EB2A /* WindowViewController.swift */, 86AAF81B1D551FE60031EE32 /* UIViewController+Utils.swift */, @@ -305,7 +311,9 @@ 86BBA9061D5E040C00FE8F16 /* Identifiable.swift in Sources */, 86BBA9011D5E040600FE8F16 /* PassthroughWindow.swift in Sources */, 86BBA9031D5E040600FE8F16 /* UIViewController+Utils.swift in Sources */, + 22E01F641E74EC8B00ACE19A /* MaskingView.swift in Sources */, 86BBA9001D5E040600FE8F16 /* PassthroughView.swift in Sources */, + 22E307FF1E74C5B100E35893 /* AccessibleMessage.swift in Sources */, 86BBA9041D5E040600FE8F16 /* NSBundle+Utils.swift in Sources */, 86BBA8FD1D5E03F800FE8F16 /* SwiftMessages.swift in Sources */, 86BBA9021D5E040600FE8F16 /* WindowViewController.swift in Sources */, diff --git a/SwiftMessages/AccessibleMessage.swift b/SwiftMessages/AccessibleMessage.swift new file mode 100644 index 00000000..47a628ae --- /dev/null +++ b/SwiftMessages/AccessibleMessage.swift @@ -0,0 +1,20 @@ +// +// AccessibleMessage.swift +// SwiftMessages +// +// Created by Timothy Moose on 3/11/17. +// Copyright © 2017 SwiftKick Mobile. All rights reserved. +// + +import Foundation + +/** + Message views that `AccessibleMessage`, as `MessageView` does will + have proper accessibility behavior when displaying messages. + `MessageView` implements this protocol. + */ +public protocol AccessibleMessage { + var accessibilityMessage: String? { get } + var accessibilityElement: NSObject? { get } + var additonalAccessibilityElements: [NSObject]? { get } +} diff --git a/SwiftMessages/MaskingView.swift b/SwiftMessages/MaskingView.swift new file mode 100644 index 00000000..1b9b60d7 --- /dev/null +++ b/SwiftMessages/MaskingView.swift @@ -0,0 +1,28 @@ +// +// MaskingView.swift +// SwiftMessages +// +// Created by Timothy Moose on 3/11/17. +// Copyright © 2017 SwiftKick Mobile. All rights reserved. +// + +import UIKit + + +class MaskingView: PassthroughView { + + var accessibleElements: [NSObject] = [] + + override func accessibilityElementCount() -> Int { + return accessibleElements.count + } + + override func accessibilityElement(at index: Int) -> Any? { + return accessibleElements[index] + } + + override func index(ofAccessibilityElement element: Any) -> Int { + guard let object = element as? NSObject else { return 0 } + return accessibleElements.index(of: object) ?? 0 + } +} diff --git a/SwiftMessages/MessageView.swift b/SwiftMessages/MessageView.swift index 6000ca2b..232a9b8f 100644 --- a/SwiftMessages/MessageView.swift +++ b/SwiftMessages/MessageView.swift @@ -10,7 +10,7 @@ import UIKit /* */ -open class MessageView: BaseView, Identifiable { +open class MessageView: BaseView, Identifiable, AccessibleMessage { /* MARK: - Button tap handler @@ -81,6 +81,33 @@ open class MessageView: BaseView, Identifiable { } private var customId: String? + + /* + MARK: - AccessibleMessage + */ + + /** + An optional prefix for the `accessibilityMessage` that can + be used to futher clarify the message for VoiceOver. For example, + the view's background color or icon might convey that a message is + a warning, in which case one may specify the value "warning". + */ + private var accessibilityPrefix: String? + + open var accessibilityMessage: String? { + let components = [accessibilityPrefix, titleLabel?.text, bodyLabel?.text].flatMap { $0 } + guard components.count > 0 else { return nil } + return components.joined(separator: ", ") + } + + public var accessibilityElement: NSObject? { + return backgroundView + } + + open var additonalAccessibilityElements: [NSObject]? { + if let button = button { return [button] } + return nil + } } /* @@ -345,3 +372,4 @@ extension MessageView { iconLabel?.isHidden = iconLabel?.text == nil } } + diff --git a/SwiftMessages/Presenter.swift b/SwiftMessages/Presenter.swift index 197ff955..83325940 100644 --- a/SwiftMessages/Presenter.swift +++ b/SwiftMessages/Presenter.swift @@ -49,7 +49,7 @@ class Presenter: NSObject, UIGestureRecognizerDelegate { let config: SwiftMessages.Config let view: UIView weak var delegate: PresenterDelegate? - let maskingView = PassthroughView() + let maskingView = MaskingView() var presentationContext = PresentationContext.viewController(Weak(value: nil)) let panRecognizer: UIPanGestureRecognizer var translationConstraint: NSLayoutConstraint! = nil @@ -109,10 +109,27 @@ class Presenter: NSObject, UIGestureRecognizerDelegate { showAnimation() { completed in completion(completed) if completed { + if self.config.dimMode.modal { + self.showAccessibilityFocus() + } else { + self.showAccessibilityAnnouncement() + } self.config.eventListeners.forEach { $0(.didShow) } } } } + + private func showAccessibilityAnnouncement() { + guard let accessibleMessage = view as? AccessibleMessage, + let message = accessibleMessage.accessibilityMessage else { return } + UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, message) + } + + private func showAccessibilityFocus() { + guard let accessibleMessage = view as? AccessibleMessage, + let focus = accessibleMessage.accessibilityElement ?? accessibleMessage.additonalAccessibilityElements?.first else { return } + UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, focus) + } func getPresentationContext() throws -> PresentationContext { @@ -207,31 +224,55 @@ class Presenter: NSObject, UIGestureRecognizerDelegate { if config.interactiveHide { view.addGestureRecognizer(panRecognizer) } - do { - - func setupInteractive(_ interactive: Bool) { - if interactive { - maskingView.tappedHander = { [weak self] in - guard let strongSelf = self else { return } - strongSelf.interactivelyHidden = true - strongSelf.delegate?.hide(presenter: strongSelf) - } - } else { - // There's no action to take, but the presence of - // a tap handler prevents interaction with underlying views. - maskingView.tappedHander = { } + installInteractive() + installAccessibility() + } + + private func installInteractive() { + if config.dimMode.interactive { + maskingView.tappedHander = { [weak self] in + guard let strongSelf = self else { return } + strongSelf.interactivelyHidden = true + strongSelf.delegate?.hide(presenter: strongSelf) + } + } else { + // There's no action to take, but the presence of + // a tap handler prevents interaction with underlying views. + maskingView.tappedHander = { } + } + } + + func installAccessibility() { + var elements: [NSObject] = [] + if let accessibleMessage = view as? AccessibleMessage { + if let message = accessibleMessage.accessibilityMessage { + let element = accessibleMessage.accessibilityElement ?? view + element.isAccessibilityElement = true + if element.accessibilityLabel == nil { + element.accessibilityLabel = message } - maskingView.accessibilityViewIsModal = true + elements.append(element) } - switch config.dimMode { - case .none: - break - case .gray(let interactive): - setupInteractive(interactive) - case .color(_, let interactive): - setupInteractive(interactive) + if let additional = accessibleMessage.additonalAccessibilityElements { + elements += additional } } + if config.dimMode.interactive { + let dismissView = UIView(frame: maskingView.bounds) + dismissView.translatesAutoresizingMaskIntoConstraints = true + dismissView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + maskingView.addSubview(dismissView) + maskingView.sendSubview(toBack: dismissView) + dismissView.isUserInteractionEnabled = false + dismissView.isAccessibilityElement = true + dismissView.accessibilityLabel = config.dimModeAccessibilityLabel + dismissView.accessibilityTraits = UIAccessibilityTraitButton + elements.append(dismissView) + } + if config.dimMode.modal { + maskingView.accessibilityViewIsModal = true + } + maskingView.accessibleElements = elements } private var becomeKeyWindow: Bool { @@ -239,7 +280,7 @@ class Presenter: NSObject, UIGestureRecognizerDelegate { switch config.dimMode { case .gray, .color: // Should become key window in modal presentation style - // for proper voice over handling. + // for proper VoiceOver handling. return true case .none: return false diff --git a/SwiftMessages/SwiftMessages.swift b/SwiftMessages/SwiftMessages.swift index 49da3749..1bbbd5e2 100644 --- a/SwiftMessages/SwiftMessages.swift +++ b/SwiftMessages/SwiftMessages.swift @@ -158,6 +158,26 @@ open class SwiftMessages: PresenterDelegate { dimmed area dismisses the message view. */ case color(color: UIColor, interactive: Bool) + + public var interactive: Bool { + switch self { + case .gray(let interactive): + return interactive + case .color(_, let interactive): + return interactive + case .none: + return false + } + } + + public var modal: Bool { + switch self { + case .gray, .color: + return true + case .none: + return false + } + } } /** @@ -260,6 +280,12 @@ open class SwiftMessages: PresenterDelegate { > may designate a different window as needed. */ public var becomeKeyWindow: Bool? + + /** + The `dimMode` background will use this accessibility + label, e.g. "dismiss" when the `interactive` option is used. + */ + public var dimModeAccessibilityLabel: String = "dismiss" } /** From 02a2d5bfbb5f0ce32d62e656b06f56a89d969659 Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Mon, 13 Mar 2017 09:41:55 -0500 Subject: [PATCH 011/227] =?UTF-8?q?Don=E2=80=99t=20block=20user=20interact?= =?UTF-8?q?ion=20with=20.none=20dim=20mode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 5 +++++ SwiftMessages.podspec | 4 ++-- SwiftMessages/Presenter.swift | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fce723e..2bbede83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ # Change Log All notable changes to this project will be documented in this file. +## [3.3.1](https://github.com/SwiftKickMobile/SwiftMessages/releases/tag/3.3.1) + +### Bug Fixes +* Fix regression where the UI was being blocked when using `DimMode.none`. + ## [3.3.0](https://github.com/SwiftKickMobile/SwiftMessages/releases/tag/3.3.0) ### Features diff --git a/SwiftMessages.podspec b/SwiftMessages.podspec index c3d19dc6..579709ba 100644 --- a/SwiftMessages.podspec +++ b/SwiftMessages.podspec @@ -1,11 +1,11 @@ Pod::Spec.new do |spec| spec.name = 'SwiftMessages' - spec.version = '3.3.0' + spec.version = '3.3.1' spec.license = { :type => 'MIT' } spec.homepage = 'https://github.com/SwiftKickMobile/SwiftMessages' spec.authors = { 'Timothy Moose' => 'tim@swiftkick.it' } spec.summary = 'A very flexible message bar for iOS written in Swift.' - spec.source = {:git => 'https://github.com/SwiftKickMobile/SwiftMessages.git', :tag => '3.3.0'} + spec.source = {:git => 'https://github.com/SwiftKickMobile/SwiftMessages.git', :tag => '3.3.1'} spec.platform = :ios, '8.0' spec.ios.deployment_target = '8.0' spec.source_files = 'SwiftMessages/**/*.swift' diff --git a/SwiftMessages/Presenter.swift b/SwiftMessages/Presenter.swift index 83325940..e8e1af3c 100644 --- a/SwiftMessages/Presenter.swift +++ b/SwiftMessages/Presenter.swift @@ -229,6 +229,7 @@ class Presenter: NSObject, UIGestureRecognizerDelegate { } private func installInteractive() { + guard config.dimMode.modal else { return } if config.dimMode.interactive { maskingView.tappedHander = { [weak self] in guard let strongSelf = self else { return } From 9237958eaa5fb7efca156492c523e70f80c78f5b Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Fri, 24 Mar 2017 12:32:40 -0500 Subject: [PATCH 012/227] Improve inclusion of additional accessibility elements --- CHANGELOG.md | 7 ++++ Demo/Demo.xcodeproj/project.pbxproj | 5 +-- Demo/Demo/TacoDialogView.swift | 2 +- Demo/Demo/TacoDialogView.xib | 36 ++++++++++++++++++--- SwiftMessages.podspec | 4 +-- SwiftMessages/MessageView.swift | 16 +++++++-- SwiftMessages/Resources/CardView.xib | 11 ++++++- SwiftMessages/Resources/MessageView.xib | 11 ++++++- SwiftMessages/Resources/MessageViewIOS8.xib | 11 ++++++- SwiftMessages/Resources/StatusLine.xib | 13 ++++++-- SwiftMessages/Resources/TabView.xib | 11 ++++++- 11 files changed, 108 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bbede83..aaaf261a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log All notable changes to this project will be documented in this file. +## [3.3.2](https://github.com/SwiftKickMobile/SwiftMessages/releases/tag/3.3.2) + +### Improvements +* `MessageView` is smarter about including additional accessibility views for cases where you've added accessible elements to the view. Previously only the `button` was included. Now all views where `isAccessibilityElement == true`. + + Note that all nib files now have `isAccessibilityElement == false` for `titleLabel`, `bodyLabel` and `iconLabel` (`titleLabel` and `bodyLabel` are read out as part of the overall message view's text). If any of these need to be directly accessible, then copy the nib file into your project and select "Enabled" in the Accessibility section of the Identity Inspector. + ## [3.3.1](https://github.com/SwiftKickMobile/SwiftMessages/releases/tag/3.3.1) ### Bug Fixes diff --git a/Demo/Demo.xcodeproj/project.pbxproj b/Demo/Demo.xcodeproj/project.pbxproj index 149df712..596b5b52 100644 --- a/Demo/Demo.xcodeproj/project.pbxproj +++ b/Demo/Demo.xcodeproj/project.pbxproj @@ -132,6 +132,7 @@ TargetAttributes = { 86AEDCE11D5D1DB70030232E = { CreatedOnToolsVersion = 7.3.1; + DevelopmentTeam = 38R82CD868; LastSwiftMigration = 0800; }; }; @@ -346,7 +347,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 38R82CD868; INFOPLIST_FILE = Demo/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = it.swiftkick.Demo; @@ -361,7 +362,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 38R82CD868; INFOPLIST_FILE = Demo/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = it.swiftkick.Demo; diff --git a/Demo/Demo/TacoDialogView.swift b/Demo/Demo/TacoDialogView.swift index a42f6df7..58739c93 100644 --- a/Demo/Demo/TacoDialogView.swift +++ b/Demo/Demo/TacoDialogView.swift @@ -24,7 +24,7 @@ class TacoDialogView: MessageView { fileprivate var count = 1 { didSet { iconLabel?.text = String(repeating: "🌮", count: count)//String(count: count, repeatedValue: ) - titleLabel?.text = TacoDialogView.tacoTitles[count] ?? "\(count)" + String(repeating: "!", count: count) + bodyLabel?.text = TacoDialogView.tacoTitles[count] ?? "\(count)" + String(repeating: "!", count: count) } } diff --git a/Demo/Demo/TacoDialogView.xib b/Demo/Demo/TacoDialogView.xib index 8dcda1a2..f6a82c3d 100644 --- a/Demo/Demo/TacoDialogView.xib +++ b/Demo/Demo/TacoDialogView.xib @@ -1,8 +1,11 @@ - - + + + + + - + @@ -14,16 +17,25 @@ + + + + + + @@ -73,10 +95,13 @@ + + @@ -83,8 +83,8 @@ - - + + diff --git a/SwiftMessages/Resources/CenteredView.xib b/SwiftMessages/Resources/CenteredView.xib new file mode 100644 index 00000000..ded68b96 --- /dev/null +++ b/SwiftMessages/Resources/CenteredView.xib @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SwiftMessages/Resources/TabView.xib b/SwiftMessages/Resources/TabView.xib index 8b151a76..20007236 100644 --- a/SwiftMessages/Resources/TabView.xib +++ b/SwiftMessages/Resources/TabView.xib @@ -1,11 +1,11 @@ - + - + @@ -17,10 +17,10 @@ - + - + - + diff --git a/SwiftMessages/SwiftMessages.swift b/SwiftMessages/SwiftMessages.swift index 8cfe133d..fc976c6c 100644 --- a/SwiftMessages/SwiftMessages.swift +++ b/SwiftMessages/SwiftMessages.swift @@ -15,7 +15,7 @@ private let globalInstance = SwiftMessages() It behaves like a queue, only showing one message at a time. Message views that implement the `Identifiable` protocol (as `MessageView` does) will have duplicates removed. */ -open class SwiftMessages: PresenterDelegate { +open class SwiftMessages { /** Specifies whether the message view is displayed at the top or bottom @@ -32,6 +32,16 @@ open class SwiftMessages: PresenterDelegate { Message view slides up from the bottom. */ case bottom + + /** + Message view fades into the center. + */ + case center + + /** + User-defined animation + */ + case custom(animator: Animator) } /** @@ -480,6 +490,10 @@ open class SwiftMessages: PresenterDelegate { guard queue.count > 0 else { return } let current = queue.removeFirst() self.current = current + // Set `autohideToken` before the animation starts in case + // the dismiss gesture begins before we've queued the autohide + // block on animation completion. + self.autohideToken = current current.showDate = Date() DispatchQueue.main.async { [weak self] in guard let strongSelf = self else { return } @@ -493,7 +507,9 @@ open class SwiftMessages: PresenterDelegate { }) return } - strongSelf.queueAutoHide() + if current === strongSelf.autohideToken { + strongSelf.queueAutoHide() + } } } catch { strongSelf.current = nil @@ -532,34 +548,52 @@ open class SwiftMessages: PresenterDelegate { }) } } - - /* - MARK: - PresenterDelegate - */ - +} + + +/* + MARK: - PresenterDelegate + */ + +extension SwiftMessages: PresenterDelegate { + func hide(presenter: Presenter) { + if let current = current, presenter === current { + hideCurrent() + } + queue = queue.filter { $0 !== presenter } + delays.remove(presenter: presenter) + } + + public func hide(animator: Animator) { syncQueue.async { [weak self] in guard let strongSelf = self else { return } - if let current = strongSelf.current, presenter === current { - strongSelf.hideCurrent() + if let presenter = strongSelf.presenter(forAnimator: animator) { + strongSelf.hide(presenter: presenter) } - strongSelf.queue = strongSelf.queue.filter { $0 !== presenter } - strongSelf.delays.remove(presenter: presenter) } } - - func panStarted(presenter: Presenter) { + + public func panStarted(animator: Animator) { autohideToken = nil } - - func panEnded(presenter: Presenter) { + + public func panEnded(animator: Animator) { queueAutoHide() } + + private func presenter(forAnimator animator: Animator) -> Presenter? { + if let current = current, animator === current.animator { + return current + } + let queued = queue.filter { $0.animator === animator } + return queued.first + } } /** MARK: - Creating views from nibs - + This extension provides several convenience functions for instantiating views from nib files. SwiftMessages provides several default nib files in the Resources folder that can be drag-and-dropped into a project as a starting point and modified. diff --git a/SwiftMessages/Theme.swift b/SwiftMessages/Theme.swift index a31bc579..68613530 100644 --- a/SwiftMessages/Theme.swift +++ b/SwiftMessages/Theme.swift @@ -44,9 +44,10 @@ public enum IconStyle { case `default` case light case subtle + case none /// Returns the image for the given theme - public func image(theme: Theme) -> UIImage { + public func image(theme: Theme) -> UIImage? { switch (theme, self) { case (.info, .default): return Icon.Info.image case (.info, .light): return Icon.InfoLight.image @@ -60,6 +61,7 @@ public enum IconStyle { case (.error, .default): return Icon.Error.image case (.error, .light): return Icon.ErrorLight.image case (.error, .subtle): return Icon.ErrorSubtle.image + default: return nil } } } diff --git a/SwiftMessages/TopBottomAnimation.swift b/SwiftMessages/TopBottomAnimation.swift new file mode 100644 index 00000000..afe5537f --- /dev/null +++ b/SwiftMessages/TopBottomAnimation.swift @@ -0,0 +1,167 @@ +// +// TopBottomAnimation.swift +// SwiftMessages +// +// Created by Timothy Moose on 6/4/17. +// Copyright © 2017 SwiftKick Mobile. All rights reserved. +// + +import UIKit + +public class TopBottomAnimation: NSObject, Animator { + + enum Style { + case top + case bottom + } + + public weak var delegate: AnimationDelegate? + + var style: Style + + var translationConstraint: NSLayoutConstraint! = nil + + weak var messageView: UIView? + + weak var containerView: UIView? + + init(style: Style, delegate: AnimationDelegate) { + self.style = style + self.delegate = delegate + } + + public func show(context: AnimationContext, completion: @escaping AnimationCompletion) { + install(context: context) + showAnimation(completion: completion) + } + + public func hide(context: AnimationContext, completion: @escaping AnimationCompletion) { + let view = context.messageView + let container = context.containerView + UIView.animate(withDuration: 0.2, delay: 0, options: [.beginFromCurrentState, .curveEaseIn], animations: { + let size = view.systemLayoutSizeFitting(UILayoutFittingCompressedSize) + self.translationConstraint.constant -= size.height + container.layoutIfNeeded() + }, completion: { completed in + completion(completed) + }) + } + + func install(context: AnimationContext) { + let view = context.messageView + let container = context.containerView + messageView = view + containerView = container + if let adjustable = context.messageView as? MarginAdjustable { + bounceOffset = adjustable.bounceAnimationOffset + } + view.translatesAutoresizingMaskIntoConstraints = false + container.addSubview(view) + let leading = NSLayoutConstraint(item: view, attribute: .leading, relatedBy: .equal, toItem: container, attribute: .leading, multiplier: 1.00, constant: 0.0) + let trailing = NSLayoutConstraint(item: view, attribute: .trailing, relatedBy: .equal, toItem: container, attribute: .trailing, multiplier: 1.00, constant: 0.0) + switch style { + case .top: + translationConstraint = NSLayoutConstraint(item: view, attribute: .top, relatedBy: .equal, toItem: container, attribute: .top, multiplier: 1.00, constant: 0.0) + case .bottom: + translationConstraint = NSLayoutConstraint(item: container, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1.00, constant: 0.0) + } + container.addConstraints([leading, trailing, translationConstraint]) + if let adjustable = view as? MarginAdjustable { + var top: CGFloat = 0.0 + var bottom: CGFloat = 0.0 + switch style { + case .top: + top += adjustable.bounceAnimationOffset + if context.behindStatusBar { + top += adjustable.statusBarOffset + } + case .bottom: + bottom += adjustable.bounceAnimationOffset + } + view.layoutMargins = UIEdgeInsets(top: top, left: 0.0, bottom: bottom, right: 0.0) + } + let size = view.systemLayoutSizeFitting(UILayoutFittingCompressedSize) + translationConstraint.constant -= size.height + container.layoutIfNeeded() + if context.interactiveHide { + let pan = UIPanGestureRecognizer() + pan.addTarget(self, action: #selector(pan(_:))) + if let view = view as? BackgroundViewable { + view.backgroundView.addGestureRecognizer(pan) + } else { + view.addGestureRecognizer(pan) + } + } + } + + func showAnimation(completion: @escaping AnimationCompletion) { + guard let container = containerView else { + completion(false) + return + } + let animationDistance = self.translationConstraint.constant + bounceOffset + // Cap the initial velocity at zero because the bounceOffset may not be great + // enough to allow for greater bounce induced by a quick panning motion. + let initialSpringVelocity = animationDistance == 0.0 ? 0.0 : min(0.0, closeSpeed / animationDistance) + UIView.animate(withDuration: 0.4, delay: 0.0, usingSpringWithDamping: 0.8, initialSpringVelocity: initialSpringVelocity, options: [.beginFromCurrentState, .curveLinear, .allowUserInteraction], animations: { + self.translationConstraint.constant = -self.bounceOffset + container.layoutIfNeeded() + }, completion: { completed in + completion(completed) + }) + } + + fileprivate var bounceOffset: CGFloat = 5 + + /* + MARK: - Pan to close + */ + + fileprivate var closing = false + fileprivate var closeSpeed: CGFloat = 0.0 + fileprivate var closePercent: CGFloat = 0.0 + fileprivate var panTranslationY: CGFloat = 0.0 + + @objc func pan(_ pan: UIPanGestureRecognizer) { + switch pan.state { + case .changed: + guard let view = pan.view else { return } + let height = view.bounds.height - bounceOffset + if height <= 0 { return } + let point = pan.location(ofTouch: 0, in: view) + var velocity = pan.velocity(in: view) + var translation = pan.translation(in: view) + if case .top = style { + velocity.y *= -1.0 + translation.y *= -1.0 + } + if !closing { + if view.bounds.contains(point) && velocity.y > 0.0 && velocity.x / velocity.y < 5.0 { + closing = true + pan.setTranslation(CGPoint.zero, in: view) + delegate?.panStarted(animator: self) + } + } + if !closing { return } + let translationAmount = -bounceOffset - max(0.0, translation.y) + translationConstraint.constant = translationAmount + closeSpeed = velocity.y + closePercent = translation.y / height + panTranslationY = translation.y + case .ended, .cancelled: + if closeSpeed > 750.0 || closePercent > 0.33 { + delegate?.hide(animator: self) + } else { + closing = false + closeSpeed = 0.0 + closePercent = 0.0 + panTranslationY = 0.0 + showAnimation(completion: { (completed) in + self.delegate?.panEnded(animator: self) + }) + } + default: + break + } + } +} diff --git a/SwiftMessages/Weak.swift b/SwiftMessages/Weak.swift new file mode 100644 index 00000000..a9bc4700 --- /dev/null +++ b/SwiftMessages/Weak.swift @@ -0,0 +1,16 @@ +// +// Weak.swift +// SwiftMessages +// +// Created by Timothy Moose on 6/4/17. +// Copyright © 2017 SwiftKick Mobile. All rights reserved. +// + +import Foundation + +public class Weak { + public weak var value : T? + public init(value: T?) { + self.value = value + } +} From 9dcf49fd8a37fa46b25f9ae6b3c3b2e73ca71921 Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Mon, 26 Jun 2017 11:02:09 -0500 Subject: [PATCH 023/227] Add 3.4.0-beta announcement --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 849a190d..a0bb438a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ + +### 🔥 SwiftMessages 3.4.0-beta now supports centered messages! + # SwiftMessages [![Twitter: @TimothyMoose](https://img.shields.io/badge/contact-@TimothyMoose-blue.svg?style=flat)](https://twitter.com/TimothyMoose) From 134ee470ce93071777254e37c8f9e7eaf64c599d Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Tue, 27 Jun 2017 18:17:01 -0500 Subject: [PATCH 024/227] Fix memory leak #100 --- SwiftMessages/Presenter.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SwiftMessages/Presenter.swift b/SwiftMessages/Presenter.swift index 806a6c8e..cb4e9c0b 100644 --- a/SwiftMessages/Presenter.swift +++ b/SwiftMessages/Presenter.swift @@ -37,8 +37,8 @@ class Presenter: NSObject { } } - let view: UIView let config: SwiftMessages.Config + let view: UIView weak var delegate: PresenterDelegate? let maskingView = MaskingView() var presentationContext = PresentationContext.viewController(Weak(value: nil)) From 15fe4d9ba94072b1abd2019ed3a8206e950a0853 Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Sat, 1 Jul 2017 11:35:15 -0500 Subject: [PATCH 025/227] Revert breaking change to enum capitalization --- Demo/Demo/Base.lproj/Main.storyboard | 121 +++++++++++++------------- Demo/Demo/ExploreViewController.swift | 14 ++- Demo/Demo/ViewController.swift | 14 +-- SwiftMessages/MessageView.swift | 12 +-- 4 files changed, 79 insertions(+), 82 deletions(-) diff --git a/Demo/Demo/Base.lproj/Main.storyboard b/Demo/Demo/Base.lproj/Main.storyboard index 278a0c8c..86f253f8 100644 --- a/Demo/Demo/Base.lproj/Main.storyboard +++ b/Demo/Demo/Base.lproj/Main.storyboard @@ -1,6 +1,6 @@ - - + + @@ -32,25 +32,25 @@ - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo/Demo/CountedMessageView.swift b/Demo/Demo/CountedMessageView.swift new file mode 100644 index 00000000..e0921bde --- /dev/null +++ b/Demo/Demo/CountedMessageView.swift @@ -0,0 +1,19 @@ +// +// CountedMessageView.swift +// Demo +// +// Created by Timothy Moose on 8/25/17. +// Copyright © 2017 SwiftKick Mobile. All rights reserved. +// + +import UIKit +import SwiftMessages + +class CountedMessageView: UIView, Identifiable { + + @IBOutlet weak var countLabel: UILabel! + + var id: String { + return "counted" + } +} diff --git a/Demo/Demo/CountedViewController.swift b/Demo/Demo/CountedViewController.swift new file mode 100644 index 00000000..6bcc9bf0 --- /dev/null +++ b/Demo/Demo/CountedViewController.swift @@ -0,0 +1,45 @@ +// +// CountedViewController.swift +// Demo +// +// Created by Timothy Moose on 8/25/17. +// Copyright © 2017 SwiftKick Mobile. All rights reserved. +// + +import UIKit +import SwiftMessages + +class CountedViewController: UIViewController { + + @IBOutlet weak var descriptionLabel: UILabel! + @IBOutlet var messageView: CountedMessageView! + @IBOutlet weak var messageContainer: UIView! + + override func viewDidLoad() { + super.viewDidLoad() + descriptionLabel.configureBodyTextStyle() + descriptionLabel.configureCodeStyle(on: "show()") + descriptionLabel.configureCodeStyle(on: "hideCounted(id:)") + } + + @IBAction func show() { + var config = SwiftMessages.defaultConfig + config.presentationStyle = .center + config.duration = .forever + config.presentationContext = .view(messageContainer) + SwiftMessages.show(config: config, view: messageView) + updateCountLabel() + } + + @IBAction func hide() { + SwiftMessages.hideCounted(id: messageView.id) + updateCountLabel() + } + + private func updateCountLabel() { + let count = SwiftMessages.count(id: messageView.id) + let numberFormatter = NumberFormatter() + numberFormatter.numberStyle = .spellOut + messageView.countLabel.text = numberFormatter.string(from: NSNumber(value: count))?.uppercased() + } +} diff --git a/Demo/Demo/Utils.swift b/Demo/Demo/Utils.swift new file mode 100644 index 00000000..112b71e8 --- /dev/null +++ b/Demo/Demo/Utils.swift @@ -0,0 +1,58 @@ +// +// Utils.swift +// Demo +// +// Created by Timothy Moose on 8/25/17. +// Copyright © 2017 SwiftKick Mobile. All rights reserved. +// + +import UIKit + +extension UILabel { + + func configureBodyTextStyle() { + let bodyStyle = NSMutableParagraphStyle() + bodyStyle.lineSpacing = 5.0 + attributedText = NSAttributedString(string: text ?? "", attributes: [NSParagraphStyleAttributeName : bodyStyle]) + } + + func configureCodeStyle(on substring: String?) { + var attributes: [String : Any] = [:] + let codeFont = UIFont(name: "CourierNewPSMT", size: font.pointSize)! + attributes[NSFontAttributeName] = codeFont + attributes[NSBackgroundColorAttributeName] = UIColor(white: 0.96, alpha: 1) + attributedText = attributedText?.setAttributes(attributes: attributes, onSubstring: substring) + } +} + +extension NSAttributedString { + + public func setAttributes(attributes: [String : Any], onSubstring substring: String?) -> NSAttributedString { + let mutableSelf = NSMutableAttributedString(attributedString: self) + if let substring = substring { + var range = NSRange() + repeat { + let length = mutableSelf.length + let start = range.location + range.length + let remainingLength = length - start + let remainingRange = NSRange(location: start, length: remainingLength) + range = (mutableSelf.string as NSString).range(of: substring, options: .caseInsensitive, range: remainingRange) + NSAttributedString.set(attributes: attributes, in: range, of: mutableSelf) + } while range.length > 0 + } else { + let range = NSRange(location: 0, length: mutableSelf.length) + NSAttributedString.set(attributes: attributes, in: range, of: mutableSelf) + } + return mutableSelf + } + + private static func set(attributes newAttributes: [String : Any], in range: NSRange, of mutableString: NSMutableAttributedString) { + if range.length > 0 { + var attributes = mutableString.attributes(at: range.location, effectiveRange: nil) + for (key, value) in newAttributes { + attributes.updateValue(value, forKey: key) + } + mutableString.setAttributes(attributes, range: range) + } + } +} diff --git a/Demo/Demo/ViewController.swift b/Demo/Demo/ViewController.swift index c8c190fc..8acb7b91 100644 --- a/Demo/Demo/ViewController.swift +++ b/Demo/Demo/ViewController.swift @@ -17,6 +17,7 @@ class ViewController: UITableViewController { .titleBody(title: "CUSTOMIZE", body: "Easily customize by copying one of the SwiftMessages nib files into your project as a starting point. Then order some tacos.", function: ViewController.demoCustomNib), .explore, .titleBody(title: "CENTERED", body: "Show cenetered messages with a fun, physics-based dismissal gesture.", function: ViewController.demoCentered), + .counted, ] /* @@ -162,6 +163,7 @@ enum Item { case titleBody(title: String, body: String, function: Function) case explore + case counted func dequeueCell(_ tableView: UITableView) -> UITableViewCell { switch self { @@ -175,6 +177,12 @@ enum Item { let cell = tableView.dequeueReusableCell(withIdentifier: "Explore") as! TitleBodyCell cell.configureBodyTextStyle() return cell + case .counted: + let cell = tableView.dequeueReusableCell(withIdentifier: "Counted") as! TitleBodyCell + cell.configureBodyTextStyle() + cell.bodyLabel.configureCodeStyle(on: "show()") + cell.bodyLabel.configureCodeStyle(on: "hideCounted(id:)") + return cell } } @@ -195,7 +203,6 @@ class TitleBodyCell: UITableViewCell { func configureBodyTextStyle() { let bodyStyle = NSMutableParagraphStyle() bodyStyle.lineSpacing = 5.0 - bodyLabel.attributedText = NSAttributedString(string: bodyLabel.text ?? "", attributes: [NSParagraphStyleAttributeName : bodyStyle]) + bodyLabel.configureBodyTextStyle() } } - diff --git a/README.md b/README.md index e7604c7c..5c08acb0 100644 --- a/README.md +++ b/README.md @@ -215,6 +215,11 @@ SwiftMessages.hideAll() // Or for a view that implements `Identifiable`: SwiftMessages.hide(id: someId) + +// Or hide when the number of calls to show() and hideCounted(id:) for a +// given message ID are equal. This can be useful for messages that may be +// shown from multiple code paths to ensure that all code paths are ready to hide. +SwiftMessages.hideCounted(id: someId) ```` Multiple instances of `SwiftMessages` can be used to show more than one message at a time. Note that the static `SwiftMessages.show()` and other static APIs on `SwiftMessage` are just convenience wrappers around the shared instance `SwiftMessages.sharedInstance`): diff --git a/SwiftMessages/SwiftMessages.swift b/SwiftMessages/SwiftMessages.swift index 83536891..642d2a4a 100644 --- a/SwiftMessages/SwiftMessages.swift +++ b/SwiftMessages/SwiftMessages.swift @@ -392,6 +392,7 @@ open class SwiftMessages { messageQueue.sync { queue.removeAll() delays.ids.removeAll() + counts.removeAll() hideCurrent() } } @@ -409,6 +410,28 @@ open class SwiftMessages { } queue = queue.filter { $0.id != id } delays.ids.remove(id) + counts[id] = nil + } + } + + /** + + */ + open func hideCounted(id: String) { + messageQueue.sync { + if let count = counts[id] { + if count < 2 { + counts[id] = nil + } else { + counts[id] = count - 1 + return + } + } + if id == current?.id { + hideCurrent() + } + queue = queue.filter { $0.id != id } + delays.ids.remove(id) } } @@ -444,6 +467,7 @@ open class SwiftMessages { fileprivate let messageQueue = DispatchQueue(label: "it.swiftkick.SwiftMessages", attributes: []) fileprivate var queue: [Presenter] = [] fileprivate var delays = Delays() + fileprivate var counts: [String : Int] = [:] fileprivate var current: Presenter? = nil { didSet { if oldValue != nil { @@ -457,6 +481,7 @@ open class SwiftMessages { fileprivate func enqueue(presenter: Presenter) { if presenter.config.ignoreDuplicates { + counts[presenter.id] = (counts[presenter.id] ?? 0) + 1 if current?.id == presenter.id && current?.isHiding == false { return } if queue.filter({ $0.id == presenter.id }).count > 0 { return } } @@ -525,6 +550,7 @@ open class SwiftMessages { guard completed, let strongSelf = self, let strongCurrent = current else { return } strongSelf.messageQueue.sync { guard strongSelf.current === strongCurrent else { return } + strongSelf.counts[strongCurrent.id] = nil strongSelf.current = nil } } @@ -596,6 +622,19 @@ extension SwiftMessages { public func currentOrQueued(id: String) -> T? { return current(id: id) ?? queued(id: id) } + + /** + */ + public func count(id: String) -> Int { + return counts[id] ?? 0 + } + + /** + */ + public func set(count: Int, for id: String) { + guard counts[id] != nil else { return } + return counts[id] = count + } } /* @@ -763,7 +802,11 @@ extension SwiftMessages { public static func hide(id: String) { globalInstance.hide(id: id) } - + + public static func hideCounted(id: String) { + globalInstance.hideCounted(id: id) + } + public static var defaultConfig: Config { get { return globalInstance.defaultConfig @@ -781,4 +824,24 @@ extension SwiftMessages { globalInstance.pauseBetweenMessages = newValue } } + + public static func current(id: String) -> T? { + return globalInstance.current(id: id) + } + + public static func queued(id: String) -> T? { + return globalInstance.queued(id: id) + } + + public static func currentOrQueued(id: String) -> T? { + return globalInstance.currentOrQueued(id: id) + } + + public static func count(id: String) -> Int { + return globalInstance.count(id: id) + } + + public static func set(count: Int, for id: String) { + globalInstance.set(count: count, for: id) + } } From 595c95144c4bfebc9ad7111589fb98cf59c6377d Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Fri, 25 Aug 2017 18:10:46 -0500 Subject: [PATCH 034/227] Update documentation and refine demo --- CHANGELOG.md | 23 ++++++- Demo/Demo/Base.lproj/Main.storyboard | 81 +++++++++++++------------ README.md | 90 +++++++++++++++++----------- SwiftMessages.podspec | 4 +- SwiftMessages/SwiftMessages.swift | 37 +++++++----- 5 files changed, 142 insertions(+), 93 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cb87a57..0fb1657f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,30 @@ # Change Log All notable changes to this project will be documented in this file. -## [3.4.1](https://github.com/SwiftKickMobile/SwiftMessages/releases/tag/3.4.1) +## [3.5.0](https://github.com/SwiftKickMobile/SwiftMessages/releases/tag/3.5.0) ### Features +* Added `SwiftMessages.hideCounted(id:)` method of hiding. The counted method hides when the number of calls to `show()` and `hideCounted(id:)` for a +given message ID are equal. This can be useful for messages that may be +shown from multiple code paths to ensure that all paths are ready to hide. + + Also added `SwiftMessages.count(id:)` to get the current count and `SwiftMessages.set(id:count:)` to set the current count. + +* Added ways to retrieve message views currently being shown, hidden, or queued to be shown. + + ````swift + // Get a message view with the given ID if it is currently + // being shown or hidden. + if let view = SwiftMessages.current(id: "some id") { ... } + + // Get a message view with the given ID if is it currently + // queued to be shown. + if let view = SwiftMessages.queued(id: "some id") { ... } + + // Get a message view with the given ID if it is currently being + // shown, hidden or in the queue to be shown. + if let view = SwiftMessages.currentOrQueued(id: "some id") { ... } + ```` ### Bug Fixes * Fix #116 for message views that don't adopt the `Identifiable` protocol by using the memory address as the ID. diff --git a/Demo/Demo/Base.lproj/Main.storyboard b/Demo/Demo/Base.lproj/Main.storyboard index e775498d..21bd66e0 100644 --- a/Demo/Demo/Base.lproj/Main.storyboard +++ b/Demo/Demo/Base.lproj/Main.storyboard @@ -40,7 +40,7 @@ - + - + + + + - + - + @@ -69,24 +69,25 @@ - - - - + + + + - + - - - - + + + + + @@ -96,16 +97,22 @@ + + + + + + - - - - - - + + + + + + - + diff --git a/SwiftMessages/Resources/CenteredView.xib b/SwiftMessages/Resources/CenteredView.xib index c040724d..ef81dac8 100644 --- a/SwiftMessages/Resources/CenteredView.xib +++ b/SwiftMessages/Resources/CenteredView.xib @@ -1,11 +1,11 @@ - + - + @@ -17,13 +17,13 @@ - + - + - + @@ -70,17 +70,18 @@ - + - - - - + + + + + @@ -90,6 +91,12 @@ + + + + + + diff --git a/SwiftMessages/Resources/MessageView.xib b/SwiftMessages/Resources/MessageView.xib index ba373493..85b86049 100644 --- a/SwiftMessages/Resources/MessageView.xib +++ b/SwiftMessages/Resources/MessageView.xib @@ -1,11 +1,11 @@ - + - + @@ -17,10 +17,10 @@ - + - + - + @@ -79,6 +79,12 @@ + + + + + + diff --git a/SwiftMessages/Resources/StatusLine.xib b/SwiftMessages/Resources/StatusLine.xib index d76c6ca7..87f75220 100644 --- a/SwiftMessages/Resources/StatusLine.xib +++ b/SwiftMessages/Resources/StatusLine.xib @@ -1,11 +1,11 @@ - + - + @@ -16,8 +16,8 @@ - + - + + + + + + + diff --git a/SwiftMessages/Resources/TabView.xib b/SwiftMessages/Resources/TabView.xib index 6c32134d..e37824c3 100644 --- a/SwiftMessages/Resources/TabView.xib +++ b/SwiftMessages/Resources/TabView.xib @@ -1,11 +1,11 @@ - + - + @@ -16,14 +16,14 @@ - - + + - + - + - + @@ -69,34 +69,41 @@ - - - + - + + - + + + - + + + + + + + diff --git a/SwiftMessages/SwiftMessages.swift b/SwiftMessages/SwiftMessages.swift index 5a532cc4..cab93a09 100644 --- a/SwiftMessages/SwiftMessages.swift +++ b/SwiftMessages/SwiftMessages.swift @@ -624,7 +624,7 @@ extension SwiftMessages { var view: T? messageQueue.sync { if let queued = queue.first(where: { $0.id == id }) { - view = queued as? T + view = queued.view as? T } } return view diff --git a/SwiftMessages/Theme.swift b/SwiftMessages/Theme.swift index 68613530..f1a959b6 100644 --- a/SwiftMessages/Theme.swift +++ b/SwiftMessages/Theme.swift @@ -19,18 +19,18 @@ public enum Theme { /// The Icon enum provides type-safe access to the included icons. public enum Icon: String { - case Error = "errorIcon" - case Warning = "warningIcon" - case Success = "successIcon" - case Info = "infoIcon" - case ErrorLight = "errorIconLight" - case WarningLight = "warningIconLight" - case SuccessLight = "successIconLight" - case InfoLight = "infoIconLight" - case ErrorSubtle = "errorIconSubtle" - case WarningSubtle = "warningIconSubtle" - case SuccessSubtle = "successIconSubtle" - case InfoSubtle = "infoIconSubtle" + case error = "errorIcon" + case warning = "warningIcon" + case success = "successIcon" + case info = "infoIcon" + case errorLight = "errorIconLight" + case warningLight = "warningIconLight" + case successLight = "successIconLight" + case infoLight = "infoIconLight" + case errorSubtle = "errorIconSubtle" + case warningSubtle = "warningIconSubtle" + case successSubtle = "successIconSubtle" + case infoSubtle = "infoIconSubtle" /// Returns the associated image. public var image: UIImage { @@ -49,18 +49,18 @@ public enum IconStyle { /// Returns the image for the given theme public func image(theme: Theme) -> UIImage? { switch (theme, self) { - case (.info, .default): return Icon.Info.image - case (.info, .light): return Icon.InfoLight.image - case (.info, .subtle): return Icon.InfoSubtle.image - case (.success, .default): return Icon.Success.image - case (.success, .light): return Icon.SuccessLight.image - case (.success, .subtle): return Icon.SuccessSubtle.image - case (.warning, .default): return Icon.Warning.image - case (.warning, .light): return Icon.WarningLight.image - case (.warning, .subtle): return Icon.WarningSubtle.image - case (.error, .default): return Icon.Error.image - case (.error, .light): return Icon.ErrorLight.image - case (.error, .subtle): return Icon.ErrorSubtle.image + case (.info, .default): return Icon.info.image + case (.info, .light): return Icon.infoLight.image + case (.info, .subtle): return Icon.infoSubtle.image + case (.success, .default): return Icon.success.image + case (.success, .light): return Icon.successLight.image + case (.success, .subtle): return Icon.successSubtle.image + case (.warning, .default): return Icon.warning.image + case (.warning, .light): return Icon.warningLight.image + case (.warning, .subtle): return Icon.warningSubtle.image + case (.error, .default): return Icon.error.image + case (.error, .light): return Icon.errorLight.image + case (.error, .subtle): return Icon.errorSubtle.image default: return nil } } diff --git a/SwiftMessages/TopBottomAnimation.swift b/SwiftMessages/TopBottomAnimation.swift index afe5537f..b0773e87 100644 --- a/SwiftMessages/TopBottomAnimation.swift +++ b/SwiftMessages/TopBottomAnimation.swift @@ -67,18 +67,41 @@ public class TopBottomAnimation: NSObject, Animator { } container.addConstraints([leading, trailing, translationConstraint]) if let adjustable = view as? MarginAdjustable { - var top: CGFloat = 0.0 - var bottom: CGFloat = 0.0 + // Important to layout now in order to get the right safe area insets + container.layoutIfNeeded() + var top: CGFloat = 0 + var bottom: CGFloat = 0 switch style { case .top: top += adjustable.bounceAnimationOffset - if context.behindStatusBar { - top += adjustable.statusBarOffset + if !context.safeZoneConflicts.isDisjoint(with: [.sensorNotch, .statusBar]) { + if #available(iOS 11, *), container.safeAreaInsets.top > 0 { + // Linear formula based on: + // iPhone 8 - 20pt top safe area with 0pt adjustment + // iPhone X - 44pt top safe area with -6pt adjustment + top -= 6 * (container.safeAreaInsets.top - 20) / (44 - 20) + top += adjustable.safeAreaTopOffset + } else { + top += adjustable.statusBarOffset + } + } + if #available(iOS 11, *), !context.safeZoneConflicts.isDisjoint(with: .coveredStatusBar) { + top -= view.safeAreaInsets.top } case .bottom: bottom += adjustable.bounceAnimationOffset + if !context.safeZoneConflicts.isDisjoint(with: [.homeIndicator]) { + if #available(iOS 11, *), container.safeAreaInsets.bottom > 0 { + bottom += adjustable.safeAreaBottomOffset + } + } + } + view.preservesSuperviewLayoutMargins = false + if #available(iOS 11, *) { + view.directionalLayoutMargins = NSDirectionalEdgeInsets(top: top, leading: view.directionalLayoutMargins.leading, bottom: bottom, trailing: view.directionalLayoutMargins.trailing) + } else { + view.layoutMargins = UIEdgeInsets(top: top, left: view.layoutMargins.left, bottom: bottom, right: view.layoutMargins.right) } - view.layoutMargins = UIEdgeInsets(top: top, left: 0.0, bottom: bottom, right: 0.0) } let size = view.systemLayoutSizeFitting(UILayoutFittingCompressedSize) translationConstraint.constant -= size.height @@ -94,6 +117,14 @@ public class TopBottomAnimation: NSObject, Animator { } } +// @available(iOS 11, *) +// private func adjustForCoveredStatusBarSafeArea(view: UIView) { +// var margins = view.directionalLayoutMargins +// margins.top -= 2 * view.safeAreaInsets.top +// view.directionalLayoutMargins = margins +// view.subviews.forEach { self.adjustForCoveredStatusBarSafeArea(view: $0) } +// } + func showAnimation(completion: @escaping AnimationCompletion) { guard let container = containerView else { completion(false) From 59bd33c1100ae309cc0701b5827fb295b4552aa4 Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Wed, 20 Sep 2017 18:53:31 -0500 Subject: [PATCH 039/227] Fix changelog formatting --- CHANGELOG.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b28d9ddf..8db66102 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,14 +10,14 @@ All notable changes to this project will be documented in this file. SwiftMessages 4 supports iOS 11 out-of-the-box with built-in support for safe areas. To ensur that message view layouts look just right when overlapping safe areas, views that adopt the `MarginAdjustable` protocol (like `MessageView`) will have their layout margins automatically adjusted by SwiftMessages. However, there is no one-size-fits-all adjustment, so the following properties were added to `MarginAdjustable` to allow for additional adjustments to be made to the layout margins: ````swift -public protocol MarginAdjustable { - ... - /// Safe area top adjustment in iOS 11+ - var safeAreaTopOffset: CGFloat { get set } - /// Safe area bottom adjustment in iOS 11+ - var safeAreaBottomOffset: CGFloat { get set } -} -```` + public protocol MarginAdjustable { + ... + /// Safe area top adjustment in iOS 11+ + var safeAreaTopOffset: CGFloat { get set } + /// Safe area bottom adjustment in iOS 11+ + var safeAreaBottomOffset: CGFloat { get set } + } + ```` If you're using using custom nib files or view classes and your layouts don't look quite right, try adjusting the values of these properties. `BaseView` (the super class of `MessageView`) declares these properties to be `@IBDesignable` and you can find sample values in the nib files included with SwiftMessages. From 0d344e7ccc89f8232817e9a26e1b27e049bc4568 Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Wed, 20 Sep 2017 19:00:11 -0500 Subject: [PATCH 040/227] Fix pod spec validation error --- SwiftMessages/MessageView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SwiftMessages/MessageView.swift b/SwiftMessages/MessageView.swift index 6c4e4324..ca158f65 100644 --- a/SwiftMessages/MessageView.swift +++ b/SwiftMessages/MessageView.swift @@ -227,7 +227,7 @@ extension MessageView { views.forEach { let constraints = [$0.heightAnchor.constraint(equalToConstant: size.height), $0.widthAnchor.constraint(equalToConstant: size.width)] - constraints.forEach { $0.priority = UILayoutPriority(rawValue: 999) } + constraints.forEach { $0.priority = UILayoutPriority(999.0) } $0.addConstraints(constraints) if let contentMode = contentMode { $0.contentMode = contentMode From 61a673553c8d9467c5d79295e329094013215413 Mon Sep 17 00:00:00 2001 From: mbesnili Date: Thu, 28 Sep 2017 18:59:13 +0300 Subject: [PATCH 041/227] Made close percent and close speed parameterizable to enhance closing action. --- SwiftMessages/TopBottomAnimation.swift | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/SwiftMessages/TopBottomAnimation.swift b/SwiftMessages/TopBottomAnimation.swift index b0773e87..a0bbea33 100644 --- a/SwiftMessages/TopBottomAnimation.swift +++ b/SwiftMessages/TopBottomAnimation.swift @@ -10,13 +10,25 @@ import UIKit public class TopBottomAnimation: NSObject, Animator { - enum Style { + public enum Style { case top case bottom } + + public struct Config { + let closeSpeedThreshold: CGFloat + let closePercentThreshold: CGFloat + + static var `default` = Config(closeSpeedThreshold: 750.0, closePercentThreshold: 33.0) + + public init(closeSpeedThreshold: CGFloat, closePercentThreshold: CGFloat) { + self.closePercentThreshold = closePercentThreshold + self.closeSpeedThreshold = closeSpeedThreshold + } + } public weak var delegate: AnimationDelegate? - + let config: Config var style: Style var translationConstraint: NSLayoutConstraint! = nil @@ -25,7 +37,8 @@ public class TopBottomAnimation: NSObject, Animator { weak var containerView: UIView? - init(style: Style, delegate: AnimationDelegate) { + init(style: Style, delegate: AnimationDelegate, config: Config = Config.default) { + self.config = config self.style = style self.delegate = delegate } @@ -180,7 +193,7 @@ public class TopBottomAnimation: NSObject, Animator { closePercent = translation.y / height panTranslationY = translation.y case .ended, .cancelled: - if closeSpeed > 750.0 || closePercent > 0.33 { + if closeSpeed > config.closeSpeedThreshold || closePercent > config.closePercentThreshold { delegate?.hide(animator: self) } else { closing = false From 7f8e5fc7d8682cc25ff2e4569017dc799f1b465b Mon Sep 17 00:00:00 2001 From: mbesnili Date: Fri, 29 Sep 2017 10:48:24 +0300 Subject: [PATCH 042/227] Made TopBottomAnimation init method public. --- SwiftMessages/TopBottomAnimation.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SwiftMessages/TopBottomAnimation.swift b/SwiftMessages/TopBottomAnimation.swift index a0bbea33..36af95d7 100644 --- a/SwiftMessages/TopBottomAnimation.swift +++ b/SwiftMessages/TopBottomAnimation.swift @@ -19,7 +19,7 @@ public class TopBottomAnimation: NSObject, Animator { let closeSpeedThreshold: CGFloat let closePercentThreshold: CGFloat - static var `default` = Config(closeSpeedThreshold: 750.0, closePercentThreshold: 33.0) + public static var `default` = Config(closeSpeedThreshold: 750.0, closePercentThreshold: 33.0) public init(closeSpeedThreshold: CGFloat, closePercentThreshold: CGFloat) { self.closePercentThreshold = closePercentThreshold @@ -37,7 +37,7 @@ public class TopBottomAnimation: NSObject, Animator { weak var containerView: UIView? - init(style: Style, delegate: AnimationDelegate, config: Config = Config.default) { + public init(style: Style, delegate: AnimationDelegate, config: Config = Config.default) { self.config = config self.style = style self.delegate = delegate From d8c8ec631f70e86c29339a982c6a85dffe447aa6 Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Fri, 29 Sep 2017 17:05:01 -0500 Subject: [PATCH 043/227] Minor refactoring --- SwiftMessages/TopBottomAnimation.swift | 29 +++++++++++--------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/SwiftMessages/TopBottomAnimation.swift b/SwiftMessages/TopBottomAnimation.swift index 36af95d7..38fb91ab 100644 --- a/SwiftMessages/TopBottomAnimation.swift +++ b/SwiftMessages/TopBottomAnimation.swift @@ -14,22 +14,14 @@ public class TopBottomAnimation: NSObject, Animator { case top case bottom } - - public struct Config { - let closeSpeedThreshold: CGFloat - let closePercentThreshold: CGFloat - - public static var `default` = Config(closeSpeedThreshold: 750.0, closePercentThreshold: 33.0) - - public init(closeSpeedThreshold: CGFloat, closePercentThreshold: CGFloat) { - self.closePercentThreshold = closePercentThreshold - self.closeSpeedThreshold = closeSpeedThreshold - } - } public weak var delegate: AnimationDelegate? - let config: Config - var style: Style + + open let style: Style + + open var closeSpeedThreshold: CGFloat = 750.0; + + open var closePercentThreshold: CGFloat = 33.0; var translationConstraint: NSLayoutConstraint! = nil @@ -37,8 +29,11 @@ public class TopBottomAnimation: NSObject, Animator { weak var containerView: UIView? - public init(style: Style, delegate: AnimationDelegate, config: Config = Config.default) { - self.config = config + public init(style: Style) { + self.style = style + } + + init(style: Style, delegate: AnimationDelegate) { self.style = style self.delegate = delegate } @@ -193,7 +188,7 @@ public class TopBottomAnimation: NSObject, Animator { closePercent = translation.y / height panTranslationY = translation.y case .ended, .cancelled: - if closeSpeed > config.closeSpeedThreshold || closePercent > config.closePercentThreshold { + if closeSpeed > closeSpeedThreshold || closePercent > closePercentThreshold { delegate?.hide(animator: self) } else { closing = false From a913f6ed0191a3e5b9dea59f6b338190c1e05393 Mon Sep 17 00:00:00 2001 From: Kizito Nwose Date: Wed, 11 Oct 2017 09:02:51 +0100 Subject: [PATCH 044/227] Fix broken markdown in README GitHub changed the way they parse sub-lists in markdown. I've adjusted the indentation for sub-list items. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 040e05ba..0249b1e8 100644 --- a/README.md +++ b/README.md @@ -73,8 +73,8 @@ github "SwiftKickMobile/SwiftMessages" 1. Put SwiftMessages repo somewhere in your project directory. 1. In Xcode, add `SwiftMessages.xcodeproj` to your project. 1. On your app's target, add the SwiftMessages framework: - 1. as an embedded binary on the General tab. - 1. as a target dependency on the Build Phases tab. + 1. as an embedded binary on the General tab. + 1. as a target dependency on the Build Phases tab. ## Usage From 7c20e60834aa5a43465a7b0bde456075c840d0a8 Mon Sep 17 00:00:00 2001 From: Mathieu Allaire Date: Fri, 3 Nov 2017 13:03:45 -0400 Subject: [PATCH 045/227] Clarify how to use multiple instances of SwiftMessages --- README.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 040e05ba..f0ed9537 100644 --- a/README.md +++ b/README.md @@ -202,12 +202,18 @@ SwiftMessages.hide(id: someId) SwiftMessages.hideCounted(id: someId) ```` -Multiple instances of `SwiftMessages` can be used to show more than one message at a time. Note that the static `SwiftMessages.show()` and other static APIs on `SwiftMessage` are just convenience wrappers around the shared instance `SwiftMessages.sharedInstance`): +Multiple instances of `SwiftMessages` can be used to show more than one message at a time. Note that the static `SwiftMessages.show()` and other static APIs on `SwiftMessage` are just convenience wrappers around the shared instance `SwiftMessages.sharedInstance`). Instances must be retained, thus it should be a property of something (e.g. your view controller): ````swift -let otherMessages = SwiftMessages() -SwiftMessages.show(...) -otherMessages.show(...) +class SomeViewController: UIViewController { + static var otherMessages = SwiftMessages() + + + func someMethod() { + SwiftMessages.show(...) + otherMessages.show(...) + } +} ```` ### Retrieving Messages From 65bb7646c8d437e47329c9c3e465b135b6ea4f53 Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Fri, 3 Nov 2017 12:17:01 -0500 Subject: [PATCH 046/227] Remove extra newline --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index f0ed9537..55865487 100644 --- a/README.md +++ b/README.md @@ -206,8 +206,7 @@ Multiple instances of `SwiftMessages` can be used to show more than one message ````swift class SomeViewController: UIViewController { - static var otherMessages = SwiftMessages() - + static var otherMessages = SwiftMessages() func someMethod() { SwiftMessages.show(...) From bf053bd511e3211ba4a49848618854ba1066d7d7 Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Fri, 3 Nov 2017 12:18:31 -0500 Subject: [PATCH 047/227] Update README.md Update `otherMessages` to immutable --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 55865487..1a4c61cf 100644 --- a/README.md +++ b/README.md @@ -206,7 +206,7 @@ Multiple instances of `SwiftMessages` can be used to show more than one message ````swift class SomeViewController: UIViewController { - static var otherMessages = SwiftMessages() + static let otherMessages = SwiftMessages() func someMethod() { SwiftMessages.show(...) From 57b3530d63ef2a1d5782a10adceab93c068147e4 Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Fri, 3 Nov 2017 12:20:15 -0500 Subject: [PATCH 048/227] Update README.md Make `otherMessages` an instance variable. --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1a4c61cf..0db53968 100644 --- a/README.md +++ b/README.md @@ -206,12 +206,12 @@ Multiple instances of `SwiftMessages` can be used to show more than one message ````swift class SomeViewController: UIViewController { - static let otherMessages = SwiftMessages() + let otherMessages = SwiftMessages() - func someMethod() { - SwiftMessages.show(...) - otherMessages.show(...) - } + func someMethod() { + SwiftMessages.show(...) + otherMessages.show(...) + } } ```` From 089c0f4a87e58af7d98e24423ee4b0d101b1988f Mon Sep 17 00:00:00 2001 From: Timothy Moose Date: Sun, 5 Nov 2017 10:48:58 -0600 Subject: [PATCH 049/227] Move icons out of asset catalog to prevent mysterious crash --- CHANGELOG.md | 7 + Demo/Pods/Pods.xcodeproj/project.pbxproj | 408 ++++++++++++------ Design/SwiftMessagesDesign.sketch | Bin 1471873 -> 1108689 bytes SwiftMessages.podspec | 4 +- SwiftMessages.xcodeproj/project.pbxproj | 148 ++++++- .../Resources/Images.xcassets/Contents.json | 6 - .../errorIcon.imageset/Contents.json | 15 - .../errorIcon.imageset/errorIcon.pdf | Bin 4058 -> 0 bytes .../errorIconLight.imageset/Contents.json | 15 - .../errorIconLight.pdf | Bin 4127 -> 0 bytes .../errorIconSubtle.imageset/Contents.json | 15 - .../errorIconSubtle.pdf | Bin 3948 -> 0 bytes .../infoIcon.imageset/Contents.json | 15 - .../infoIcon.imageset/infoIcon.pdf | Bin 3922 -> 0 bytes .../infoIconLight.imageset/Contents.json | 15 - .../infoIconLight.imageset/infoIconLight.pdf | Bin 4014 -> 0 bytes .../infoIconSubtle.imageset/Contents.json | 15 - .../infoIconSubtle.pdf | Bin 3893 -> 0 bytes .../successIcon.imageset/Contents.json | 15 - .../successIcon.imageset/successIcon.pdf | Bin 4041 -> 0 bytes .../successIconLight.imageset/Contents.json | 15 - .../successIconLight.pdf | Bin 4131 -> 0 bytes .../successIconSubtle.imageset/Contents.json | 15 - .../successIconSubtle.pdf | Bin 3941 -> 0 bytes .../warningIcon.imageset/Contents.json | 15 - .../warningIcon.imageset/warningIcon.pdf | Bin 3929 -> 0 bytes .../warningIconLight.imageset/Contents.json | 15 - .../warningIconLight.pdf | Bin 4014 -> 0 bytes .../warningIconSubtle.imageset/Contents.json | 15 - .../warningIconSubtle.pdf | Bin 3892 -> 0 bytes SwiftMessages/Resources/errorIcon.png | Bin 0 -> 698 bytes SwiftMessages/Resources/errorIcon@2x.png | Bin 0 -> 1338 bytes SwiftMessages/Resources/errorIcon@3x.png | Bin 0 -> 2074 bytes SwiftMessages/Resources/errorIconLight.png | Bin 0 -> 879 bytes SwiftMessages/Resources/errorIconLight@2x.png | Bin 0 -> 1911 bytes SwiftMessages/Resources/errorIconLight@3x.png | Bin 0 -> 2900 bytes SwiftMessages/Resources/errorIconSubtle.png | Bin 0 -> 225 bytes .../Resources/errorIconSubtle@2x.png | Bin 0 -> 402 bytes .../Resources/errorIconSubtle@3x.png | Bin 0 -> 543 bytes SwiftMessages/Resources/infoIcon.png | Bin 0 -> 495 bytes SwiftMessages/Resources/infoIcon@2x.png | Bin 0 -> 913 bytes SwiftMessages/Resources/infoIcon@3x.png | Bin 0 -> 1553 bytes SwiftMessages/Resources/infoIconLight.png | Bin 0 -> 640 bytes SwiftMessages/Resources/infoIconLight@2x.png | Bin 0 -> 1391 bytes SwiftMessages/Resources/infoIconLight@3x.png | Bin 0 -> 2441 bytes SwiftMessages/Resources/infoIconSubtle.png | Bin 0 -> 139 bytes SwiftMessages/Resources/infoIconSubtle@2x.png | Bin 0 -> 188 bytes SwiftMessages/Resources/infoIconSubtle@3x.png | Bin 0 -> 263 bytes SwiftMessages/Resources/successIcon.png | Bin 0 -> 639 bytes SwiftMessages/Resources/successIcon@2x.png | Bin 0 -> 1214 bytes SwiftMessages/Resources/successIcon@3x.png | Bin 0 -> 1930 bytes SwiftMessages/Resources/successIconLight.png | Bin 0 -> 808 bytes .../Resources/successIconLight@2x.png | Bin 0 -> 1809 bytes .../Resources/successIconLight@3x.png | Bin 0 -> 2743 bytes SwiftMessages/Resources/successIconSubtle.png | Bin 0 -> 235 bytes .../Resources/successIconSubtle@2x.png | Bin 0 -> 323 bytes .../Resources/successIconSubtle@3x.png | Bin 0 -> 418 bytes SwiftMessages/Resources/warningIcon.png | Bin 0 -> 493 bytes SwiftMessages/Resources/warningIcon@2x.png | Bin 0 -> 916 bytes SwiftMessages/Resources/warningIcon@3x.png | Bin 0 -> 1577 bytes SwiftMessages/Resources/warningIconLight.png | Bin 0 -> 660 bytes .../Resources/warningIconLight@2x.png | Bin 0 -> 1404 bytes .../Resources/warningIconLight@3x.png | Bin 0 -> 2479 bytes SwiftMessages/Resources/warningIconSubtle.png | Bin 0 -> 131 bytes .../Resources/warningIconSubtle@2x.png | Bin 0 -> 178 bytes .../Resources/warningIconSubtle@3x.png | Bin 0 -> 259 bytes SwiftMessages/Theme.swift | 4 +- 67 files changed, 429 insertions(+), 328 deletions(-) delete mode 100644 SwiftMessages/Resources/Images.xcassets/Contents.json delete mode 100644 SwiftMessages/Resources/Images.xcassets/errorIcon.imageset/Contents.json delete mode 100644 SwiftMessages/Resources/Images.xcassets/errorIcon.imageset/errorIcon.pdf delete mode 100644 SwiftMessages/Resources/Images.xcassets/errorIconLight.imageset/Contents.json delete mode 100644 SwiftMessages/Resources/Images.xcassets/errorIconLight.imageset/errorIconLight.pdf delete mode 100644 SwiftMessages/Resources/Images.xcassets/errorIconSubtle.imageset/Contents.json delete mode 100644 SwiftMessages/Resources/Images.xcassets/errorIconSubtle.imageset/errorIconSubtle.pdf delete mode 100644 SwiftMessages/Resources/Images.xcassets/infoIcon.imageset/Contents.json delete mode 100644 SwiftMessages/Resources/Images.xcassets/infoIcon.imageset/infoIcon.pdf delete mode 100644 SwiftMessages/Resources/Images.xcassets/infoIconLight.imageset/Contents.json delete mode 100644 SwiftMessages/Resources/Images.xcassets/infoIconLight.imageset/infoIconLight.pdf delete mode 100644 SwiftMessages/Resources/Images.xcassets/infoIconSubtle.imageset/Contents.json delete mode 100644 SwiftMessages/Resources/Images.xcassets/infoIconSubtle.imageset/infoIconSubtle.pdf delete mode 100644 SwiftMessages/Resources/Images.xcassets/successIcon.imageset/Contents.json delete mode 100644 SwiftMessages/Resources/Images.xcassets/successIcon.imageset/successIcon.pdf delete mode 100644 SwiftMessages/Resources/Images.xcassets/successIconLight.imageset/Contents.json delete mode 100644 SwiftMessages/Resources/Images.xcassets/successIconLight.imageset/successIconLight.pdf delete mode 100644 SwiftMessages/Resources/Images.xcassets/successIconSubtle.imageset/Contents.json delete mode 100644 SwiftMessages/Resources/Images.xcassets/successIconSubtle.imageset/successIconSubtle.pdf delete mode 100644 SwiftMessages/Resources/Images.xcassets/warningIcon.imageset/Contents.json delete mode 100644 SwiftMessages/Resources/Images.xcassets/warningIcon.imageset/warningIcon.pdf delete mode 100644 SwiftMessages/Resources/Images.xcassets/warningIconLight.imageset/Contents.json delete mode 100644 SwiftMessages/Resources/Images.xcassets/warningIconLight.imageset/warningIconLight.pdf delete mode 100644 SwiftMessages/Resources/Images.xcassets/warningIconSubtle.imageset/Contents.json delete mode 100644 SwiftMessages/Resources/Images.xcassets/warningIconSubtle.imageset/warningIconSubtle.pdf create mode 100644 SwiftMessages/Resources/errorIcon.png create mode 100644 SwiftMessages/Resources/errorIcon@2x.png create mode 100644 SwiftMessages/Resources/errorIcon@3x.png create mode 100644 SwiftMessages/Resources/errorIconLight.png create mode 100644 SwiftMessages/Resources/errorIconLight@2x.png create mode 100644 SwiftMessages/Resources/errorIconLight@3x.png create mode 100644 SwiftMessages/Resources/errorIconSubtle.png create mode 100644 SwiftMessages/Resources/errorIconSubtle@2x.png create mode 100644 SwiftMessages/Resources/errorIconSubtle@3x.png create mode 100644 SwiftMessages/Resources/infoIcon.png create mode 100644 SwiftMessages/Resources/infoIcon@2x.png create mode 100644 SwiftMessages/Resources/infoIcon@3x.png create mode 100644 SwiftMessages/Resources/infoIconLight.png create mode 100644 SwiftMessages/Resources/infoIconLight@2x.png create mode 100644 SwiftMessages/Resources/infoIconLight@3x.png create mode 100644 SwiftMessages/Resources/infoIconSubtle.png create mode 100644 SwiftMessages/Resources/infoIconSubtle@2x.png create mode 100644 SwiftMessages/Resources/infoIconSubtle@3x.png create mode 100644 SwiftMessages/Resources/successIcon.png create mode 100644 SwiftMessages/Resources/successIcon@2x.png create mode 100644 SwiftMessages/Resources/successIcon@3x.png create mode 100644 SwiftMessages/Resources/successIconLight.png create mode 100644 SwiftMessages/Resources/successIconLight@2x.png create mode 100644 SwiftMessages/Resources/successIconLight@3x.png create mode 100644 SwiftMessages/Resources/successIconSubtle.png create mode 100644 SwiftMessages/Resources/successIconSubtle@2x.png create mode 100644 SwiftMessages/Resources/successIconSubtle@3x.png create mode 100644 SwiftMessages/Resources/warningIcon.png create mode 100644 SwiftMessages/Resources/warningIcon@2x.png create mode 100644 SwiftMessages/Resources/warningIcon@3x.png create mode 100644 SwiftMessages/Resources/warningIconLight.png create mode 100644 SwiftMessages/Resources/warningIconLight@2x.png create mode 100644 SwiftMessages/Resources/warningIconLight@3x.png create mode 100644 SwiftMessages/Resources/warningIconSubtle.png create mode 100644 SwiftMessages/Resources/warningIconSubtle@2x.png create mode 100644 SwiftMessages/Resources/warningIconSubtle@3x.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 8db66102..30acb843 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log All notable changes to this project will be documented in this file. +## 4.0.1 + +### Fixes + +* Fix #128 move icons out of asset catalog to prevent mysterious crash +* + ## 4.0.0 ### Features diff --git a/Demo/Pods/Pods.xcodeproj/project.pbxproj b/Demo/Pods/Pods.xcodeproj/project.pbxproj index a28c9f1c..2b7f0d6a 100644 --- a/Demo/Pods/Pods.xcodeproj/project.pbxproj +++ b/Demo/Pods/Pods.xcodeproj/project.pbxproj @@ -7,43 +7,78 @@ objects = { /* Begin PBXBuildFile section */ - 02794C8B4373B07096E10E2C76A798F2 /* AccessibleMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9C1EECDE513D02A97FE3145E34C748B /* AccessibleMessage.swift */; }; - 03BB56DA46C312D015A70460E72D052C /* BaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93F9CA1F604355146DA49D4DFC84D9DF /* BaseView.swift */; }; + 0028E6BBC336B107CF9EF0528B5EE43A /* errorIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9ACFD5309E99F8F47EF6ECBBDCC84F48 /* errorIcon@2x.png */; }; + 00A3BE42119648E09F4481207AA1B305 /* successIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 356BEF0CD1D48ACEB259708875B6F45B /* successIcon@2x.png */; }; + 02794C8B4373B07096E10E2C76A798F2 /* AccessibleMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 639F46247D2853502E85538D44A55369 /* AccessibleMessage.swift */; }; + 03BB56DA46C312D015A70460E72D052C /* BaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AEBB9569BC83DBD2EE2C38E27BE6BFC /* BaseView.swift */; }; + 0A479206575AA251A0AAA308EB99009F /* successIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = 68F421E50804DE31408EA50F32EB3FB5 /* successIcon.png */; }; 13B45A8C97351353898FFFA04BB3311E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D88AAE1F92055A60CC2FC970D7D34634 /* Foundation.framework */; }; - 162BAE771E705217925C031A5796DAB8 /* UIViewController+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F963F98E30609D720E506187E5A7031 /* UIViewController+Utils.swift */; }; - 2133C50E9F077E94A7BEC1F87BCDA612 /* Weak.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2DC962503B293E07CAAE638D8DB2658 /* Weak.swift */; }; - 264E10EDC0BEA939B73BE9451D037E86 /* Animator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFBD0CC7265564725FC404904AC95D8F /* Animator.swift */; }; - 340332C1EF8489FE2F0BEEBD289EF3C1 /* CenteredView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1AA081944189D64EF7DC74A9D9E0B105 /* CenteredView.xib */; }; - 346CDFB7D2376B2445984A775A4121A7 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E458408B29C97A95A09C97699717187 /* Error.swift */; }; - 362E7D68DD559582C73A13E61EE2FC37 /* MaskingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEC4A492D703E0AE5C9A7483B71DC453 /* MaskingView.swift */; }; - 3A759DB4294C8F8C8828BC02D7B87782 /* SwiftMessages.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFE17362477F7C3332D1D746C87DDBBE /* SwiftMessages.swift */; }; - 404EC55260ADF93EE4524E361FB41E2E /* Identifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 815C2CECB66685FE16CEC9749C8C1EB2 /* Identifiable.swift */; }; - 4A260B03A32F1C019FEEE0D82B79C991 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 219461964B980BFA09BC31E63FD2A006 /* Theme.swift */; }; - 4E364992EED691DC0458E39AFAC99F4B /* SwiftMessages-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 83B3725B836FAFD60A1F04779F5D68FA /* SwiftMessages-dummy.m */; }; - 609DECCC3E47D6BAED5BF42D05FA1E82 /* PhysicsPanHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDF256256D805C850726206BC55D7B13 /* PhysicsPanHandler.swift */; }; - 65E8CA0D1FCC09C09F7143ECE9E7A131 /* TabView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 072B9A20FAB93ECDC5C4558B17344FCB /* TabView.xib */; }; - 6691C8C6B4D27015701FE961E040D157 /* PassthroughView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCFA729E463A0A1D6BA38B0EA40E2285 /* PassthroughView.swift */; }; - 7272D6441E55F668BF0191449176756F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E291F4BC584442AEB8D93B1DC5A3F3B5 /* Images.xcassets */; }; + 142F06B5618B79D5764391E6BFA51BD8 /* infoIconSubtle@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = BC768E58995BEE1752FF37E204D3B741 /* infoIconSubtle@3x.png */; }; + 162BAE771E705217925C031A5796DAB8 /* UIViewController+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6602B72571766EB10E664C9007999F20 /* UIViewController+Utils.swift */; }; + 170BAF58A90972BF0A6FA5609E625F7A /* errorIconLight@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7FF4F840A060487F0CF72B0A9143BFF7 /* errorIconLight@3x.png */; }; + 1A1084830C5F231B0428308DB11A5240 /* errorIconLight.png in Resources */ = {isa = PBXBuildFile; fileRef = 3F76B77F23524013D7DFBFB2DE8ECE0B /* errorIconLight.png */; }; + 2133C50E9F077E94A7BEC1F87BCDA612 /* Weak.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF31AA6050883852CFA30D6E1CCC483A /* Weak.swift */; }; + 23D88FAB1966383C09D215502E790BD1 /* successIconLight@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4A1D24A70ED9BA222C2873D799659DA0 /* successIconLight@2x.png */; }; + 264E10EDC0BEA939B73BE9451D037E86 /* Animator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96715550AC8AF9FE1A039D711B911911 /* Animator.swift */; }; + 2A2F604FE6113C6A85F128ED4D12DD87 /* infoIconLight.png in Resources */ = {isa = PBXBuildFile; fileRef = 4D98A634A2F1E915954835684E7A8D1B /* infoIconLight.png */; }; + 32642169BD476A2F909DDF18C1077154 /* warningIconSubtle.png in Resources */ = {isa = PBXBuildFile; fileRef = 181A29B0159C6F7DE70346FA70FA5FFC /* warningIconSubtle.png */; }; + 33C6333BE8A551858E68DAF5AF905596 /* CenteredView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32A099E194C7E794D67EA5ED5CB317A4 /* CenteredView.xib */; }; + 346CDFB7D2376B2445984A775A4121A7 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB5240B8697E947A06F8CC23ED7C33B /* Error.swift */; }; + 362E7D68DD559582C73A13E61EE2FC37 /* MaskingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1204D55AF556C999DC38027DF5890B28 /* MaskingView.swift */; }; + 36A7F3FA50D96416A55BA790C4097E78 /* infoIconSubtle@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8200E7E98EC0B8B4C12E5FC14642439A /* infoIconSubtle@2x.png */; }; + 3A759DB4294C8F8C8828BC02D7B87782 /* SwiftMessages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E81162128B5BD796919A2132D254B66 /* SwiftMessages.swift */; }; + 404EC55260ADF93EE4524E361FB41E2E /* Identifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35AD6C0CF4846B0CB08666B320471528 /* Identifiable.swift */; }; + 465A49B0B6350BE37433D665E1E1FEA3 /* errorIconSubtle.png in Resources */ = {isa = PBXBuildFile; fileRef = F4ADE1A948CAACA0952DA85DFE93EDC6 /* errorIconSubtle.png */; }; + 4A260B03A32F1C019FEEE0D82B79C991 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6BB71453B273789C63FBC534601E6ED /* Theme.swift */; }; + 4E364992EED691DC0458E39AFAC99F4B /* SwiftMessages-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 328CFFAA6D37707EC9D0BC86A19F5152 /* SwiftMessages-dummy.m */; }; + 5778E9746050B1A3A1DAF371CAD8BFF4 /* infoIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = C879038BE7020010FE957BCD44067FF5 /* infoIcon.png */; }; + 59AC62DE1D07102AC9405C78F2FD3263 /* warningIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 30DB15067A730C6A2BC7F05396887C75 /* warningIcon@2x.png */; }; + 5A94363433C34AAA9CE44B13CACB5111 /* warningIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = A26E6447C47D4797EBA12C51DF1FA4CC /* warningIcon.png */; }; + 609DECCC3E47D6BAED5BF42D05FA1E82 /* PhysicsPanHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF3A9CB840536B3BADF6BE7DCAAACEEA /* PhysicsPanHandler.swift */; }; + 6691C8C6B4D27015701FE961E040D157 /* PassthroughView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1441A4FFE2B7F778BEB3B5DBA62661 /* PassthroughView.swift */; }; 7AAB19F2F518FAFEFCC099693B8B8BA9 /* Pods-Demo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C5BC86D40B890A7B0844F888209CA06F /* Pods-Demo-dummy.m */; }; - 7EB804602F033B85C3DFF6A68D435408 /* Array+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A62156538C70FE8DFF7054F7A77552 /* Array+Utils.swift */; }; - 81DD02C7573B584C3853D8CF611A5A40 /* BackgroundViewable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9617E8050E64749DBA263DBE31A626F /* BackgroundViewable.swift */; }; - 89260C6C79CC3F72265591A7EF097605 /* NSBundle+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ABDAE2F220044E536027A7180117F84 /* NSBundle+Utils.swift */; }; - 91D85F7BB2DC3C6517F1526A49672975 /* TopBottomAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65E17A5A366E08E3E20DFE6B3CE09B35 /* TopBottomAnimation.swift */; }; - 96BAB81A1F1AEFFAC341F6E313EBA661 /* MarginAdjustable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 024A0D8BA639E996F69D5758209521C4 /* MarginAdjustable.swift */; }; - 99C9C752D747BED0D2D5C4C32D2D9EF4 /* PassthroughWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B3162C34528ABE7E5780BE1852AD013 /* PassthroughWindow.swift */; }; + 7EB804602F033B85C3DFF6A68D435408 /* Array+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C81F05F5F00DFF8FF634AF354A70632 /* Array+Utils.swift */; }; + 7F5B8756755F727E220FE7E3228D0A04 /* successIconSubtle@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E086DFA5ED7D77314F2C0EDFDACBD456 /* successIconSubtle@2x.png */; }; + 81CD353FE0CAE522A248792202CE7ECD /* infoIcon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = D14558C79F02E838042204033837A92B /* infoIcon@3x.png */; }; + 81DD02C7573B584C3853D8CF611A5A40 /* BackgroundViewable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5E81D2B21F048699D41BDEFCB01602F /* BackgroundViewable.swift */; }; + 85B1E60D86531952B984DCF12179B460 /* errorIconSubtle@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 65A6CD233FD29C05E00B0169D19C61FE /* errorIconSubtle@2x.png */; }; + 89260C6C79CC3F72265591A7EF097605 /* NSBundle+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8373717C1BB6ADDBD984D9FDA77C3545 /* NSBundle+Utils.swift */; }; + 8B92312643E68138C3515DA2D9AD5B85 /* warningIconLight@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 2DD0B43155EC2BA9B26BAA0A2CECF688 /* warningIconLight@3x.png */; }; + 91D85F7BB2DC3C6517F1526A49672975 /* TopBottomAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81A6BF5E78D1639242188052850104FF /* TopBottomAnimation.swift */; }; + 96BAB81A1F1AEFFAC341F6E313EBA661 /* MarginAdjustable.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE30A2E3C7B478B14B3318BD6B15A3E0 /* MarginAdjustable.swift */; }; + 979F2EF8EA034DBF9A718446D789FDEC /* errorIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = CF6BD7B87B4458C33C40DCD348714FA4 /* errorIcon.png */; }; + 99C9C752D747BED0D2D5C4C32D2D9EF4 /* PassthroughWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B704BB1358D1D80549D0C41265533BED /* PassthroughWindow.swift */; }; + 9CA74EA125ED23780EC0754309A40975 /* warningIconLight.png in Resources */ = {isa = PBXBuildFile; fileRef = 4857ED94E6E55284EDD161E7FE045A1F /* warningIconLight.png */; }; 9D19AFE650DB5BC03BF075993C34AF91 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B63C6A64CF66340668996F78DA6BB482 /* UIKit.framework */; }; + 9D8C6E9DC33A198A15C606FFA3759B20 /* successIconLight.png in Resources */ = {isa = PBXBuildFile; fileRef = 97EADE94C5D04CC66387DB68AE47FD15 /* successIconLight.png */; }; A0DA50804F4D0578FA0F9ADB8E127D55 /* SwiftMessages.bundle in Resources */ = {isa = PBXBuildFile; fileRef = EDA8A9CFB00CA35B42F93F216EB7DA9B /* SwiftMessages.bundle */; }; + A1E97D2B454032D3883DE3BFFE705300 /* warningIconSubtle@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = B4AC34DCB364CB4647739D69B339BA0E /* warningIconSubtle@3x.png */; }; ADABE508FBF83EB6D66E7C9D3FC376AD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D88AAE1F92055A60CC2FC970D7D34634 /* Foundation.framework */; }; - AE6E8D5E60D42429EFC488BBACB5B22E /* CardView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7E5EDA5081F4BFCF6D515BFB9E6A46CD /* CardView.xib */; }; - B6C02449EB4B8386B573B34D778407C7 /* MessageViewIOS8.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8F7DEEAA47DF230A64A8A4A5C83B5042 /* MessageViewIOS8.xib */; }; - B95990682EEDE805DF3D65F3D9F18933 /* CenterAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DD60CD83E69B14B2BF628B8AEFEEA4F /* CenterAnimation.swift */; }; - BC2BA13F0070A8D9152D40C9546366F7 /* SwiftMessages-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F80FA0EA95624BFC02B47AEBB8FEF8 /* SwiftMessages-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C6831BC308DC879EDCC48E0F9C68D24B /* Presenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E151F72287666C273EE9F13AE4A6FD8E /* Presenter.swift */; }; - C909E2C8F96396AE8F738650771D19AD /* MessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86BF7466A20EA158235AF3560DC587A1 /* MessageView.swift */; }; - D2AA927FC4D15F603EC8393A92A338E4 /* StatusLine.xib in Resources */ = {isa = PBXBuildFile; fileRef = DD63799D7F07CC21FB7DFACE7AFAFE7D /* StatusLine.xib */; }; - D6DBC84B97E355ADCD61AFBBA6A7A217 /* WindowViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7447A70AD4CFA7C1F2E1DB09FC3E0110 /* WindowViewController.swift */; }; + B182F806EA9E2EDBBA3E7F4D04134BF3 /* warningIconLight@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C262B9DA7B148B035DD8D359BE20A137 /* warningIconLight@2x.png */; }; + B341470AE557F15B0944480B28F2DA0C /* TabView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 579E1FBF4F4C64B13D5F665156C3A4B6 /* TabView.xib */; }; + B6E92C2E1E6D90DC98B3FFDD4646DD37 /* infoIconLight@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7C4AEB15B449176FBB2DBC600874E40D /* infoIconLight@2x.png */; }; + B95990682EEDE805DF3D65F3D9F18933 /* CenterAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 342E3936327A3C9E7ED4AEBF784BD6F9 /* CenterAnimation.swift */; }; + BC03A227950234D64554F5F9D7088078 /* MessageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D7B276C8D6648E04FD4472040B437165 /* MessageView.xib */; }; + BC2BA13F0070A8D9152D40C9546366F7 /* SwiftMessages-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 375CE8F6508E1CAE438C4F0AFE25F11B /* SwiftMessages-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C17880F9EE88CB60BD9AADC9325441E1 /* successIcon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 98DF6503E18A257D9C538978CF3FF269 /* successIcon@3x.png */; }; + C6831BC308DC879EDCC48E0F9C68D24B /* Presenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD27FDD66007991C42B5E87CEA373B3C /* Presenter.swift */; }; + C909E2C8F96396AE8F738650771D19AD /* MessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21A0CE071BF939DBCE73CCD161735F5A /* MessageView.swift */; }; + CB702D2D770EB6EBC1CA7E85FC05B29C /* successIconSubtle@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6012C56F929BD7E6D187DACBAE5AC351 /* successIconSubtle@3x.png */; }; + D0D024AF440DF9CBA8AC9608A606A46E /* warningIconSubtle@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CB372E13B00350FAA5006037EFF32E5C /* warningIconSubtle@2x.png */; }; + D29D943274AEAD9924087D9831F5A977 /* infoIconLight@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 68780855EFD69507270AE7759F574203 /* infoIconLight@3x.png */; }; + D51337D9E7181151CFB485ABE64D8ED4 /* CardView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCE5447B894027A7B3991550C3EB207F /* CardView.xib */; }; + D6DBC84B97E355ADCD61AFBBA6A7A217 /* WindowViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B90540615DCF7328A5F6A991FF2AC83F /* WindowViewController.swift */; }; + D7B293097B25E687AE1DAFC6B892130B /* successIconLight@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = A9748E635DB4E2533D1C0E68DF92B204 /* successIconLight@3x.png */; }; + DAE5B1597EF6F6559D226E746ABEF77D /* infoIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9831B5DB13B7397C2395DD95882167D3 /* infoIcon@2x.png */; }; + DBB41DE004BA395A6E821E79180E9E56 /* successIconSubtle.png in Resources */ = {isa = PBXBuildFile; fileRef = 88E13430E4C415AA42D797FDE90E92F5 /* successIconSubtle.png */; }; + DC114E92AEE9441DDE5C8EA4628AD3E3 /* warningIcon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 338F853182E3B4D02927C1A44E041B65 /* warningIcon@3x.png */; }; + DF73F74353812AA9B649DBECB4C16C17 /* errorIcon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0251D501C80E73E7C001641D22CBE99A /* errorIcon@3x.png */; }; E9F211145EAEC09D0A0A33E46BB2059E /* Pods-Demo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 03EA1E60232BFA05817BC26ACB8E68BA /* Pods-Demo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FF614E4B3177462BC428F55337A84343 /* MessageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = E8FE556582EF331E2394039D69668F3F /* MessageView.xib */; }; + EC5A51E34AE2F5295B758A044B7F1DEB /* StatusLine.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5FBAB332FFA90AAC27BD91388985379A /* StatusLine.xib */; }; + ED6096988EFAF7CD1E7E92AF15E810DA /* errorIconSubtle@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6F9220BCA5415E3FE16D859550E145A5 /* errorIconSubtle@3x.png */; }; + EFA6497F5ECC79A4E4196F08698EDF03 /* infoIconSubtle.png in Resources */ = {isa = PBXBuildFile; fileRef = B229458AF87B201601318D0C55EA5C00 /* infoIconSubtle.png */; }; + F5D8207FCCD4BF9668D2912174341EF4 /* MessageViewIOS8.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3713446C0F668B78E107B1CBCAB643A8 /* MessageViewIOS8.xib */; }; + FD74F6961877FDCDB7E7679311D82D1F /* errorIconLight@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5EBBAAA0476612EC9F78FAA9A6CCEDB4 /* errorIconLight@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -64,58 +99,93 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 024A0D8BA639E996F69D5758209521C4 /* MarginAdjustable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MarginAdjustable.swift; path = SwiftMessages/MarginAdjustable.swift; sourceTree = ""; }; + 0251D501C80E73E7C001641D22CBE99A /* errorIcon@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "errorIcon@3x.png"; path = "SwiftMessages/Resources/errorIcon@3x.png"; sourceTree = ""; }; 03EA1E60232BFA05817BC26ACB8E68BA /* Pods-Demo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Demo-umbrella.h"; sourceTree = ""; }; - 0605D96E366DB55ABEAC32B776CA3E5F /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 072B9A20FAB93ECDC5C4558B17344FCB /* TabView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = TabView.xib; path = SwiftMessages/Resources/TabView.xib; sourceTree = ""; }; - 0B3162C34528ABE7E5780BE1852AD013 /* PassthroughWindow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PassthroughWindow.swift; path = SwiftMessages/PassthroughWindow.swift; sourceTree = ""; }; - 1AA081944189D64EF7DC74A9D9E0B105 /* CenteredView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = CenteredView.xib; path = SwiftMessages/Resources/CenteredView.xib; sourceTree = ""; }; - 1E6D8CE225591FD7DC26180B2B4D3AC5 /* ResourceBundle-SwiftMessages-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-SwiftMessages-Info.plist"; sourceTree = ""; }; - 219461964B980BFA09BC31E63FD2A006 /* Theme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Theme.swift; path = SwiftMessages/Theme.swift; sourceTree = ""; }; + 0A3C73D7B53F155955B8BC0134404A38 /* SwiftMessages.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftMessages.xcconfig; sourceTree = ""; }; + 0BF2B5381CD38A267ABD9BE1916699AE /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1204D55AF556C999DC38027DF5890B28 /* MaskingView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MaskingView.swift; path = SwiftMessages/MaskingView.swift; sourceTree = ""; }; + 181A29B0159C6F7DE70346FA70FA5FFC /* warningIconSubtle.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = warningIconSubtle.png; path = SwiftMessages/Resources/warningIconSubtle.png; sourceTree = ""; }; + 1AEBB9569BC83DBD2EE2C38E27BE6BFC /* BaseView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BaseView.swift; path = SwiftMessages/BaseView.swift; sourceTree = ""; }; + 1E81162128B5BD796919A2132D254B66 /* SwiftMessages.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftMessages.swift; path = SwiftMessages/SwiftMessages.swift; sourceTree = ""; }; + 21A0CE071BF939DBCE73CCD161735F5A /* MessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessageView.swift; path = SwiftMessages/MessageView.swift; sourceTree = ""; }; + 2DD0B43155EC2BA9B26BAA0A2CECF688 /* warningIconLight@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "warningIconLight@3x.png"; path = "SwiftMessages/Resources/warningIconLight@3x.png"; sourceTree = ""; }; + 30DB15067A730C6A2BC7F05396887C75 /* warningIcon@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "warningIcon@2x.png"; path = "SwiftMessages/Resources/warningIcon@2x.png"; sourceTree = ""; }; 322419E99883B306EE7EC77959FCC8DF /* Pods-Demo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-Demo.modulemap"; sourceTree = ""; }; + 328CFFAA6D37707EC9D0BC86A19F5152 /* SwiftMessages-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SwiftMessages-dummy.m"; sourceTree = ""; }; + 32A099E194C7E794D67EA5ED5CB317A4 /* CenteredView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = CenteredView.xib; path = SwiftMessages/Resources/CenteredView.xib; sourceTree = ""; }; + 338F853182E3B4D02927C1A44E041B65 /* warningIcon@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "warningIcon@3x.png"; path = "SwiftMessages/Resources/warningIcon@3x.png"; sourceTree = ""; }; + 342E3936327A3C9E7ED4AEBF784BD6F9 /* CenterAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CenterAnimation.swift; path = SwiftMessages/CenterAnimation.swift; sourceTree = ""; }; + 356BEF0CD1D48ACEB259708875B6F45B /* successIcon@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "successIcon@2x.png"; path = "SwiftMessages/Resources/successIcon@2x.png"; sourceTree = ""; }; + 35AD6C0CF4846B0CB08666B320471528 /* Identifiable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Identifiable.swift; path = SwiftMessages/Identifiable.swift; sourceTree = ""; }; + 3713446C0F668B78E107B1CBCAB643A8 /* MessageViewIOS8.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = MessageViewIOS8.xib; path = SwiftMessages/Resources/MessageViewIOS8.xib; sourceTree = ""; }; + 375CE8F6508E1CAE438C4F0AFE25F11B /* SwiftMessages-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftMessages-umbrella.h"; sourceTree = ""; }; + 3A1441A4FFE2B7F778BEB3B5DBA62661 /* PassthroughView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PassthroughView.swift; path = SwiftMessages/PassthroughView.swift; sourceTree = ""; }; 3CD5A30239C90F1B549B4AB9299ECF16 /* Pods-Demo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Demo-frameworks.sh"; sourceTree = ""; }; 3D653C9DA16200D75AD14323AA830C6B /* Pods-Demo-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Demo-resources.sh"; sourceTree = ""; }; - 49027BADE40B71DE9A177DF75AFB59AA /* SwiftMessages-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftMessages-prefix.pch"; sourceTree = ""; }; - 4ABDAE2F220044E536027A7180117F84 /* NSBundle+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSBundle+Utils.swift"; path = "SwiftMessages/NSBundle+Utils.swift"; sourceTree = ""; }; - 4F963F98E30609D720E506187E5A7031 /* UIViewController+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+Utils.swift"; path = "SwiftMessages/UIViewController+Utils.swift"; sourceTree = ""; }; + 3F76B77F23524013D7DFBFB2DE8ECE0B /* errorIconLight.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = errorIconLight.png; path = SwiftMessages/Resources/errorIconLight.png; sourceTree = ""; }; + 4857ED94E6E55284EDD161E7FE045A1F /* warningIconLight.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = warningIconLight.png; path = SwiftMessages/Resources/warningIconLight.png; sourceTree = ""; }; + 4A1D24A70ED9BA222C2873D799659DA0 /* successIconLight@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "successIconLight@2x.png"; path = "SwiftMessages/Resources/successIconLight@2x.png"; sourceTree = ""; }; + 4D98A634A2F1E915954835684E7A8D1B /* infoIconLight.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = infoIconLight.png; path = SwiftMessages/Resources/infoIconLight.png; sourceTree = ""; }; + 4FBAA031DB3BA56621DD6880C6980C33 /* ResourceBundle-SwiftMessages-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-SwiftMessages-Info.plist"; sourceTree = ""; }; 5259A068CBCD8780234A0D70629C1271 /* SwiftMessages.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SwiftMessages.framework; path = SwiftMessages.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 64A62156538C70FE8DFF7054F7A77552 /* Array+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Array+Utils.swift"; path = "SwiftMessages/Array+Utils.swift"; sourceTree = ""; }; - 65E17A5A366E08E3E20DFE6B3CE09B35 /* TopBottomAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TopBottomAnimation.swift; path = SwiftMessages/TopBottomAnimation.swift; sourceTree = ""; }; + 53ABFBCBD51C323F6DFA9DCF333E1CED /* SwiftMessages.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = SwiftMessages.modulemap; sourceTree = ""; }; + 579E1FBF4F4C64B13D5F665156C3A4B6 /* TabView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = TabView.xib; path = SwiftMessages/Resources/TabView.xib; sourceTree = ""; }; + 5EBBAAA0476612EC9F78FAA9A6CCEDB4 /* errorIconLight@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "errorIconLight@2x.png"; path = "SwiftMessages/Resources/errorIconLight@2x.png"; sourceTree = ""; }; + 5FBAB332FFA90AAC27BD91388985379A /* StatusLine.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StatusLine.xib; path = SwiftMessages/Resources/StatusLine.xib; sourceTree = ""; }; + 6012C56F929BD7E6D187DACBAE5AC351 /* successIconSubtle@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "successIconSubtle@3x.png"; path = "SwiftMessages/Resources/successIconSubtle@3x.png"; sourceTree = ""; }; + 639F46247D2853502E85538D44A55369 /* AccessibleMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AccessibleMessage.swift; path = SwiftMessages/AccessibleMessage.swift; sourceTree = ""; }; + 65A6CD233FD29C05E00B0169D19C61FE /* errorIconSubtle@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "errorIconSubtle@2x.png"; path = "SwiftMessages/Resources/errorIconSubtle@2x.png"; sourceTree = ""; }; + 6602B72571766EB10E664C9007999F20 /* UIViewController+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+Utils.swift"; path = "SwiftMessages/UIViewController+Utils.swift"; sourceTree = ""; }; + 68780855EFD69507270AE7759F574203 /* infoIconLight@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "infoIconLight@3x.png"; path = "SwiftMessages/Resources/infoIconLight@3x.png"; sourceTree = ""; }; + 68F421E50804DE31408EA50F32EB3FB5 /* successIcon.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = successIcon.png; path = SwiftMessages/Resources/successIcon.png; sourceTree = ""; }; + 6F9220BCA5415E3FE16D859550E145A5 /* errorIconSubtle@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "errorIconSubtle@3x.png"; path = "SwiftMessages/Resources/errorIconSubtle@3x.png"; sourceTree = ""; }; 71940C1CEB7995DC34CFE54CAF1AEF88 /* Pods-Demo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Demo-acknowledgements.markdown"; sourceTree = ""; }; - 7447A70AD4CFA7C1F2E1DB09FC3E0110 /* WindowViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WindowViewController.swift; path = SwiftMessages/WindowViewController.swift; sourceTree = ""; }; - 7DD60CD83E69B14B2BF628B8AEFEEA4F /* CenterAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CenterAnimation.swift; path = SwiftMessages/CenterAnimation.swift; sourceTree = ""; }; - 7E5EDA5081F4BFCF6D515BFB9E6A46CD /* CardView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = CardView.xib; path = SwiftMessages/Resources/CardView.xib; sourceTree = ""; }; - 815C2CECB66685FE16CEC9749C8C1EB2 /* Identifiable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Identifiable.swift; path = SwiftMessages/Identifiable.swift; sourceTree = ""; }; - 83B3725B836FAFD60A1F04779F5D68FA /* SwiftMessages-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SwiftMessages-dummy.m"; sourceTree = ""; }; - 86BF7466A20EA158235AF3560DC587A1 /* MessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessageView.swift; path = SwiftMessages/MessageView.swift; sourceTree = ""; }; - 8E458408B29C97A95A09C97699717187 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = SwiftMessages/Error.swift; sourceTree = ""; }; - 8F7DEEAA47DF230A64A8A4A5C83B5042 /* MessageViewIOS8.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = MessageViewIOS8.xib; path = SwiftMessages/Resources/MessageViewIOS8.xib; sourceTree = ""; }; + 7C4AEB15B449176FBB2DBC600874E40D /* infoIconLight@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "infoIconLight@2x.png"; path = "SwiftMessages/Resources/infoIconLight@2x.png"; sourceTree = ""; }; + 7FF4F840A060487F0CF72B0A9143BFF7 /* errorIconLight@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "errorIconLight@3x.png"; path = "SwiftMessages/Resources/errorIconLight@3x.png"; sourceTree = ""; }; + 81A6BF5E78D1639242188052850104FF /* TopBottomAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TopBottomAnimation.swift; path = SwiftMessages/TopBottomAnimation.swift; sourceTree = ""; }; + 8200E7E98EC0B8B4C12E5FC14642439A /* infoIconSubtle@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "infoIconSubtle@2x.png"; path = "SwiftMessages/Resources/infoIconSubtle@2x.png"; sourceTree = ""; }; + 8373717C1BB6ADDBD984D9FDA77C3545 /* NSBundle+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSBundle+Utils.swift"; path = "SwiftMessages/NSBundle+Utils.swift"; sourceTree = ""; }; + 88E13430E4C415AA42D797FDE90E92F5 /* successIconSubtle.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = successIconSubtle.png; path = SwiftMessages/Resources/successIconSubtle.png; sourceTree = ""; }; + 8C81F05F5F00DFF8FF634AF354A70632 /* Array+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Array+Utils.swift"; path = "SwiftMessages/Array+Utils.swift"; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 93F9CA1F604355146DA49D4DFC84D9DF /* BaseView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BaseView.swift; path = SwiftMessages/BaseView.swift; sourceTree = ""; }; - AEC4A492D703E0AE5C9A7483B71DC453 /* MaskingView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MaskingView.swift; path = SwiftMessages/MaskingView.swift; sourceTree = ""; }; - B21DB98CEE62C3CFA181FAE93CE35EA9 /* SwiftMessages.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftMessages.xcconfig; sourceTree = ""; }; - B5C4CD23AB00FACC6371B3C46A88273D /* SwiftMessages.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = SwiftMessages.modulemap; sourceTree = ""; }; + 96715550AC8AF9FE1A039D711B911911 /* Animator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Animator.swift; path = SwiftMessages/Animator.swift; sourceTree = ""; }; + 97EADE94C5D04CC66387DB68AE47FD15 /* successIconLight.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = successIconLight.png; path = SwiftMessages/Resources/successIconLight.png; sourceTree = ""; }; + 9831B5DB13B7397C2395DD95882167D3 /* infoIcon@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "infoIcon@2x.png"; path = "SwiftMessages/Resources/infoIcon@2x.png"; sourceTree = ""; }; + 98DF6503E18A257D9C538978CF3FF269 /* successIcon@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "successIcon@3x.png"; path = "SwiftMessages/Resources/successIcon@3x.png"; sourceTree = ""; }; + 9ACFD5309E99F8F47EF6ECBBDCC84F48 /* errorIcon@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "errorIcon@2x.png"; path = "SwiftMessages/Resources/errorIcon@2x.png"; sourceTree = ""; }; + A26E6447C47D4797EBA12C51DF1FA4CC /* warningIcon.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = warningIcon.png; path = SwiftMessages/Resources/warningIcon.png; sourceTree = ""; }; + A9748E635DB4E2533D1C0E68DF92B204 /* successIconLight@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "successIconLight@3x.png"; path = "SwiftMessages/Resources/successIconLight@3x.png"; sourceTree = ""; }; + AF3A9CB840536B3BADF6BE7DCAAACEEA /* PhysicsPanHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PhysicsPanHandler.swift; path = SwiftMessages/PhysicsPanHandler.swift; sourceTree = ""; }; + B229458AF87B201601318D0C55EA5C00 /* infoIconSubtle.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = infoIconSubtle.png; path = SwiftMessages/Resources/infoIconSubtle.png; sourceTree = ""; }; + B4AC34DCB364CB4647739D69B339BA0E /* warningIconSubtle@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "warningIconSubtle@3x.png"; path = "SwiftMessages/Resources/warningIconSubtle@3x.png"; sourceTree = ""; }; B63C6A64CF66340668996F78DA6BB482 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - B8F80FA0EA95624BFC02B47AEBB8FEF8 /* SwiftMessages-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftMessages-umbrella.h"; sourceTree = ""; }; - BFBD0CC7265564725FC404904AC95D8F /* Animator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Animator.swift; path = SwiftMessages/Animator.swift; sourceTree = ""; }; + B704BB1358D1D80549D0C41265533BED /* PassthroughWindow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PassthroughWindow.swift; path = SwiftMessages/PassthroughWindow.swift; sourceTree = ""; }; + B90540615DCF7328A5F6A991FF2AC83F /* WindowViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WindowViewController.swift; path = SwiftMessages/WindowViewController.swift; sourceTree = ""; }; + BC768E58995BEE1752FF37E204D3B741 /* infoIconSubtle@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "infoIconSubtle@3x.png"; path = "SwiftMessages/Resources/infoIconSubtle@3x.png"; sourceTree = ""; }; + BCE5447B894027A7B3991550C3EB207F /* CardView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = CardView.xib; path = SwiftMessages/Resources/CardView.xib; sourceTree = ""; }; BFCD7E7BC43700342D2ECDA704620869 /* Pods_Demo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_Demo.framework; path = "Pods-Demo.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - BFE17362477F7C3332D1D746C87DDBBE /* SwiftMessages.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftMessages.swift; path = SwiftMessages/SwiftMessages.swift; sourceTree = ""; }; + C262B9DA7B148B035DD8D359BE20A137 /* warningIconLight@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "warningIconLight@2x.png"; path = "SwiftMessages/Resources/warningIconLight@2x.png"; sourceTree = ""; }; C5BC86D40B890A7B0844F888209CA06F /* Pods-Demo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Demo-dummy.m"; sourceTree = ""; }; + C879038BE7020010FE957BCD44067FF5 /* infoIcon.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = infoIcon.png; path = SwiftMessages/Resources/infoIcon.png; sourceTree = ""; }; CA19694C0AC41D598DE4ABFEB300E619 /* Pods-Demo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Demo-acknowledgements.plist"; sourceTree = ""; }; + CB372E13B00350FAA5006037EFF32E5C /* warningIconSubtle@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "warningIconSubtle@2x.png"; path = "SwiftMessages/Resources/warningIconSubtle@2x.png"; sourceTree = ""; }; + CBEF14FD36920E1CC43E416AEAAE4515 /* SwiftMessages-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftMessages-prefix.pch"; sourceTree = ""; }; CC6A59B0ADA6CB2F51DAE6508E437829 /* Pods-Demo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Demo.debug.xcconfig"; sourceTree = ""; }; - CCFA729E463A0A1D6BA38B0EA40E2285 /* PassthroughView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PassthroughView.swift; path = SwiftMessages/PassthroughView.swift; sourceTree = ""; }; + CD27FDD66007991C42B5E87CEA373B3C /* Presenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Presenter.swift; path = SwiftMessages/Presenter.swift; sourceTree = ""; }; + CDB5240B8697E947A06F8CC23ED7C33B /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = SwiftMessages/Error.swift; sourceTree = ""; }; + CE30A2E3C7B478B14B3318BD6B15A3E0 /* MarginAdjustable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MarginAdjustable.swift; path = SwiftMessages/MarginAdjustable.swift; sourceTree = ""; }; + CF31AA6050883852CFA30D6E1CCC483A /* Weak.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Weak.swift; path = SwiftMessages/Weak.swift; sourceTree = ""; }; + CF6BD7B87B4458C33C40DCD348714FA4 /* errorIcon.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = errorIcon.png; path = SwiftMessages/Resources/errorIcon.png; sourceTree = ""; }; + D14558C79F02E838042204033837A92B /* infoIcon@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "infoIcon@3x.png"; path = "SwiftMessages/Resources/infoIcon@3x.png"; sourceTree = ""; }; + D7B276C8D6648E04FD4472040B437165 /* MessageView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = MessageView.xib; path = SwiftMessages/Resources/MessageView.xib; sourceTree = ""; }; D88AAE1F92055A60CC2FC970D7D34634 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - D9C1EECDE513D02A97FE3145E34C748B /* AccessibleMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AccessibleMessage.swift; path = SwiftMessages/AccessibleMessage.swift; sourceTree = ""; }; DAB0701F8F25395B1ED46510ED4B9797 /* Pods-Demo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Demo.release.xcconfig"; sourceTree = ""; }; - DD63799D7F07CC21FB7DFACE7AFAFE7D /* StatusLine.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StatusLine.xib; path = SwiftMessages/Resources/StatusLine.xib; sourceTree = ""; }; - E151F72287666C273EE9F13AE4A6FD8E /* Presenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Presenter.swift; path = SwiftMessages/Presenter.swift; sourceTree = ""; }; - E291F4BC584442AEB8D93B1DC5A3F3B5 /* Images.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = SwiftMessages/Resources/Images.xcassets; sourceTree = ""; }; + E086DFA5ED7D77314F2C0EDFDACBD456 /* successIconSubtle@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "successIconSubtle@2x.png"; path = "SwiftMessages/Resources/successIconSubtle@2x.png"; sourceTree = ""; }; E68F8C86FB3267A3C87983DA9E269889 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - E8FE556582EF331E2394039D69668F3F /* MessageView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = MessageView.xib; path = SwiftMessages/Resources/MessageView.xib; sourceTree = ""; }; EDA8A9CFB00CA35B42F93F216EB7DA9B /* SwiftMessages.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = SwiftMessages.bundle; path = SwiftMessages.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - F2DC962503B293E07CAAE638D8DB2658 /* Weak.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Weak.swift; path = SwiftMessages/Weak.swift; sourceTree = ""; }; - F9617E8050E64749DBA263DBE31A626F /* BackgroundViewable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BackgroundViewable.swift; path = SwiftMessages/BackgroundViewable.swift; sourceTree = ""; }; - FDF256256D805C850726206BC55D7B13 /* PhysicsPanHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PhysicsPanHandler.swift; path = SwiftMessages/PhysicsPanHandler.swift; sourceTree = ""; }; + F4ADE1A948CAACA0952DA85DFE93EDC6 /* errorIconSubtle.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = errorIconSubtle.png; path = SwiftMessages/Resources/errorIconSubtle.png; sourceTree = ""; }; + F5E81D2B21F048699D41BDEFCB01602F /* BackgroundViewable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BackgroundViewable.swift; path = SwiftMessages/BackgroundViewable.swift; sourceTree = ""; }; + F6BB71453B273789C63FBC534601E6ED /* Theme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Theme.swift; path = SwiftMessages/Theme.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -149,7 +219,7 @@ 0854EB70FE99EC96B07690A526ACE353 /* Development Pods */ = { isa = PBXGroup; children = ( - 2D8F984E551AA75AA0405B601CB7483C /* SwiftMessages */, + 743DE5A9A92F0F5CCF2E1C85498953F9 /* SwiftMessages */, ); name = "Development Pods"; sourceTree = ""; @@ -164,36 +234,19 @@ name = Products; sourceTree = ""; }; - 2D8F984E551AA75AA0405B601CB7483C /* SwiftMessages */ = { + 2B9B34F42C5FB47C85F8821456EB3057 /* Support Files */ = { isa = PBXGroup; children = ( - D9C1EECDE513D02A97FE3145E34C748B /* AccessibleMessage.swift */, - BFBD0CC7265564725FC404904AC95D8F /* Animator.swift */, - 64A62156538C70FE8DFF7054F7A77552 /* Array+Utils.swift */, - F9617E8050E64749DBA263DBE31A626F /* BackgroundViewable.swift */, - 93F9CA1F604355146DA49D4DFC84D9DF /* BaseView.swift */, - 7DD60CD83E69B14B2BF628B8AEFEEA4F /* CenterAnimation.swift */, - 8E458408B29C97A95A09C97699717187 /* Error.swift */, - 815C2CECB66685FE16CEC9749C8C1EB2 /* Identifiable.swift */, - 024A0D8BA639E996F69D5758209521C4 /* MarginAdjustable.swift */, - AEC4A492D703E0AE5C9A7483B71DC453 /* MaskingView.swift */, - 86BF7466A20EA158235AF3560DC587A1 /* MessageView.swift */, - 4ABDAE2F220044E536027A7180117F84 /* NSBundle+Utils.swift */, - CCFA729E463A0A1D6BA38B0EA40E2285 /* PassthroughView.swift */, - 0B3162C34528ABE7E5780BE1852AD013 /* PassthroughWindow.swift */, - FDF256256D805C850726206BC55D7B13 /* PhysicsPanHandler.swift */, - E151F72287666C273EE9F13AE4A6FD8E /* Presenter.swift */, - BFE17362477F7C3332D1D746C87DDBBE /* SwiftMessages.swift */, - 219461964B980BFA09BC31E63FD2A006 /* Theme.swift */, - 65E17A5A366E08E3E20DFE6B3CE09B35 /* TopBottomAnimation.swift */, - 4F963F98E30609D720E506187E5A7031 /* UIViewController+Utils.swift */, - F2DC962503B293E07CAAE638D8DB2658 /* Weak.swift */, - 7447A70AD4CFA7C1F2E1DB09FC3E0110 /* WindowViewController.swift */, - 7606EC1F401C53C1D774B6EE0DF13AEE /* Resources */, - 4F98004D96CC56766BE8BE71662205C1 /* Support Files */, + 0BF2B5381CD38A267ABD9BE1916699AE /* Info.plist */, + 4FBAA031DB3BA56621DD6880C6980C33 /* ResourceBundle-SwiftMessages-Info.plist */, + 53ABFBCBD51C323F6DFA9DCF333E1CED /* SwiftMessages.modulemap */, + 0A3C73D7B53F155955B8BC0134404A38 /* SwiftMessages.xcconfig */, + 328CFFAA6D37707EC9D0BC86A19F5152 /* SwiftMessages-dummy.m */, + CBEF14FD36920E1CC43E416AEAAE4515 /* SwiftMessages-prefix.pch */, + 375CE8F6508E1CAE438C4F0AFE25F11B /* SwiftMessages-umbrella.h */, ); - name = SwiftMessages; - path = ../..; + name = "Support Files"; + path = "Demo/Pods/Target Support Files/SwiftMessages"; sourceTree = ""; }; 433CD3331B6C3787F473C941B61FC68F /* Frameworks */ = { @@ -213,21 +266,6 @@ name = iOS; sourceTree = ""; }; - 4F98004D96CC56766BE8BE71662205C1 /* Support Files */ = { - isa = PBXGroup; - children = ( - 0605D96E366DB55ABEAC32B776CA3E5F /* Info.plist */, - 1E6D8CE225591FD7DC26180B2B4D3AC5 /* ResourceBundle-SwiftMessages-Info.plist */, - B5C4CD23AB00FACC6371B3C46A88273D /* SwiftMessages.modulemap */, - B21DB98CEE62C3CFA181FAE93CE35EA9 /* SwiftMessages.xcconfig */, - 83B3725B836FAFD60A1F04779F5D68FA /* SwiftMessages-dummy.m */, - 49027BADE40B71DE9A177DF75AFB59AA /* SwiftMessages-prefix.pch */, - B8F80FA0EA95624BFC02B47AEBB8FEF8 /* SwiftMessages-umbrella.h */, - ); - name = "Support Files"; - path = "Demo/Pods/Target Support Files/SwiftMessages"; - sourceTree = ""; - }; 6F2351C272926D3E0225FEFC2F9C5D1F /* Targets Support Files */ = { isa = PBXGroup; children = ( @@ -236,18 +274,36 @@ name = "Targets Support Files"; sourceTree = ""; }; - 7606EC1F401C53C1D774B6EE0DF13AEE /* Resources */ = { + 743DE5A9A92F0F5CCF2E1C85498953F9 /* SwiftMessages */ = { isa = PBXGroup; children = ( - 7E5EDA5081F4BFCF6D515BFB9E6A46CD /* CardView.xib */, - 1AA081944189D64EF7DC74A9D9E0B105 /* CenteredView.xib */, - E291F4BC584442AEB8D93B1DC5A3F3B5 /* Images.xcassets */, - E8FE556582EF331E2394039D69668F3F /* MessageView.xib */, - 8F7DEEAA47DF230A64A8A4A5C83B5042 /* MessageViewIOS8.xib */, - DD63799D7F07CC21FB7DFACE7AFAFE7D /* StatusLine.xib */, - 072B9A20FAB93ECDC5C4558B17344FCB /* TabView.xib */, + 639F46247D2853502E85538D44A55369 /* AccessibleMessage.swift */, + 96715550AC8AF9FE1A039D711B911911 /* Animator.swift */, + 8C81F05F5F00DFF8FF634AF354A70632 /* Array+Utils.swift */, + F5E81D2B21F048699D41BDEFCB01602F /* BackgroundViewable.swift */, + 1AEBB9569BC83DBD2EE2C38E27BE6BFC /* BaseView.swift */, + 342E3936327A3C9E7ED4AEBF784BD6F9 /* CenterAnimation.swift */, + CDB5240B8697E947A06F8CC23ED7C33B /* Error.swift */, + 35AD6C0CF4846B0CB08666B320471528 /* Identifiable.swift */, + CE30A2E3C7B478B14B3318BD6B15A3E0 /* MarginAdjustable.swift */, + 1204D55AF556C999DC38027DF5890B28 /* MaskingView.swift */, + 21A0CE071BF939DBCE73CCD161735F5A /* MessageView.swift */, + 8373717C1BB6ADDBD984D9FDA77C3545 /* NSBundle+Utils.swift */, + 3A1441A4FFE2B7F778BEB3B5DBA62661 /* PassthroughView.swift */, + B704BB1358D1D80549D0C41265533BED /* PassthroughWindow.swift */, + AF3A9CB840536B3BADF6BE7DCAAACEEA /* PhysicsPanHandler.swift */, + CD27FDD66007991C42B5E87CEA373B3C /* Presenter.swift */, + 1E81162128B5BD796919A2132D254B66 /* SwiftMessages.swift */, + F6BB71453B273789C63FBC534601E6ED /* Theme.swift */, + 81A6BF5E78D1639242188052850104FF /* TopBottomAnimation.swift */, + 6602B72571766EB10E664C9007999F20 /* UIViewController+Utils.swift */, + CF31AA6050883852CFA30D6E1CCC483A /* Weak.swift */, + B90540615DCF7328A5F6A991FF2AC83F /* WindowViewController.swift */, + BB2DFCF45484324DBF5235343B6B7119 /* Resources */, + 2B9B34F42C5FB47C85F8821456EB3057 /* Support Files */, ); - name = Resources; + name = SwiftMessages; + path = ../..; sourceTree = ""; }; 7DB346D0F39D3F0E887471402A8071AB = { @@ -261,6 +317,55 @@ ); sourceTree = ""; }; + BB2DFCF45484324DBF5235343B6B7119 /* Resources */ = { + isa = PBXGroup; + children = ( + BCE5447B894027A7B3991550C3EB207F /* CardView.xib */, + 32A099E194C7E794D67EA5ED5CB317A4 /* CenteredView.xib */, + CF6BD7B87B4458C33C40DCD348714FA4 /* errorIcon.png */, + 9ACFD5309E99F8F47EF6ECBBDCC84F48 /* errorIcon@2x.png */, + 0251D501C80E73E7C001641D22CBE99A /* errorIcon@3x.png */, + 3F76B77F23524013D7DFBFB2DE8ECE0B /* errorIconLight.png */, + 5EBBAAA0476612EC9F78FAA9A6CCEDB4 /* errorIconLight@2x.png */, + 7FF4F840A060487F0CF72B0A9143BFF7 /* errorIconLight@3x.png */, + F4ADE1A948CAACA0952DA85DFE93EDC6 /* errorIconSubtle.png */, + 65A6CD233FD29C05E00B0169D19C61FE /* errorIconSubtle@2x.png */, + 6F9220BCA5415E3FE16D859550E145A5 /* errorIconSubtle@3x.png */, + C879038BE7020010FE957BCD44067FF5 /* infoIcon.png */, + 9831B5DB13B7397C2395DD95882167D3 /* infoIcon@2x.png */, + D14558C79F02E838042204033837A92B /* infoIcon@3x.png */, + 4D98A634A2F1E915954835684E7A8D1B /* infoIconLight.png */, + 7C4AEB15B449176FBB2DBC600874E40D /* infoIconLight@2x.png */, + 68780855EFD69507270AE7759F574203 /* infoIconLight@3x.png */, + B229458AF87B201601318D0C55EA5C00 /* infoIconSubtle.png */, + 8200E7E98EC0B8B4C12E5FC14642439A /* infoIconSubtle@2x.png */, + BC768E58995BEE1752FF37E204D3B741 /* infoIconSubtle@3x.png */, + D7B276C8D6648E04FD4472040B437165 /* MessageView.xib */, + 3713446C0F668B78E107B1CBCAB643A8 /* MessageViewIOS8.xib */, + 5FBAB332FFA90AAC27BD91388985379A /* StatusLine.xib */, + 68F421E50804DE31408EA50F32EB3FB5 /* successIcon.png */, + 356BEF0CD1D48ACEB259708875B6F45B /* successIcon@2x.png */, + 98DF6503E18A257D9C538978CF3FF269 /* successIcon@3x.png */, + 97EADE94C5D04CC66387DB68AE47FD15 /* successIconLight.png */, + 4A1D24A70ED9BA222C2873D799659DA0 /* successIconLight@2x.png */, + A9748E635DB4E2533D1C0E68DF92B204 /* successIconLight@3x.png */, + 88E13430E4C415AA42D797FDE90E92F5 /* successIconSubtle.png */, + E086DFA5ED7D77314F2C0EDFDACBD456 /* successIconSubtle@2x.png */, + 6012C56F929BD7E6D187DACBAE5AC351 /* successIconSubtle@3x.png */, + 579E1FBF4F4C64B13D5F665156C3A4B6 /* TabView.xib */, + A26E6447C47D4797EBA12C51DF1FA4CC /* warningIcon.png */, + 30DB15067A730C6A2BC7F05396887C75 /* warningIcon@2x.png */, + 338F853182E3B4D02927C1A44E041B65 /* warningIcon@3x.png */, + 4857ED94E6E55284EDD161E7FE045A1F /* warningIconLight.png */, + C262B9DA7B148B035DD8D359BE20A137 /* warningIconLight@2x.png */, + 2DD0B43155EC2BA9B26BAA0A2CECF688 /* warningIconLight@3x.png */, + 181A29B0159C6F7DE70346FA70FA5FFC /* warningIconSubtle.png */, + CB372E13B00350FAA5006037EFF32E5C /* warningIconSubtle@2x.png */, + B4AC34DCB364CB4647739D69B339BA0E /* warningIconSubtle@3x.png */, + ); + name = Resources; + sourceTree = ""; + }; ECC58720C5754A079F9A150E40E2FCDD /* Pods-Demo */ = { isa = PBXGroup; children = ( @@ -344,7 +449,7 @@ buildPhases = ( F08614BD38C701F3AADA90C9947DC76A /* Sources */, E91BEACBF4240D4C99B76EFD369464A8 /* Frameworks */, - 30741D36AB0A5F4DDE81AE6335F8F829 /* Resources */, + D0E84AE3DF77FFCB9990E831F6C843E5 /* Resources */, ); buildRules = ( ); @@ -384,25 +489,60 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 30741D36AB0A5F4DDE81AE6335F8F829 /* Resources */ = { + A71C7940AD91593112CD3B1F284D67E5 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - AE6E8D5E60D42429EFC488BBACB5B22E /* CardView.xib in Resources */, - 340332C1EF8489FE2F0BEEBD289EF3C1 /* CenteredView.xib in Resources */, - 7272D6441E55F668BF0191449176756F /* Images.xcassets in Resources */, - FF614E4B3177462BC428F55337A84343 /* MessageView.xib in Resources */, - B6C02449EB4B8386B573B34D778407C7 /* MessageViewIOS8.xib in Resources */, - D2AA927FC4D15F603EC8393A92A338E4 /* StatusLine.xib in Resources */, - 65E8CA0D1FCC09C09F7143ECE9E7A131 /* TabView.xib in Resources */, + A0DA50804F4D0578FA0F9ADB8E127D55 /* SwiftMessages.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - A71C7940AD91593112CD3B1F284D67E5 /* Resources */ = { + D0E84AE3DF77FFCB9990E831F6C843E5 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - A0DA50804F4D0578FA0F9ADB8E127D55 /* SwiftMessages.bundle in Resources */, + D51337D9E7181151CFB485ABE64D8ED4 /* CardView.xib in Resources */, + 33C6333BE8A551858E68DAF5AF905596 /* CenteredView.xib in Resources */, + 979F2EF8EA034DBF9A718446D789FDEC /* errorIcon.png in Resources */, + 0028E6BBC336B107CF9EF0528B5EE43A /* errorIcon@2x.png in Resources */, + DF73F74353812AA9B649DBECB4C16C17 /* errorIcon@3x.png in Resources */, + 1A1084830C5F231B0428308DB11A5240 /* errorIconLight.png in Resources */, + FD74F6961877FDCDB7E7679311D82D1F /* errorIconLight@2x.png in Resources */, + 170BAF58A90972BF0A6FA5609E625F7A /* errorIconLight@3x.png in Resources */, + 465A49B0B6350BE37433D665E1E1FEA3 /* errorIconSubtle.png in Resources */, + 85B1E60D86531952B984DCF12179B460 /* errorIconSubtle@2x.png in Resources */, + ED6096988EFAF7CD1E7E92AF15E810DA /* errorIconSubtle@3x.png in Resources */, + 5778E9746050B1A3A1DAF371CAD8BFF4 /* infoIcon.png in Resources */, + DAE5B1597EF6F6559D226E746ABEF77D /* infoIcon@2x.png in Resources */, + 81CD353FE0CAE522A248792202CE7ECD /* infoIcon@3x.png in Resources */, + 2A2F604FE6113C6A85F128ED4D12DD87 /* infoIconLight.png in Resources */, + B6E92C2E1E6D90DC98B3FFDD4646DD37 /* infoIconLight@2x.png in Resources */, + D29D943274AEAD9924087D9831F5A977 /* infoIconLight@3x.png in Resources */, + EFA6497F5ECC79A4E4196F08698EDF03 /* infoIconSubtle.png in Resources */, + 36A7F3FA50D96416A55BA790C4097E78 /* infoIconSubtle@2x.png in Resources */, + 142F06B5618B79D5764391E6BFA51BD8 /* infoIconSubtle@3x.png in Resources */, + BC03A227950234D64554F5F9D7088078 /* MessageView.xib in Resources */, + F5D8207FCCD4BF9668D2912174341EF4 /* MessageViewIOS8.xib in Resources */, + EC5A51E34AE2F5295B758A044B7F1DEB /* StatusLine.xib in Resources */, + 0A479206575AA251A0AAA308EB99009F /* successIcon.png in Resources */, + 00A3BE42119648E09F4481207AA1B305 /* successIcon@2x.png in Resources */, + C17880F9EE88CB60BD9AADC9325441E1 /* successIcon@3x.png in Resources */, + 9D8C6E9DC33A198A15C606FFA3759B20 /* successIconLight.png in Resources */, + 23D88FAB1966383C09D215502E790BD1 /* successIconLight@2x.png in Resources */, + D7B293097B25E687AE1DAFC6B892130B /* successIconLight@3x.png in Resources */, + DBB41DE004BA395A6E821E79180E9E56 /* successIconSubtle.png in Resources */, + 7F5B8756755F727E220FE7E3228D0A04 /* successIconSubtle@2x.png in Resources */, + CB702D2D770EB6EBC1CA7E85FC05B29C /* successIconSubtle@3x.png in Resources */, + B341470AE557F15B0944480B28F2DA0C /* TabView.xib in Resources */, + 5A94363433C34AAA9CE44B13CACB5111 /* warningIcon.png in Resources */, + 59AC62DE1D07102AC9405C78F2FD3263 /* warningIcon@2x.png in Resources */, + DC114E92AEE9441DDE5C8EA4628AD3E3 /* warningIcon@3x.png in Resources */, + 9CA74EA125ED23780EC0754309A40975 /* warningIconLight.png in Resources */, + B182F806EA9E2EDBBA3E7F4D04134BF3 /* warningIconLight@2x.png in Resources */, + 8B92312643E68138C3515DA2D9AD5B85 /* warningIconLight@3x.png in Resources */, + 32642169BD476A2F909DDF18C1077154 /* warningIconSubtle.png in Resources */, + D0D024AF440DF9CBA8AC9608A606A46E /* warningIconSubtle@2x.png in Resources */, + A1E97D2B454032D3883DE3BFFE705300 /* warningIconSubtle@3x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -518,7 +658,7 @@ }; 16C76C11C5F44BBFE957FB7ECB49DA6E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B21DB98CEE62C3CFA181FAE93CE35EA9 /* SwiftMessages.xcconfig */; + baseConfigurationReference = 0A3C73D7B53F155955B8BC0134404A38 /* SwiftMessages.xcconfig */; buildSettings = { CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SwiftMessages"; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -573,7 +713,7 @@ }; 9C5F7DEFFFE6887556FC88B3615B391B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B21DB98CEE62C3CFA181FAE93CE35EA9 /* SwiftMessages.xcconfig */; + baseConfigurationReference = 0A3C73D7B53F155955B8BC0134404A38 /* SwiftMessages.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -608,7 +748,7 @@ }; B183EFBB9DFD7B5A4B9147C0BF6A96CB /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B21DB98CEE62C3CFA181FAE93CE35EA9 /* SwiftMessages.xcconfig */; + baseConfigurationReference = 0A3C73D7B53F155955B8BC0134404A38 /* SwiftMessages.xcconfig */; buildSettings = { CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SwiftMessages"; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -664,7 +804,7 @@ }; E25C556D4D914CFB2CDBFC591BB94F8B /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B21DB98CEE62C3CFA181FAE93CE35EA9 /* SwiftMessages.xcconfig */; + baseConfigurationReference = 0A3C73D7B53F155955B8BC0134404A38 /* SwiftMessages.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; diff --git a/Design/SwiftMessagesDesign.sketch b/Design/SwiftMessagesDesign.sketch index 37ecb64c1193735de1184cbaae9520a2d8e64a9b..c83ae2914eb6c04e207392be192cdb70c389bf10 100644 GIT binary patch delta 29224 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 delta 395254 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