├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── Package.swift ├── RAMReel.podspec ├── RAMReel.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── mikhail.s.xcuserdatad │ │ └── WorkspaceSettings.xcsettings ├── xcshareddata │ └── xcschemes │ │ └── RAMReel.xcscheme └── xcuserdata │ └── mikhail.s.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── RAMReel.xcscheme │ └── xcschememanagement.plist ├── RAMReel ├── Framework │ ├── CollectionViewCell.swift │ ├── CollectionViewLayout.swift │ ├── CollectionViewWrapper.swift │ ├── DataFlow.swift │ ├── GradientView.swift │ ├── RAMReel.h │ ├── RAMReel.swift │ ├── RAMTextField.swift │ ├── TextFieldReactor.swift │ └── Theme.swift ├── Info.plist └── Roboto │ ├── Apache License.txt │ └── Roboto-Light.ttf ├── RAMReelExample.xcworkspace └── contents.xcworkspacedata ├── RAMReelExample ├── RAMReelExample.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ └── contents.xcworkspacedata └── RAMReelExample │ ├── AppDelegate.swift │ ├── Base.lproj │ ├── LaunchScreen.xib │ └── Main.storyboard │ ├── Images.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json │ ├── Info.plist │ ├── ViewController.swift │ ├── WordReader.swift │ └── data.txt ├── README.md ├── Sources ├── docs ├── Classes.html ├── Classes │ ├── CollectionViewWrapper.html │ ├── RAMCell.html │ ├── RAMReel.html │ └── RAMTextField.html ├── Constructors.html ├── Extensions.html ├── Extensions │ ├── String.html │ ├── UIImage.html │ └── UITextField.html ├── Functions.html ├── Functions │ ├── *>(_:_:).html │ └── <&>(_:_:).html ├── Generic Type Parameters.html ├── Protocols.html ├── Protocols │ ├── ConfigurableCell.html │ ├── FlowDataDestination.html │ ├── FlowDataSource.html │ ├── Parsable.html │ ├── Renderable.html │ └── Theme.html ├── Structs.html ├── Structs │ ├── RAMTheme.html │ └── SimplePrefixQueryDataSource.html ├── Typealiases.html ├── css │ ├── highlight.css │ └── jazzy.css ├── docsets │ ├── RAMReel.docset │ │ └── Contents │ │ │ ├── Info.plist │ │ │ └── Resources │ │ │ ├── Documents │ │ │ ├── Classes.html │ │ │ ├── Classes │ │ │ │ ├── CollectionViewWrapper.html │ │ │ │ ├── RAMCell.html │ │ │ │ ├── RAMReel.html │ │ │ │ └── RAMTextField.html │ │ │ ├── Constructors.html │ │ │ ├── Extensions.html │ │ │ ├── Extensions │ │ │ │ ├── String.html │ │ │ │ ├── UIImage.html │ │ │ │ └── UITextField.html │ │ │ ├── Functions.html │ │ │ ├── Functions │ │ │ │ ├── *>(_:_:).html │ │ │ │ └── <&>(_:_:).html │ │ │ ├── Generic Type Parameters.html │ │ │ ├── Protocols.html │ │ │ ├── Protocols │ │ │ │ ├── ConfigurableCell.html │ │ │ │ ├── FlowDataDestination.html │ │ │ │ ├── FlowDataSource.html │ │ │ │ ├── Parsable.html │ │ │ │ ├── Renderable.html │ │ │ │ └── Theme.html │ │ │ ├── Structs.html │ │ │ ├── Structs │ │ │ │ ├── RAMTheme.html │ │ │ │ └── SimplePrefixQueryDataSource.html │ │ │ ├── Typealiases.html │ │ │ ├── css │ │ │ │ ├── highlight.css │ │ │ │ └── jazzy.css │ │ │ ├── img │ │ │ │ ├── carat.png │ │ │ │ ├── dash.png │ │ │ │ └── gh.png │ │ │ ├── index.html │ │ │ ├── js │ │ │ │ ├── jazzy.js │ │ │ │ └── jquery.min.js │ │ │ └── undocumented.json │ │ │ └── docSet.dsidx │ └── RAMReel.tgz ├── img │ ├── carat.png │ ├── dash.png │ └── gh.png ├── index.html ├── js │ ├── jazzy.js │ └── jquery.min.js └── undocumented.json ├── header.png └── reel-search.gif /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | xcuserdata 13 | *.xccheckout 14 | *.moved-aside 15 | DerivedData 16 | *.hmap 17 | *.ipa 18 | *.xcuserstate 19 | 20 | # CocoaPods 21 | # 22 | # We recommend against adding the Pods directory to your .gitignore. However 23 | # you should judge for yourself, the pros and cons are mentioned at: 24 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 25 | # 26 | Pods/ 27 | 28 | # Carthage 29 | # 30 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 31 | # Carthage/Checkouts 32 | 33 | Carthage/Build 34 | 35 | # Other 36 | *.swp 37 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | osx_image: xcode9.2 2 | language: objective-c 3 | cache: cocoapods 4 | 5 | xcode_project: RAMReel.xcodeproj 6 | xcode_scheme: RAMReel 7 | xcode_sdk: iphonesimulator11.2 8 | 9 | # SWIFT_VERSION: 4.0 10 | 11 | # whitelist 12 | branches: 13 | only: 14 | - master 15 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## [Unreleased](https://github.com/Ramotion/reel-search/tree/HEAD) 4 | 5 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.2.4...HEAD) 6 | 7 | **Closed issues:** 8 | 9 | - Actions when something from the list is selected. [\#7](https://github.com/Ramotion/reel-search/issues/7) 10 | 11 | ## [1.2.4](https://github.com/Ramotion/reel-search/tree/1.2.4) (2016-05-30) 12 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.2.3...1.2.4) 13 | 14 | ## [1.2.3](https://github.com/Ramotion/reel-search/tree/1.2.3) (2016-05-19) 15 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.2.2...1.2.3) 16 | 17 | ## [1.2.2](https://github.com/Ramotion/reel-search/tree/1.2.2) (2016-05-04) 18 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.2.1...1.2.2) 19 | 20 | ## [1.2.1](https://github.com/Ramotion/reel-search/tree/1.2.1) (2016-05-04) 21 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.2.0...1.2.1) 22 | 23 | **Closed issues:** 24 | 25 | - ui blocking on textfield entry defects [\#5](https://github.com/Ramotion/reel-search/issues/5) 26 | 27 | ## [1.2.0](https://github.com/Ramotion/reel-search/tree/1.2.0) (2016-05-04) 28 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.1.1...1.2.0) 29 | 30 | ## [1.1.1](https://github.com/Ramotion/reel-search/tree/1.1.1) (2016-04-06) 31 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.1.0...1.1.1) 32 | 33 | ## [1.1.0](https://github.com/Ramotion/reel-search/tree/1.1.0) (2016-04-06) 34 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.0.6...1.1.0) 35 | 36 | ## [1.0.6](https://github.com/Ramotion/reel-search/tree/1.0.6) (2016-02-26) 37 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.0.5...1.0.6) 38 | 39 | **Closed issues:** 40 | 41 | - How did you make the demo gif? [\#3](https://github.com/Ramotion/reel-search/issues/3) 42 | 43 | **Merged pull requests:** 44 | 45 | - update doc [\#4](https://github.com/Ramotion/reel-search/pull/4) ([ArtemKyslicyn](https://github.com/ArtemKyslicyn)) 46 | 47 | ## [1.0.5](https://github.com/Ramotion/reel-search/tree/1.0.5) (2016-02-11) 48 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.0.4...1.0.5) 49 | 50 | ## [1.0.4](https://github.com/Ramotion/reel-search/tree/1.0.4) (2016-02-01) 51 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.0.3...1.0.4) 52 | 53 | ## [1.0.3](https://github.com/Ramotion/reel-search/tree/1.0.3) (2016-02-01) 54 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.0.2...1.0.3) 55 | 56 | **Closed issues:** 57 | 58 | - improve autosuggestion logic [\#1](https://github.com/Ramotion/reel-search/issues/1) 59 | 60 | ## [1.0.2](https://github.com/Ramotion/reel-search/tree/1.0.2) (2016-02-01) 61 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.0.1...1.0.2) 62 | 63 | **Merged pull requests:** 64 | 65 | - Docs update [\#2](https://github.com/Ramotion/reel-search/pull/2) ([Juriv](https://github.com/Juriv)) 66 | 67 | ## [1.0.1](https://github.com/Ramotion/reel-search/tree/1.0.1) (2016-01-28) 68 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.0.0...1.0.1) 69 | 70 | ## [1.0.0](https://github.com/Ramotion/reel-search/tree/1.0.0) (2016-01-28) 71 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.8...1.0.0) 72 | 73 | ## [0.10.8](https://github.com/Ramotion/reel-search/tree/0.10.8) (2015-12-29) 74 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.7...0.10.8) 75 | 76 | ## [0.10.7](https://github.com/Ramotion/reel-search/tree/0.10.7) (2015-12-21) 77 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.6...0.10.7) 78 | 79 | ## [0.10.6](https://github.com/Ramotion/reel-search/tree/0.10.6) (2015-12-21) 80 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.5...0.10.6) 81 | 82 | ## [0.10.5](https://github.com/Ramotion/reel-search/tree/0.10.5) (2015-12-19) 83 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.4...0.10.5) 84 | 85 | ## [0.10.4](https://github.com/Ramotion/reel-search/tree/0.10.4) (2015-12-18) 86 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.3...0.10.4) 87 | 88 | ## [0.10.3](https://github.com/Ramotion/reel-search/tree/0.10.3) (2015-12-18) 89 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.2...0.10.3) 90 | 91 | ## [0.10.2](https://github.com/Ramotion/reel-search/tree/0.10.2) (2015-12-08) 92 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.11...0.10.2) 93 | 94 | ## [0.9.11](https://github.com/Ramotion/reel-search/tree/0.9.11) (2015-10-22) 95 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.10...0.9.11) 96 | 97 | ## [0.9.10](https://github.com/Ramotion/reel-search/tree/0.9.10) (2015-10-22) 98 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.9...0.9.10) 99 | 100 | ## [0.9.9](https://github.com/Ramotion/reel-search/tree/0.9.9) (2015-10-01) 101 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.8...0.9.9) 102 | 103 | ## [0.9.8](https://github.com/Ramotion/reel-search/tree/0.9.8) (2015-10-01) 104 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.7...0.9.8) 105 | 106 | ## [0.9.7](https://github.com/Ramotion/reel-search/tree/0.9.7) (2015-10-01) 107 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.1...0.9.7) 108 | 109 | ## [0.10.1](https://github.com/Ramotion/reel-search/tree/0.10.1) (2015-09-21) 110 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.0...0.10.1) 111 | 112 | ## [0.10.0](https://github.com/Ramotion/reel-search/tree/0.10.0) (2015-09-21) 113 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.6...0.10.0) 114 | 115 | ## [0.9.6](https://github.com/Ramotion/reel-search/tree/0.9.6) (2015-09-21) 116 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.5...0.9.6) 117 | 118 | ## [0.9.5](https://github.com/Ramotion/reel-search/tree/0.9.5) (2015-08-28) 119 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.4...0.9.5) 120 | 121 | ## [0.9.4](https://github.com/Ramotion/reel-search/tree/0.9.4) (2015-08-12) 122 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.3...0.9.4) 123 | 124 | ## [0.9.3](https://github.com/Ramotion/reel-search/tree/0.9.3) (2015-07-22) 125 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.2...0.9.3) 126 | 127 | ## [0.9.2](https://github.com/Ramotion/reel-search/tree/0.9.2) (2015-07-06) 128 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.1...0.9.2) 129 | 130 | ## [0.9.1](https://github.com/Ramotion/reel-search/tree/0.9.1) (2015-07-06) 131 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.0...0.9.1) 132 | 133 | ## [0.9.0](https://github.com/Ramotion/reel-search/tree/0.9.0) (2015-04-24) 134 | 135 | 136 | \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to a Project 2 | Now that you’ve found the material for understanding the project, here is how you can take action. 3 | 4 | ### Create an Issue 5 | 6 | If you find a bug in a project you’re using (and you don’t know how to fix it), have trouble following the documentation or have a question about the project – create an issue! There’s nothing to it and whatever issue you’re having, you’re likely not the only one, so others will find your issue helpful, too. For more information on how issues work, check out our Issues guide. 7 | 8 | #### Issues Pro Tips 9 | 10 | Check existing issues for your issue. Duplicating an issue is slower for both parties so search through open and closed issues to see if what you’re running into has been addressed already. 11 | Be clear about what your problem is: what was the expected outcome, what happened instead? Detail how someone else can recreate the problem. 12 | Link to demos recreating the problem on things like JSFiddle or CodePen. 13 | Include system details like what the browser, library or operating system you’re using and its version. 14 | Paste error output or logs in your issue or in a Gist. If pasting them in the issue, wrap it in three backticks: ``` so that it renders nicely. 15 | 16 | ### Pull Request 17 | 18 | If you’re able to patch the bug or add the feature yourself – fantastic, make a pull request with the code! Be sure you’ve read any documents on contributing, understand the license and have signed a CLA if required. Once you’ve submitted a pull request the maintainer(s) can compare your branch to the existing one and decide whether or not to incorporate (pull in) your changes. 19 | 20 | #### Pull Request Pro Tips 21 | 22 | Fork the repository and clone it locally. Connect your local to the original ‘upstream’ repository by adding it as a remote. Pull in changes from ‘upstream’ often so that you stay up to date so that when you submit your pull request, merge conflicts will be less likely. See more detailed instructions here. 23 | Create a branch for your edits. 24 | Be clear about what problem is occurring and how someone can recreate that problem or why your feature will help. Then be equally as clear about the steps you took to make your changes. 25 | It’s best to test. Run your changes against any existing tests if they exist and create new ones when needed. Whether tests exist or not, make sure your changes don’t break the existing project. 26 | Include screenshots of the before and after if your changes include differences in HTML/CSS. Drag and drop the images into the body of your pull request. 27 | Contribute in the style of the project to the best of your abilities. This may mean using indents, semi colons or comments differently than you would in your own repository, but makes it easier for the maintainer to merge, others to understand and maintain in the future. 28 | 29 | #### Open Pull Requests 30 | 31 | Once you’ve opened a pull request a discussion will start around your proposed changes. Other contributors and users may chime in, but ultimately the decision is made by the maintainer(s). You may be asked to make some changes to your pull request, if so, add more commits to your branch and push them – they’ll automatically go into the existing pull request. 32 | 33 | If your pull request is merged – great! If it is not, no sweat, it may not be what the project maintainer had in mind, or they were already working on it. This happens, so our recommendation is to take any feedback you’ve received and go forth and pull request again – or create your own open source project. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Ramotion 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.1 2 | // 3 | // Package.swift 4 | // 5 | // Copyright (c) Ramotion (https://www.ramotion.com/) 6 | // 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy 8 | // of this software and associated documentation files (the "Software"), to deal 9 | // in the Software without restriction, including without limitation the rights 10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | // copies of the Software, and to permit persons to whom the Software is 12 | // furnished to do so, subject to the following conditions: 13 | // 14 | // The above copyright notice and this permission notice shall be included in 15 | // all copies or substantial portions of the Software. 16 | // 17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | // THE SOFTWARE. 24 | // 25 | 26 | import PackageDescription 27 | 28 | 29 | let package = Package( 30 | name: "ReelSearch", 31 | platforms: [ 32 | .iOS(.v8) 33 | ], 34 | products: [ 35 | .library(name: "RAMReel", 36 | targets: ["RAMReel"]), 37 | ], 38 | targets: [ 39 | .target(name: "RAMReel", 40 | path: "RAMReel") 41 | ], 42 | swiftLanguageVersions: [.v5] 43 | ) 44 | -------------------------------------------------------------------------------- /RAMReel.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | 3 | s.name = "RAMReel" 4 | s.version = "4.1.0" 5 | s.summary = "Live search control with reel of suggestions" 6 | s.screenshots = "https://raw.githubusercontent.com/Ramotion/reel-search/master/reel-search.gif" 7 | 8 | s.homepage = "https://github.com/Ramotion/reel-search" 9 | 10 | s.license = "MIT" 11 | 12 | s.author = { "Mikhail Stepkin, Ramotion Inc." => "mikhail.s@ramotion.com" } 13 | s.social_media_url = "https://twitter.com/Ramotion" 14 | 15 | s.platform = :ios, "9.0" 16 | 17 | s.source = { :git => "https://github.com/Ramotion/reel-search.git", :tag => "#{s.version}" } 18 | 19 | s.source_files = "RAMReel/Framework", "RAMReel/Framework/**/*.{h,m,swift}" 20 | 21 | s.resources = "RAMReel/Roboto/*.*" 22 | 23 | end 24 | -------------------------------------------------------------------------------- /RAMReel.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /RAMReel.xcodeproj/project.xcworkspace/xcuserdata/mikhail.s.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 6 | 7 | SnapshotAutomaticallyBeforeSignificantChanges 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /RAMReel.xcodeproj/xcshareddata/xcschemes/RAMReel.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /RAMReel.xcodeproj/xcuserdata/mikhail.s.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /RAMReel.xcodeproj/xcuserdata/mikhail.s.xcuserdatad/xcschemes/RAMReel.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /RAMReel.xcodeproj/xcuserdata/mikhail.s.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | RAMReel.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 9E82B37B1AD7EEAE0063F1B0 16 | 17 | primary 18 | 19 | 20 | 9E82B3861AD7EEAE0063F1B0 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /RAMReel/Framework/CollectionViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RAMCell.swift 3 | // RAMReel 4 | // 5 | // Created by Mikhail Stepkin on 4/10/15. 6 | // Copyright (c) 2015 Ramotion. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: - Collection view cells 12 | /** 13 | Type that implements this protocol allows configuration. 14 | As type name hints this protocol primarily targeted to UITableView and UICollectionView cells 15 | */ 16 | public protocol ConfigurableCell { 17 | 18 | associatedtype DataType: Equatable 19 | 20 | /** 21 | Implementing type should use data to fill own data fields 22 | 23 | - parameter data: Data to present in the cell 24 | */ 25 | func configureCell(_ data: DataType) 26 | 27 | /// Visual appearance theme 28 | var theme: Theme { get set } 29 | 30 | } 31 | 32 | /** 33 | RAMCell 34 | -- 35 | 36 | Example configurable cell 37 | */ 38 | open class RAMCell: UICollectionViewCell, ConfigurableCell { 39 | 40 | /** 41 | Proxy call to superclass init. 42 | 43 | - parameter coder: `NSCoder` instance proxied to superview. 44 | */ 45 | required public init?(coder aDecoder: NSCoder) { 46 | super.init(coder: aDecoder) 47 | 48 | setup() 49 | } 50 | 51 | /** 52 | Proxy call to superclass init. 53 | 54 | - parameter frame: Rect of cell, proxied to superview. 55 | */ 56 | public override init(frame: CGRect) { 57 | super.init(frame: frame) 58 | setup() 59 | } 60 | 61 | var textLabel: UILabel! 62 | 63 | /// Visual appearance theme 64 | open var theme: Theme = RAMTheme.sharedTheme { 65 | didSet { 66 | if theme.font != oldValue.font || theme.textColor != oldValue.textColor { 67 | updateFont() 68 | } 69 | } 70 | } 71 | 72 | func updateFont() { 73 | let theme = self.theme 74 | textLabel.font = theme.font 75 | textLabel.textColor = theme.textColor.withAlphaComponent(0.3) 76 | } 77 | 78 | fileprivate func setup() { 79 | let labelFrame = self.contentView.bounds 80 | textLabel = UILabel(frame: labelFrame) 81 | textLabel.translatesAutoresizingMaskIntoConstraints = false 82 | 83 | self.contentView.addSubview(textLabel) 84 | 85 | let attributes: [NSLayoutConstraint.Attribute] = [.left, .right, .top, .bottom] 86 | let constraints: [NSLayoutConstraint] = attributes.map { 87 | let const: CGFloat = ($0 == .left || $0 == .right) ? -20 : 0 88 | return NSLayoutConstraint(item: self, 89 | attribute: $0, 90 | relatedBy: .equal, 91 | toItem: textLabel, 92 | attribute: $0, 93 | multiplier: 1, 94 | constant: const) 95 | } 96 | addConstraints(constraints) 97 | updateFont() 98 | } 99 | 100 | /** 101 | Applies string data to the label text property 102 | 103 | - parameter string: String to show in the cell 104 | */ 105 | open func configureCell(_ string: String) { 106 | 107 | self.textLabel.text = string 108 | 109 | } 110 | 111 | } 112 | -------------------------------------------------------------------------------- /RAMReel/Framework/CollectionViewLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RAMCollectionViewLayout.swift 3 | // RAMReel 4 | // 5 | // Created by Mikhail Stepkin on 4/9/15. 6 | // Copyright (c) 2015 Ramotion. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /** 12 | Example collection view layout 13 | */ 14 | @objc(RAMCollectionViewLayout) 15 | class RAMCollectionViewLayout: UICollectionViewFlowLayout { 16 | 17 | internal override func prepare() { 18 | super.prepare() 19 | 20 | updateInsets() 21 | } 22 | 23 | func updateInsets() { 24 | if let collectionView = self.collectionView { 25 | let insets = (collectionView.bounds.height - itemHeight)/2 26 | collectionView.contentInset = UIEdgeInsets(top: insets, left: 0, bottom: insets, right: 0) 27 | } 28 | } 29 | 30 | internal override func initialLayoutAttributesForAppearingItem(at itemIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? { 31 | return self.layoutAttributesForItem(at: itemIndexPath) 32 | } 33 | 34 | internal override func layoutAttributesForItem(at indexPath:IndexPath) -> UICollectionViewLayoutAttributes { 35 | let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath) 36 | self.modifyLayoutAttributes(attributes) 37 | 38 | return attributes 39 | } 40 | 41 | internal override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { 42 | 43 | var allAttributesInRect = [(UICollectionViewLayoutAttributes, CGFloat)]() 44 | 45 | if let numberOfItems = collectionView?.numberOfItems(inSection: 0) { 46 | for item in 0 ..< numberOfItems { 47 | let indexPath = IndexPath(item: item, section: 0) 48 | 49 | let attributes = self.layoutAttributesForItem(at: indexPath) 50 | 51 | if rect.intersects(attributes.frame) { 52 | let intersection = rect.intersection(attributes.frame) 53 | allAttributesInRect.append((attributes, intersection.area)) 54 | } 55 | } 56 | } 57 | 58 | allAttributesInRect.sort { 59 | let (_, a1) = $0 60 | let (_, a2) = $1 61 | 62 | return a1 > a2 63 | } 64 | 65 | let attributes = allAttributesInRect.map ({ (attr, _) in 66 | attr 67 | }) 68 | 69 | return attributes 70 | } 71 | 72 | var itemHeight: CGFloat = 44 73 | func modifyLayoutAttributes(_ layoutattributes: UICollectionViewLayoutAttributes) { 74 | 75 | if 76 | let collectionView = self.collectionView 77 | { 78 | var frame = layoutattributes.frame 79 | frame.size.height = itemHeight 80 | frame.size.width = collectionView.bounds.width 81 | frame.origin.x = collectionView.bounds.origin.x 82 | frame.origin.y = itemHeight * CGFloat((layoutattributes.indexPath as NSIndexPath).item) 83 | layoutattributes.frame = frame 84 | } 85 | 86 | } 87 | 88 | internal override var collectionViewContentSize : CGSize { 89 | 90 | guard let collectionView = self.collectionView else { 91 | return CGSize.zero 92 | } 93 | 94 | let number = collectionView.numberOfItems(inSection: 0) 95 | let height = CGFloat(number) * itemHeight 96 | 97 | let size = CGSize(width: collectionView.bounds.width, height: height) 98 | return size 99 | 100 | } 101 | } 102 | 103 | private extension CGRect { 104 | 105 | var area: CGFloat { 106 | 107 | return self.height * self.width 108 | 109 | } 110 | 111 | } 112 | -------------------------------------------------------------------------------- /RAMReel/Framework/GradientView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContainerView.swift 3 | // RAMReel 4 | // 5 | // Created by Mikhail Stepkin on 4/23/15. 6 | // Copyright (c) 2015 Ramotion. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import QuartzCore 11 | 12 | class GradientView: UIView { 13 | 14 | var gradientLayer: CAGradientLayer! 15 | 16 | var listBackgroundColor: UIColor? { 17 | didSet { 18 | updateGradient() 19 | } 20 | } 21 | 22 | func updateGradient() { 23 | let color = listBackgroundColor ?? UIColor.white 24 | let white = color.withAlphaComponent(1.0).cgColor 25 | let clear = color.withAlphaComponent(0.0).cgColor 26 | gradientLayer.colors = [clear, white, clear] 27 | } 28 | 29 | func setupGradientLayer() { 30 | gradientLayer = CAGradientLayer() 31 | gradientLayer.frame = self.bounds 32 | updateGradient() 33 | self.layer.insertSublayer(gradientLayer, at: 0) 34 | } 35 | 36 | required init?(coder aDecoder: NSCoder) { 37 | super.init(coder: aDecoder) 38 | 39 | setupGradientLayer() 40 | } 41 | 42 | override init(frame: CGRect) { 43 | super.init(frame: frame) 44 | 45 | setupGradientLayer() 46 | } 47 | 48 | override func layoutSubviews() { 49 | super.layoutSubviews() 50 | 51 | gradientLayer.frame = self.bounds 52 | gradientLayer.setNeedsDisplay() 53 | } 54 | 55 | override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { 56 | return false 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /RAMReel/Framework/RAMReel.h: -------------------------------------------------------------------------------- 1 | // 2 | // RAMReel.h 3 | // RAMReel 4 | // 5 | // Created by Mikhail Stepkin on 4/10/15. 6 | // Copyright (c) 2015 Ramotion. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for RAMReel. 12 | FOUNDATION_EXPORT double RAMReelVersionNumber; 13 | 14 | //! Project version string for RAMReel. 15 | FOUNDATION_EXPORT const unsigned char RAMReelVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /RAMReel/Framework/RAMTextField.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RAMTextField.swift 3 | // RAMReel 4 | // 5 | // Created by Mikhail Stepkin on 4/22/15. 6 | // Copyright (c) 2015 Ramotion. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: - RAMTextField 12 | 13 | /** 14 | RAMTextField 15 | -- 16 | 17 | Textfield with a line in the bottom 18 | */ 19 | open class RAMTextField: UITextField { 20 | 21 | /** 22 | Overriding UIView's drawRect method to add line in the bottom of the Text Field 23 | 24 | - parameter rect: Rect that should be updated. This override ignores this parameter and redraws all text field 25 | */ 26 | override open func draw(_ rect: CGRect) { 27 | let rect = self.bounds 28 | let ctx = UIGraphicsGetCurrentContext() 29 | 30 | let lineColor = self.tintColor.withAlphaComponent(0.3) 31 | lineColor.set() 32 | 33 | ctx?.setLineWidth(1) 34 | 35 | let path = CGMutablePath() 36 | 37 | // var m = CGAffineTransform.identity 38 | // CGPathMoveToPoint(path, &m, 0, rect.height) 39 | path.move(to: CGPoint(x: 0, y: rect.height)) 40 | path.addLine(to: CGPoint(x: rect.width, y: rect.height)) 41 | // CGPathAddLineToPoint(path, &m, rect.width, rect.height) 42 | 43 | ctx?.addPath(path) 44 | ctx?.strokePath() 45 | } 46 | 47 | } 48 | 49 | // MARK: - UITextField extensions 50 | 51 | extension UITextField { 52 | 53 | /** 54 | Overriding `UITextField` `tintColor` property to make it affect close image tint color. 55 | */ 56 | open override var tintColor: UIColor! { 57 | get { 58 | return super.tintColor 59 | } 60 | 61 | set { 62 | super.tintColor = newValue 63 | 64 | let subviews = self.subviews 65 | for view in subviews { 66 | guard let button = view as? UIButton else { 67 | break 68 | } 69 | 70 | let states: [UIControl.State] = [.highlighted] 71 | states.forEach { state -> Void in 72 | let image = button.image(for: state)?.tintedImage(self.tintColor) 73 | button.setImage(image, for: state) 74 | } 75 | } 76 | } 77 | } 78 | 79 | } 80 | 81 | // MARK: - UIImage extensions 82 | 83 | private extension UIImage { 84 | 85 | /** 86 | Create new image by applying a tint. 87 | 88 | - parameter color: New image tint color. 89 | */ 90 | func tintedImage(_ color: UIColor) -> UIImage { 91 | let size = self.size 92 | 93 | UIGraphicsBeginImageContextWithOptions(size, false, self.scale) 94 | let context = UIGraphicsGetCurrentContext() 95 | self.draw(at: CGPoint.zero, blendMode: CGBlendMode.normal, alpha: 1.0) 96 | 97 | context?.setFillColor(color.cgColor) 98 | context?.setBlendMode(CGBlendMode.sourceIn) 99 | context?.setAlpha(1.0) 100 | 101 | let rect = CGRect( 102 | x: CGPoint.zero.x, 103 | y: CGPoint.zero.y, 104 | width: size.width, 105 | height: size.height) 106 | UIGraphicsGetCurrentContext()?.fill(rect) 107 | let tintedImage = UIGraphicsGetImageFromCurrentImageContext() 108 | UIGraphicsEndImageContext() 109 | 110 | return tintedImage ?? self 111 | } 112 | 113 | } 114 | -------------------------------------------------------------------------------- /RAMReel/Framework/TextFieldReactor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RAMReel.swift 3 | // RAMReel 4 | // 5 | // Created by Mikhail Stepkin on 4/2/15. 6 | // Copyright (c) 2015 Ramotion. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | // MARK: - Text field reactor operators 13 | precedencegroup RPrecedence { 14 | higherThan: BitwiseShiftPrecedence 15 | } 16 | 17 | infix operator <&> : RPrecedence 18 | 19 | /** 20 | Links text field to data flow 21 | 22 | - parameters: 23 | - left: Text field. 24 | - right: `DataFlow` object. 25 | 26 | - returns: `TextFieldReactor` object 27 | */ 28 | public func <&> 29 | (left: UITextField, right: DataFlow) -> TextFieldReactor 30 | where 31 | FlowDataSource.ResultType == FlowDataDestination.DataType 32 | { 33 | return TextFieldReactor(textField: left, dataFlow: right) 34 | } 35 | 36 | // MARK: - Text field reactor 37 | 38 | /** 39 | TextFieldReactor 40 | -- 41 | 42 | Implements reactive handling text field editing and passes editing changes to data flow 43 | */ 44 | public struct TextFieldReactor 45 | < 46 | DS: FlowDataSource, 47 | DD: FlowDataDestination> 48 | where 49 | DS.ResultType == DD.DataType, 50 | DS.QueryType == String 51 | 52 | { 53 | let textField : UITextField 54 | let dataFlow : DataFlow 55 | 56 | fileprivate let editingTarget: TextFieldTarget 57 | 58 | fileprivate init(textField: UITextField, dataFlow: DataFlow) { 59 | self.textField = textField 60 | self.dataFlow = dataFlow 61 | 62 | self.editingTarget = TextFieldTarget(controlEvents: UIControl.Event.editingChanged, textField: textField) { 63 | if let text = $0.text { 64 | dataFlow.transport(text) 65 | } 66 | } 67 | } 68 | 69 | } 70 | 71 | final class TextFieldTarget: NSObject { 72 | 73 | static let actionSelector = #selector(TextFieldTarget.action(_:)) 74 | 75 | typealias HookType = (UITextField) -> () 76 | 77 | override init() { 78 | super.init() 79 | } 80 | 81 | init(controlEvents:UIControl.Event, textField: UITextField, hook: @escaping HookType) { 82 | super.init() 83 | 84 | self.beTargetFor(textField, controlEvents: controlEvents, hook: hook) 85 | } 86 | 87 | var hooks: [UITextField: HookType] = [:] 88 | func beTargetFor(_ textField: UITextField, controlEvents:UIControl.Event, hook: @escaping HookType) { 89 | textField.addTarget(self, action: TextFieldTarget.actionSelector, for: controlEvents) 90 | hooks[textField] = hook 91 | } 92 | 93 | deinit { 94 | for (textField, _) in hooks { 95 | textField.removeTarget(self, action: TextFieldTarget.actionSelector, for: UIControl.Event.allEvents) 96 | } 97 | } 98 | 99 | @objc func action(_ textField: UITextField) { 100 | let hook = hooks[textField] 101 | hook?(textField) 102 | } 103 | 104 | } 105 | -------------------------------------------------------------------------------- /RAMReel/Framework/Theme.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Theme.swift 3 | // RAMReel 4 | // 5 | // Created by Mikhail Stepkin on 4/11/15. 6 | // Copyright (c) 2015 Ramotion. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: Theme 12 | /** 13 | Theme 14 | -- 15 | 16 | Protocol that allows you change visual appearance a bit. 17 | */ 18 | public protocol Theme { 19 | 20 | /** 21 | Text font of both list labels and input textfield. 22 | */ 23 | var font: UIFont { get } 24 | /** 25 | Color of textfield's text. 26 | 27 | Suggestion list's text color is calculated using this color by changing alpha channel value to `0.3`. 28 | */ 29 | var textColor: UIColor { get } 30 | 31 | /** 32 | Color of list's background. 33 | */ 34 | var listBackgroundColor: UIColor { get } 35 | 36 | } 37 | 38 | /** 39 | RAMTheme 40 | -- 41 | 42 | Theme prefab. 43 | */ 44 | public struct RAMTheme: Theme { 45 | 46 | /// Shared theme with default settings. 47 | public static let sharedTheme = RAMTheme() 48 | 49 | /// Theme font. 50 | public let font: UIFont 51 | /// Theme text color. 52 | public let textColor: UIColor 53 | /// Theme background color. 54 | public let listBackgroundColor: UIColor 55 | 56 | fileprivate init( 57 | textColor: UIColor = UIColor.black, 58 | listBackgroundColor: UIColor = UIColor.clear, 59 | font: UIFont = RAMTheme.defaultFont 60 | ) 61 | { 62 | self.textColor = textColor 63 | self.listBackgroundColor = listBackgroundColor 64 | self.font = font 65 | } 66 | 67 | fileprivate static var defaultFont: UIFont = RAMTheme.initDefaultFont() 68 | 69 | fileprivate static func initDefaultFont() -> UIFont { 70 | do { 71 | let _ = try FontLoader.loadRobotoLight() 72 | } catch (let error) { 73 | print(error) 74 | } 75 | 76 | let font: UIFont 77 | if 78 | let robotoLoaded = FontLoader.robotoLight, 79 | let roboto = UIFont(name: robotoLoaded.name, size: 36) 80 | { 81 | font = roboto 82 | } else if #available(iOS 8.2, *) { 83 | font = UIFont.systemFont(ofSize: 36, weight: UIFont.Weight.thin) 84 | } else { 85 | font = UIFont.systemFont(ofSize: 36) 86 | } 87 | return font 88 | } 89 | 90 | /** 91 | Creates new theme with new text color. 92 | 93 | - parameter textColor: New text color. 94 | - returns: New `RAMTheme` instance. 95 | */ 96 | public func textColor(_ textColor: UIColor) -> RAMTheme { 97 | return RAMTheme(textColor: textColor, listBackgroundColor: self.listBackgroundColor, font: self.font) 98 | } 99 | 100 | /** 101 | Creates new theme with new background color. 102 | 103 | - parameter listBackgroundColor: New background color. 104 | - returns: New `RAMTheme` instance. 105 | */ 106 | public func listBackgroundColor(_ listBackgroundColor: UIColor) -> RAMTheme { 107 | return RAMTheme(textColor: self.textColor, listBackgroundColor: listBackgroundColor, font: self.font) 108 | } 109 | 110 | /** 111 | Creates new theme with new font. 112 | 113 | - parameter font: New font. 114 | - returns: New `RAMTheme` instance. 115 | */ 116 | public func font(_ font: UIFont) -> RAMTheme { 117 | return RAMTheme(textColor: self.textColor, listBackgroundColor: self.listBackgroundColor, font: font) 118 | } 119 | 120 | } 121 | 122 | // MARK: - Font loader 123 | 124 | /** 125 | FontLoader 126 | -- 127 | */ 128 | final class FontLoader { 129 | 130 | enum AnError: Error { 131 | case failedToLoadFont(String) 132 | } 133 | 134 | static let robotoLight: FontLoader? = try? FontLoader.loadRobotoLight() 135 | 136 | static func loadRobotoLight() throws -> FontLoader { 137 | return try FontLoader(name: "Roboto-Light", type: "ttf") 138 | } 139 | 140 | let name: String 141 | let type: String 142 | 143 | fileprivate init(name: String, type: String) throws { 144 | self.name = name 145 | self.type = type 146 | 147 | guard FontLoader.loadedFonts[name] == nil else { 148 | return 149 | } 150 | 151 | let bundle = Bundle(for: Swift.type(of: self) as AnyClass) 152 | 153 | if 154 | let fontPath = bundle.path(forResource: name, ofType: type), 155 | let inData = try? Data(contentsOf: URL(fileURLWithPath: fontPath)), 156 | let provider = CGDataProvider(data: inData as CFData) 157 | { 158 | let font = CGFont(provider) 159 | CTFontManagerRegisterGraphicsFont(font!, nil) 160 | FontLoader.loadedFonts[self.name] = self 161 | return 162 | } else { 163 | throw AnError.failedToLoadFont(name) 164 | } 165 | } 166 | 167 | fileprivate static var loadedFonts: [String: FontLoader] = [:] 168 | 169 | } 170 | -------------------------------------------------------------------------------- /RAMReel/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.2.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /RAMReel/Roboto/Roboto-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/RAMReel/Roboto/Roboto-Light.ttf -------------------------------------------------------------------------------- /RAMReelExample.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /RAMReelExample/RAMReelExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /RAMReelExample/RAMReelExample/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // RAMReel 4 | // 5 | // Created by Mikhail Stepkin on 4/2/15. 6 | // Copyright (c) 2015 Ramotion. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import CoreData 11 | 12 | @UIApplicationMain 13 | class AppDelegate: UIResponder, UIApplicationDelegate { 14 | 15 | var window: UIWindow? 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 18 | 19 | return true 20 | } 21 | } 22 | 23 | -------------------------------------------------------------------------------- /RAMReelExample/RAMReelExample/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 25 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /RAMReelExample/RAMReelExample/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /RAMReelExample/RAMReelExample/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /RAMReelExample/RAMReelExample/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /RAMReelExample/RAMReelExample/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // RAMReel 4 | // 5 | // Created by Mikhail Stepkin on 4/2/15. 6 | // Copyright (c) 2015 Ramotion. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import RAMReel 11 | 12 | @available(iOS 8.2, *) 13 | class ViewController: UIViewController, UICollectionViewDelegate { 14 | 15 | var dataSource: SimplePrefixQueryDataSource! 16 | var ramReel: RAMReel! 17 | 18 | override func viewDidLoad() { 19 | super.viewDidLoad() 20 | 21 | dataSource = SimplePrefixQueryDataSource(data) 22 | 23 | ramReel = RAMReel(frame: view.bounds, dataSource: dataSource, placeholder: "Start by typing…", attemptToDodgeKeyboard: true) { 24 | print("Plain:", $0) 25 | } 26 | 27 | ramReel.hooks.append { 28 | let r = Array($0.reversed()) 29 | let j = String(r) 30 | print("Reversed:", j) 31 | } 32 | 33 | view.addSubview(ramReel.view) 34 | ramReel.view.autoresizingMask = [.flexibleWidth, .flexibleHeight] 35 | } 36 | 37 | fileprivate let data: [String] = { 38 | do { 39 | guard let dataPath = Bundle.main.path(forResource: "data", ofType: "txt") else { 40 | return [] 41 | } 42 | 43 | let data = try WordReader(filepath: dataPath) 44 | return data.words 45 | } 46 | catch let error { 47 | print(error) 48 | return [] 49 | } 50 | }() 51 | } 52 | -------------------------------------------------------------------------------- /RAMReelExample/RAMReelExample/WordReader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WordReader.swift 3 | // RAMReelExample 4 | // 5 | // Created by Mikhail Stepkin on 01.02.16. 6 | // Copyright © 2016 Ramotion. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public final class WordReader { 12 | 13 | fileprivate(set) public var words: [String] = [] 14 | 15 | init (filepath: String) throws { 16 | let fileManager = FileManager.default 17 | 18 | guard fileManager.fileExists(atPath: filepath) else { 19 | throw AnError.fileDoesntExist(filepath) 20 | } 21 | 22 | guard fileManager.isReadableFile(atPath: filepath) else { 23 | throw AnError.fileIsNotReadable(filepath) 24 | } 25 | 26 | let contents = try String(contentsOfFile: filepath) 27 | 28 | guard !contents.isEmpty else { 29 | throw AnError.fileIsEmpty(filepath) 30 | } 31 | 32 | let words = contents.split(separator: "\n") 33 | self.words = words.map(String.init) 34 | } 35 | 36 | enum AnError: Error { 37 | case fileDoesntExist(String) 38 | case fileIsNotReadable(String) 39 | case fileIsEmpty(String) 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

REEL SEARCH

7 | 8 |

Reel Search is a Swift UI controller that allows you to choose options from a list

9 | 10 | 11 | ___ 12 | 13 | 14 | 15 |

We specialize in the designing and coding of custom UI for Mobile Apps and Websites.
16 | 17 | 18 |

19 |

Stay tuned for the latest updates:
20 | 21 |

22 | 23 |
24 | 25 | # RAMReel 26 | [![Swift 4.0](https://img.shields.io/badge/Swift-4.0-green.svg?style=flat)](https://developer.apple.com/swift/) 27 | [![CocoaPods](https://img.shields.io/cocoapods/p/RAMReel.svg)](https://cocoapods.org/pods/RAMReel) 28 | [![CocoaPods](https://img.shields.io/cocoapods/v/RAMReel.svg)](http://cocoapods.org/pods/RAMReel) 29 | [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Ramotion/reel-search) 30 | [![codebeat badge](https://codebeat.co/badges/a591dc07-0f55-4321-929b-b33904c3dca8)](https://codebeat.co/projects/github-com-ramotion-reel-search) 31 | [![Travis](https://img.shields.io/travis/Ramotion/reel-search.svg)](https://travis-ci.org/Ramotion/reel-search) 32 | [![Twitter](https://img.shields.io/badge/Twitter-@Ramotion-blue.svg?style=flat)](http://twitter.com/Ramotion) 33 | [![Donate](https://img.shields.io/badge/Donate-PayPal-blue.svg)](https://paypal.me/Ramotion) 34 | 35 | ## Requirements 36 | 37 | - iOS 8.0+ 38 | - Swift 4.0 39 | 40 | ## Installation 41 | 42 | We recommend using **[CocoaPods](https://cocoapods.org/)** to install our library. 43 | 44 | Just put this in your `Podfile`: 45 | 46 | ~~~ruby 47 | pod 'RAMReel' 48 | ~~~ 49 | 50 | or [Carthage](https://github.com/Carthage/Carthage) users can simply add `reel-search` to their `Cartfile`: 51 | ``` 52 | github "Ramotion/reel-search" 53 | ``` 54 | 55 | ## Usage 56 | 57 | In order to use our control you need to implement the following: 58 | 59 | ### Types 60 | - **`CellClass`**: Your cell class must inherit from [`UICollectionViewCell`](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UICollectionViewCell_class/) and implement the [`ConfigurableCell`](https://rawgit.com/Ramotion/reel-search/master/docs/Protocols/ConfigurableCell.html) protocol. Or you can just use our predefined class [`RAMCell`](https://rawgit.com/Ramotion/reel-search/master/docs/Classes/RAMCell.html). 61 | - **`TextFieldClass`**: Any subclass of [`UITextField`](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextField_Class/) will do. 62 | - **`DataSource`**: Your type must implement the [`FlowDataSource`](https://rawgit.com/Ramotion/reel-search/master/docs/Protocols/FlowDataSource.html) protocol, with `QueryType` being `String` and `ResultType` being [`Renderable`](https://rawgit.com/Ramotion/reel-search/master/docs/Protocols/Renderable.html) and [`Parsable`](https://rawgit.com/Ramotion/reel-search/master/docs/Protocols/Parsable.html). Or you can just use our predefined class [`SimplePrefixQueryDataSource`](https://rawgit.com/Ramotion/reel-search/master/docs/Structs/SimplePrefixQueryDataSource.html), which has its `ResultType` set to `String`. 63 | 64 | Now you can use those types as generic parameters of type declaration of `RAMReel`: 65 | 66 | ~~~swift 67 | RAMReel 68 | ~~~ 69 | 70 | ### Values 71 | Next you need to create an instance of `RAMReel`, and for that you need the following: 72 | 73 | - **`frame: CGRect`**: Rect, specifying where you want to put the control. 74 | - **`dataSource: DataSource`**: the source of data for the reel. 75 | - **`placeholder: String`** (*optional*): Placeholder text; by default, an empty string is used. 76 | - **`hook: DataSource.ResultType -> Void`** (*optional*): Action to perform on element selection, `nil` by default. You can add additional hooks later, if you need multiple actions performed. 77 | 78 | Let's use it to create an instance of `RAMReel`: 79 | 80 | ~~~swift 81 | let ramReel = RAMReel(frame: frame, dataSource: dataSource, placeholder: placeholder, hook: hook) 82 | ~~~ 83 | 84 | ### Adding action hooks 85 | 86 | To add extra actions you may append `DataSource.ResultType -> Void` functions to `RAMReel` object property `hooks`: 87 | 88 | ~~~swift 89 | ramReel.hooks.append { data in 90 | // your code goes here 91 | } 92 | ~~~ 93 | 94 | ### Putting on the view 95 | 96 | And the final step, showing `RAMReel` on your view: 97 | 98 | ~~~swift 99 | ramReel.view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] 100 | yourView.addSubview(ramReel.view) 101 | ~~~ 102 | 103 | If you have visual problems, try calling [`prepareForViewing`](https://rawgit.com/Ramotion/reel-search/master/docs/Classes/RAMReel.html#/s:FC7RAMReel7RAMReel17prepareForViewingu1_Rdq_CSo20UICollectionViewCellq_S_16ConfigurableCelldq0_CSo11UITextFieldq1_S_14FlowDataSourceqq_S2_8DataTypeS_8Parsableqq_S2_8DataTypeS_10Renderablezqq_S2_8DataTypeqq1_S4_10ResultTypezqq1_S4_9QueryTypeSS_FGS0_q_q0_q1__FT_T_) before showing your view. 104 | 105 | Like this: 106 | 107 | ~~~swift 108 | override func viewDidLayoutSubviews() { 109 | super.viewDidLayoutSubviews() 110 | ramReel.prepareForViewing() 111 | } 112 | ~~~ 113 | 114 | ### Theming 115 | 116 | If you want to change `RAMReel` look and feel, you can use theming. 117 | 118 | To do so, you just to have to implement the [`Theme`](https://rawgit.com/Ramotion/reel-search/master/docs/Protocols/Theme.html) protocol in your class/structure and set your `RAMReel` object's `theme` property to your theme. 119 | 120 | Or you can just use the predefined instance of type [`RAMTheme`](https://rawgit.com/Ramotion/reel-search/master/docs/Structs/RAMTheme.html). 121 | 122 | ~~~swift 123 | let textColor: UIColor 124 | let listBackgroundColor: UIColor 125 | let font: UIFont 126 | 127 | let theme = RAMTheme(textColor: textColor, listBackgroundColor: listBackgroundColor, font: font) 128 | ~~~ 129 | 130 | ### Docs 131 | 132 | [![CocoaPods](https://img.shields.io/cocoapods/metrics/doc-percent/RAMReel.svg)](https://rawgit.com/Ramotion/reel-search/master/docs/index.html) 133 | 134 | See more at [RAMReel docs](https://rawgit.com/Ramotion/reel-search/master/docs/index.html) 135 | 136 |
137 | 138 | ## 📄 License 139 | 140 | Reel Search is released under the MIT license. 141 | See [LICENSE](./LICENSE) for details. 142 | 143 | This library is a part of a selection of our best UI open-source projects. 144 | 145 | If you use the open-source library in your project, please make sure to credit and backlink to www.ramotion.com 146 | 147 | ## 📱 Get the Showroom App for iOS to give it a try 148 | Try this UI component and more like this in our iOS app. Contact us if interested. 149 | 150 | 151 | 152 | 153 | 154 | 155 |
156 |
157 | -------------------------------------------------------------------------------- /Sources: -------------------------------------------------------------------------------- 1 | RAMReel/Framework/ -------------------------------------------------------------------------------- /docs/Extensions/UIImage.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | UIImage Extension Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |

RAMReel Docs (93% documented)

18 |
19 |
20 |
21 | 26 |
27 |
28 | 118 |
119 |
120 |
121 |

UIImage

122 |

Undocumented

123 | 124 |
125 |
126 |
127 |
    128 |
  • 129 |
    130 | 131 | 132 | 133 | tintedImage(_:) 134 | 135 |
    136 |
    137 |
    138 |
    139 |
    140 |
    141 |

    Undocumented

    142 | 143 |
    144 |
    145 |
    146 |
  • 147 |
148 |
149 |
150 |
151 | 155 |
156 |
157 | 158 | 159 | 160 | -------------------------------------------------------------------------------- /docs/Extensions/UITextField.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | UITextField Extension Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |

RAMReel Docs (96% documented)

18 |
19 |
20 |
21 | 26 |
27 |
28 | 114 |
115 |
116 |
117 |

UITextField

118 |
119 |
120 |
class UITextField : UIControl, UITextInput, NSCoding
121 | 122 |
123 |
124 | 125 |
126 |
127 |
128 |
    129 |
  • 130 |
    131 | 132 | 133 | 134 | tintColor 135 | 136 |
    137 |
    138 |
    139 |
    140 |
    141 |
    142 |

    Overriding UITextField tintColor property to make it affect close image tint color.

    143 | 144 |
    145 |
    146 |

    Declaration

    147 |
    148 |

    Swift

    149 |
    public override var tintColor: UIColor!
    150 | 151 |
    152 |
    153 |
    154 |
    155 |
  • 156 |
157 |
158 |
159 |
160 | 164 |
165 |
166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /docs/Generic Type Parameters.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Generic Type Parameters Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 |
16 |

RAMReel Docs (93% documented)

17 |
18 |
19 |
20 | 25 |
26 |
27 | 117 |
118 |
119 |
120 |

Generic Type Parameters

121 |

The following generic type parameters are available globally.

122 | 123 |
124 |
125 |
126 | 133 |
    134 |
  • 135 |
    136 | 137 | 138 | 139 | DS 140 | 141 |
    142 |
    143 |
    144 |
    145 |
    146 |
    147 |

    Undocumented

    148 | 149 |
    150 |
    151 |
    152 |
  • 153 |
154 |
155 |
156 |
157 | 161 |
162 |
163 | 164 | 165 | 166 | -------------------------------------------------------------------------------- /docs/Protocols/FlowDataDestination.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | FlowDataDestination Protocol Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |

RAMReel Docs (93% documented)

18 |
19 |
20 |
21 | 26 |
27 |
28 | 118 |
119 |
120 |
121 |

FlowDataDestination

122 |

Undocumented

123 | 124 |
125 |
126 |
127 |
    128 |
  • 129 |
    130 | 131 | 132 | 133 | processData(_:) 134 | 135 |
    136 |
    137 |
    138 |
    139 |
    140 |
    141 |

    Undocumented

    142 | 143 |
    144 |
    145 |
    146 |
  • 147 |
148 |
149 |
150 |
151 | 155 |
156 |
157 | 158 | 159 | 160 | -------------------------------------------------------------------------------- /docs/Protocols/FlowDataSource.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | FlowDataSource Protocol Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |

RAMReel Docs (93% documented)

18 |
19 |
20 |
21 | 26 |
27 |
28 | 118 |
119 |
120 |
121 |

FlowDataSource

122 |

Undocumented

123 | 124 |
125 |
126 |
127 |
    128 |
  • 129 |
    130 | 131 | 132 | 133 | resultsForQuery(_:) 134 | 135 |
    136 |
    137 |
    138 |
    139 |
    140 |
    141 |

    Undocumented

    142 | 143 |
    144 |
    145 |
    146 |
  • 147 |
148 |
149 |
150 |
151 | 155 |
156 |
157 | 158 | 159 | 160 | -------------------------------------------------------------------------------- /docs/Protocols/Renderable.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Renderable Protocol Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |

RAMReel Docs (93% documented)

18 |
19 |
20 |
21 | 26 |
27 |
28 | 118 |
119 |
120 |
121 |

Renderable

122 |
123 |
124 |
public protocol Renderable
125 | 126 |
127 |
128 |

Renderable

129 | 130 |

Types that implement this protocol are expected to have string representation. 131 | This protocol is separated from Printable and it’s description property on purpose.

132 | 133 |
134 |
135 |
136 |
    137 |
  • 138 |
    139 | 140 | 141 | 142 | render() 143 | 144 |
    145 |
    146 |
    147 |
    148 |
    149 |
    150 |

    Implement this method in order to be able to put data to textField field 151 | Simplest implementation may return just object description

    152 | 153 |
    154 |
    155 |

    Declaration

    156 |
    157 |

    Swift

    158 |
    func render() -> String
    159 | 160 |
    161 |
    162 |
    163 |
    164 |
  • 165 |
166 |
167 |
168 |
169 | 173 |
174 |
175 | 176 | 177 | 178 | -------------------------------------------------------------------------------- /docs/Structs/SimplePrefixQueryDataSource.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | SimplePrefixQueryDataSource Struct Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |

RAMReel Docs (93% documented)

18 |
19 |
20 |
21 | 26 |
27 |
28 | 118 |
119 |
120 |
121 |

SimplePrefixQueryDataSource

122 |

Undocumented

123 | 124 |
125 |
126 |
127 |
    128 |
  • 129 |
    130 | 131 | 132 | 133 | init(_:) 134 | 135 |
    136 |
    137 |
    138 |
    139 |
    140 |
    141 |

    Undocumented

    142 | 143 |
    144 |
    145 |
    146 |
  • 147 |
  • 148 |
    149 | 150 | 151 | 152 | resultsForQuery(_:) 153 | 154 |
    155 |
    156 |
    157 |
    158 |
    159 |
    160 |

    Undocumented

    161 | 162 |
    163 |
    164 |
    165 |
  • 166 |
167 |
168 |
169 |
170 | 174 |
175 |
176 | 177 | 178 | 179 | -------------------------------------------------------------------------------- /docs/Typealiases.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Typealiases Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 |
16 |

RAMReel Docs (93% documented)

17 |
18 |
19 |
20 | 25 |
26 |
27 | 117 |
118 |
119 |
120 |

Typealiases

121 |

The following typealiases are available globally.

122 | 123 |
124 |
125 |
126 |
127 | 128 | 129 | 130 |

String conversions

131 |
132 |
133 |
    134 |
  • 135 |
    136 | 137 | 138 | 139 | HookType 140 | 141 |
    142 |
    143 |
    144 |
    145 |
    146 |
    147 |

    Type of selected item change callback hook

    148 | 149 |
    150 |
    151 |

    Declaration

    152 |
    153 |

    Swift

    154 |
    public typealias HookType = (DataSource.ResultType) -> ()
    155 | 156 |
    157 |
    158 |
    159 |
    160 |
  • 161 |
162 |
163 |
164 |
165 | 169 |
170 |
171 | 172 | 173 | 174 | -------------------------------------------------------------------------------- /docs/css/highlight.css: -------------------------------------------------------------------------------- 1 | /* Credit to https://gist.github.com/wataru420/2048287 */ 2 | .highlight { 3 | /* Comment */ 4 | /* Error */ 5 | /* Keyword */ 6 | /* Operator */ 7 | /* Comment.Multiline */ 8 | /* Comment.Preproc */ 9 | /* Comment.Single */ 10 | /* Comment.Special */ 11 | /* Generic.Deleted */ 12 | /* Generic.Deleted.Specific */ 13 | /* Generic.Emph */ 14 | /* Generic.Error */ 15 | /* Generic.Heading */ 16 | /* Generic.Inserted */ 17 | /* Generic.Inserted.Specific */ 18 | /* Generic.Output */ 19 | /* Generic.Prompt */ 20 | /* Generic.Strong */ 21 | /* Generic.Subheading */ 22 | /* Generic.Traceback */ 23 | /* Keyword.Constant */ 24 | /* Keyword.Declaration */ 25 | /* Keyword.Pseudo */ 26 | /* Keyword.Reserved */ 27 | /* Keyword.Type */ 28 | /* Literal.Number */ 29 | /* Literal.String */ 30 | /* Name.Attribute */ 31 | /* Name.Builtin */ 32 | /* Name.Class */ 33 | /* Name.Constant */ 34 | /* Name.Entity */ 35 | /* Name.Exception */ 36 | /* Name.Function */ 37 | /* Name.Namespace */ 38 | /* Name.Tag */ 39 | /* Name.Variable */ 40 | /* Operator.Word */ 41 | /* Text.Whitespace */ 42 | /* Literal.Number.Float */ 43 | /* Literal.Number.Hex */ 44 | /* Literal.Number.Integer */ 45 | /* Literal.Number.Oct */ 46 | /* Literal.String.Backtick */ 47 | /* Literal.String.Char */ 48 | /* Literal.String.Doc */ 49 | /* Literal.String.Double */ 50 | /* Literal.String.Escape */ 51 | /* Literal.String.Heredoc */ 52 | /* Literal.String.Interpol */ 53 | /* Literal.String.Other */ 54 | /* Literal.String.Regex */ 55 | /* Literal.String.Single */ 56 | /* Literal.String.Symbol */ 57 | /* Name.Builtin.Pseudo */ 58 | /* Name.Variable.Class */ 59 | /* Name.Variable.Global */ 60 | /* Name.Variable.Instance */ 61 | /* Literal.Number.Integer.Long */ } 62 | .highlight .c { 63 | color: #999988; 64 | font-style: italic; } 65 | .highlight .err { 66 | color: #a61717; 67 | background-color: #e3d2d2; } 68 | .highlight .k { 69 | color: #000000; 70 | font-weight: bold; } 71 | .highlight .o { 72 | color: #000000; 73 | font-weight: bold; } 74 | .highlight .cm { 75 | color: #999988; 76 | font-style: italic; } 77 | .highlight .cp { 78 | color: #999999; 79 | font-weight: bold; } 80 | .highlight .c1 { 81 | color: #999988; 82 | font-style: italic; } 83 | .highlight .cs { 84 | color: #999999; 85 | font-weight: bold; 86 | font-style: italic; } 87 | .highlight .gd { 88 | color: #000000; 89 | background-color: #ffdddd; } 90 | .highlight .gd .x { 91 | color: #000000; 92 | background-color: #ffaaaa; } 93 | .highlight .ge { 94 | color: #000000; 95 | font-style: italic; } 96 | .highlight .gr { 97 | color: #aa0000; } 98 | .highlight .gh { 99 | color: #999999; } 100 | .highlight .gi { 101 | color: #000000; 102 | background-color: #ddffdd; } 103 | .highlight .gi .x { 104 | color: #000000; 105 | background-color: #aaffaa; } 106 | .highlight .go { 107 | color: #888888; } 108 | .highlight .gp { 109 | color: #555555; } 110 | .highlight .gs { 111 | font-weight: bold; } 112 | .highlight .gu { 113 | color: #aaaaaa; } 114 | .highlight .gt { 115 | color: #aa0000; } 116 | .highlight .kc { 117 | color: #000000; 118 | font-weight: bold; } 119 | .highlight .kd { 120 | color: #000000; 121 | font-weight: bold; } 122 | .highlight .kp { 123 | color: #000000; 124 | font-weight: bold; } 125 | .highlight .kr { 126 | color: #000000; 127 | font-weight: bold; } 128 | .highlight .kt { 129 | color: #445588; } 130 | .highlight .m { 131 | color: #009999; } 132 | .highlight .s { 133 | color: #d14; } 134 | .highlight .na { 135 | color: #008080; } 136 | .highlight .nb { 137 | color: #0086B3; } 138 | .highlight .nc { 139 | color: #445588; 140 | font-weight: bold; } 141 | .highlight .no { 142 | color: #008080; } 143 | .highlight .ni { 144 | color: #800080; } 145 | .highlight .ne { 146 | color: #990000; 147 | font-weight: bold; } 148 | .highlight .nf { 149 | color: #990000; } 150 | .highlight .nn { 151 | color: #555555; } 152 | .highlight .nt { 153 | color: #000080; } 154 | .highlight .nv { 155 | color: #008080; } 156 | .highlight .ow { 157 | color: #000000; 158 | font-weight: bold; } 159 | .highlight .w { 160 | color: #bbbbbb; } 161 | .highlight .mf { 162 | color: #009999; } 163 | .highlight .mh { 164 | color: #009999; } 165 | .highlight .mi { 166 | color: #009999; } 167 | .highlight .mo { 168 | color: #009999; } 169 | .highlight .sb { 170 | color: #d14; } 171 | .highlight .sc { 172 | color: #d14; } 173 | .highlight .sd { 174 | color: #d14; } 175 | .highlight .s2 { 176 | color: #d14; } 177 | .highlight .se { 178 | color: #d14; } 179 | .highlight .sh { 180 | color: #d14; } 181 | .highlight .si { 182 | color: #d14; } 183 | .highlight .sx { 184 | color: #d14; } 185 | .highlight .sr { 186 | color: #009926; } 187 | .highlight .s1 { 188 | color: #d14; } 189 | .highlight .ss { 190 | color: #990073; } 191 | .highlight .bp { 192 | color: #999999; } 193 | .highlight .vc { 194 | color: #008080; } 195 | .highlight .vg { 196 | color: #008080; } 197 | .highlight .vi { 198 | color: #008080; } 199 | .highlight .il { 200 | color: #009999; } 201 | -------------------------------------------------------------------------------- /docs/css/jazzy.css: -------------------------------------------------------------------------------- 1 | html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { 2 | background: transparent; 3 | border: 0; 4 | margin: 0; 5 | outline: 0; 6 | padding: 0; 7 | vertical-align: baseline; } 8 | 9 | body { 10 | background-color: #f2f2f2; 11 | font-family: Helvetica, freesans, Arial, sans-serif; 12 | font-size: 14px; 13 | -webkit-font-smoothing: subpixel-antialiased; 14 | word-wrap: break-word; } 15 | 16 | h1, h2, h3 { 17 | margin-top: 0.8em; 18 | margin-bottom: 0.3em; 19 | font-weight: 100; 20 | color: black; } 21 | 22 | h1 { 23 | font-size: 2.5em; } 24 | 25 | h2 { 26 | font-size: 2em; 27 | border-bottom: 1px solid #e2e2e2; } 28 | 29 | h4 { 30 | font-size: 13px; 31 | line-height: 1.5; 32 | margin-top: 21px; } 33 | 34 | h5 { 35 | font-size: 1.1em; } 36 | 37 | h6 { 38 | font-size: 1.1em; 39 | color: #777; } 40 | 41 | .section-name { 42 | color: gray; 43 | display: block; 44 | font-family: Helvetica; 45 | font-size: 22px; 46 | font-weight: 100; 47 | margin-bottom: 15px; } 48 | 49 | pre, code { 50 | font: 0.95em Menlo, monospace; 51 | color: #777; 52 | word-wrap: normal; } 53 | 54 | p code, li code { 55 | background-color: #eee; 56 | padding: 2px 4px; 57 | border-radius: 4px; } 58 | 59 | a { 60 | color: #0088cc; 61 | text-decoration: none; } 62 | 63 | ul { 64 | padding-left: 15px; } 65 | 66 | li { 67 | line-height: 1.8em; } 68 | 69 | img { 70 | max-width: 100%; } 71 | 72 | blockquote { 73 | margin-left: 0; 74 | padding: 0 10px; 75 | border-left: 4px solid #ccc; } 76 | 77 | .content-wrapper { 78 | margin: 0 auto; 79 | width: 980px; } 80 | 81 | header { 82 | font-size: 0.85em; 83 | line-height: 26px; 84 | background-color: #414141; 85 | position: fixed; 86 | width: 100%; 87 | z-index: 1; } 88 | header img { 89 | padding-right: 6px; 90 | vertical-align: -4px; 91 | height: 16px; } 92 | header a { 93 | color: #fff; } 94 | header p { 95 | float: left; 96 | color: #999; } 97 | header .header-right { 98 | float: right; 99 | margin-left: 16px; } 100 | 101 | #breadcrumbs { 102 | background-color: #f2f2f2; 103 | height: 27px; 104 | padding-top: 17px; 105 | position: fixed; 106 | width: 100%; 107 | z-index: 1; 108 | margin-top: 26px; } 109 | #breadcrumbs #carat { 110 | height: 10px; 111 | margin: 0 5px; } 112 | 113 | .sidebar { 114 | background-color: #f9f9f9; 115 | border: 1px solid #e2e2e2; 116 | overflow-y: auto; 117 | overflow-x: hidden; 118 | position: fixed; 119 | top: 70px; 120 | bottom: 0; 121 | width: 230px; 122 | word-wrap: normal; } 123 | 124 | .nav-groups { 125 | list-style-type: none; 126 | background: #fff; 127 | padding-left: 0; } 128 | 129 | .nav-group-name { 130 | border-bottom: 1px solid #e2e2e2; 131 | font-size: 1.1em; 132 | font-weight: 100; 133 | padding: 15px 0 15px 20px; } 134 | .nav-group-name > a { 135 | color: #333; } 136 | 137 | .nav-group-tasks { 138 | margin-top: 5px; } 139 | 140 | .nav-group-task { 141 | font-size: 0.9em; 142 | list-style-type: none; 143 | white-space: nowrap; } 144 | .nav-group-task a { 145 | color: #888; } 146 | 147 | .main-content { 148 | background-color: #fff; 149 | border: 1px solid #e2e2e2; 150 | margin-left: 246px; 151 | position: absolute; 152 | overflow: hidden; 153 | padding-bottom: 60px; 154 | top: 70px; 155 | width: 734px; } 156 | .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { 157 | margin-bottom: 1em; } 158 | .main-content p { 159 | line-height: 1.8em; } 160 | .main-content section .section:first-child { 161 | margin-top: 0; 162 | padding-top: 0; } 163 | .main-content section .task-group-section .task-group:first-of-type { 164 | padding-top: 10px; } 165 | .main-content section .task-group-section .task-group:first-of-type .section-name { 166 | padding-top: 15px; } 167 | 168 | .section { 169 | padding: 0 25px; } 170 | 171 | .highlight { 172 | background-color: #eee; 173 | padding: 10px 12px; 174 | border: 1px solid #e2e2e2; 175 | border-radius: 4px; 176 | overflow-x: auto; } 177 | 178 | .declaration .highlight { 179 | overflow-x: initial; 180 | padding: 0 40px 40px 0; 181 | margin-bottom: -25px; 182 | background-color: transparent; 183 | border: none; } 184 | 185 | .section-name { 186 | margin: 0; 187 | margin-left: 18px; } 188 | 189 | .task-group-section { 190 | padding-left: 6px; 191 | border-top: 1px solid #e2e2e2; } 192 | 193 | .task-group { 194 | padding-top: 0px; } 195 | 196 | .task-name-container a[name]:before { 197 | content: ""; 198 | display: block; 199 | padding-top: 70px; 200 | margin: -70px 0 0; } 201 | 202 | .item { 203 | padding-top: 8px; 204 | width: 100%; 205 | list-style-type: none; } 206 | .item a[name]:before { 207 | content: ""; 208 | display: block; 209 | padding-top: 70px; 210 | margin: -70px 0 0; } 211 | .item code { 212 | background-color: transparent; 213 | padding: 0; } 214 | .item .token { 215 | padding-left: 3px; 216 | margin-left: 15px; 217 | font-size: 11.9px; } 218 | .item .declaration-note { 219 | font-size: .85em; 220 | color: gray; 221 | font-style: italic; } 222 | 223 | .pointer-container { 224 | border-bottom: 1px solid #e2e2e2; 225 | left: -23px; 226 | padding-bottom: 13px; 227 | position: relative; 228 | width: 110%; } 229 | 230 | .pointer { 231 | background: #f9f9f9; 232 | border-left: 1px solid #e2e2e2; 233 | border-top: 1px solid #e2e2e2; 234 | height: 12px; 235 | left: 21px; 236 | top: -7px; 237 | -webkit-transform: rotate(45deg); 238 | -moz-transform: rotate(45deg); 239 | -o-transform: rotate(45deg); 240 | transform: rotate(45deg); 241 | position: absolute; 242 | width: 12px; } 243 | 244 | .height-container { 245 | display: none; 246 | left: -25px; 247 | padding: 0 25px; 248 | position: relative; 249 | width: 100%; 250 | overflow: hidden; } 251 | .height-container .section { 252 | background: #f9f9f9; 253 | border-bottom: 1px solid #e2e2e2; 254 | left: -25px; 255 | position: relative; 256 | width: 100%; 257 | padding-top: 10px; 258 | padding-bottom: 5px; } 259 | 260 | .aside, .language { 261 | padding: 6px 12px; 262 | margin: 12px 0; 263 | border-left: 5px solid #dddddd; 264 | overflow-y: hidden; } 265 | .aside .aside-title, .language .aside-title { 266 | font-size: 9px; 267 | letter-spacing: 2px; 268 | text-transform: uppercase; 269 | padding-bottom: 0; 270 | margin: 0; 271 | color: #aaa; 272 | -webkit-user-select: none; } 273 | .aside p:last-child, .language p:last-child { 274 | margin-bottom: 0; } 275 | 276 | .language { 277 | border-left: 5px solid #cde9f4; } 278 | .language .aside-title { 279 | color: #4b8afb; } 280 | 281 | .aside-warning { 282 | border-left: 5px solid #ff6666; } 283 | .aside-warning .aside-title { 284 | color: #ff0000; } 285 | 286 | .graybox { 287 | border-collapse: collapse; 288 | width: 100%; } 289 | .graybox p { 290 | margin: 0; 291 | word-break: break-word; 292 | min-width: 50px; } 293 | .graybox td { 294 | border: 1px solid #e2e2e2; 295 | padding: 5px 25px 5px 10px; 296 | vertical-align: middle; } 297 | .graybox tr td:first-of-type { 298 | text-align: right; 299 | padding: 7px; 300 | vertical-align: top; 301 | word-break: normal; 302 | width: 40px; } 303 | 304 | .slightly-smaller { 305 | font-size: 0.9em; } 306 | 307 | #footer { 308 | position: absolute; 309 | bottom: 10px; 310 | margin-left: 25px; } 311 | #footer p { 312 | margin: 0; 313 | color: #aaa; 314 | font-size: 0.8em; } 315 | 316 | html.dash header, html.dash #breadcrumbs, html.dash .sidebar { 317 | display: none; } 318 | html.dash .main-content { 319 | width: 980px; 320 | margin-left: 0; 321 | border: none; 322 | width: 100%; 323 | top: 0; 324 | padding-bottom: 0; } 325 | html.dash .height-container { 326 | display: block; } 327 | html.dash .item .token { 328 | margin-left: 0; } 329 | html.dash .content-wrapper { 330 | width: auto; } 331 | html.dash #footer { 332 | position: static; } 333 | -------------------------------------------------------------------------------- /docs/docsets/RAMReel.docset/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleIdentifier 6 | com.jazzy.ramreel 7 | CFBundleName 8 | RAMReel 9 | DocSetPlatformFamily 10 | ramreel 11 | isDashDocset 12 | 13 | dashIndexFilePath 14 | index.html 15 | isJavaScriptEnabled 16 | 17 | DashDocSetFamily 18 | dashtoc 19 | 20 | 21 | -------------------------------------------------------------------------------- /docs/docsets/RAMReel.docset/Contents/Resources/Documents/Extensions/UIImage.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | UIImage Extension Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |

RAMReel Docs (93% documented)

18 |
19 |
20 |
21 | 26 |
27 |
28 | 118 |
119 |
120 |
121 |

UIImage

122 |

Undocumented

123 | 124 |
125 |
126 |
127 |
    128 |
  • 129 |
    130 | 131 | 132 | 133 | tintedImage(_:) 134 | 135 |
    136 |
    137 |
    138 |
    139 |
    140 |
    141 |

    Undocumented

    142 | 143 |
    144 |
    145 |
    146 |
  • 147 |
148 |
149 |
150 |
151 | 155 |
156 |
157 | 158 | 159 | 160 | -------------------------------------------------------------------------------- /docs/docsets/RAMReel.docset/Contents/Resources/Documents/Extensions/UITextField.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | UITextField Extension Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |

RAMReel Docs (96% documented)

18 |
19 |
20 |
21 | 26 |
27 |
28 | 114 |
115 |
116 |
117 |

UITextField

118 |
119 |
120 |
class UITextField : UIControl, UITextInput, NSCoding
121 | 122 |
123 |
124 | 125 |
126 |
127 |
128 |
    129 |
  • 130 |
    131 | 132 | 133 | 134 | tintColor 135 | 136 |
    137 |
    138 |
    139 |
    140 |
    141 |
    142 |

    Overriding UITextField tintColor property to make it affect close image tint color.

    143 | 144 |
    145 |
    146 |

    Declaration

    147 |
    148 |

    Swift

    149 |
    public override var tintColor: UIColor!
    150 | 151 |
    152 |
    153 |
    154 |
    155 |
  • 156 |
157 |
158 |
159 |
160 | 164 |
165 |
166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /docs/docsets/RAMReel.docset/Contents/Resources/Documents/Generic Type Parameters.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Generic Type Parameters Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 |
16 |

RAMReel Docs (93% documented)

17 |
18 |
19 |
20 | 25 |
26 |
27 | 117 |
118 |
119 |
120 |

Generic Type Parameters

121 |

The following generic type parameters are available globally.

122 | 123 |
124 |
125 |
126 | 133 |
    134 |
  • 135 |
    136 | 137 | 138 | 139 | DS 140 | 141 |
    142 |
    143 |
    144 |
    145 |
    146 |
    147 |

    Undocumented

    148 | 149 |
    150 |
    151 |
    152 |
  • 153 |
154 |
155 |
156 |
157 | 161 |
162 |
163 | 164 | 165 | 166 | -------------------------------------------------------------------------------- /docs/docsets/RAMReel.docset/Contents/Resources/Documents/Protocols/FlowDataDestination.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | FlowDataDestination Protocol Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |

RAMReel Docs (93% documented)

18 |
19 |
20 |
21 | 26 |
27 |
28 | 118 |
119 |
120 |
121 |

FlowDataDestination

122 |

Undocumented

123 | 124 |
125 |
126 |
127 |
    128 |
  • 129 |
    130 | 131 | 132 | 133 | processData(_:) 134 | 135 |
    136 |
    137 |
    138 |
    139 |
    140 |
    141 |

    Undocumented

    142 | 143 |
    144 |
    145 |
    146 |
  • 147 |
148 |
149 |
150 |
151 | 155 |
156 |
157 | 158 | 159 | 160 | -------------------------------------------------------------------------------- /docs/docsets/RAMReel.docset/Contents/Resources/Documents/Protocols/FlowDataSource.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | FlowDataSource Protocol Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |

RAMReel Docs (93% documented)

18 |
19 |
20 |
21 | 26 |
27 |
28 | 118 |
119 |
120 |
121 |

FlowDataSource

122 |

Undocumented

123 | 124 |
125 |
126 |
127 |
    128 |
  • 129 |
    130 | 131 | 132 | 133 | resultsForQuery(_:) 134 | 135 |
    136 |
    137 |
    138 |
    139 |
    140 |
    141 |

    Undocumented

    142 | 143 |
    144 |
    145 |
    146 |
  • 147 |
148 |
149 |
150 |
151 | 155 |
156 |
157 | 158 | 159 | 160 | -------------------------------------------------------------------------------- /docs/docsets/RAMReel.docset/Contents/Resources/Documents/Protocols/Renderable.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Renderable Protocol Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |

RAMReel Docs (93% documented)

18 |
19 |
20 |
21 | 26 |
27 |
28 | 118 |
119 |
120 |
121 |

Renderable

122 |
123 |
124 |
public protocol Renderable
125 | 126 |
127 |
128 |

Renderable

129 | 130 |

Types that implement this protocol are expected to have string representation. 131 | This protocol is separated from Printable and it’s description property on purpose.

132 | 133 |
134 |
135 |
136 |
    137 |
  • 138 |
    139 | 140 | 141 | 142 | render() 143 | 144 |
    145 |
    146 |
    147 |
    148 |
    149 |
    150 |

    Implement this method in order to be able to put data to textField field 151 | Simplest implementation may return just object description

    152 | 153 |
    154 |
    155 |

    Declaration

    156 |
    157 |

    Swift

    158 |
    func render() -> String
    159 | 160 |
    161 |
    162 |
    163 |
    164 |
  • 165 |
166 |
167 |
168 |
169 | 173 |
174 |
175 | 176 | 177 | 178 | -------------------------------------------------------------------------------- /docs/docsets/RAMReel.docset/Contents/Resources/Documents/Structs/SimplePrefixQueryDataSource.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | SimplePrefixQueryDataSource Struct Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |

RAMReel Docs (93% documented)

18 |
19 |
20 |
21 | 26 |
27 |
28 | 118 |
119 |
120 |
121 |

SimplePrefixQueryDataSource

122 |

Undocumented

123 | 124 |
125 |
126 |
127 |
    128 |
  • 129 |
    130 | 131 | 132 | 133 | init(_:) 134 | 135 |
    136 |
    137 |
    138 |
    139 |
    140 |
    141 |

    Undocumented

    142 | 143 |
    144 |
    145 |
    146 |
  • 147 |
  • 148 |
    149 | 150 | 151 | 152 | resultsForQuery(_:) 153 | 154 |
    155 |
    156 |
    157 |
    158 |
    159 |
    160 |

    Undocumented

    161 | 162 |
    163 |
    164 |
    165 |
  • 166 |
167 |
168 |
169 |
170 | 174 |
175 |
176 | 177 | 178 | 179 | -------------------------------------------------------------------------------- /docs/docsets/RAMReel.docset/Contents/Resources/Documents/Typealiases.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Typealiases Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 |
16 |

RAMReel Docs (93% documented)

17 |
18 |
19 |
20 | 25 |
26 |
27 | 117 |
118 |
119 |
120 |

Typealiases

121 |

The following typealiases are available globally.

122 | 123 |
124 |
125 |
126 |
127 | 128 | 129 | 130 |

String conversions

131 |
132 |
133 |
    134 |
  • 135 |
    136 | 137 | 138 | 139 | HookType 140 | 141 |
    142 |
    143 |
    144 |
    145 |
    146 |
    147 |

    Type of selected item change callback hook

    148 | 149 |
    150 |
    151 |

    Declaration

    152 |
    153 |

    Swift

    154 |
    public typealias HookType = (DataSource.ResultType) -> ()
    155 | 156 |
    157 |
    158 |
    159 |
    160 |
  • 161 |
162 |
163 |
164 |
165 | 169 |
170 |
171 | 172 | 173 | 174 | -------------------------------------------------------------------------------- /docs/docsets/RAMReel.docset/Contents/Resources/Documents/css/highlight.css: -------------------------------------------------------------------------------- 1 | /* Credit to https://gist.github.com/wataru420/2048287 */ 2 | .highlight { 3 | /* Comment */ 4 | /* Error */ 5 | /* Keyword */ 6 | /* Operator */ 7 | /* Comment.Multiline */ 8 | /* Comment.Preproc */ 9 | /* Comment.Single */ 10 | /* Comment.Special */ 11 | /* Generic.Deleted */ 12 | /* Generic.Deleted.Specific */ 13 | /* Generic.Emph */ 14 | /* Generic.Error */ 15 | /* Generic.Heading */ 16 | /* Generic.Inserted */ 17 | /* Generic.Inserted.Specific */ 18 | /* Generic.Output */ 19 | /* Generic.Prompt */ 20 | /* Generic.Strong */ 21 | /* Generic.Subheading */ 22 | /* Generic.Traceback */ 23 | /* Keyword.Constant */ 24 | /* Keyword.Declaration */ 25 | /* Keyword.Pseudo */ 26 | /* Keyword.Reserved */ 27 | /* Keyword.Type */ 28 | /* Literal.Number */ 29 | /* Literal.String */ 30 | /* Name.Attribute */ 31 | /* Name.Builtin */ 32 | /* Name.Class */ 33 | /* Name.Constant */ 34 | /* Name.Entity */ 35 | /* Name.Exception */ 36 | /* Name.Function */ 37 | /* Name.Namespace */ 38 | /* Name.Tag */ 39 | /* Name.Variable */ 40 | /* Operator.Word */ 41 | /* Text.Whitespace */ 42 | /* Literal.Number.Float */ 43 | /* Literal.Number.Hex */ 44 | /* Literal.Number.Integer */ 45 | /* Literal.Number.Oct */ 46 | /* Literal.String.Backtick */ 47 | /* Literal.String.Char */ 48 | /* Literal.String.Doc */ 49 | /* Literal.String.Double */ 50 | /* Literal.String.Escape */ 51 | /* Literal.String.Heredoc */ 52 | /* Literal.String.Interpol */ 53 | /* Literal.String.Other */ 54 | /* Literal.String.Regex */ 55 | /* Literal.String.Single */ 56 | /* Literal.String.Symbol */ 57 | /* Name.Builtin.Pseudo */ 58 | /* Name.Variable.Class */ 59 | /* Name.Variable.Global */ 60 | /* Name.Variable.Instance */ 61 | /* Literal.Number.Integer.Long */ } 62 | .highlight .c { 63 | color: #999988; 64 | font-style: italic; } 65 | .highlight .err { 66 | color: #a61717; 67 | background-color: #e3d2d2; } 68 | .highlight .k { 69 | color: #000000; 70 | font-weight: bold; } 71 | .highlight .o { 72 | color: #000000; 73 | font-weight: bold; } 74 | .highlight .cm { 75 | color: #999988; 76 | font-style: italic; } 77 | .highlight .cp { 78 | color: #999999; 79 | font-weight: bold; } 80 | .highlight .c1 { 81 | color: #999988; 82 | font-style: italic; } 83 | .highlight .cs { 84 | color: #999999; 85 | font-weight: bold; 86 | font-style: italic; } 87 | .highlight .gd { 88 | color: #000000; 89 | background-color: #ffdddd; } 90 | .highlight .gd .x { 91 | color: #000000; 92 | background-color: #ffaaaa; } 93 | .highlight .ge { 94 | color: #000000; 95 | font-style: italic; } 96 | .highlight .gr { 97 | color: #aa0000; } 98 | .highlight .gh { 99 | color: #999999; } 100 | .highlight .gi { 101 | color: #000000; 102 | background-color: #ddffdd; } 103 | .highlight .gi .x { 104 | color: #000000; 105 | background-color: #aaffaa; } 106 | .highlight .go { 107 | color: #888888; } 108 | .highlight .gp { 109 | color: #555555; } 110 | .highlight .gs { 111 | font-weight: bold; } 112 | .highlight .gu { 113 | color: #aaaaaa; } 114 | .highlight .gt { 115 | color: #aa0000; } 116 | .highlight .kc { 117 | color: #000000; 118 | font-weight: bold; } 119 | .highlight .kd { 120 | color: #000000; 121 | font-weight: bold; } 122 | .highlight .kp { 123 | color: #000000; 124 | font-weight: bold; } 125 | .highlight .kr { 126 | color: #000000; 127 | font-weight: bold; } 128 | .highlight .kt { 129 | color: #445588; } 130 | .highlight .m { 131 | color: #009999; } 132 | .highlight .s { 133 | color: #d14; } 134 | .highlight .na { 135 | color: #008080; } 136 | .highlight .nb { 137 | color: #0086B3; } 138 | .highlight .nc { 139 | color: #445588; 140 | font-weight: bold; } 141 | .highlight .no { 142 | color: #008080; } 143 | .highlight .ni { 144 | color: #800080; } 145 | .highlight .ne { 146 | color: #990000; 147 | font-weight: bold; } 148 | .highlight .nf { 149 | color: #990000; } 150 | .highlight .nn { 151 | color: #555555; } 152 | .highlight .nt { 153 | color: #000080; } 154 | .highlight .nv { 155 | color: #008080; } 156 | .highlight .ow { 157 | color: #000000; 158 | font-weight: bold; } 159 | .highlight .w { 160 | color: #bbbbbb; } 161 | .highlight .mf { 162 | color: #009999; } 163 | .highlight .mh { 164 | color: #009999; } 165 | .highlight .mi { 166 | color: #009999; } 167 | .highlight .mo { 168 | color: #009999; } 169 | .highlight .sb { 170 | color: #d14; } 171 | .highlight .sc { 172 | color: #d14; } 173 | .highlight .sd { 174 | color: #d14; } 175 | .highlight .s2 { 176 | color: #d14; } 177 | .highlight .se { 178 | color: #d14; } 179 | .highlight .sh { 180 | color: #d14; } 181 | .highlight .si { 182 | color: #d14; } 183 | .highlight .sx { 184 | color: #d14; } 185 | .highlight .sr { 186 | color: #009926; } 187 | .highlight .s1 { 188 | color: #d14; } 189 | .highlight .ss { 190 | color: #990073; } 191 | .highlight .bp { 192 | color: #999999; } 193 | .highlight .vc { 194 | color: #008080; } 195 | .highlight .vg { 196 | color: #008080; } 197 | .highlight .vi { 198 | color: #008080; } 199 | .highlight .il { 200 | color: #009999; } 201 | -------------------------------------------------------------------------------- /docs/docsets/RAMReel.docset/Contents/Resources/Documents/css/jazzy.css: -------------------------------------------------------------------------------- 1 | html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { 2 | background: transparent; 3 | border: 0; 4 | margin: 0; 5 | outline: 0; 6 | padding: 0; 7 | vertical-align: baseline; } 8 | 9 | body { 10 | background-color: #f2f2f2; 11 | font-family: Helvetica, freesans, Arial, sans-serif; 12 | font-size: 14px; 13 | -webkit-font-smoothing: subpixel-antialiased; 14 | word-wrap: break-word; } 15 | 16 | h1, h2, h3 { 17 | margin-top: 0.8em; 18 | margin-bottom: 0.3em; 19 | font-weight: 100; 20 | color: black; } 21 | 22 | h1 { 23 | font-size: 2.5em; } 24 | 25 | h2 { 26 | font-size: 2em; 27 | border-bottom: 1px solid #e2e2e2; } 28 | 29 | h4 { 30 | font-size: 13px; 31 | line-height: 1.5; 32 | margin-top: 21px; } 33 | 34 | h5 { 35 | font-size: 1.1em; } 36 | 37 | h6 { 38 | font-size: 1.1em; 39 | color: #777; } 40 | 41 | .section-name { 42 | color: gray; 43 | display: block; 44 | font-family: Helvetica; 45 | font-size: 22px; 46 | font-weight: 100; 47 | margin-bottom: 15px; } 48 | 49 | pre, code { 50 | font: 0.95em Menlo, monospace; 51 | color: #777; 52 | word-wrap: normal; } 53 | 54 | p code, li code { 55 | background-color: #eee; 56 | padding: 2px 4px; 57 | border-radius: 4px; } 58 | 59 | a { 60 | color: #0088cc; 61 | text-decoration: none; } 62 | 63 | ul { 64 | padding-left: 15px; } 65 | 66 | li { 67 | line-height: 1.8em; } 68 | 69 | img { 70 | max-width: 100%; } 71 | 72 | blockquote { 73 | margin-left: 0; 74 | padding: 0 10px; 75 | border-left: 4px solid #ccc; } 76 | 77 | .content-wrapper { 78 | margin: 0 auto; 79 | width: 980px; } 80 | 81 | header { 82 | font-size: 0.85em; 83 | line-height: 26px; 84 | background-color: #414141; 85 | position: fixed; 86 | width: 100%; 87 | z-index: 1; } 88 | header img { 89 | padding-right: 6px; 90 | vertical-align: -4px; 91 | height: 16px; } 92 | header a { 93 | color: #fff; } 94 | header p { 95 | float: left; 96 | color: #999; } 97 | header .header-right { 98 | float: right; 99 | margin-left: 16px; } 100 | 101 | #breadcrumbs { 102 | background-color: #f2f2f2; 103 | height: 27px; 104 | padding-top: 17px; 105 | position: fixed; 106 | width: 100%; 107 | z-index: 1; 108 | margin-top: 26px; } 109 | #breadcrumbs #carat { 110 | height: 10px; 111 | margin: 0 5px; } 112 | 113 | .sidebar { 114 | background-color: #f9f9f9; 115 | border: 1px solid #e2e2e2; 116 | overflow-y: auto; 117 | overflow-x: hidden; 118 | position: fixed; 119 | top: 70px; 120 | bottom: 0; 121 | width: 230px; 122 | word-wrap: normal; } 123 | 124 | .nav-groups { 125 | list-style-type: none; 126 | background: #fff; 127 | padding-left: 0; } 128 | 129 | .nav-group-name { 130 | border-bottom: 1px solid #e2e2e2; 131 | font-size: 1.1em; 132 | font-weight: 100; 133 | padding: 15px 0 15px 20px; } 134 | .nav-group-name > a { 135 | color: #333; } 136 | 137 | .nav-group-tasks { 138 | margin-top: 5px; } 139 | 140 | .nav-group-task { 141 | font-size: 0.9em; 142 | list-style-type: none; 143 | white-space: nowrap; } 144 | .nav-group-task a { 145 | color: #888; } 146 | 147 | .main-content { 148 | background-color: #fff; 149 | border: 1px solid #e2e2e2; 150 | margin-left: 246px; 151 | position: absolute; 152 | overflow: hidden; 153 | padding-bottom: 60px; 154 | top: 70px; 155 | width: 734px; } 156 | .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { 157 | margin-bottom: 1em; } 158 | .main-content p { 159 | line-height: 1.8em; } 160 | .main-content section .section:first-child { 161 | margin-top: 0; 162 | padding-top: 0; } 163 | .main-content section .task-group-section .task-group:first-of-type { 164 | padding-top: 10px; } 165 | .main-content section .task-group-section .task-group:first-of-type .section-name { 166 | padding-top: 15px; } 167 | 168 | .section { 169 | padding: 0 25px; } 170 | 171 | .highlight { 172 | background-color: #eee; 173 | padding: 10px 12px; 174 | border: 1px solid #e2e2e2; 175 | border-radius: 4px; 176 | overflow-x: auto; } 177 | 178 | .declaration .highlight { 179 | overflow-x: initial; 180 | padding: 0 40px 40px 0; 181 | margin-bottom: -25px; 182 | background-color: transparent; 183 | border: none; } 184 | 185 | .section-name { 186 | margin: 0; 187 | margin-left: 18px; } 188 | 189 | .task-group-section { 190 | padding-left: 6px; 191 | border-top: 1px solid #e2e2e2; } 192 | 193 | .task-group { 194 | padding-top: 0px; } 195 | 196 | .task-name-container a[name]:before { 197 | content: ""; 198 | display: block; 199 | padding-top: 70px; 200 | margin: -70px 0 0; } 201 | 202 | .item { 203 | padding-top: 8px; 204 | width: 100%; 205 | list-style-type: none; } 206 | .item a[name]:before { 207 | content: ""; 208 | display: block; 209 | padding-top: 70px; 210 | margin: -70px 0 0; } 211 | .item code { 212 | background-color: transparent; 213 | padding: 0; } 214 | .item .token { 215 | padding-left: 3px; 216 | margin-left: 15px; 217 | font-size: 11.9px; } 218 | .item .declaration-note { 219 | font-size: .85em; 220 | color: gray; 221 | font-style: italic; } 222 | 223 | .pointer-container { 224 | border-bottom: 1px solid #e2e2e2; 225 | left: -23px; 226 | padding-bottom: 13px; 227 | position: relative; 228 | width: 110%; } 229 | 230 | .pointer { 231 | background: #f9f9f9; 232 | border-left: 1px solid #e2e2e2; 233 | border-top: 1px solid #e2e2e2; 234 | height: 12px; 235 | left: 21px; 236 | top: -7px; 237 | -webkit-transform: rotate(45deg); 238 | -moz-transform: rotate(45deg); 239 | -o-transform: rotate(45deg); 240 | transform: rotate(45deg); 241 | position: absolute; 242 | width: 12px; } 243 | 244 | .height-container { 245 | display: none; 246 | left: -25px; 247 | padding: 0 25px; 248 | position: relative; 249 | width: 100%; 250 | overflow: hidden; } 251 | .height-container .section { 252 | background: #f9f9f9; 253 | border-bottom: 1px solid #e2e2e2; 254 | left: -25px; 255 | position: relative; 256 | width: 100%; 257 | padding-top: 10px; 258 | padding-bottom: 5px; } 259 | 260 | .aside, .language { 261 | padding: 6px 12px; 262 | margin: 12px 0; 263 | border-left: 5px solid #dddddd; 264 | overflow-y: hidden; } 265 | .aside .aside-title, .language .aside-title { 266 | font-size: 9px; 267 | letter-spacing: 2px; 268 | text-transform: uppercase; 269 | padding-bottom: 0; 270 | margin: 0; 271 | color: #aaa; 272 | -webkit-user-select: none; } 273 | .aside p:last-child, .language p:last-child { 274 | margin-bottom: 0; } 275 | 276 | .language { 277 | border-left: 5px solid #cde9f4; } 278 | .language .aside-title { 279 | color: #4b8afb; } 280 | 281 | .aside-warning { 282 | border-left: 5px solid #ff6666; } 283 | .aside-warning .aside-title { 284 | color: #ff0000; } 285 | 286 | .graybox { 287 | border-collapse: collapse; 288 | width: 100%; } 289 | .graybox p { 290 | margin: 0; 291 | word-break: break-word; 292 | min-width: 50px; } 293 | .graybox td { 294 | border: 1px solid #e2e2e2; 295 | padding: 5px 25px 5px 10px; 296 | vertical-align: middle; } 297 | .graybox tr td:first-of-type { 298 | text-align: right; 299 | padding: 7px; 300 | vertical-align: top; 301 | word-break: normal; 302 | width: 40px; } 303 | 304 | .slightly-smaller { 305 | font-size: 0.9em; } 306 | 307 | #footer { 308 | position: absolute; 309 | bottom: 10px; 310 | margin-left: 25px; } 311 | #footer p { 312 | margin: 0; 313 | color: #aaa; 314 | font-size: 0.8em; } 315 | 316 | html.dash header, html.dash #breadcrumbs, html.dash .sidebar { 317 | display: none; } 318 | html.dash .main-content { 319 | width: 980px; 320 | margin-left: 0; 321 | border: none; 322 | width: 100%; 323 | top: 0; 324 | padding-bottom: 0; } 325 | html.dash .height-container { 326 | display: block; } 327 | html.dash .item .token { 328 | margin-left: 0; } 329 | html.dash .content-wrapper { 330 | width: auto; } 331 | html.dash #footer { 332 | position: static; } 333 | -------------------------------------------------------------------------------- /docs/docsets/RAMReel.docset/Contents/Resources/Documents/img/carat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/docs/docsets/RAMReel.docset/Contents/Resources/Documents/img/carat.png -------------------------------------------------------------------------------- /docs/docsets/RAMReel.docset/Contents/Resources/Documents/img/dash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/docs/docsets/RAMReel.docset/Contents/Resources/Documents/img/dash.png -------------------------------------------------------------------------------- /docs/docsets/RAMReel.docset/Contents/Resources/Documents/img/gh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/docs/docsets/RAMReel.docset/Contents/Resources/Documents/img/gh.png -------------------------------------------------------------------------------- /docs/docsets/RAMReel.docset/Contents/Resources/Documents/js/jazzy.js: -------------------------------------------------------------------------------- 1 | window.jazzy = {'docset': false} 2 | if (typeof window.dash != 'undefined') { 3 | document.documentElement.className += ' dash' 4 | window.jazzy.docset = true 5 | } 6 | if (navigator.userAgent.match(/xcode/i)) { 7 | document.documentElement.className += ' xcode' 8 | window.jazzy.docset = true 9 | } 10 | 11 | // On doc load, toggle the URL hash discussion if present 12 | $(document).ready(function() { 13 | if (!window.jazzy.docset) { 14 | var linkToHash = $('a[href="' + window.location.hash +'"]'); 15 | linkToHash.trigger("click"); 16 | } 17 | }); 18 | 19 | // On token click, toggle its discussion and animate token.marginLeft 20 | $(".token").click(function(event) { 21 | if (window.jazzy.docset) { 22 | return; 23 | } 24 | var link = $(this); 25 | var animationDuration = 300; 26 | var tokenOffset = "15px"; 27 | var original = link.css('marginLeft') == tokenOffset; 28 | link.animate({'margin-left':original ? "0px" : tokenOffset}, animationDuration); 29 | $content = link.parent().parent().next(); 30 | $content.slideToggle(animationDuration); 31 | 32 | // Keeps the document from jumping to the hash. 33 | var href = $(this).attr('href'); 34 | if (history.pushState) { 35 | history.pushState({}, '', href); 36 | } else { 37 | location.hash = href; 38 | } 39 | event.preventDefault(); 40 | }); 41 | -------------------------------------------------------------------------------- /docs/docsets/RAMReel.docset/Contents/Resources/Documents/undocumented.json: -------------------------------------------------------------------------------- 1 | { 2 | "warnings": [ 3 | { 4 | "file": "/Users/juriv/tmp/reel-search/RAMReel/Framework/TextFieldReactor.swift", 5 | "line": 30, 6 | "symbol": "DS", 7 | "symbol_kind": "source.lang.swift.decl.generic_type_param", 8 | "warning": "undocumented" 9 | } 10 | ], 11 | "source_directory": "/Users/juriv/tmp/reel-search" 12 | } -------------------------------------------------------------------------------- /docs/docsets/RAMReel.docset/Contents/Resources/docSet.dsidx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/docs/docsets/RAMReel.docset/Contents/Resources/docSet.dsidx -------------------------------------------------------------------------------- /docs/docsets/RAMReel.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/docs/docsets/RAMReel.tgz -------------------------------------------------------------------------------- /docs/img/carat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/docs/img/carat.png -------------------------------------------------------------------------------- /docs/img/dash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/docs/img/dash.png -------------------------------------------------------------------------------- /docs/img/gh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/docs/img/gh.png -------------------------------------------------------------------------------- /docs/js/jazzy.js: -------------------------------------------------------------------------------- 1 | window.jazzy = {'docset': false} 2 | if (typeof window.dash != 'undefined') { 3 | document.documentElement.className += ' dash' 4 | window.jazzy.docset = true 5 | } 6 | if (navigator.userAgent.match(/xcode/i)) { 7 | document.documentElement.className += ' xcode' 8 | window.jazzy.docset = true 9 | } 10 | 11 | // On doc load, toggle the URL hash discussion if present 12 | $(document).ready(function() { 13 | if (!window.jazzy.docset) { 14 | var linkToHash = $('a[href="' + window.location.hash +'"]'); 15 | linkToHash.trigger("click"); 16 | } 17 | }); 18 | 19 | // On token click, toggle its discussion and animate token.marginLeft 20 | $(".token").click(function(event) { 21 | if (window.jazzy.docset) { 22 | return; 23 | } 24 | var link = $(this); 25 | var animationDuration = 300; 26 | var tokenOffset = "15px"; 27 | var original = link.css('marginLeft') == tokenOffset; 28 | link.animate({'margin-left':original ? "0px" : tokenOffset}, animationDuration); 29 | $content = link.parent().parent().next(); 30 | $content.slideToggle(animationDuration); 31 | 32 | // Keeps the document from jumping to the hash. 33 | var href = $(this).attr('href'); 34 | if (history.pushState) { 35 | history.pushState({}, '', href); 36 | } else { 37 | location.hash = href; 38 | } 39 | event.preventDefault(); 40 | }); 41 | -------------------------------------------------------------------------------- /docs/undocumented.json: -------------------------------------------------------------------------------- 1 | { 2 | "warnings": [ 3 | { 4 | "file": "/Users/juriv/tmp/reel-search/RAMReel/Framework/TextFieldReactor.swift", 5 | "line": 30, 6 | "symbol": "DS", 7 | "symbol_kind": "source.lang.swift.decl.generic_type_param", 8 | "warning": "undocumented" 9 | } 10 | ], 11 | "source_directory": "/Users/juriv/tmp/reel-search" 12 | } -------------------------------------------------------------------------------- /header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/header.png -------------------------------------------------------------------------------- /reel-search.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/reel-search.gif --------------------------------------------------------------------------------