Showing preview only (987K chars total). Download the full file or copy to clipboard to get everything.
Repository: jessesquires/JSQMessagesViewController
Branch: develop
Commit: 9343b8fc8c1c
Files: 248
Total size: 911.7 KB
Directory structure:
gitextract_skmjj783/
├── .cocoadocs.yml
├── .codecov.yml
├── .github/
│ ├── CONDUCT.md
│ ├── CONTRIBUTING.md
│ ├── ISSUE_TEMPLATE.md
│ └── PULL_REQUEST_TEMPLATE.md
├── .gitignore
├── .travis.yml
├── Assets/
│ ├── jsq_messages_banner.psd
│ ├── jsq_messages_icon.psd
│ ├── jsq_messages_splash.psd
│ └── jsq_messages_splash_ipad.psd
├── CHANGELOG.md
├── Documentation/
│ ├── apps_using_this_library.md
│ ├── contributor_onboarding.md
│ ├── faq.md
│ ├── getting_started.md
│ └── migration.md
├── JSQMessages.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ └── contents.xcworkspacedata
│ └── xcshareddata/
│ └── xcschemes/
│ └── JSQMessages.xcscheme
├── JSQMessages.xcworkspace/
│ └── contents.xcworkspacedata
├── JSQMessagesDemo/
│ ├── AppDelegate.h
│ ├── AppDelegate.m
│ ├── Base.lproj/
│ │ ├── Localizable.strings
│ │ └── Main.storyboard
│ ├── DemoMessagesViewController.h
│ ├── DemoMessagesViewController.m
│ ├── DemoModelData.h
│ ├── DemoModelData.m
│ ├── DemoSettingsViewController.h
│ ├── DemoSettingsViewController.m
│ ├── Images.xcassets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ ├── DemoAvatars/
│ │ │ ├── demo_avatar_cook.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── demo_avatar_jobs.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── demo_avatar_woz.imageset/
│ │ │ └── Contents.json
│ │ ├── LaunchImage.launchimage/
│ │ │ └── Contents.json
│ │ └── goldengate.imageset/
│ │ └── Contents.json
│ ├── Info.plist
│ ├── NSUserDefaults+DemoSettings.h
│ ├── NSUserDefaults+DemoSettings.m
│ ├── TableViewController.h
│ ├── TableViewController.m
│ ├── he.lproj/
│ │ ├── Localizable.strings
│ │ └── Main.strings
│ ├── jsq_messages_sample.m4a
│ └── main.m
├── JSQMessagesTests/
│ ├── CategoryTests/
│ │ ├── JSQMessagesNSBundleTests.m
│ │ ├── JSQMessagesNSStringTests.m
│ │ ├── JSQMessagesUIColorTests.m
│ │ ├── JSQMessagesUIImageTests.m
│ │ └── JSQMessagesUIViewTests.m
│ ├── ControllerTests/
│ │ └── JSQMessagesViewControllerTests.m
│ ├── FactoryTests/
│ │ ├── JSQMessagesAvatarImageFactoryTests.m
│ │ ├── JSQMessagesBubbleImageFactoryTests.m
│ │ ├── JSQMessagesMediaViewBubbleImageMaskerTests.m
│ │ ├── JSQMessagesTimestampFormatterTests.m
│ │ └── JSQMessagesToolbarButtonFactoryTests.m
│ ├── Info.plist
│ ├── LayoutTests/
│ │ ├── JSQMessagesCollectionViewFlowLayoutTests.m
│ │ └── JSQMessagesCollectionViewLayoutAttributesTests.m
│ ├── ModelTests/
│ │ ├── JSQAudioMediaItemTests.m
│ │ ├── JSQLocationMediaItemTests.m
│ │ ├── JSQMessageMediaTests.m
│ │ ├── JSQMessageTextTests.m
│ │ ├── JSQMessagesAvatarImageTests.m
│ │ ├── JSQMessagesBubbleImageTests.m
│ │ ├── JSQPhotoMediaItemTests.m
│ │ └── JSQVideoMediaItemTests.m
│ └── ViewTests/
│ ├── JSQMessagesCollectionViewCellTests.m
│ ├── JSQMessagesCollectionViewTests.m
│ ├── JSQMessagesComposerTextViewTests.m
│ ├── JSQMessagesInputToolbarTests.m
│ ├── JSQMessagesLabelTests.m
│ ├── JSQMessagesLoadEarlierHeaderViewTests.m
│ ├── JSQMessagesToolbarContentViewTests.m
│ └── JSQMessagesTypingIndicatorFooterViewTests.m
├── JSQMessagesViewController/
│ ├── Assets/
│ │ └── JSQMessagesAssets.bundle/
│ │ ├── Base.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── Sounds/
│ │ │ ├── message_received.aiff
│ │ │ └── message_sent.aiff
│ │ ├── ar.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── bs.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── cs.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── da.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── de.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── en.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── es.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── fa.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── fi.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── fr.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── he.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── hr.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── id.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── it.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── ja.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── ko.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── ms.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── nb.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── nl.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── pl.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── pt.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── ro.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── ru.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── sv.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── th.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── tr.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── vi.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── zh-Hans.lproj/
│ │ │ └── JSQMessages.strings
│ │ └── zh-Hant.lproj/
│ │ └── JSQMessages.strings
│ ├── Categories/
│ │ ├── NSBundle+JSQMessages.h
│ │ ├── NSBundle+JSQMessages.m
│ │ ├── NSString+JSQMessages.h
│ │ ├── NSString+JSQMessages.m
│ │ ├── UIColor+JSQMessages.h
│ │ ├── UIColor+JSQMessages.m
│ │ ├── UIImage+JSQMessages.h
│ │ ├── UIImage+JSQMessages.m
│ │ ├── UIView+JSQMessages.h
│ │ └── UIView+JSQMessages.m
│ ├── Controllers/
│ │ ├── JSQMessagesViewController.h
│ │ ├── JSQMessagesViewController.m
│ │ └── JSQMessagesViewController.xib
│ ├── Factories/
│ │ ├── JSQMessagesAvatarImageFactory.h
│ │ ├── JSQMessagesAvatarImageFactory.m
│ │ ├── JSQMessagesBubbleImageFactory.h
│ │ ├── JSQMessagesBubbleImageFactory.m
│ │ ├── JSQMessagesMediaViewBubbleImageMasker.h
│ │ ├── JSQMessagesMediaViewBubbleImageMasker.m
│ │ ├── JSQMessagesTimestampFormatter.h
│ │ ├── JSQMessagesTimestampFormatter.m
│ │ ├── JSQMessagesToolbarButtonFactory.h
│ │ ├── JSQMessagesToolbarButtonFactory.m
│ │ ├── JSQMessagesVideoThumbnailFactory.h
│ │ └── JSQMessagesVideoThumbnailFactory.m
│ ├── JSQMessages.h
│ ├── Layout/
│ │ ├── JSQAudioMediaViewAttributes.h
│ │ ├── JSQAudioMediaViewAttributes.m
│ │ ├── JSQMessagesBubbleSizeCalculating.h
│ │ ├── JSQMessagesBubblesSizeCalculator.h
│ │ ├── JSQMessagesBubblesSizeCalculator.m
│ │ ├── JSQMessagesCollectionViewFlowLayout.h
│ │ ├── JSQMessagesCollectionViewFlowLayout.m
│ │ ├── JSQMessagesCollectionViewFlowLayoutInvalidationContext.h
│ │ ├── JSQMessagesCollectionViewFlowLayoutInvalidationContext.m
│ │ ├── JSQMessagesCollectionViewLayoutAttributes.h
│ │ └── JSQMessagesCollectionViewLayoutAttributes.m
│ ├── Model/
│ │ ├── JSQAudioMediaItem.h
│ │ ├── JSQAudioMediaItem.m
│ │ ├── JSQLocationMediaItem.h
│ │ ├── JSQLocationMediaItem.m
│ │ ├── JSQMediaItem.h
│ │ ├── JSQMediaItem.m
│ │ ├── JSQMessage.h
│ │ ├── JSQMessage.m
│ │ ├── JSQMessageAvatarImageDataSource.h
│ │ ├── JSQMessageBubbleImageDataSource.h
│ │ ├── JSQMessageData.h
│ │ ├── JSQMessageMediaData.h
│ │ ├── JSQMessagesAvatarImage.h
│ │ ├── JSQMessagesAvatarImage.m
│ │ ├── JSQMessagesBubbleImage.h
│ │ ├── JSQMessagesBubbleImage.m
│ │ ├── JSQMessagesCollectionViewDataSource.h
│ │ ├── JSQMessagesCollectionViewDelegateFlowLayout.h
│ │ ├── JSQMessagesViewAccessoryButtonDelegate.h
│ │ ├── JSQPhotoMediaItem.h
│ │ ├── JSQPhotoMediaItem.m
│ │ ├── JSQVideoMediaItem.h
│ │ └── JSQVideoMediaItem.m
│ └── Views/
│ ├── JSQMessagesCellTextView.h
│ ├── JSQMessagesCellTextView.m
│ ├── JSQMessagesCollectionView.h
│ ├── JSQMessagesCollectionView.m
│ ├── JSQMessagesCollectionViewCell.h
│ ├── JSQMessagesCollectionViewCell.m
│ ├── JSQMessagesCollectionViewCellIncoming.h
│ ├── JSQMessagesCollectionViewCellIncoming.m
│ ├── JSQMessagesCollectionViewCellIncoming.xib
│ ├── JSQMessagesCollectionViewCellOutgoing.h
│ ├── JSQMessagesCollectionViewCellOutgoing.m
│ ├── JSQMessagesCollectionViewCellOutgoing.xib
│ ├── JSQMessagesComposerTextView.h
│ ├── JSQMessagesComposerTextView.m
│ ├── JSQMessagesInputToolbar.h
│ ├── JSQMessagesInputToolbar.m
│ ├── JSQMessagesLabel.h
│ ├── JSQMessagesLabel.m
│ ├── JSQMessagesLoadEarlierHeaderView.h
│ ├── JSQMessagesLoadEarlierHeaderView.m
│ ├── JSQMessagesLoadEarlierHeaderView.xib
│ ├── JSQMessagesMediaPlaceholderView.h
│ ├── JSQMessagesMediaPlaceholderView.m
│ ├── JSQMessagesToolbarContentView.h
│ ├── JSQMessagesToolbarContentView.m
│ ├── JSQMessagesToolbarContentView.xib
│ ├── JSQMessagesTypingIndicatorFooterView.h
│ ├── JSQMessagesTypingIndicatorFooterView.m
│ ├── JSQMessagesTypingIndicatorFooterView.xib
│ ├── JSQMessagesTypingView.h
│ └── JSQMessagesTypingView.m
├── JSQMessagesViewController.podspec
├── LICENSE
├── README.md
└── SwiftExample/
├── Podfile
├── Pods/
│ ├── Local Podspecs/
│ │ └── JSQMessagesViewController.podspec.json
│ ├── Pods.xcodeproj/
│ │ └── project.pbxproj
│ └── Target Support Files/
│ ├── JSQMessagesViewController/
│ │ ├── Info.plist
│ │ ├── JSQMessagesViewController-dummy.m
│ │ ├── JSQMessagesViewController-prefix.pch
│ │ ├── JSQMessagesViewController-umbrella.h
│ │ ├── JSQMessagesViewController.modulemap
│ │ └── JSQMessagesViewController.xcconfig
│ ├── Pods-SwiftExample/
│ │ ├── Info.plist
│ │ ├── Pods-SwiftExample-acknowledgements.markdown
│ │ ├── Pods-SwiftExample-acknowledgements.plist
│ │ ├── Pods-SwiftExample-dummy.m
│ │ ├── Pods-SwiftExample-frameworks.sh
│ │ ├── Pods-SwiftExample-resources.sh
│ │ ├── Pods-SwiftExample-umbrella.h
│ │ ├── Pods-SwiftExample.debug.xcconfig
│ │ ├── Pods-SwiftExample.modulemap
│ │ └── Pods-SwiftExample.release.xcconfig
│ └── Pods-SwiftExampleTests/
│ ├── Info.plist
│ ├── Pods-SwiftExampleTests-acknowledgements.markdown
│ ├── Pods-SwiftExampleTests-acknowledgements.plist
│ ├── Pods-SwiftExampleTests-dummy.m
│ ├── Pods-SwiftExampleTests-frameworks.sh
│ ├── Pods-SwiftExampleTests-resources.sh
│ ├── Pods-SwiftExampleTests-umbrella.h
│ ├── Pods-SwiftExampleTests.debug.xcconfig
│ ├── Pods-SwiftExampleTests.modulemap
│ └── Pods-SwiftExampleTests.release.xcconfig
├── SwiftExample/
│ ├── AppDelegate.swift
│ ├── Base.lproj/
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ ├── ChatViewController.swift
│ ├── Conversation.swift
│ ├── DemoConversation.swift
│ ├── Info.plist
│ ├── InitalTableViewController.swift
│ └── SettingsTableViewController.swift
├── SwiftExample.xcodeproj/
│ ├── project.pbxproj
│ └── project.xcworkspace/
│ └── contents.xcworkspacedata
├── SwiftExample.xcworkspace/
│ └── contents.xcworkspacedata
└── SwiftExampleTests/
├── ChatViewControllerTests.swift
├── Info.plist
└── SettingsTests.swift
================================================
FILE CONTENTS
================================================
================================================
FILE: .cocoadocs.yml
================================================
highlight-color: "#43D15B"
highlight-dark-color: "#319942"
darker-color: "#8A998C"
darker-dark-color: "#454D46"
background-color: "#D7E5CF"
alt-link-color: "#00A81C"
warning-color: "#0FB82B"
================================================
FILE: .codecov.yml
================================================
codecov:
branch: develop
coverage:
precision: 2
round: nearest
range: "60...100"
ignore:
- JSQMessagesDemo/*
- Pods/*
- JSQMessagesTests/*
status:
project:
default:
target: auto
threshold: 2.0
branches:
- master
- develop
patch:
default:
target: auto
branches:
- master
- develop
comment:
layout: header, diff, changes, sunburst, uncovered
behavior: default
branches:
- master
- develop
================================================
FILE: .github/CONDUCT.md
================================================
# JSQMessagesViewController Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
nationality, personal appearance, race, religion, or sexual identity and
orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at **jesse.squires.developer [at] gmail [dot] com**. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
================================================
FILE: .github/CONTRIBUTING.md
================================================
# Contributing to JSQMessagesViewController
## Code of Conduct
Please read our [Code of Conduct](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/.github/CONDUCT.md). Intolerance, disrespect, harassment, and any of form of negativity will not be tolerated.
## Opening a new issue
1. Read *all* of the [`README`](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/README.md) :speak_no_evil:
* Search [open issues](https://github.com/jessesquires/JSQMessagesViewController/issues) *and* [closed issues](https://github.com/jessesquires/JSQMessagesViewController/issues?q=is%3Aissue+is%3Aclosed) to **avoid opening a duplicate issue!** :see_no_evil:
* If your issue exists, please comment on its thread with your new information :hear_no_evil:
* Otherwise, open a new issue with a good title and description :memo:
* Provide **all** of the following information:
- Library version(s) :octocat:
- iOS version(s) :iphone:
- Devices/Simulators affected :iphone:
- Expected behavior vs actual behavior
- Complete steps to reproduce the issue :warning:
- Link to a project that exhibits the issue, if possible fork the repo and modify the provided demo project :construction:
- Screenshots/GIFs/Videos showing the issue, if applicable :camera:
- Full crash log, if applicable :boom:
- Search for and list any issues that might be related :mag_right:
## Submitting a pull request
1. Link to the issue that the pull request resolves. If there isn't one, create one.
2. Write unit tests that test your changes, if applicable.
3. Update header docs, if needed.
4. Follow existing coding style, and these [style guidelines](https://github.com/jessesquires/HowToContribute#style-guidelines).
5. Resolve any merge conflicts.
6. Squash your commits into a single commit.
## Questions and help
See the [Questions & Help](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/README.md#questions--help), and [Documentation](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/README.md#documentation) sections in the `README`.
## General guidelines
Please also read through these more general [contribution guidelines](https://github.com/jessesquires/HowToContribute).
## Did you read all of this?
You even followed the links? Congratulations! You deserve a high-five. :tada:

### New issue checklist
Now show me how awesome you are! :smile: When opening your new issue and filling out the checklist, you'll be asked for confirmation. Confirm that you've read this with these emoji: :muscle::sunglasses::facepunch:
> - [x] I have reviewed the contributing guidelines. Confirmation: :muscle::sunglasses::facepunch:
================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
> This library is ⚠️ [deprecated](https://www.jessesquires.com/blog/officially-deprecating-jsqmessagesviewcontroller/) ⚠️ and is **only** accepting pull requests for critical bug fixes. Consider using [MessageKit](https://github.com/MessageKit/MessageKit) for new projects.
## New issue checklist
<!-- Before submitting this issue, make sure you have done the following -->
- [ ] I understand that this library is ⚠️ [deprecated](https://www.jessesquires.com/blog/officially-deprecating-jsqmessagesviewcontroller/) ⚠️ and is **only** accepting pull requests for critical bug fixes.
- [ ] I have read the [`README`](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/README.md), [documentation](http://cocoadocs.org/docsets/JSQMessagesViewController/), and [FAQ](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/Documentation/faq.md).
- [ ] [Contributing guidelines](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/.github/CONTRIBUTING.md) confirmation: ____
- [ ] I have searched [existing issues](https://github.com/jessesquires/JSQMessagesViewController/issues?q=is%3Aissue+sort%3Acreated-desc) and **this is not a duplicate**.
## General information
- `JSQMessagesViewController` version:
- iOS version:
- Devices/Simulators:
- Reproducible in the demo project? (Yes/No):
- Any related issues:
## What happened?
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
> This library is ⚠️ [deprecated](https://www.jessesquires.com/blog/officially-deprecating-jsqmessagesviewcontroller/) ⚠️ and is **only** accepting pull requests for critical bug fixes. Consider using [MessageKit](https://github.com/MessageKit/MessageKit) for new projects.
## Pull request checklist
- [ ] I understand that this library is ⚠️ [deprecated](https://www.jessesquires.com/blog/officially-deprecating-jsqmessagesviewcontroller/) ⚠️ and is **only** accepting pull requests for critical bug fixes.
- [ ] All tests pass.
- [ ] Demo project builds and runs.
- [ ] I have resolved merge conflicts.
- [ ] I have followed the [coding style](https://github.com/jessesquires/HowToContribute#style-guidelines).
[Contributing guidelines](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/.github/CONTRIBUTING.md) confirmation: ____
#### This fixes issue #
## What's in this pull request?
================================================
FILE: .gitignore
================================================
.DS_Store
# Xcode
/build/*
*/build/*
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
profile
*.moved-aside
DerivedData
.idea/
*.hmap
*.xccheckout
================================================
FILE: .travis.yml
================================================
language: objective-c
osx_image: xcode8
cache: cocoapods
env:
global:
- LANG=en_US.UTF-8
- WORKSPACE="JSQMessages.xcworkspace"
- IOS_SCHEME="JSQMessages"
- IOS_SDK=iphonesimulator10.0
matrix:
- DESTINATION="OS=8.1,name=iPhone 4s" SDK="$IOS_SDK" SCHEME="$IOS_SCHEME" RUN_TESTS="NO" BUILD_EXAMPLE="YES" POD_LINT="YES" RUN_UI_TESTS="NO"
- DESTINATION="OS=8.2,name=iPhone 5" SDK="$IOS_SDK" SCHEME="$IOS_SCHEME" RUN_TESTS="NO" BUILD_EXAMPLE="NO" POD_LINT="NO" RUN_UI_TESTS="NO"
- DESTINATION="OS=8.3,name=iPhone 5s" SDK="$IOS_SDK" SCHEME="$IOS_SCHEME" RUN_TESTS="NO" BUILD_EXAMPLE="NO" POD_LINT="NO" RUN_UI_TESTS="NO"
- DESTINATION="OS=8.4,name=iPhone 6" SDK="$IOS_SDK" SCHEME="$IOS_SCHEME" RUN_TESTS="NO" BUILD_EXAMPLE="NO" POD_LINT="NO" RUN_UI_TESTS="NO"
- DESTINATION="OS=9.0,name=iPhone 6 Plus" SDK="$IOS_SDK" SCHEME="$IOS_SCHEME" RUN_TESTS="YES" BUILD_EXAMPLE="YES" POD_LINT="NO" RUN_UI_TESTS="NO"
- DESTINATION="OS=9.1,name=iPhone 6s" SDK="$IOS_SDK" SCHEME="$IOS_SCHEME" RUN_TESTS="YES" BUILD_EXAMPLE="NO" POD_LINT="NO" RUN_UI_TESTS="NO"
- DESTINATION="OS=9.2,name=iPhone 6s Plus" SDK="$IOS_SDK" SCHEME="$IOS_SCHEME" RUN_TESTS="YES" BUILD_EXAMPLE="NO" POD_LINT="NO" RUN_UI_TESTS="NO"
- DESTINATION="OS=9.3,name=iPad Air 2" SDK="$IOS_SDK" SCHEME="$IOS_SCHEME" RUN_TESTS="YES" BUILD_EXAMPLE="NO" POD_LINT="NO" RUN_UI_TESTS="NO"
- DESTINATION="OS=10.0,name=iPhone 6s" SDK="$IOS_SDK" SCHEME="$IOS_SCHEME" RUN_TESTS="YES" BUILD_EXAMPLE="YES" POD_LINT="NO" RUN_UI_TESTS="NO"
before_install:
- gem install cocoapods --pre
script:
- set -o pipefail
- if [ $POD_LINT == "YES" ]; then
pod lib lint;
fi
# TODO: enable after project re-organization
# - if [ $BUILD_EXAMPLE == "YES" ]; then
# xcodebuild clean build -project Example/Example.xcodeproj -scheme Example -sdk "$SDK" -destination "$DESTINATION" ONLY_ACTIVE_ARCH=NO | xcpretty -c;
# fi
- if [ $RUN_TESTS == "YES" ]; then
xcodebuild clean build test -workspace "$WORKSPACE" -scheme "$SCHEME" -sdk "$SDK" -destination "$DESTINATION" -configuration Debug ONLY_ACTIVE_ARCH=NO | xcpretty -c;
else
xcodebuild clean build -workspace "$WORKSPACE" -scheme "$SCHEME" -sdk "$SDK" -destination "$DESTINATION" -configuration Debug ONLY_ACTIVE_ARCH=NO | xcpretty -c;
fi
# TODO: enable after project re-organization
# - if [ $RUN_UI_TESTS == "YES" ]; then
# xcodebuild test -project Example/Example.xcodeproj -scheme Example -sdk "$SDK" -destination "$DESTINATION" -configuration Debug ONLY_ACTIVE_ARCH=NO | xcpretty -c;
# fi
# Build for reporting test coverage
#- if [ $RUN_TESTS == "YES" ]; then
# xcodebuild test -workspace JSQMessages.xcworkspace -scheme JSQMessages -sdk iphonesimulator GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES;
# fi
after_success:
- bash <(curl -s https://codecov.io/bash);
================================================
FILE: CHANGELOG.md
================================================
# CHANGELOG
The changelog for `JSQMessagesViewController`. Also see the [releases](https://github.com/jessesquires/JSQMessagesViewController/releases) on GitHub.
--------------------------------------
8.0.0
-----
This release closes the [8.0.0 milestone](https://github.com/jessesquires/JSQMessagesViewController/milestones/8.0.0).
### Breaking changes
- Removed `JSQSystemSoundPlayer` as a dependency, see #1649 for reasoning. You can easily still include this in your project by adding `pod 'JSQSystemSoundPlayer'` to your Podfile. You can find out the latest on `JSQSystemSoundPlayer` [here](https://github.com/jessesquires/JSQSystemSoundPlayer).
- Removed `JSQMessagesKeyboardController` and implemented a proper `inputAccessoryView`. (#1063, #1529) Thanks @LeoNatan and @kirualex!
- `JSQMessagesToolbarButtonFactory` is now an instance, not just class methods. (#1651, #866) Thanks @burntheroad!
- `JSQMessagesAvatarImageFactory` is now an instance, not just class methods. (#1659, #1657) Thanks @burntheroad!
- `JSQMessagesInputToolbar` now provides more control over the placement of the send button. (#840) Thanks @davidchiles!
### Enhancements
- Better Swift inter-op. Implemented Objective-C nullability. (#1654) Thanks @Lucashuang0802!
- Animated typing indicator. Typing indicator now animates like iMessage. (#1382) Thanks @radekcieciwa!
- Dynamic text support. (#497, #1747) Thanks @MacMeDan!
- Message cells now have a customizable accessory view. (#1519, #1719) Thanks @adubr!
- Send button now can be turned on/off manually. (#1575, #1609) Thanks @sebastianludwig!
- Video message items now have a custom thumbnail option. (#628, #709, #1408, #1823) Thanks @weekwood, @benjaminhallock!
- A new class `JSQMessagesVideoThumbnailFactory` now can generate thumbnail images from `AVURLAsset`. (#709, #1823) Thanks @weekwood, @Lucashuang0802!
- Added a `placeHolderInsets` property to `JSQMessagesComposerTextView` to allow insetting the placeholder text. (#1908)
### Fixes
- Fixed a number of issues regarding keyboard handling. Keyboard handling is now much more stable. (#1063, #1529, #799, #941, #1299, #558, #557)
- Fixed potential crash with media cells. (#1377, #1741) Thanks @Lucashuang0802!
7.3.4
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.3.4+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.3.4)
7.3.3
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.3.3+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.3.3)
7.3.2
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.3.2+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.3.2)
7.3.1
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.3.1+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.3.1)
7.3.0
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.3.0+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.3.0)
7.2.0
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.2.0+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.2.0)
7.1.0
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.1.0+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.1.0)
7.0.2
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.0.2+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.0.2)
7.0.1
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.0.1+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.0.1)
7.0.0
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.0.0+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.0.0)
6.1.3
-----
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/6.1.3)
6.1.2
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A6.1.2+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/6.1.2)
6.1.1
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A6.1.1+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/6.1.1)
6.0.0
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A6.0.0+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/6.0.0)
5.3.0
-----
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/5.3.0)
5.2.0
-----
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/5.2.0)
5.1.0
-----
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/5.1.0)
5.0.3
-----
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/5.0.3)
5.0.0
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A5.0.0+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/5.0.0)
4.0.0
-----
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/4.0.0)
All previous versions
---------------------
Unfortunately, release notes are not available for earlier versions of the library.
================================================
FILE: Documentation/apps_using_this_library.md
================================================
# Apps using this library
These are the (known) apps that use `JSQMessagesViewController`. Submit a [pull request](https://github.com/jessesquires/JSQMessagesViewController/compare) to join the list! :smile:
-----------------
* [Hemoglobe](http://bit.ly/hemoglobeapp)
* [PocketSuite](https://itunes.apple.com/us/app/pocketsuite/id721795146)
* [FireChat](https://itunes.apple.com/us/app/firechat/id719829352)
* [Signal](https://github.com/WhisperSystems/Signal-iOS)
* [ClassDojo](https://itunes.apple.com/us/app/classdojo/id552602056)
* [Schools App](https://itunes.apple.com/us/app/schools-app/id495845755)
* [ChatSecure](https://chatsecure.org)
* [Bryx 911](https://itunes.apple.com/us/app/bryx-911/id813078029)
* [Kytt](https://itunes.apple.com/de/app/kytt-neue-leute-in-der-umgebung/id848959696)
* [Spark Social](https://itunes.apple.com/us/app/spark-social/id823785892)
* [Spabbit](https://itunes.apple.com/us/app/spabbit/id737363908)
* [Elodie](https://itunes.apple.com/app/elodie/id821610181)
* [Instaply](https://itunes.apple.com/us/app/instaply/id558562920)
* [Loopse](https://itunes.apple.com/us/app/loopse-spots-friends-sessions/id704783915)
* [Oxwall Messenger](https://github.com/tochman/OxwallMessenger)
* [FourChat](https://itunes.apple.com/us/app/fourchat/id650833730)
* [vCinity](https://itunes.apple.com/us/app/vcinity-chat-without-internet/id875395391)
* [Quick Text Message](https://itunes.apple.com/us/app/quick-text-message-fast-sms/id583729997)
* [Libraries for developers](https://itunes.apple.com/us/app/libraries-for-developers/id653427112)
* [Buhz|Hyve](https://itunes.apple.com/us/app/buhz-hyve/id818568956)
* [Ringring.io](https://github.com/ringring-io/ringring-ios)
* [gDecide](https://itunes.apple.com/ca/app/gdecide/id716801285)
* [AwesomeChat](https://github.com/relatedcode/RealtimeChat)
* [ParseChat](https://github.com/relatedcode/ParseChat)
* [Jib](http://jibapp.com)
* [Onvolo](https://itunes.apple.com/us/app/onvolo/id869332351)
* [EVCloudKitDao](https://github.com/evermeer/EVCloudKitDao)
* [Fluky Chat](https://itunes.apple.com/us/app/fluky-chat-secure-anonymous/id958605886)
* [VillageUnity](https://itunes.apple.com/us/app/village-unity/id919972368)
* [Pine](https://itunes.apple.com/us/app/pine-innovation-product-life/id946589228)
* [NotificationChat](https://github.com/relatedcode/EncryptedChat)
* [RealtimeChat](https://github.com/relatedcode/RealtimeChat)
* [Bazar](https://itunes.apple.com/ru/app/bazar-talk-about-everything/id885453058)
* [Roomie](https://itunes.apple.com/us/app/roomie-find-your-roomie/id962585201)
* [PimpMyCall](https://itunes.apple.com/us/app/pimp-my-call/id990167537)
* [Yellow Partner](https://itunes.apple.com/us/app/yellow-partner/id1062994361?ls=1&mt=8)
* [Radiate](https://itunes.apple.com/us/app/radiate/id939284774?mt=8)
* [Criptext](https://itunes.apple.com/us/app/criptext-secure-messenger/id848647361?mt=8)
* [Chaty](https://github.com/LunarFlash/Chaty)
* [SnipSnap](http://go.snipsnap.it/messageui-scout)
* [BubbleMe](https://itunes.apple.com/us/app/bubbleme/id1125325038)
* [Social-Go](https://github.com/kingreza/Social-Go)
* [StudyBuddy](https://itunes.apple.com/ca/app/studybuddy/id948997336?mt=8)
* [multipeer-chat](https://github.com/J4awesome/multipeer-chat)
* [FriendlyU](https://itunes.apple.com/us/app/friendlyu/id963421205)
* [LŌC](https://itunes.apple.com/us/app/loc-location-based-social/id957193908?mt=8)
* [Ginger.io](https://itunes.apple.com/us/app/ginger.io-coaching-therapy/id515118602)
* *Your app here, submit a [pull request](https://github.com/jessesquires/JSQMessagesViewController/compare)!*
================================================
FILE: Documentation/contributor_onboarding.md
================================================
# Contributor Onboarding
*Contributor onboarding guide for JSQMessagesViewController*
This guide is intended to bring new core contributors up-to-speed on the project, organization, expectations, and best practices.
-------------------------
## Introduction
Welcome! :smile: If you are reading this, then you are (or are about to be) a core contributor! :tada: The goal of this document is to cover everything you need to know about helping to maintain this project. If you are not familiar with the code, the docs, the demo project, and everything else in the repo, then that should be your first step. Otherwise, continue on!
## Getting push access
Being a **contributor** means submitting pull requests, opening issues, etc. Being a **core contributor** means getting push access and other permissions.
We love freely giving push access to great contributors, and always err on trusting contributors with this responsibility. However, before granting you push access we would like to see a few things:
- An interest and dedication to the project
- Helping to triage issues, review pull requests, and diagnose bugs
- Submitting a couple great pull requests
We really prefer to grant push access to contributors who have a decent amount of time to share each week or month. If you cannot be extremely active on the project — that's ok! You can still be an :sparkles: awesome contributor :sparkles: without getting push access!
The rationale behind all of this is that we do not want to accumulate a *huge* list of **core contributors** that are *not* regularly active.
Remember, *your time* is *your time* — there is absolutely no pressure on you to spend a lot of time on this project, although it is greatly appreciated! :smile:
> **Note:** the rest of this document applies to both **contributors** and **core contributors**, but there are some details that would require having push access.
## Core team
### Project lead
Jesse Squires ([**@jessesquires**](https://github.com/jessesquires)) serves as the lead for `JSQMessagesViewController`.
Responsibilities include:
- Managing releases and CocoaPods distributions
- Merging code into `master`
- Overall guidance on design, architecture, and implementation
- Strategic direction for the library
- Onboarding new core contributors
- Everything under **Core Contributors** :smile:
- Anything not covered by **Core Contributors** :smile:
As core contributors grow and take on more repsonsibility, they can become a lead.
### Core contributors
Core contributors have push access and are responsible for:
- Bug fixes
- New features
- Triaging issues (managing, organizing)
- Reviewing pull requests
- Answering questions from the community on [issues](https://github.com/jessesquires/JSQMessagesViewController/issues?utf8=✓&q=is%3Aissue+label%3A%22questions+%26+help%22+) and [StackOverflow](http://stackoverflow.com/questions/tagged/jsqmessagesviewcontroller)
- Documentation
Current core contributors:
- Harlan Haskans ([**@harlanhaskins**](https://github.com/harlanhaskins))
- Eli Burke ([**@eliburke**](https://github.com/eliburke))
- Sebastian Ludwig ([**@sebastianludwig**](https://github.com/sebastianludwig))
## Pushing code
Although you have permissions to push code directly to `develop` as a core contributor, we ask that you *always* submit a pull request for code changes. After a code review and approval, you may merge your diff. For minor changes, like formatting or typos, pushing directly to `develop` is acceptable.
Always merge work to `develop` unless otherwise specified. The project lead will manage the `master` branch.
For now, Jesse ([**@jessesquires**](https://github.com/jessesquires)) should provide the final approval for *all* pull requests. However, as core contributors grow and establish themselves in the project, they can take on this responsibility as well.
## Project managment
### General guidelines
Above all, abide by our [code of conduct](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/.github/CONDUCT.md) at all times. Be welcoming, kind, and inclusive.
Often, users do not follow our [contributing guidelines](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/.github/CONTRIBUTING.md), fail to complete the [issue template](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/.github/ISSUE_TEMPLATE.md), or fail to complete the [pull request template](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/.github/PULL_REQUEST_TEMPLATE.md). This is frustrating, but the best response is to kindly remind and encourage them to follow the correct procedures next time.
When first responding to a newly opened issue or pull request, *always* thank the contributor and add some sweet emoji. Any positive emoji will work. (:+1:, :smile:, :sunglasses:, etc.) Choose your favorite.
> Thanks **@jessesquires**! :smile_cat:
Then continue on with the rest of your comment. There will be times where we simply cannot accept a patch for various reasons. In this case, kindly explain why it is not the right approach for the library, thank them for their time and effort, and encourage them to keep contributing.
In any situation, when in doubt, tag the project lead in a comment to get feedback.
### Development
- All work for minor and patch releases should happen on `develop`. For example, release 7.x.x.
- All work for major releases should happen on a release branch. For example, `release_8.0`.
- The project lead will manage the `master` branch.
For core contributors, always assign issues or pull requests to the appropriate team member. If you are working on an issue, assign it to yourself. If you would like someone to review a pull request, assign it to them.
### Managing issues
- Always add the appropriate label(s). There may be more than one.
- Assign to a release milestone, if applicable.
- Ask for more information from the user, if needed.
- Verify bugs. Leave comments on your findings as necessary.
- If it's a duplicate, label and close.
- Follow the general guidelines above.
##### Special labels
- [`needs review`](https://github.com/jessesquires/JSQMessagesViewController/issues?q=is%3Aissue+label%3A%22needs+review%22): These issues need to be triaged and confirmed. They are typically bugs or pull requests, but do not have to be. Once verified, `needs review` should be removed and any other appropriate labels should be added.
- [`new release roadmap`](https://github.com/jessesquires/JSQMessagesViewController/issues?utf8=✓&q=is%3Aissue+label%3A%22new+release+roadmap%22+): For communicating new releases to the community.
- [`in-progress`](https://github.com/jessesquires/JSQMessagesViewController/issues?q=is%3Aissue+label%3Ain-progress): Specifies a task that is currently being worked on. Remove this label after closing a task.
- [`duplicate`](https://github.com/jessesquires/JSQMessagesViewController/issues?utf8=✓&q=label%3Aduplicate+): For duplicate isses. When closing an issue as a duplicate be sure to leave a comment with the original issue number. *"Closing as duplicate of #6."*
- [`questions & help`](https://github.com/jessesquires/JSQMessagesViewController/issues?q=is%3Aissue+label%3A%22questions+%26+help%22): For community questions and help. Note that we are trying to refer questions to [StackOverflow](http://stackoverflow.com/questions/tagged/jsqmessagesviewcontroller) instead.
### Managing pull requests
- Review the code for correctness, performance, style, etc. Leave comments as needed.
- Always add the appropriate label(s). There may be more than one.
- Assign to a release milestone, if applicable.
- Follow the general guidelines above.
- If you think it's ready to go, tag the project lead to get the final :+1:
### Managing releases
All releases are organized using [milestones](https://github.com/jessesquires/JSQMessagesViewController/milestones). Use these to prioritize work and figure out what's next.
Issues and pull requests included in the next milestone release should be the highest priorty. Once a milestone is 100% complete, the project lead will merge `develop` or other release branches into `master`. The project lead will close the milestone, tag the release, and submit to CocoaPods.
### Managing documentation
Having high quality documentation and 100% coverage has a significant impact on the project's success.
Always add new docs for new public APIs and keep them up-to-date. Use existing docs and Apple's docs for Cocoa as guidelines for writing great documentation.
================================================
FILE: Documentation/faq.md
================================================
# FAQ
*Frequently asked questions for JSQMessagesViewController.*
Contributions are welcome! Please submit a [pull request](https://github.com/jessesquires/JSQMessagesViewController/compare).
------------------------------------
## For 7.x.x
#### Using `UITabBar` ?
Is the library compatible with `UITabBarController` and `UITabBar`? Yes and no. For the history on this issue, see [#179](https://github.com/jessesquires/JSQMessagesViewController/issues/179) and [#94](https://github.com/jessesquires/JSQMessagesViewController/issues/94). This seems to be the best workaround:
````objective-c
- (void)viewDidLoad
{
[super viewDidLoad];
self.edgesForExtendedLayout = UIRectEdgeNone;
}
````
#### *Springy bubbles?*
:warning: Note: this feature is still experimental.
````objective-c
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
self.collectionView.collectionViewLayout.springinessEnabled = YES;
}
````
#### *Remove avatars?*
````objective-c
- (void)viewDidLoad
{
[super viewDidLoad];
self.collectionView.collectionViewLayout.incomingAvatarViewSize = CGSizeZero;
self.collectionView.collectionViewLayout.outgoingAvatarViewSize = CGSizeZero;
}
- (id<JSQMessageAvatarImageDataSource>)collectionView:(JSQMessagesCollectionView *)collectionView avatarImageDataForItemAtIndexPath:(NSIndexPath *)indexPath
{
return nil;
}
````
#### *Need customize your collection view cells?*
There are 2 approaches to this, which one you choose depends on your needs.
1. Customize appearance and behavior of existing cells. (Easy)
2. Provide your own completely custom cell prototypes. (Hard)
> Also see [previous issues](https://github.com/jessesquires/JSQMessagesViewController/issues?utf8=✓&q=custom+cell+in%3Atitle).
##### (1) Customizing existing cells
If you only need to make minor changes to the existing cells (colors, data detectors, etc.), then you simply need to override the following method. You have access to all properties on the cell. ([docs](http://cocoadocs.org/docsets/JSQMessagesViewController/7.2.0/Classes/JSQMessagesCollectionViewCell.html))
````objective-c
- (UICollectionViewCell *)collectionView:(JSQMessagesCollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
JSQMessagesCollectionViewCell *cell = (JSQMessagesCollectionViewCell *)[super collectionView:collectionView cellForItemAtIndexPath:indexPath];
// Customize the shit out of this cell
// See the docs for JSQMessagesCollectionViewCell
return cell;
}
````
##### (2) Providing your own cell prototypes
This approach is more involved, but gives you greater flexibility. If you need to add or modify subviews of the cell, use this approach. ([docs](http://cocoadocs.org/docsets/JSQMessagesViewController/7.2.0/Classes/JSQMessagesViewController.html))
1. You need to provide your own cell subclasses, similar to the library's `JSQMessagesCollectionViewCell`, `JSQMessagesCollectionViewCellIncoming`, `JSQMessagesCollectionViewCellOutgoing`.
2. On your `JSQMessagesViewController` subclass, set the following properties according to your classes:
- `outgoingCellIdentifier`
- `outgoingMediaCellIdentifier`
- `incomingCellIdentifier`
- `incomingMediaCellIdentifier`
3. Register your cell classes/nibs with the collection view and the identifiers above
4. Override `-collectionView: cellForItemAtIndexPath:`. Do not call `super`. Since you are providing your own cells, calling `super` will perform a bunch of unnecessary work.
5. (Optional) For your model objects, implement `JSQMessageData` or subclass `JSQMessage` and extend to your needs.
For more detailed instructions on creating custom cells, see [this comment](https://github.com/jessesquires/JSQMessagesViewController/issues/1739#issuecomment-246489889)
#### *Customize your toolbar buttons?*
````objective-c
- (void)viewDidLoad
{
[super viewDidLoad];
// This button will call the `didPressAccessoryButton:` selector on your JSQMessagesViewController subclass
self.inputToolbar.contentView.leftBarButtonItem = /* custom button or nil to remove */
// This button will call the `didPressSendButton:` selector on your JSQMessagesViewController subclass
self.inputToolbar.contentView.rightBarButtonItem = /* custom button or nil to remove */
// Swap buttons, move send button to the LEFT side and the attachment button to the RIGHT
// For RTL language support
self.inputToolbar.contentView.leftBarButtonItem = [JSQMessagesToolbarButtonFactory defaultSendButtonItem];
self.inputToolbar.contentView.rightBarButtonItem = [JSQMessagesToolbarButtonFactory defaultAccessoryButtonItem];
// The library will call the correct selector for each button, based on this value
self.inputToolbar.sendButtonOnRight = NO;
}
````
================================================
FILE: Documentation/getting_started.md
================================================
# Getting Started
*Getting started guide for JSQMessagesViewController*
-----------------------------
## For versions 6.x and 7.x
````objective-c
#import <JSQMessagesViewController/JSQMessages.h> // import all the things
````
* **Tutorials and blogs**
* Read the [blog post](http://www.jessesquires.com/introducing-jsqmessagesvc-6-0/) about the 6.0 release!
* Ray Wenderlich has a [great tutorial](http://www.raywenderlich.com/122148/firebase-tutorial-real-time-chat), written by [David East](https://twitter.com/_davideast). (For 7.x releases)
* **Demo Project**
* There's a sweet demo project: `JSQMessages.xcworkspace`.
* Run `pod install` first.
* Swift Example can be found in the SwiftExample folder just open the `SwiftExample.xcworkspace`.
* Run `pod install` first.
* [Firebase](https://www.firebase.com) also has a sweet [demo project](https://github.com/firebase/ios-swift-chat-example), and it's in Swift!
* **Message Model**
* Your message model objects should conform to the `JSQMessageData` protocol.
* However, you may use the provided `JSQMessage` class.
* **Media Attachment Model**
* Your media attachment model objects should conform to the `JSQMessageMediaData` protocol.
* However, you may use the provided classes: `JSQPhotoMediaItem`, `JSQLocationMediaItem`, `JSQVideoMediaItem`.
* Creating your own custom media items is easy! Simply follow the pattern used by the built-in media types.
* Also see `JSQMessagesMediaViewBubbleImageMasker` for masking your custom media views as message bubbles.
* **Avatar Model**
* Your avatar model objects should conform to the `JSQMessageAvatarImageDataSource` protocol.
* However, you may use the provided `JSQMessagesAvatarImage` class.
* Also see `JSQMessagesAvatarImageFactory` for easily generating custom avatars.
* **Message Bubble Model**
* Your message bubble model objects should conform to the `JSQMessageBubbleImageDataSource` protocol.
* However, you may use the provided `JSQMessagesBubbleImage` class.
* Also see `JSQMessagesBubbleImageFactory` and `UIImage+JSQMessages.h` for easily generating custom bubbles.
* **View Controller**
* Subclass `JSQMessagesViewController`.
* Implement the required methods in the `JSQMessagesCollectionViewDataSource` protocol.
* Implement the required methods in the `JSQMessagesCollectionViewDelegateFlowLayout` protocol.
* Set your `senderId` and `senderDisplayName`. These properties correspond to the methods found in `JSQMessageData` and determine which messages are incoming or outgoing.
* **Customizing**
* The demo project is well-commented. Please use this as a guide.
## Previous versions
Sorry! Guides are not available for older versions of the library.
================================================
FILE: Documentation/migration.md
================================================
# Migration Guide
*Migrating between major versions of JSQMessagesViewController?*
-----------------------------
## From `6.x` to `7.x`
See the [7.0 release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.0.0) for details about API changes.
## From `5.x` to `6.x`
See the [6.0 release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/6.0.0) for details about API changes.
## Previous versions
Unfortunately, versions prior to `5.0` outdate this document, and guides are not available.
================================================
FILE: JSQMessages.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
1F0EFE0F1AC23D7E003FF3DB /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F0EFE0E1AC23D7E003FF3DB /* MobileCoreServices.framework */; };
50B7F5A81CA401FA009A44F5 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 50B7F5AA1CA401FA009A44F5 /* Localizable.strings */; };
54271E3B1C90469100294290 /* jsq_messages_sample.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 54271E3A1C90469100294290 /* jsq_messages_sample.m4a */; };
54271E3E1C905B9200294290 /* JSQAudioMediaItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 54271E3D1C905B9200294290 /* JSQAudioMediaItem.m */; };
54271E401C905D1600294290 /* JSQAudioMediaItemTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 54271E3F1C905D1600294290 /* JSQAudioMediaItemTests.m */; };
544A32211CB2EE380084BFC0 /* JSQAudioMediaViewAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = 544A32201CB2EE380084BFC0 /* JSQAudioMediaViewAttributes.m */; };
88078A9D19D8FEB5005B4595 /* JSQMessagesMediaPlaceholderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88078A9C19D8FEB5005B4595 /* JSQMessagesMediaPlaceholderView.m */; };
88324C3419F6301C00BC732D /* JSQMessagesMediaViewBubbleImageMaskerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88324C3319F6301C00BC732D /* JSQMessagesMediaViewBubbleImageMaskerTests.m */; };
883C11781A09FB100092A16D /* JSQMessagesCellTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 883C11771A09FB100092A16D /* JSQMessagesCellTextView.m */; };
88445B3119E0AE3F0014F889 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B3019E0AE3F0014F889 /* UIKit.framework */; };
88445B3319E0AE450014F889 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B3219E0AE450014F889 /* Foundation.framework */; };
88445B3519E0AE4A0014F889 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B3419E0AE4A0014F889 /* CoreGraphics.framework */; };
88445B3719E0AE5C0014F889 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B3619E0AE5C0014F889 /* QuartzCore.framework */; };
88445B3819E0C0A70014F889 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B3019E0AE3F0014F889 /* UIKit.framework */; };
88445B3919E0C0AC0014F889 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B3219E0AE450014F889 /* Foundation.framework */; };
88445B3B19E0C0B10014F889 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B3A19E0C0B10014F889 /* XCTest.framework */; };
88445B3C19E0C0B80014F889 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B3419E0AE4A0014F889 /* CoreGraphics.framework */; };
88445B3D19E0C0BE0014F889 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B3619E0AE5C0014F889 /* QuartzCore.framework */; };
88445B4019E1B4470014F889 /* JSQLocationMediaItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 88445B3F19E1B4470014F889 /* JSQLocationMediaItem.m */; };
88445B4219E1B50B0014F889 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B4119E1B50B0014F889 /* CoreLocation.framework */; };
88445B4419E1B5110014F889 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B4319E1B5110014F889 /* MapKit.framework */; };
88445B4519E1B5210014F889 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B4119E1B50B0014F889 /* CoreLocation.framework */; };
88445B4619E1B5290014F889 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B4319E1B5110014F889 /* MapKit.framework */; };
8861666D19F492B70025B958 /* JSQMessagesAssets.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 8861666C19F492B70025B958 /* JSQMessagesAssets.bundle */; };
886C33FD19F4371E006B4997 /* JSQVideoMediaItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 886C33FC19F4371E006B4997 /* JSQVideoMediaItem.m */; };
886C33FF19F45E30006B4997 /* JSQMessagesViewController.podspec in Resources */ = {isa = PBXBuildFile; fileRef = 886C33FE19F45E30006B4997 /* JSQMessagesViewController.podspec */; };
8873B60C1AB7B244006DF9AC /* NSBundle+JSQMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 8873B60B1AB7B244006DF9AC /* NSBundle+JSQMessages.m */; };
8873B60E1AB7B63E006DF9AC /* JSQMessagesNSBundleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8873B60D1AB7B63E006DF9AC /* JSQMessagesNSBundleTests.m */; };
8885734A19DE540400E89D20 /* DemoSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8885734919DE540400E89D20 /* DemoSettingsViewController.m */; };
8885734D19DE55D000E89D20 /* NSUserDefaults+DemoSettings.m in Sources */ = {isa = PBXBuildFile; fileRef = 8885734C19DE55D000E89D20 /* NSUserDefaults+DemoSettings.m */; };
88A25F3719D8DF2500924534 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F2D19D8DF2500924534 /* AppDelegate.m */; };
88A25F3919D8DF2500924534 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F3019D8DF2500924534 /* Main.storyboard */; };
88A25F3A19D8DF2500924534 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F3219D8DF2500924534 /* Images.xcassets */; };
88A25F3C19D8DF2500924534 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F3419D8DF2500924534 /* main.m */; };
88A25FB619D8E01A00924534 /* NSString+JSQMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F5819D8E01A00924534 /* NSString+JSQMessages.m */; };
88A25FB719D8E01A00924534 /* UIColor+JSQMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F5A19D8E01A00924534 /* UIColor+JSQMessages.m */; };
88A25FB819D8E01A00924534 /* UIImage+JSQMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F5C19D8E01A00924534 /* UIImage+JSQMessages.m */; };
88A25FB919D8E01A00924534 /* UIView+JSQMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F5E19D8E01A00924534 /* UIView+JSQMessages.m */; };
88A25FBB19D8E01A00924534 /* JSQMessagesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F6319D8E01A00924534 /* JSQMessagesViewController.m */; };
88A25FBC19D8E01A00924534 /* JSQMessagesViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F6419D8E01A00924534 /* JSQMessagesViewController.xib */; };
88A25FBD19D8E01A00924534 /* JSQMessagesAvatarImageFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F6719D8E01A00924534 /* JSQMessagesAvatarImageFactory.m */; };
88A25FBE19D8E01A00924534 /* JSQMessagesBubbleImageFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F6919D8E01A00924534 /* JSQMessagesBubbleImageFactory.m */; };
88A25FBF19D8E01A00924534 /* JSQMessagesTimestampFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F6B19D8E01A00924534 /* JSQMessagesTimestampFormatter.m */; };
88A25FC019D8E01A00924534 /* JSQMessagesToolbarButtonFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F6D19D8E01A00924534 /* JSQMessagesToolbarButtonFactory.m */; };
88A25FC119D8E01A00924534 /* JSQMessagesCollectionViewFlowLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F7119D8E01A00924534 /* JSQMessagesCollectionViewFlowLayout.m */; };
88A25FC219D8E01A00924534 /* JSQMessagesCollectionViewFlowLayoutInvalidationContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F7319D8E01A00924534 /* JSQMessagesCollectionViewFlowLayoutInvalidationContext.m */; };
88A25FC319D8E01A00924534 /* JSQMessagesCollectionViewLayoutAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F7519D8E01A00924534 /* JSQMessagesCollectionViewLayoutAttributes.m */; };
88A25FC519D8E01A00924534 /* JSQMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F7A19D8E01A00924534 /* JSQMessage.m */; };
88A25FC619D8E01A00924534 /* JSQMessagesAvatarImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F8019D8E01A00924534 /* JSQMessagesAvatarImage.m */; };
88A25FC719D8E01A00924534 /* JSQMessagesBubbleImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F8219D8E01A00924534 /* JSQMessagesBubbleImage.m */; };
88A25FC819D8E01A00924534 /* JSQPhotoMediaItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F8619D8E01A00924534 /* JSQPhotoMediaItem.m */; };
88A25FCA19D8E01A00924534 /* JSQMessagesCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F8B19D8E01A00924534 /* JSQMessagesCollectionView.m */; };
88A25FCB19D8E01A00924534 /* JSQMessagesCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F8D19D8E01A00924534 /* JSQMessagesCollectionViewCell.m */; };
88A25FCC19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F8F19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.m */; };
88A25FCD19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.xib in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F9019D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.xib */; };
88A25FCE19D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F9219D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.m */; };
88A25FCF19D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.xib in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F9319D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.xib */; };
88A25FD019D8E01A00924534 /* JSQMessagesComposerTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F9519D8E01A00924534 /* JSQMessagesComposerTextView.m */; };
88A25FD119D8E01A00924534 /* JSQMessagesInputToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F9719D8E01A00924534 /* JSQMessagesInputToolbar.m */; };
88A25FD219D8E01A00924534 /* JSQMessagesLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F9919D8E01A00924534 /* JSQMessagesLabel.m */; };
88A25FD319D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F9B19D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.m */; };
88A25FD419D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F9C19D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.xib */; };
88A25FD519D8E01A00924534 /* JSQMessagesToolbarContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F9E19D8E01A00924534 /* JSQMessagesToolbarContentView.m */; };
88A25FD619D8E01A00924534 /* JSQMessagesToolbarContentView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F9F19D8E01A00924534 /* JSQMessagesToolbarContentView.xib */; };
88A25FD719D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FA119D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.m */; };
88A25FD819D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 88A25FA219D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.xib */; };
88A25FDF19D8E0C400924534 /* DemoMessagesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FDA19D8E0C400924534 /* DemoMessagesViewController.m */; };
88A25FE019D8E0C400924534 /* DemoModelData.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FDC19D8E0C400924534 /* DemoModelData.m */; };
88A25FE119D8E0C400924534 /* TableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FDE19D8E0C400924534 /* TableViewController.m */; };
88A2600119D8E18400924534 /* JSQMessagesNSStringTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FE319D8E18400924534 /* JSQMessagesNSStringTests.m */; };
88A2600219D8E18400924534 /* JSQMessagesUIColorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FE419D8E18400924534 /* JSQMessagesUIColorTests.m */; };
88A2600319D8E18400924534 /* JSQMessagesUIImageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FE519D8E18400924534 /* JSQMessagesUIImageTests.m */; };
88A2600419D8E18400924534 /* JSQMessagesUIViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FE619D8E18400924534 /* JSQMessagesUIViewTests.m */; };
88A2600619D8E18400924534 /* JSQMessagesViewControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FE919D8E18400924534 /* JSQMessagesViewControllerTests.m */; };
88A2600719D8E18400924534 /* JSQMessagesAvatarImageFactoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FEB19D8E18400924534 /* JSQMessagesAvatarImageFactoryTests.m */; };
88A2600819D8E18400924534 /* JSQMessagesBubbleImageFactoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FEC19D8E18400924534 /* JSQMessagesBubbleImageFactoryTests.m */; };
88A2600919D8E18400924534 /* JSQMessagesTimestampFormatterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FED19D8E18400924534 /* JSQMessagesTimestampFormatterTests.m */; };
88A2600A19D8E18400924534 /* JSQMessagesToolbarButtonFactoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FEE19D8E18400924534 /* JSQMessagesToolbarButtonFactoryTests.m */; };
88A2600B19D8E18400924534 /* JSQMessagesCollectionViewFlowLayoutTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FF019D8E18400924534 /* JSQMessagesCollectionViewFlowLayoutTests.m */; };
88A2600C19D8E18400924534 /* JSQMessagesCollectionViewLayoutAttributesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FF119D8E18400924534 /* JSQMessagesCollectionViewLayoutAttributesTests.m */; };
88A2600D19D8E18400924534 /* JSQMessageMediaTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FF319D8E18400924534 /* JSQMessageMediaTests.m */; };
88A2600E19D8E18400924534 /* JSQMessagesAvatarImageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FF419D8E18400924534 /* JSQMessagesAvatarImageTests.m */; };
88A2600F19D8E18400924534 /* JSQMessagesBubbleImageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FF519D8E18400924534 /* JSQMessagesBubbleImageTests.m */; };
88A2601019D8E18400924534 /* JSQMessageTextTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FF619D8E18400924534 /* JSQMessageTextTests.m */; };
88A2601219D8E18400924534 /* JSQMessagesCollectionViewCellTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FF919D8E18400924534 /* JSQMessagesCollectionViewCellTests.m */; };
88A2601319D8E18400924534 /* JSQMessagesCollectionViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FFA19D8E18400924534 /* JSQMessagesCollectionViewTests.m */; };
88A2601419D8E18400924534 /* JSQMessagesComposerTextViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FFB19D8E18400924534 /* JSQMessagesComposerTextViewTests.m */; };
88A2601519D8E18400924534 /* JSQMessagesInputToolbarTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FFC19D8E18400924534 /* JSQMessagesInputToolbarTests.m */; };
88A2601619D8E18400924534 /* JSQMessagesLabelTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FFD19D8E18400924534 /* JSQMessagesLabelTests.m */; };
88A2601719D8E18400924534 /* JSQMessagesLoadEarlierHeaderViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FFE19D8E18400924534 /* JSQMessagesLoadEarlierHeaderViewTests.m */; };
88A2601819D8E18400924534 /* JSQMessagesToolbarContentViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FFF19D8E18400924534 /* JSQMessagesToolbarContentViewTests.m */; };
88A2601919D8E18400924534 /* JSQMessagesTypingIndicatorFooterViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A2600019D8E18400924534 /* JSQMessagesTypingIndicatorFooterViewTests.m */; };
88A2601B19D8E45600924534 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 88A2601A19D8E45600924534 /* Info.plist */; };
88A901B619F618B100F99777 /* JSQMediaItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A901B519F618B100F99777 /* JSQMediaItem.m */; };
88B5C41F1B7C422900EC79D4 /* JSQMessagesBubblesSizeCalculator.m in Sources */ = {isa = PBXBuildFile; fileRef = 88B5C41E1B7C422900EC79D4 /* JSQMessagesBubblesSizeCalculator.m */; };
88C00A4E1A44D4C600B004B3 /* JSQLocationMediaItemTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C00A4D1A44D4C600B004B3 /* JSQLocationMediaItemTests.m */; };
88C00A501A44D4D800B004B3 /* JSQPhotoMediaItemTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C00A4F1A44D4D800B004B3 /* JSQPhotoMediaItemTests.m */; };
88C00A521A44D4E500B004B3 /* JSQVideoMediaItemTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C00A511A44D4E500B004B3 /* JSQVideoMediaItemTests.m */; };
88C4583019F5F7A0008FD427 /* JSQMessagesMediaViewBubbleImageMasker.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C4582F19F5F7A0008FD427 /* JSQMessagesMediaViewBubbleImageMasker.m */; };
A04B0EBF1D6ADE5800FBDC47 /* JSQMessagesVideoThumbnailFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = A04B0EBE1D6ADE5800FBDC47 /* JSQMessagesVideoThumbnailFactory.m */; };
BF10D6AA1D062AD10072D215 /* JSQMessagesTypingView.m in Sources */ = {isa = PBXBuildFile; fileRef = BF10D6A91D062AD10072D215 /* JSQMessagesTypingView.m */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
88A25F1C19D8DEC500924534 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 88A25EFA19D8DEC400924534 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 88A25F0119D8DEC400924534;
remoteInfo = JSQMessages;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
1F0EFE0E1AC23D7E003FF3DB /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
50B7F5A51CA3FF4E009A44F5 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/Main.strings; sourceTree = "<group>"; };
50B7F5A91CA401FA009A44F5 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/Localizable.strings; sourceTree = "<group>"; };
50B7F5AB1CA40202009A44F5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = "<group>"; };
54271E3A1C90469100294290 /* jsq_messages_sample.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = jsq_messages_sample.m4a; sourceTree = "<group>"; };
54271E3C1C905B9200294290 /* JSQAudioMediaItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQAudioMediaItem.h; sourceTree = "<group>"; };
54271E3D1C905B9200294290 /* JSQAudioMediaItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQAudioMediaItem.m; sourceTree = "<group>"; };
54271E3F1C905D1600294290 /* JSQAudioMediaItemTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQAudioMediaItemTests.m; sourceTree = "<group>"; };
544A321F1CB2EE380084BFC0 /* JSQAudioMediaViewAttributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQAudioMediaViewAttributes.h; sourceTree = "<group>"; };
544A32201CB2EE380084BFC0 /* JSQAudioMediaViewAttributes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQAudioMediaViewAttributes.m; sourceTree = "<group>"; };
58620BCC6ABA99E3C6FD36F5 /* JSQMessagesViewAccessoryButtonDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesViewAccessoryButtonDelegate.h; sourceTree = "<group>"; };
88078A9B19D8FEB5005B4595 /* JSQMessagesMediaPlaceholderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesMediaPlaceholderView.h; sourceTree = "<group>"; };
88078A9C19D8FEB5005B4595 /* JSQMessagesMediaPlaceholderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesMediaPlaceholderView.m; sourceTree = "<group>"; };
88324C3319F6301C00BC732D /* JSQMessagesMediaViewBubbleImageMaskerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesMediaViewBubbleImageMaskerTests.m; sourceTree = "<group>"; };
883C11761A09FB100092A16D /* JSQMessagesCellTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCellTextView.h; sourceTree = "<group>"; };
883C11771A09FB100092A16D /* JSQMessagesCellTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCellTextView.m; sourceTree = "<group>"; };
88445B3019E0AE3F0014F889 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
88445B3219E0AE450014F889 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
88445B3419E0AE4A0014F889 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
88445B3619E0AE5C0014F889 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
88445B3A19E0C0B10014F889 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = System/Library/Frameworks/XCTest.framework; sourceTree = SDKROOT; };
88445B3E19E1B4470014F889 /* JSQLocationMediaItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQLocationMediaItem.h; sourceTree = "<group>"; };
88445B3F19E1B4470014F889 /* JSQLocationMediaItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQLocationMediaItem.m; sourceTree = "<group>"; };
88445B4119E1B50B0014F889 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; };
88445B4319E1B5110014F889 /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = System/Library/Frameworks/MapKit.framework; sourceTree = SDKROOT; };
8861666C19F492B70025B958 /* JSQMessagesAssets.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = JSQMessagesAssets.bundle; sourceTree = "<group>"; };
886C33FB19F4371E006B4997 /* JSQVideoMediaItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQVideoMediaItem.h; sourceTree = "<group>"; };
886C33FC19F4371E006B4997 /* JSQVideoMediaItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQVideoMediaItem.m; sourceTree = "<group>"; };
886C33FE19F45E30006B4997 /* JSQMessagesViewController.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = JSQMessagesViewController.podspec; sourceTree = "<group>"; };
8873B60A1AB7B244006DF9AC /* NSBundle+JSQMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSBundle+JSQMessages.h"; sourceTree = "<group>"; };
8873B60B1AB7B244006DF9AC /* NSBundle+JSQMessages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSBundle+JSQMessages.m"; sourceTree = "<group>"; };
8873B60D1AB7B63E006DF9AC /* JSQMessagesNSBundleTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesNSBundleTests.m; sourceTree = "<group>"; };
8885734819DE540400E89D20 /* DemoSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoSettingsViewController.h; sourceTree = "<group>"; };
8885734919DE540400E89D20 /* DemoSettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoSettingsViewController.m; sourceTree = "<group>"; };
8885734B19DE55D000E89D20 /* NSUserDefaults+DemoSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSUserDefaults+DemoSettings.h"; sourceTree = "<group>"; };
8885734C19DE55D000E89D20 /* NSUserDefaults+DemoSettings.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSUserDefaults+DemoSettings.m"; sourceTree = "<group>"; };
88A25F0219D8DEC400924534 /* JSQMessages.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JSQMessages.app; sourceTree = BUILT_PRODUCTS_DIR; };
88A25F1B19D8DEC500924534 /* JSQMessagesTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JSQMessagesTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
88A25F2019D8DEC500924534 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
88A25F2C19D8DF2500924534 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
88A25F2D19D8DF2500924534 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
88A25F3119D8DF2500924534 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
88A25F3219D8DF2500924534 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
88A25F3419D8DF2500924534 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
88A25F5719D8E01A00924534 /* NSString+JSQMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+JSQMessages.h"; sourceTree = "<group>"; };
88A25F5819D8E01A00924534 /* NSString+JSQMessages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+JSQMessages.m"; sourceTree = "<group>"; };
88A25F5919D8E01A00924534 /* UIColor+JSQMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+JSQMessages.h"; sourceTree = "<group>"; };
88A25F5A19D8E01A00924534 /* UIColor+JSQMessages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+JSQMessages.m"; sourceTree = "<group>"; };
88A25F5B19D8E01A00924534 /* UIImage+JSQMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+JSQMessages.h"; sourceTree = "<group>"; };
88A25F5C19D8E01A00924534 /* UIImage+JSQMessages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+JSQMessages.m"; sourceTree = "<group>"; };
88A25F5D19D8E01A00924534 /* UIView+JSQMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+JSQMessages.h"; sourceTree = "<group>"; };
88A25F5E19D8E01A00924534 /* UIView+JSQMessages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+JSQMessages.m"; sourceTree = "<group>"; };
88A25F6219D8E01A00924534 /* JSQMessagesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesViewController.h; sourceTree = "<group>"; };
88A25F6319D8E01A00924534 /* JSQMessagesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesViewController.m; sourceTree = "<group>"; };
88A25F6419D8E01A00924534 /* JSQMessagesViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQMessagesViewController.xib; sourceTree = "<group>"; };
88A25F6619D8E01A00924534 /* JSQMessagesAvatarImageFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesAvatarImageFactory.h; sourceTree = "<group>"; };
88A25F6719D8E01A00924534 /* JSQMessagesAvatarImageFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesAvatarImageFactory.m; sourceTree = "<group>"; };
88A25F6819D8E01A00924534 /* JSQMessagesBubbleImageFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesBubbleImageFactory.h; sourceTree = "<group>"; };
88A25F6919D8E01A00924534 /* JSQMessagesBubbleImageFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesBubbleImageFactory.m; sourceTree = "<group>"; };
88A25F6A19D8E01A00924534 /* JSQMessagesTimestampFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesTimestampFormatter.h; sourceTree = "<group>"; };
88A25F6B19D8E01A00924534 /* JSQMessagesTimestampFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesTimestampFormatter.m; sourceTree = "<group>"; };
88A25F6C19D8E01A00924534 /* JSQMessagesToolbarButtonFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesToolbarButtonFactory.h; sourceTree = "<group>"; };
88A25F6D19D8E01A00924534 /* JSQMessagesToolbarButtonFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesToolbarButtonFactory.m; sourceTree = "<group>"; };
88A25F6E19D8E01A00924534 /* JSQMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessages.h; sourceTree = "<group>"; };
88A25F7019D8E01A00924534 /* JSQMessagesCollectionViewFlowLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionViewFlowLayout.h; sourceTree = "<group>"; };
88A25F7119D8E01A00924534 /* JSQMessagesCollectionViewFlowLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewFlowLayout.m; sourceTree = "<group>"; };
88A25F7219D8E01A00924534 /* JSQMessagesCollectionViewFlowLayoutInvalidationContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionViewFlowLayoutInvalidationContext.h; sourceTree = "<group>"; };
88A25F7319D8E01A00924534 /* JSQMessagesCollectionViewFlowLayoutInvalidationContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewFlowLayoutInvalidationContext.m; sourceTree = "<group>"; };
88A25F7419D8E01A00924534 /* JSQMessagesCollectionViewLayoutAttributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionViewLayoutAttributes.h; sourceTree = "<group>"; };
88A25F7519D8E01A00924534 /* JSQMessagesCollectionViewLayoutAttributes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewLayoutAttributes.m; sourceTree = "<group>"; };
88A25F7919D8E01A00924534 /* JSQMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessage.h; sourceTree = "<group>"; };
88A25F7A19D8E01A00924534 /* JSQMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessage.m; sourceTree = "<group>"; };
88A25F7B19D8E01A00924534 /* JSQMessageAvatarImageDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessageAvatarImageDataSource.h; sourceTree = "<group>"; };
88A25F7C19D8E01A00924534 /* JSQMessageBubbleImageDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessageBubbleImageDataSource.h; sourceTree = "<group>"; };
88A25F7D19D8E01A00924534 /* JSQMessageData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessageData.h; sourceTree = "<group>"; };
88A25F7E19D8E01A00924534 /* JSQMessageMediaData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessageMediaData.h; sourceTree = "<group>"; };
88A25F7F19D8E01A00924534 /* JSQMessagesAvatarImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesAvatarImage.h; sourceTree = "<group>"; };
88A25F8019D8E01A00924534 /* JSQMessagesAvatarImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesAvatarImage.m; sourceTree = "<group>"; };
88A25F8119D8E01A00924534 /* JSQMessagesBubbleImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesBubbleImage.h; sourceTree = "<group>"; };
88A25F8219D8E01A00924534 /* JSQMessagesBubbleImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesBubbleImage.m; sourceTree = "<group>"; };
88A25F8319D8E01A00924534 /* JSQMessagesCollectionViewDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionViewDataSource.h; sourceTree = "<group>"; };
88A25F8419D8E01A00924534 /* JSQMessagesCollectionViewDelegateFlowLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionViewDelegateFlowLayout.h; sourceTree = "<group>"; };
88A25F8519D8E01A00924534 /* JSQPhotoMediaItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQPhotoMediaItem.h; sourceTree = "<group>"; };
88A25F8619D8E01A00924534 /* JSQPhotoMediaItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQPhotoMediaItem.m; sourceTree = "<group>"; };
88A25F8A19D8E01A00924534 /* JSQMessagesCollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionView.h; sourceTree = "<group>"; };
88A25F8B19D8E01A00924534 /* JSQMessagesCollectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionView.m; sourceTree = "<group>"; };
88A25F8C19D8E01A00924534 /* JSQMessagesCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionViewCell.h; sourceTree = "<group>"; };
88A25F8D19D8E01A00924534 /* JSQMessagesCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewCell.m; sourceTree = "<group>"; };
88A25F8E19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionViewCellIncoming.h; sourceTree = "<group>"; };
88A25F8F19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewCellIncoming.m; sourceTree = "<group>"; };
88A25F9019D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQMessagesCollectionViewCellIncoming.xib; sourceTree = "<group>"; };
88A25F9119D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionViewCellOutgoing.h; sourceTree = "<group>"; };
88A25F9219D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewCellOutgoing.m; sourceTree = "<group>"; };
88A25F9319D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQMessagesCollectionViewCellOutgoing.xib; sourceTree = "<group>"; };
88A25F9419D8E01A00924534 /* JSQMessagesComposerTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesComposerTextView.h; sourceTree = "<group>"; };
88A25F9519D8E01A00924534 /* JSQMessagesComposerTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesComposerTextView.m; sourceTree = "<group>"; };
88A25F9619D8E01A00924534 /* JSQMessagesInputToolbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesInputToolbar.h; sourceTree = "<group>"; };
88A25F9719D8E01A00924534 /* JSQMessagesInputToolbar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesInputToolbar.m; sourceTree = "<group>"; };
88A25F9819D8E01A00924534 /* JSQMessagesLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesLabel.h; sourceTree = "<group>"; };
88A25F9919D8E01A00924534 /* JSQMessagesLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesLabel.m; sourceTree = "<group>"; };
88A25F9A19D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesLoadEarlierHeaderView.h; sourceTree = "<group>"; };
88A25F9B19D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesLoadEarlierHeaderView.m; sourceTree = "<group>"; };
88A25F9C19D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQMessagesLoadEarlierHeaderView.xib; sourceTree = "<group>"; };
88A25F9D19D8E01A00924534 /* JSQMessagesToolbarContentView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesToolbarContentView.h; sourceTree = "<group>"; };
88A25F9E19D8E01A00924534 /* JSQMessagesToolbarContentView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesToolbarContentView.m; sourceTree = "<group>"; };
88A25F9F19D8E01A00924534 /* JSQMessagesToolbarContentView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQMessagesToolbarContentView.xib; sourceTree = "<group>"; };
88A25FA019D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesTypingIndicatorFooterView.h; sourceTree = "<group>"; };
88A25FA119D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesTypingIndicatorFooterView.m; sourceTree = "<group>"; };
88A25FA219D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQMessagesTypingIndicatorFooterView.xib; sourceTree = "<group>"; };
88A25FD919D8E0C400924534 /* DemoMessagesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoMessagesViewController.h; sourceTree = "<group>"; };
88A25FDA19D8E0C400924534 /* DemoMessagesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoMessagesViewController.m; sourceTree = "<group>"; };
88A25FDB19D8E0C400924534 /* DemoModelData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoModelData.h; sourceTree = "<group>"; };
88A25FDC19D8E0C400924534 /* DemoModelData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoModelData.m; sourceTree = "<group>"; };
88A25FDD19D8E0C400924534 /* TableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TableViewController.h; sourceTree = "<group>"; };
88A25FDE19D8E0C400924534 /* TableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TableViewController.m; sourceTree = "<group>"; };
88A25FE319D8E18400924534 /* JSQMessagesNSStringTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesNSStringTests.m; sourceTree = "<group>"; };
88A25FE419D8E18400924534 /* JSQMessagesUIColorTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesUIColorTests.m; sourceTree = "<group>"; };
88A25FE519D8E18400924534 /* JSQMessagesUIImageTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesUIImageTests.m; sourceTree = "<group>"; };
88A25FE619D8E18400924534 /* JSQMessagesUIViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesUIViewTests.m; sourceTree = "<group>"; };
88A25FE919D8E18400924534 /* JSQMessagesViewControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesViewControllerTests.m; sourceTree = "<group>"; };
88A25FEB19D8E18400924534 /* JSQMessagesAvatarImageFactoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesAvatarImageFactoryTests.m; sourceTree = "<group>"; };
88A25FEC19D8E18400924534 /* JSQMessagesBubbleImageFactoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesBubbleImageFactoryTests.m; sourceTree = "<group>"; };
88A25FED19D8E18400924534 /* JSQMessagesTimestampFormatterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesTimestampFormatterTests.m; sourceTree = "<group>"; };
88A25FEE19D8E18400924534 /* JSQMessagesToolbarButtonFactoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesToolbarButtonFactoryTests.m; sourceTree = "<group>"; };
88A25FF019D8E18400924534 /* JSQMessagesCollectionViewFlowLayoutTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewFlowLayoutTests.m; sourceTree = "<group>"; };
88A25FF119D8E18400924534 /* JSQMessagesCollectionViewLayoutAttributesTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewLayoutAttributesTests.m; sourceTree = "<group>"; };
88A25FF319D8E18400924534 /* JSQMessageMediaTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessageMediaTests.m; sourceTree = "<group>"; };
88A25FF419D8E18400924534 /* JSQMessagesAvatarImageTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesAvatarImageTests.m; sourceTree = "<group>"; };
88A25FF519D8E18400924534 /* JSQMessagesBubbleImageTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesBubbleImageTests.m; sourceTree = "<group>"; };
88A25FF619D8E18400924534 /* JSQMessageTextTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessageTextTests.m; sourceTree = "<group>"; };
88A25FF919D8E18400924534 /* JSQMessagesCollectionViewCellTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewCellTests.m; sourceTree = "<group>"; };
88A25FFA19D8E18400924534 /* JSQMessagesCollectionViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewTests.m; sourceTree = "<group>"; };
88A25FFB19D8E18400924534 /* JSQMessagesComposerTextViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesComposerTextViewTests.m; sourceTree = "<group>"; };
88A25FFC19D8E18400924534 /* JSQMessagesInputToolbarTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesInputToolbarTests.m; sourceTree = "<group>"; };
88A25FFD19D8E18400924534 /* JSQMessagesLabelTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesLabelTests.m; sourceTree = "<group>"; };
88A25FFE19D8E18400924534 /* JSQMessagesLoadEarlierHeaderViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesLoadEarlierHeaderViewTests.m; sourceTree = "<group>"; };
88A25FFF19D8E18400924534 /* JSQMessagesToolbarContentViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesToolbarContentViewTests.m; sourceTree = "<group>"; };
88A2600019D8E18400924534 /* JSQMessagesTypingIndicatorFooterViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesTypingIndicatorFooterViewTests.m; sourceTree = "<group>"; };
88A2601A19D8E45600924534 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
88A901B419F618B100F99777 /* JSQMediaItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMediaItem.h; sourceTree = "<group>"; };
88A901B519F618B100F99777 /* JSQMediaItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMediaItem.m; sourceTree = "<group>"; };
88B5C41D1B7C422900EC79D4 /* JSQMessagesBubblesSizeCalculator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesBubblesSizeCalculator.h; sourceTree = "<group>"; };
88B5C41E1B7C422900EC79D4 /* JSQMessagesBubblesSizeCalculator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesBubblesSizeCalculator.m; sourceTree = "<group>"; };
88B5C4201B7C424700EC79D4 /* JSQMessagesBubbleSizeCalculating.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesBubbleSizeCalculating.h; sourceTree = "<group>"; };
88C00A4D1A44D4C600B004B3 /* JSQLocationMediaItemTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQLocationMediaItemTests.m; sourceTree = "<group>"; };
88C00A4F1A44D4D800B004B3 /* JSQPhotoMediaItemTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQPhotoMediaItemTests.m; sourceTree = "<group>"; };
88C00A511A44D4E500B004B3 /* JSQVideoMediaItemTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQVideoMediaItemTests.m; sourceTree = "<group>"; };
88C4582E19F5F7A0008FD427 /* JSQMessagesMediaViewBubbleImageMasker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesMediaViewBubbleImageMasker.h; sourceTree = "<group>"; };
88C4582F19F5F7A0008FD427 /* JSQMessagesMediaViewBubbleImageMasker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesMediaViewBubbleImageMasker.m; sourceTree = "<group>"; };
A04B0EBD1D6ADE5800FBDC47 /* JSQMessagesVideoThumbnailFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesVideoThumbnailFactory.h; sourceTree = "<group>"; };
A04B0EBE1D6ADE5800FBDC47 /* JSQMessagesVideoThumbnailFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesVideoThumbnailFactory.m; sourceTree = "<group>"; };
BF10D6A81D062AD10072D215 /* JSQMessagesTypingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesTypingView.h; sourceTree = "<group>"; };
BF10D6A91D062AD10072D215 /* JSQMessagesTypingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesTypingView.m; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
88A25EFF19D8DEC400924534 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
1F0EFE0F1AC23D7E003FF3DB /* MobileCoreServices.framework in Frameworks */,
88445B4419E1B5110014F889 /* MapKit.framework in Frameworks */,
88445B4219E1B50B0014F889 /* CoreLocation.framework in Frameworks */,
88445B3719E0AE5C0014F889 /* QuartzCore.framework in Frameworks */,
88445B3519E0AE4A0014F889 /* CoreGraphics.framework in Frameworks */,
88445B3319E0AE450014F889 /* Foundation.framework in Frameworks */,
88445B3119E0AE3F0014F889 /* UIKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
88A25F1819D8DEC400924534 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
88445B4619E1B5290014F889 /* MapKit.framework in Frameworks */,
88445B4519E1B5210014F889 /* CoreLocation.framework in Frameworks */,
88445B3D19E0C0BE0014F889 /* QuartzCore.framework in Frameworks */,
88445B3C19E0C0B80014F889 /* CoreGraphics.framework in Frameworks */,
88445B3B19E0C0B10014F889 /* XCTest.framework in Frameworks */,
88445B3919E0C0AC0014F889 /* Foundation.framework in Frameworks */,
88445B3819E0C0A70014F889 /* UIKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
636A8663AEEE5C37B65C515D /* Frameworks */ = {
isa = PBXGroup;
children = (
1F0EFE0E1AC23D7E003FF3DB /* MobileCoreServices.framework */,
88445B3419E0AE4A0014F889 /* CoreGraphics.framework */,
88445B4119E1B50B0014F889 /* CoreLocation.framework */,
88445B3219E0AE450014F889 /* Foundation.framework */,
88445B4319E1B5110014F889 /* MapKit.framework */,
88445B3619E0AE5C0014F889 /* QuartzCore.framework */,
88445B3019E0AE3F0014F889 /* UIKit.framework */,
88445B3A19E0C0B10014F889 /* XCTest.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
88A25EF919D8DEC400924534 = {
isa = PBXGroup;
children = (
886C33FE19F45E30006B4997 /* JSQMessagesViewController.podspec */,
88A25F3E19D8E01A00924534 /* JSQMessagesViewController */,
636A8663AEEE5C37B65C515D /* Frameworks */,
88A25F2B19D8DF2500924534 /* JSQMessagesDemo */,
88A25F1E19D8DEC500924534 /* JSQMessagesTests */,
88A25F0319D8DEC400924534 /* Products */,
);
sourceTree = "<group>";
};
88A25F0319D8DEC400924534 /* Products */ = {
isa = PBXGroup;
children = (
88A25F0219D8DEC400924534 /* JSQMessages.app */,
88A25F1B19D8DEC500924534 /* JSQMessagesTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
88A25F1E19D8DEC500924534 /* JSQMessagesTests */ = {
isa = PBXGroup;
children = (
88A25FE219D8E18400924534 /* CategoryTests */,
88A25FE719D8E18400924534 /* ControllerTests */,
88A25FEA19D8E18400924534 /* FactoryTests */,
88A25FEF19D8E18400924534 /* LayoutTests */,
88A25FF219D8E18400924534 /* ModelTests */,
88A25FF819D8E18400924534 /* ViewTests */,
88A25F1F19D8DEC500924534 /* Supporting Files */,
);
path = JSQMessagesTests;
sourceTree = "<group>";
};
88A25F1F19D8DEC500924534 /* Supporting Files */ = {
isa = PBXGroup;
children = (
88A25F2019D8DEC500924534 /* Info.plist */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
88A25F2B19D8DF2500924534 /* JSQMessagesDemo */ = {
isa = PBXGroup;
children = (
88A25F2C19D8DF2500924534 /* AppDelegate.h */,
88A25F2D19D8DF2500924534 /* AppDelegate.m */,
88A25FD919D8E0C400924534 /* DemoMessagesViewController.h */,
88A25FDA19D8E0C400924534 /* DemoMessagesViewController.m */,
88A25FDB19D8E0C400924534 /* DemoModelData.h */,
88A25FDC19D8E0C400924534 /* DemoModelData.m */,
8885734819DE540400E89D20 /* DemoSettingsViewController.h */,
8885734919DE540400E89D20 /* DemoSettingsViewController.m */,
88A25F3219D8DF2500924534 /* Images.xcassets */,
88A2601A19D8E45600924534 /* Info.plist */,
54271E3A1C90469100294290 /* jsq_messages_sample.m4a */,
88A25F3419D8DF2500924534 /* main.m */,
88A25F3019D8DF2500924534 /* Main.storyboard */,
8885734B19DE55D000E89D20 /* NSUserDefaults+DemoSettings.h */,
8885734C19DE55D000E89D20 /* NSUserDefaults+DemoSettings.m */,
88A25FDD19D8E0C400924534 /* TableViewController.h */,
88A25FDE19D8E0C400924534 /* TableViewController.m */,
50B7F5AA1CA401FA009A44F5 /* Localizable.strings */,
);
path = JSQMessagesDemo;
sourceTree = "<group>";
};
88A25F3E19D8E01A00924534 /* JSQMessagesViewController */ = {
isa = PBXGroup;
children = (
88A25F3F19D8E01A00924534 /* Assets */,
88A25F5419D8E01A00924534 /* Categories */,
88A25F5F19D8E01A00924534 /* Controllers */,
88A25F6519D8E01A00924534 /* Factories */,
88A25F6E19D8E01A00924534 /* JSQMessages.h */,
88A25F6F19D8E01A00924534 /* Layout */,
88A25F7619D8E01A00924534 /* Model */,
88A25F8919D8E01A00924534 /* Views */,
);
path = JSQMessagesViewController;
sourceTree = "<group>";
};
88A25F3F19D8E01A00924534 /* Assets */ = {
isa = PBXGroup;
children = (
8861666C19F492B70025B958 /* JSQMessagesAssets.bundle */,
);
path = Assets;
sourceTree = "<group>";
};
88A25F5419D8E01A00924534 /* Categories */ = {
isa = PBXGroup;
children = (
8873B60A1AB7B244006DF9AC /* NSBundle+JSQMessages.h */,
8873B60B1AB7B244006DF9AC /* NSBundle+JSQMessages.m */,
88A25F5719D8E01A00924534 /* NSString+JSQMessages.h */,
88A25F5819D8E01A00924534 /* NSString+JSQMessages.m */,
88A25F5919D8E01A00924534 /* UIColor+JSQMessages.h */,
88A25F5A19D8E01A00924534 /* UIColor+JSQMessages.m */,
88A25F5B19D8E01A00924534 /* UIImage+JSQMessages.h */,
88A25F5C19D8E01A00924534 /* UIImage+JSQMessages.m */,
88A25F5D19D8E01A00924534 /* UIView+JSQMessages.h */,
88A25F5E19D8E01A00924534 /* UIView+JSQMessages.m */,
);
path = Categories;
sourceTree = "<group>";
};
88A25F5F19D8E01A00924534 /* Controllers */ = {
isa = PBXGroup;
children = (
88A25F6219D8E01A00924534 /* JSQMessagesViewController.h */,
88A25F6319D8E01A00924534 /* JSQMessagesViewController.m */,
88A25F6419D8E01A00924534 /* JSQMessagesViewController.xib */,
);
path = Controllers;
sourceTree = "<group>";
};
88A25F6519D8E01A00924534 /* Factories */ = {
isa = PBXGroup;
children = (
88A25F6619D8E01A00924534 /* JSQMessagesAvatarImageFactory.h */,
88A25F6719D8E01A00924534 /* JSQMessagesAvatarImageFactory.m */,
88A25F6819D8E01A00924534 /* JSQMessagesBubbleImageFactory.h */,
88A25F6919D8E01A00924534 /* JSQMessagesBubbleImageFactory.m */,
88C4582E19F5F7A0008FD427 /* JSQMessagesMediaViewBubbleImageMasker.h */,
88C4582F19F5F7A0008FD427 /* JSQMessagesMediaViewBubbleImageMasker.m */,
88A25F6A19D8E01A00924534 /* JSQMessagesTimestampFormatter.h */,
88A25F6B19D8E01A00924534 /* JSQMessagesTimestampFormatter.m */,
88A25F6C19D8E01A00924534 /* JSQMessagesToolbarButtonFactory.h */,
88A25F6D19D8E01A00924534 /* JSQMessagesToolbarButtonFactory.m */,
A04B0EBD1D6ADE5800FBDC47 /* JSQMessagesVideoThumbnailFactory.h */,
A04B0EBE1D6ADE5800FBDC47 /* JSQMessagesVideoThumbnailFactory.m */,
);
path = Factories;
sourceTree = "<group>";
};
88A25F6F19D8E01A00924534 /* Layout */ = {
isa = PBXGroup;
children = (
544A321F1CB2EE380084BFC0 /* JSQAudioMediaViewAttributes.h */,
544A32201CB2EE380084BFC0 /* JSQAudioMediaViewAttributes.m */,
88B5C4201B7C424700EC79D4 /* JSQMessagesBubbleSizeCalculating.h */,
88B5C41D1B7C422900EC79D4 /* JSQMessagesBubblesSizeCalculator.h */,
88B5C41E1B7C422900EC79D4 /* JSQMessagesBubblesSizeCalculator.m */,
88A25F7019D8E01A00924534 /* JSQMessagesCollectionViewFlowLayout.h */,
88A25F7119D8E01A00924534 /* JSQMessagesCollectionViewFlowLayout.m */,
88A25F7219D8E01A00924534 /* JSQMessagesCollectionViewFlowLayoutInvalidationContext.h */,
88A25F7319D8E01A00924534 /* JSQMessagesCollectionViewFlowLayoutInvalidationContext.m */,
88A25F7419D8E01A00924534 /* JSQMessagesCollectionViewLayoutAttributes.h */,
88A25F7519D8E01A00924534 /* JSQMessagesCollectionViewLayoutAttributes.m */,
);
path = Layout;
sourceTree = "<group>";
};
88A25F7619D8E01A00924534 /* Model */ = {
isa = PBXGroup;
children = (
54271E3C1C905B9200294290 /* JSQAudioMediaItem.h */,
54271E3D1C905B9200294290 /* JSQAudioMediaItem.m */,
88445B3E19E1B4470014F889 /* JSQLocationMediaItem.h */,
88445B3F19E1B4470014F889 /* JSQLocationMediaItem.m */,
88A901B419F618B100F99777 /* JSQMediaItem.h */,
88A901B519F618B100F99777 /* JSQMediaItem.m */,
88A25F7919D8E01A00924534 /* JSQMessage.h */,
88A25F7A19D8E01A00924534 /* JSQMessage.m */,
88A25F7B19D8E01A00924534 /* JSQMessageAvatarImageDataSource.h */,
88A25F7C19D8E01A00924534 /* JSQMessageBubbleImageDataSource.h */,
88A25F7D19D8E01A00924534 /* JSQMessageData.h */,
88A25F7E19D8E01A00924534 /* JSQMessageMediaData.h */,
88A25F7F19D8E01A00924534 /* JSQMessagesAvatarImage.h */,
88A25F8019D8E01A00924534 /* JSQMessagesAvatarImage.m */,
88A25F8119D8E01A00924534 /* JSQMessagesBubbleImage.h */,
88A25F8219D8E01A00924534 /* JSQMessagesBubbleImage.m */,
88A25F8319D8E01A00924534 /* JSQMessagesCollectionViewDataSource.h */,
88A25F8419D8E01A00924534 /* JSQMessagesCollectionViewDelegateFlowLayout.h */,
88A25F8519D8E01A00924534 /* JSQPhotoMediaItem.h */,
88A25F8619D8E01A00924534 /* JSQPhotoMediaItem.m */,
886C33FB19F4371E006B4997 /* JSQVideoMediaItem.h */,
886C33FC19F4371E006B4997 /* JSQVideoMediaItem.m */,
58620BCC6ABA99E3C6FD36F5 /* JSQMessagesViewAccessoryButtonDelegate.h */,
);
path = Model;
sourceTree = "<group>";
};
88A25F8919D8E01A00924534 /* Views */ = {
isa = PBXGroup;
children = (
883C11761A09FB100092A16D /* JSQMessagesCellTextView.h */,
883C11771A09FB100092A16D /* JSQMessagesCellTextView.m */,
88A25F8A19D8E01A00924534 /* JSQMessagesCollectionView.h */,
88A25F8B19D8E01A00924534 /* JSQMessagesCollectionView.m */,
88A25F8C19D8E01A00924534 /* JSQMessagesCollectionViewCell.h */,
88A25F8D19D8E01A00924534 /* JSQMessagesCollectionViewCell.m */,
88A25F8E19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.h */,
88A25F8F19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.m */,
88A25F9019D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.xib */,
88A25F9119D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.h */,
88A25F9219D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.m */,
88A25F9319D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.xib */,
88A25F9419D8E01A00924534 /* JSQMessagesComposerTextView.h */,
88A25F9519D8E01A00924534 /* JSQMessagesComposerTextView.m */,
88A25F9619D8E01A00924534 /* JSQMessagesInputToolbar.h */,
88A25F9719D8E01A00924534 /* JSQMessagesInputToolbar.m */,
88A25F9819D8E01A00924534 /* JSQMessagesLabel.h */,
88A25F9919D8E01A00924534 /* JSQMessagesLabel.m */,
88A25F9A19D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.h */,
88A25F9B19D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.m */,
88A25F9C19D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.xib */,
88078A9B19D8FEB5005B4595 /* JSQMessagesMediaPlaceholderView.h */,
88078A9C19D8FEB5005B4595 /* JSQMessagesMediaPlaceholderView.m */,
88A25F9D19D8E01A00924534 /* JSQMessagesToolbarContentView.h */,
88A25F9E19D8E01A00924534 /* JSQMessagesToolbarContentView.m */,
88A25F9F19D8E01A00924534 /* JSQMessagesToolbarContentView.xib */,
88A25FA019D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.h */,
88A25FA119D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.m */,
88A25FA219D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.xib */,
BF10D6A81D062AD10072D215 /* JSQMessagesTypingView.h */,
BF10D6A91D062AD10072D215 /* JSQMessagesTypingView.m */,
);
path = Views;
sourceTree = "<group>";
};
88A25FE219D8E18400924534 /* CategoryTests */ = {
isa = PBXGroup;
children = (
8873B60D1AB7B63E006DF9AC /* JSQMessagesNSBundleTests.m */,
88A25FE319D8E18400924534 /* JSQMessagesNSStringTests.m */,
88A25FE419D8E18400924534 /* JSQMessagesUIColorTests.m */,
88A25FE519D8E18400924534 /* JSQMessagesUIImageTests.m */,
88A25FE619D8E18400924534 /* JSQMessagesUIViewTests.m */,
);
path = CategoryTests;
sourceTree = "<group>";
};
88A25FE719D8E18400924534 /* ControllerTests */ = {
isa = PBXGroup;
children = (
88A25FE919D8E18400924534 /* JSQMessagesViewControllerTests.m */,
);
path = ControllerTests;
sourceTree = "<group>";
};
88A25FEA19D8E18400924534 /* FactoryTests */ = {
isa = PBXGroup;
children = (
88A25FEB19D8E18400924534 /* JSQMessagesAvatarImageFactoryTests.m */,
88A25FEC19D8E18400924534 /* JSQMessagesBubbleImageFactoryTests.m */,
88324C3319F6301C00BC732D /* JSQMessagesMediaViewBubbleImageMaskerTests.m */,
88A25FED19D8E18400924534 /* JSQMessagesTimestampFormatterTests.m */,
88A25FEE19D8E18400924534 /* JSQMessagesToolbarButtonFactoryTests.m */,
);
path = FactoryTests;
sourceTree = "<group>";
};
88A25FEF19D8E18400924534 /* LayoutTests */ = {
isa = PBXGroup;
children = (
88A25FF019D8E18400924534 /* JSQMessagesCollectionViewFlowLayoutTests.m */,
88A25FF119D8E18400924534 /* JSQMessagesCollectionViewLayoutAttributesTests.m */,
);
path = LayoutTests;
sourceTree = "<group>";
};
88A25FF219D8E18400924534 /* ModelTests */ = {
isa = PBXGroup;
children = (
54271E3F1C905D1600294290 /* JSQAudioMediaItemTests.m */,
88C00A4D1A44D4C600B004B3 /* JSQLocationMediaItemTests.m */,
88A25FF319D8E18400924534 /* JSQMessageMediaTests.m */,
88A25FF419D8E18400924534 /* JSQMessagesAvatarImageTests.m */,
88A25FF519D8E18400924534 /* JSQMessagesBubbleImageTests.m */,
88A25FF619D8E18400924534 /* JSQMessageTextTests.m */,
88C00A4F1A44D4D800B004B3 /* JSQPhotoMediaItemTests.m */,
88C00A511A44D4E500B004B3 /* JSQVideoMediaItemTests.m */,
);
path = ModelTests;
sourceTree = "<group>";
};
88A25FF819D8E18400924534 /* ViewTests */ = {
isa = PBXGroup;
children = (
88A25FF919D8E18400924534 /* JSQMessagesCollectionViewCellTests.m */,
88A25FFA19D8E18400924534 /* JSQMessagesCollectionViewTests.m */,
88A25FFB19D8E18400924534 /* JSQMessagesComposerTextViewTests.m */,
88A25FFC19D8E18400924534 /* JSQMessagesInputToolbarTests.m */,
88A25FFD19D8E18400924534 /* JSQMessagesLabelTests.m */,
88A25FFE19D8E18400924534 /* JSQMessagesLoadEarlierHeaderViewTests.m */,
88A25FFF19D8E18400924534 /* JSQMessagesToolbarContentViewTests.m */,
88A2600019D8E18400924534 /* JSQMessagesTypingIndicatorFooterViewTests.m */,
);
path = ViewTests;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
88A25F0119D8DEC400924534 /* JSQMessages */ = {
isa = PBXNativeTarget;
buildConfigurationList = 88A25F2519D8DEC500924534 /* Build configuration list for PBXNativeTarget "JSQMessages" */;
buildPhases = (
88A25EFE19D8DEC400924534 /* Sources */,
88A25EFF19D8DEC400924534 /* Frameworks */,
88A25F0019D8DEC400924534 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = JSQMessages;
productName = JSQMessages;
productReference = 88A25F0219D8DEC400924534 /* JSQMessages.app */;
productType = "com.apple.product-type.application";
};
88A25F1A19D8DEC400924534 /* JSQMessagesTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 88A25F2819D8DEC500924534 /* Build configuration list for PBXNativeTarget "JSQMessagesTests" */;
buildPhases = (
88A25F1719D8DEC400924534 /* Sources */,
88A25F1819D8DEC400924534 /* Frameworks */,
88A25F1919D8DEC400924534 /* Resources */,
);
buildRules = (
);
dependencies = (
88A25F1D19D8DEC500924534 /* PBXTargetDependency */,
);
name = JSQMessagesTests;
productName = JSQMessagesTests;
productReference = 88A25F1B19D8DEC500924534 /* JSQMessagesTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
88A25EFA19D8DEC400924534 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0800;
ORGANIZATIONNAME = "Hexed Bits";
TargetAttributes = {
88A25F0119D8DEC400924534 = {
CreatedOnToolsVersion = 6.0.1;
};
88A25F1A19D8DEC400924534 = {
CreatedOnToolsVersion = 6.0.1;
TestTargetID = 88A25F0119D8DEC400924534;
};
};
};
buildConfigurationList = 88A25EFD19D8DEC400924534 /* Build configuration list for PBXProject "JSQMessages" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
es,
de,
"zh-Hans",
"zh-Hant",
ro,
ru,
pl,
pt,
fr,
it,
he,
nl,
tr,
);
mainGroup = 88A25EF919D8DEC400924534;
productRefGroup = 88A25F0319D8DEC400924534 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
88A25F0119D8DEC400924534 /* JSQMessages */,
88A25F1A19D8DEC400924534 /* JSQMessagesTests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
88A25F0019D8DEC400924534 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
886C33FF19F45E30006B4997 /* JSQMessagesViewController.podspec in Resources */,
8861666D19F492B70025B958 /* JSQMessagesAssets.bundle in Resources */,
50B7F5A81CA401FA009A44F5 /* Localizable.strings in Resources */,
88A25FCF19D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.xib in Resources */,
88A25FCD19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.xib in Resources */,
88A25FD619D8E01A00924534 /* JSQMessagesToolbarContentView.xib in Resources */,
88A25F3A19D8DF2500924534 /* Images.xcassets in Resources */,
54271E3B1C90469100294290 /* jsq_messages_sample.m4a in Resources */,
88A25FBC19D8E01A00924534 /* JSQMessagesViewController.xib in Resources */,
88A25FD819D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.xib in Resources */,
88A25F3919D8DF2500924534 /* Main.storyboard in Resources */,
88A25FD419D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
88A25F1919D8DEC400924534 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
88A2601B19D8E45600924534 /* Info.plist in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
88A25EFE19D8DEC400924534 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
88078A9D19D8FEB5005B4595 /* JSQMessagesMediaPlaceholderView.m in Sources */,
88A25FCE19D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.m in Sources */,
88A25FD119D8E01A00924534 /* JSQMessagesInputToolbar.m in Sources */,
88A25FCB19D8E01A00924534 /* JSQMessagesCollectionViewCell.m in Sources */,
88A25FBB19D8E01A00924534 /* JSQMessagesViewController.m in Sources */,
8885734D19DE55D000E89D20 /* NSUserDefaults+DemoSettings.m in Sources */,
A04B0EBF1D6ADE5800FBDC47 /* JSQMessagesVideoThumbnailFactory.m in Sources */,
544A32211CB2EE380084BFC0 /* JSQAudioMediaViewAttributes.m in Sources */,
883C11781A09FB100092A16D /* JSQMessagesCellTextView.m in Sources */,
88A25FB919D8E01A00924534 /* UIView+JSQMessages.m in Sources */,
88A25FCA19D8E01A00924534 /* JSQMessagesCollectionView.m in Sources */,
88A25FD219D8E01A00924534 /* JSQMessagesLabel.m in Sources */,
88445B4019E1B4470014F889 /* JSQLocationMediaItem.m in Sources */,
88A25FC619D8E01A00924534 /* JSQMessagesAvatarImage.m in Sources */,
88A25FD519D8E01A00924534 /* JSQMessagesToolbarContentView.m in Sources */,
88A25FC119D8E01A00924534 /* JSQMessagesCollectionViewFlowLayout.m in Sources */,
8885734A19DE540400E89D20 /* DemoSettingsViewController.m in Sources */,
88A25FC719D8E01A00924534 /* JSQMessagesBubbleImage.m in Sources */,
88A25FC519D8E01A00924534 /* JSQMessage.m in Sources */,
88A25FD719D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.m in Sources */,
88A25FD319D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.m in Sources */,
88A25FC819D8E01A00924534 /* JSQPhotoMediaItem.m in Sources */,
88C4583019F5F7A0008FD427 /* JSQMessagesMediaViewBubbleImageMasker.m in Sources */,
88A25FB819D8E01A00924534 /* UIImage+JSQMessages.m in Sources */,
88A25FBF19D8E01A00924534 /* JSQMessagesTimestampFormatter.m in Sources */,
88A25FE019D8E0C400924534 /* DemoModelData.m in Sources */,
88A25F3C19D8DF2500924534 /* main.m in Sources */,
88A25F3719D8DF2500924534 /* AppDelegate.m in Sources */,
54271E3E1C905B9200294290 /* JSQAudioMediaItem.m in Sources */,
88B5C41F1B7C422900EC79D4 /* JSQMessagesBubblesSizeCalculator.m in Sources */,
BF10D6AA1D062AD10072D215 /* JSQMessagesTypingView.m in Sources */,
88A25FB619D8E01A00924534 /* NSString+JSQMessages.m in Sources */,
88A901B619F618B100F99777 /* JSQMediaItem.m in Sources */,
88A25FCC19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.m in Sources */,
88A25FBE19D8E01A00924534 /* JSQMessagesBubbleImageFactory.m in Sources */,
88A25FDF19D8E0C400924534 /* DemoMessagesViewController.m in Sources */,
88A25FB719D8E01A00924534 /* UIColor+JSQMessages.m in Sources */,
886C33FD19F4371E006B4997 /* JSQVideoMediaItem.m in Sources */,
88A25FC019D8E01A00924534 /* JSQMessagesToolbarButtonFactory.m in Sources */,
88A25FC219D8E01A00924534 /* JSQMessagesCollectionViewFlowLayoutInvalidationContext.m in Sources */,
88A25FE119D8E0C400924534 /* TableViewController.m in Sources */,
88A25FBD19D8E01A00924534 /* JSQMessagesAvatarImageFactory.m in Sources */,
8873B60C1AB7B244006DF9AC /* NSBundle+JSQMessages.m in Sources */,
88A25FD019D8E01A00924534 /* JSQMessagesComposerTextView.m in Sources */,
88A25FC319D8E01A00924534 /* JSQMessagesCollectionViewLayoutAttributes.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
88A25F1719D8DEC400924534 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
88A2600219D8E18400924534 /* JSQMessagesUIColorTests.m in Sources */,
88A2601819D8E18400924534 /* JSQMessagesToolbarContentViewTests.m in Sources */,
88C00A521A44D4E500B004B3 /* JSQVideoMediaItemTests.m in Sources */,
88A2601519D8E18400924534 /* JSQMessagesInputToolbarTests.m in Sources */,
88A2601719D8E18400924534 /* JSQMessagesLoadEarlierHeaderViewTests.m in Sources */,
54271E401C905D1600294290 /* JSQAudioMediaItemTests.m in Sources */,
88A2601219D8E18400924534 /* JSQMessagesCollectionViewCellTests.m in Sources */,
88A2601619D8E18400924534 /* JSQMessagesLabelTests.m in Sources */,
88A2600B19D8E18400924534 /* JSQMessagesCollectionViewFlowLayoutTests.m in Sources */,
88A2601019D8E18400924534 /* JSQMessageTextTests.m in Sources */,
88A2600D19D8E18400924534 /* JSQMessageMediaTests.m in Sources */,
88A2600719D8E18400924534 /* JSQMessagesAvatarImageFactoryTests.m in Sources */,
88A2600419D8E18400924534 /* JSQMessagesUIViewTests.m in Sources */,
88A2600F19D8E18400924534 /* JSQMessagesBubbleImageTests.m in Sources */,
88A2600E19D8E18400924534 /* JSQMessagesAvatarImageTests.m in Sources */,
88A2600919D8E18400924534 /* JSQMessagesTimestampFormatterTests.m in Sources */,
88A2601419D8E18400924534 /* JSQMessagesComposerTextViewTests.m in Sources */,
88A2601319D8E18400924534 /* JSQMessagesCollectionViewTests.m in Sources */,
88A2600119D8E18400924534 /* JSQMessagesNSStringTests.m in Sources */,
88A2600A19D8E18400924534 /* JSQMessagesToolbarButtonFactoryTests.m in Sources */,
88C00A501A44D4D800B004B3 /* JSQPhotoMediaItemTests.m in Sources */,
88324C3419F6301C00BC732D /* JSQMessagesMediaViewBubbleImageMaskerTests.m in Sources */,
88A2601919D8E18400924534 /* JSQMessagesTypingIndicatorFooterViewTests.m in Sources */,
88A2600319D8E18400924534 /* JSQMessagesUIImageTests.m in Sources */,
88C00A4E1A44D4C600B004B3 /* JSQLocationMediaItemTests.m in Sources */,
8873B60E1AB7B63E006DF9AC /* JSQMessagesNSBundleTests.m in Sources */,
88A2600C19D8E18400924534 /* JSQMessagesCollectionViewLayoutAttributesTests.m in Sources */,
88A2600619D8E18400924534 /* JSQMessagesViewControllerTests.m in Sources */,
88A2600819D8E18400924534 /* JSQMessagesBubbleImageFactoryTests.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
88A25F1D19D8DEC500924534 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 88A25F0119D8DEC400924534 /* JSQMessages */;
targetProxy = 88A25F1C19D8DEC500924534 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
50B7F5AA1CA401FA009A44F5 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
50B7F5A91CA401FA009A44F5 /* he */,
50B7F5AB1CA40202009A44F5 /* Base */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
88A25F3019D8DF2500924534 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
88A25F3119D8DF2500924534 /* Base */,
50B7F5A51CA3FF4E009A44F5 /* he */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
88A25F2319D8DEC500924534 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
88A25F2419D8DEC500924534 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = YES;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
88A25F2619D8DEC500924534 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = "$(SRCROOT)/JSQMessagesDemo/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
OTHER_LDFLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = "com.hexedbits.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
};
name = Debug;
};
88A25F2719D8DEC500924534 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = "$(SRCROOT)/JSQMessagesDemo/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
OTHER_LDFLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = "com.hexedbits.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
};
name = Release;
};
88A25F2919D8DEC500924534 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
INFOPLIST_FILE = JSQMessagesTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.hexedbits.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/JSQMessages.app/JSQMessages";
};
name = Debug;
};
88A25F2A19D8DEC500924534 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = JSQMessagesTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.hexedbits.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/JSQMessages.app/JSQMessages";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
88A25EFD19D8DEC400924534 /* Build configuration list for PBXProject "JSQMessages" */ = {
isa = XCConfigurationList;
buildConfigurations = (
88A25F2319D8DEC500924534 /* Debug */,
88A25F2419D8DEC500924534 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
88A25F2519D8DEC500924534 /* Build configuration list for PBXNativeTarget "JSQMessages" */ = {
isa = XCConfigurationList;
buildConfigurations = (
88A25F2619D8DEC500924534 /* Debug */,
88A25F2719D8DEC500924534 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
88A25F2819D8DEC500924534 /* Build configuration list for PBXNativeTarget "JSQMessagesTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
88A25F2919D8DEC500924534 /* Debug */,
88A25F2A19D8DEC500924534 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 88A25EFA19D8DEC400924534 /* Project object */;
}
================================================
FILE: JSQMessages.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:JSQMessages.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: JSQMessages.xcodeproj/xcshareddata/xcschemes/JSQMessages.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0800"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D14DE867BBE115B80620BD22C0E35F79"
BuildableName = "libPods.a"
BlueprintName = "Pods"
ReferencedContainer = "container:Pods/Pods.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "88A25F0119D8DEC400924534"
BuildableName = "JSQMessages.app"
BlueprintName = "JSQMessages"
ReferencedContainer = "container:JSQMessages.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "NO"
buildForArchiving = "NO"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "88A25F1A19D8DEC400924534"
BuildableName = "JSQMessagesTests.xctest"
BlueprintName = "JSQMessagesTests"
ReferencedContainer = "container:JSQMessages.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "88A25F1A19D8DEC400924534"
BuildableName = "JSQMessagesTests.xctest"
BlueprintName = "JSQMessagesTests"
ReferencedContainer = "container:JSQMessages.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "88A25F0119D8DEC400924534"
BuildableName = "JSQMessages.app"
BlueprintName = "JSQMessages"
ReferencedContainer = "container:JSQMessages.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "88A25F0119D8DEC400924534"
BuildableName = "JSQMessages.app"
BlueprintName = "JSQMessages"
ReferencedContainer = "container:JSQMessages.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "88A25F0119D8DEC400924534"
BuildableName = "JSQMessages.app"
BlueprintName = "JSQMessages"
ReferencedContainer = "container:JSQMessages.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: JSQMessages.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:JSQMessages.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: JSQMessagesDemo/AppDelegate.h
================================================
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
================================================
FILE: JSQMessagesDemo/AppDelegate.m
================================================
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
#import "AppDelegate.h"
#import "NSUserDefaults+DemoSettings.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Load our default settings
[NSUserDefaults saveIncomingAvatarSetting:YES];
[NSUserDefaults saveOutgoingAvatarSetting:YES];
return YES;
}
@end
================================================
FILE: JSQMessagesDemo/Base.lproj/Localizable.strings
================================================
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
"Media messages" = "Media messages";
"Cancel" = "Cancel";
"Send photo" = "Send photo";
"Send location" = "Send location";
"Send video" = "Send video";
"Send video thumbnail" = "Send video with thumbnail";
"Custom Action" = "Custom Action";
"OK" = "OK";
"Welcome to JSQMessages: A messaging UI framework for iOS." = "Welcome to JSQMessages: A messaging UI framework for iOS.";
"It is simple, elegant, and easy to use. There are super sweet default settings, but you can customize like crazy." = "It is simple, elegant, and easy to use. There are super sweet default settings, but you can customize like crazy.";
"It even has data detectors. You can call me tonight. My cell number is 123-456-7890. My website is www.hexedbits.com." = "It even has data detectors. You can call me tonight. My cell number is 123-456-7890. My website is www.hexedbits.com.";
"JSQMessagesViewController is nearly an exact replica of the iOS Messages App. And perhaps, better." = "JSQMessagesViewController is nearly an exact replica of the iOS Messages App. And perhaps, better.";
"It is unit-tested, free, open-source, and documented." = "It is unit-tested, free, open-source, and documented.";
"Now with media messages!" = "Now with media messages!";
================================================
FILE: JSQMessagesDemo/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15G31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="JRd-Be-psV">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
<!--Root View Controller-->
<scene sceneID="IjL-71-Ll6">
<objects>
<tableViewController id="rXs-qR-ns2" customClass="TableViewController" sceneMemberID="viewController">
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="d0b-Sx-5kJ">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="0.93725490199999995" green="0.93725490199999995" blue="0.95686274510000002" alpha="1" colorSpace="calibratedRGB"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="CellIdentifier" textLabel="2qz-Z2-GmT" style="IBUITableViewCellStyleDefault" id="k8B-cw-dMU">
<rect key="frame" x="0.0" y="114" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="k8B-cw-dMU" id="kX4-QF-oKx">
<rect key="frame" x="0.0" y="0.0" width="287" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="2qz-Z2-GmT">
<rect key="frame" x="15" y="0.0" width="270" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="system" pointSize="18"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
</tableViewCell>
</prototypes>
</tableView>
<navigationItem key="navigationItem" title="Root View Controller" id="irr-Pn-9x5"/>
<connections>
<segue destination="JdJ-0X-ZL8" kind="push" identifier="seguePushDemoVC" id="Hvf-k8-GSP"/>
<segue destination="s4z-xn-r6C" kind="modal" identifier="segueModalDemoVC" id="4UP-0e-ylo"/>
<segue destination="y7K-ZU-Xs9" kind="push" identifier="SegueToSettings" id="u7b-st-FND"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="IcC-ug-dCB" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-2982" y="274"/>
</scene>
<!--Settings-->
<scene sceneID="6rZ-ao-qyI">
<objects>
<tableViewController id="y7K-ZU-Xs9" customClass="DemoSettingsViewController" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" allowsSelection="NO" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="GY5-ob-knb">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="0.93725490199999995" green="0.93725490199999995" blue="0.95686274510000002" alpha="1" colorSpace="calibratedRGB"/>
<sections>
<tableViewSection headerTitle="Messages" id="ygb-Dp-o4r">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="Eii-ro-1yZ">
<rect key="frame" x="0.0" y="114" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Eii-ro-1yZ" id="qU9-o3-MWC">
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="K7N-os-fuc">
<rect key="frame" x="263" y="6" width="51" height="31"/>
<constraints>
<constraint firstAttribute="width" constant="49" id="A6s-Sr-u8U"/>
<constraint firstAttribute="height" constant="31" id="z9i-uJ-MBq"/>
</constraints>
<connections>
<action selector="didTapSwitch:" destination="y7K-ZU-Xs9" eventType="valueChanged" id="Ebi-bs-7Bc"/>
</connections>
</switch>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Load extra messages" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bSS-CD-nfD">
<rect key="frame" x="8" y="10" width="247" height="24"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="bSS-CD-nfD" firstAttribute="top" secondItem="qU9-o3-MWC" secondAttribute="top" constant="10" id="4Iw-W0-qZs"/>
<constraint firstAttribute="trailing" secondItem="K7N-os-fuc" secondAttribute="trailing" constant="8" id="Fex-nr-C1R"/>
<constraint firstItem="bSS-CD-nfD" firstAttribute="leading" secondItem="qU9-o3-MWC" secondAttribute="leading" constant="8" id="N5B-E5-Pzk"/>
<constraint firstItem="K7N-os-fuc" firstAttribute="leading" secondItem="bSS-CD-nfD" secondAttribute="trailing" constant="8" id="O2Y-G9-d6n"/>
<constraint firstAttribute="centerY" secondItem="K7N-os-fuc" secondAttribute="centerY" id="j7N-59-vRk"/>
<constraint firstAttribute="bottom" secondItem="bSS-CD-nfD" secondAttribute="bottom" constant="9" id="poL-wE-Eir"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="bZI-G1-eYA">
<rect key="frame" x="0.0" y="158" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="bZI-G1-eYA" id="1Ho-Zz-KN0">
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hMq-Ee-EJK">
<rect key="frame" x="263" y="6" width="51" height="31"/>
<constraints>
<constraint firstAttribute="height" constant="31" id="gM4-dK-cl7"/>
<constraint firstAttribute="width" constant="49" id="hvu-Yy-NTG"/>
</constraints>
<connections>
<action selector="didTapSwitch:" destination="y7K-ZU-Xs9" eventType="valueChanged" id="JCb-EJ-M9U"/>
</connections>
</switch>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Load really long message" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YV3-GH-Yul">
<rect key="frame" x="8" y="10" width="247" height="24"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="centerY" secondItem="hMq-Ee-EJK" secondAttribute="centerY" id="CcO-KD-31y"/>
<constraint firstItem="hMq-Ee-EJK" firstAttribute="leading" secondItem="YV3-GH-Yul" secondAttribute="trailing" constant="8" id="KFO-nO-4r4"/>
<constraint firstItem="YV3-GH-Yul" firstAttribute="top" secondItem="1Ho-Zz-KN0" secondAttribute="top" constant="10" id="Lgl-fY-a8c"/>
<constraint firstAttribute="bottom" secondItem="YV3-GH-Yul" secondAttribute="bottom" constant="9" id="NvL-b8-QDl"/>
<constraint firstAttribute="trailing" secondItem="hMq-Ee-EJK" secondAttribute="trailing" constant="8" id="xDE-tf-5mB"/>
<constraint firstItem="YV3-GH-Yul" firstAttribute="leading" secondItem="1Ho-Zz-KN0" secondAttribute="leading" constant="8" id="xyR-oc-iUp"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="2Th-gL-oAN">
<rect key="frame" x="0.0" y="202" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="2Th-gL-oAN" id="OFq-Mz-mbl">
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="baL-Tb-bTJ">
<rect key="frame" x="263" y="6" width="51" height="31"/>
<constraints>
<constraint firstAttribute="width" constant="49" id="SaV-RG-DVL"/>
<constraint firstAttribute="height" constant="31" id="dXb-pb-etA"/>
</constraints>
<connections>
<action selector="didTapSwitch:" destination="y7K-ZU-Xs9" eventType="valueChanged" id="w1H-5W-oip"/>
</connections>
</switch>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Empty view, no messages" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DoU-SU-Nek">
<rect key="frame" x="8" y="10" width="247" height="24"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="DoU-SU-Nek" firstAttribute="leading" secondItem="OFq-Mz-mbl" secondAttribute="leading" constant="8" id="A9k-hI-0BH"/>
<constraint firstItem="DoU-SU-Nek" firstAttribute="top" secondItem="OFq-Mz-mbl" secondAttribute="top" constant="10" id="Uji-LE-8IA"/>
<constraint firstAttribute="trailing" secondItem="baL-Tb-bTJ" secondAttribute="trailing" constant="8" id="dUp-7b-g3p"/>
<constraint firstItem="baL-Tb-bTJ" firstAttribute="leading" secondItem="DoU-SU-Nek" secondAttribute="trailing" constant="8" id="fxZ-zy-ksL"/>
<constraint firstAttribute="bottom" secondItem="DoU-SU-Nek" secondAttribute="bottom" constant="9" id="h0B-EX-3MW"/>
<constraint firstAttribute="centerY" secondItem="baL-Tb-bTJ" secondAttribute="centerY" id="hx4-cn-W0h"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="lik-Tz-jeU">
<rect key="frame" x="0.0" y="246" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="lik-Tz-jeU" id="mdy-8L-puo">
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="OqF-Mi-0DT">
<rect key="frame" x="263" y="6" width="51" height="31"/>
<constraints>
<constraint firstAttribute="height" constant="31" id="4ci-Od-My4"/>
<constraint firstAttribute="width" constant="49" id="P4N-Fc-Dva"/>
</constraints>
<connections>
<action selector="didTapSwitch:" destination="y7K-ZU-Xs9" eventType="valueChanged" id="tZ0-90-bdH"/>
</connections>
</switch>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Accessory button for media messages" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Cae-FY-b5Q">
<rect key="frame" x="8" y="10" width="247" height="24"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="Cae-FY-b5Q" secondAttribute="bottom" constant="9" id="9HI-ME-UGd"/>
<constraint firstAttribute="centerY" secondItem="OqF-Mi-0DT" secondAttribute="centerY" id="C5b-Zd-gSP"/>
<constraint firstItem="Cae-FY-b5Q" firstAttribute="leading" secondItem="mdy-8L-puo" secondAttribute="leading" constant="8" id="G1j-Fx-1t3"/>
<constraint firstAttribute="trailing" secondItem="OqF-Mi-0DT" secondAttribute="trailing" constant="8" id="Ksl-eL-T2o"/>
<constraint firstItem="Cae-FY-b5Q" firstAttribute="top" secondItem="mdy-8L-puo" secondAttribute="top" constant="10" id="MBf-DY-8Am"/>
<constraint firstItem="OqF-Mi-0DT" firstAttribute="leading" secondItem="Cae-FY-b5Q" secondAttribute="trailing" constant="8" id="iSd-te-S0L"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
<tableViewSection headerTitle="Avatars" id="ns0-OO-PGu">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="hYS-4f-iL6">
<rect key="frame" x="0.0" y="333" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="hYS-4f-iL6" id="dk1-tc-gux">
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fLZ-NC-aPO">
<rect key="frame" x="263" y="6" width="51" height="31"/>
<constraints>
<constraint firstAttribute="width" constant="49" id="1lf-6y-hgz"/>
<constraint firstAttribute="height" constant="31" id="rdQ-ol-d20"/>
</constraints>
<connections>
<action selector="didTapSwitch:" destination="y7K-ZU-Xs9" eventType="valueChanged" id="WnT-b7-og6"/>
</connections>
</switch>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Incoming avatars" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="RUq-Pa-3nx">
<rect key="frame" x="8" y="10" width="247" height="24"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="centerY" secondItem="fLZ-NC-aPO" secondAttribute="centerY" id="17e-cC-bP4"/>
<constraint firstAttribute="bottom" secondItem="RUq-Pa-3nx" secondAttribute="bottom" constant="9" id="7Yt-uN-sOS"/>
<constraint firstItem="RUq-Pa-3nx" firstAttribute="top" secondItem="dk1-tc-gux" secondAttribute="top" constant="10" id="Aih-Lc-tq7"/>
<constraint firstItem="fLZ-NC-aPO" firstAttribute="leading" secondItem="RUq-Pa-3nx" secondAttribute="trailing" constant="8" id="Cfo-7m-Vyd"/>
<constraint firstAttribute="trailing" secondItem="fLZ-NC-aPO" secondAttribute="trailing" constant="8" id="Mgz-VG-tDn"/>
<constraint firstItem="RUq-Pa-3nx" firstAttribute="leading" secondItem="dk1-tc-gux" secondAttribute="leading" constant="8" id="mhd-oX-p53"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="VF7-uo-6Pc">
<rect key="frame" x="0.0" y="377" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="VF7-uo-6Pc" id="zad-JQ-TRI">
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LuM-mk-Zj6">
<rect key="frame" x="263" y="6" width="51" height="31"/>
<constraints>
<constraint firstAttribute="height" constant="31" id="QXv-ty-g0B"/>
<constraint firstAttribute="width" constant="49" id="rZ3-cO-f8t"/>
</constraints>
<connections>
<action selector="didTapSwitch:" destination="y7K-ZU-Xs9" eventType="valueChanged" id="rNB-Bx-Uh3"/>
</connections>
</switch>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Outgoing avatars" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9Rr-S8-Uae">
<rect key="frame" x="8" y="10" width="247" height="24"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="centerY" secondItem="LuM-mk-Zj6" secondAttribute="centerY" id="2oC-JM-LVI"/>
<constraint firstAttribute="bottom" secondItem="9Rr-S8-Uae" secondAttribute="bottom" constant="9" id="5xp-ez-tac"/>
<constraint firstItem="LuM-mk-Zj6" firstAttribute="leading" secondItem="9Rr-S8-Uae" secondAttribute="trailing" constant="8" id="C5c-2A-mli"/>
<constraint firstAttribute="trailing" secondItem="LuM-mk-Zj6" secondAttribute="trailing" constant="8" id="Lep-LY-D1h"/>
<constraint firstItem="9Rr-S8-Uae" firstAttribute="leading" secondItem="zad-JQ-TRI" secondAttribute="leading" constant="8" id="Yao-VR-Is6"/>
<constraint firstItem="9Rr-S8-Uae" firstAttribute="top" secondItem="zad-JQ-TRI" secondAttribute="top" constant="10" id="Yiv-t6-Xj5"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
<tableViewSection headerTitle="Dynamic Behaviors" footerTitle="NOTE: This feature is experimental" id="o5m-OT-1Iw">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="q07-lZ-YdI">
<rect key="frame" x="0.0" y="464" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="q07-lZ-YdI" id="btE-Mk-fSE">
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="uXC-2j-cgi">
<rect key="frame" x="263" y="6" width="51" height="31"/>
<constraints>
<constraint firstAttribute="height" constant="31" id="5bI-xQ-njj"/>
<constraint firstAttribute="width" constant="49" id="PG2-X2-FdD"/>
</constraints>
<connections>
<action selector="didTapSwitch:" destination="y7K-ZU-Xs9" eventType="valueChanged" id="oHB-iq-JSz"/>
</connections>
</switch>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Springy bubbles" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3d2-fZ-dx9">
<rect key="frame" x="8" y="10" width="247" height="24"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="3d2-fZ-dx9" firstAttribute="leading" secondItem="btE-Mk-fSE" secondAttribute="leading" constant="8" id="6Cs-6l-Xzp"/>
<constraint firstItem="uXC-2j-cgi" firstAttribute="leading" secondItem="3d2-fZ-dx9" secondAttribute="trailing" constant="8" id="7Mq-HR-4nY"/>
<constraint firstAttribute="bottom" secondItem="3d2-fZ-dx9" secondAttribute="bottom" constant="9" id="EzH-aB-ePQ"/>
<constraint firstItem="3d2-fZ-dx9" firstAttribute="top" secondItem="btE-Mk-fSE" secondAttribute="top" constant="10" id="btF-q4-HJg"/>
<constraint firstAttribute="centerY" secondItem="uXC-2j-cgi" secondAttribute="centerY" id="zJf-Xj-C1X"/>
<constraint firstAttribute="trailing" secondItem="uXC-2j-cgi" secondAttribute="trailing" constant="8" id="zzu-aP-ZiL"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
</sections>
<connections>
<outlet property="dataSource" destination="y7K-ZU-Xs9" id="4gP-Ip-VMs"/>
<outlet property="delegate" destination="y7K-ZU-Xs9" id="RdT-hW-mFp"/>
</connections>
</tableView>
<navigationItem key="navigationItem" title="Settings" id="hrw-Dp-Tor"/>
<connections>
<outlet property="accessoryButtonSwitch" destination="OqF-Mi-0DT" id="X3f-d5-5Uo"/>
<outlet property="emptySwitch" destination="baL-Tb-bTJ" id="qk7-dH-53U"/>
<outlet property="extraMessagesSwitch" destination="K7N-os-fuc" id="qlF-0W-3JO"/>
<outlet property="incomingAvatarsSwitch" destination="fLZ-NC-aPO" id="0ck-t9-Hwt"/>
<outlet property="longMessageSwitch" destination="hMq-Ee-EJK" id="Vs2-fX-Hys"/>
<outlet property="outgoingAvatarsSwitch" destination="LuM-mk-Zj6" id="EAh-35-xjI"/>
<outlet property="springySwitch" destination="uXC-2j-cgi" id="Jzx-1y-VZP"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="5u5-k6-W2j" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-2982" y="1039"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="eGf-GM-ORQ">
<objects>
<navigationController definesPresentationContext="YES" id="s4z-xn-r6C" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="G3q-Gy-0Lf">
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
<segue destination="2Qx-iu-03V" kind="relationship" relationship="rootViewController" id="cuu-7c-yOr"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="8DO-Rt-kgb" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-2409" y="619"/>
</scene>
<!--Demo Messages View Controller-->
<scene sceneID="gOX-cv-CuN">
<objects>
<viewController storyboardIdentifier="DemoVC" id="JdJ-0X-ZL8" customClass="DemoMessagesViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="TE8-r2-pE8"/>
<viewControllerLayoutGuide type="bottom" id="H2n-HB-Ssl"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Vop-TB-ImV">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" id="URv-4c-d6h"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="B2s-hQ-gD4" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-2409" y="-71"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="A8N-cL-8VP">
<objects>
<navigationController definesPresentationContext="YES" id="JRd-Be-psV" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="YZb-OI-WKd">
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
<segue destination="rXs-qR-ns2" kind="relationship" relationship="rootViewController" id="8xe-QC-QaY"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="OC7-Ng-9xQ" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-3413" y="274"/>
</scene>
<!--Demo Messages View Controller-->
<scene sceneID="Rr5-W8-Xyh">
<objects>
<viewController id="2Qx-iu-03V" customClass="DemoMessagesViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="hTc-sT-can"/>
<viewControllerLayoutGuide type="bottom" id="BPF-eU-3uQ"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="SsE-pA-zOd">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" id="gBw-Dh-o4F"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="jTG-EA-PIP" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-1989" y="619"/>
</scene>
</scenes>
</document>
================================================
FILE: JSQMessagesDemo/DemoMessagesViewController.h
================================================
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
// Import all the things
#import "JSQMessages.h"
#import "DemoModelData.h"
#import "NSUserDefaults+DemoSettings.h"
@class DemoMessagesViewController;
@protocol JSQDemoViewControllerDelegate <NSObject>
- (void)didDismissJSQDemoViewController:(DemoMessagesViewController *)vc;
@end
@interface DemoMessagesViewController : JSQMessagesViewController <UIActionSheetDelegate, JSQMessagesComposerTextViewPasteDelegate>
@property (weak, nonatomic) id<JSQDemoViewControllerDelegate> delegateModal;
@property (strong, nonatomic) DemoModelData *demoData;
- (void)receiveMessagePressed:(UIBarButtonItem *)sender;
- (void)closePressed:(UIBarButtonItem *)sender;
@end
================================================
FILE: JSQMessagesDemo/DemoMessagesViewController.m
================================================
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
#import "DemoMessagesViewController.h"
#import "JSQMessagesViewAccessoryButtonDelegate.h"
@interface DemoMessagesViewController () <JSQMessagesViewAccessoryButtonDelegate>
@end
@implementation DemoMessagesViewController
#pragma mark - View lifecycle
/**
* Override point for customization.
*
* Customize your view.
* Look at the properties on `JSQMessagesViewController` and `JSQMessagesCollectionView` to see what is possible.
*
* Customize your layout.
* Look at the properties on `JSQMessagesCollectionViewFlowLayout` to see what is possible.
*/
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"JSQMessages";
self.inputToolbar.contentView.textView.pasteDelegate = self;
/**
* Load up our fake data for the demo
*/
self.demoData = [[DemoModelData alloc] init];
/**
* Set up message accessory button delegate and configuration
*/
self.collectionView.accessoryDelegate = self;
/**
* You can set custom avatar sizes
*/
if (![NSUserDefaults incomingAvatarSetting]) {
self.collectionView.collectionViewLayout.incomingAvatarViewSize = CGSizeZero;
}
if (![NSUserDefaults outgoingAvatarSetting]) {
self.collectionView.collectionViewLayout.outgoingAvatarViewSize = CGSizeZero;
}
self.showLoadEarlierMessagesHeader = YES;
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage jsq_defaultTypingIndicatorImage]
style:UIBarButtonItemStylePlain
target:self
action:@selector(receiveMessagePressed:)];
/**
* Register custom menu actions for cells.
*/
[JSQMessagesCollectionViewCell registerMenuAction:@selector(customAction:)];
/**
* OPT-IN: allow cells to be deleted
*/
[JSQMessagesCollectionViewCell registerMenuAction:@selector(delete:)];
/**
* Customize your toolbar buttons
*
* self.inputToolbar.contentView.leftBarButtonItem = custom button or nil to remove
* self.inputToolbar.contentView.rightBarButtonItem = custom button or nil to remove
*/
/**
* Set a maximum height for the input toolbar
*
* self.inputToolbar.maximumHeight = 150;
*/
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (self.delegateModal) {
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop
target:self
action:@selector(closePressed:)];
}
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
/**
* Enable/disable springy bubbles, default is NO.
* You must set this from `viewDidAppear:`
* Note: this feature is mostly stable, but still experimental
*/
self.collectionView.collectionViewLayout.springinessEnabled = [NSUserDefaults springinessSetting];
}
#pragma mark - Custom menu actions for cells
- (void)didReceiveMenuWillShowNotification:(NSNotification *)notification
{
/**
* Display custom menu actions for cells.
*/
UIMenuController *menu = [notification object];
menu.menuItems = @[ [[UIMenuItem alloc] initWithTitle:@"Custom Action" action:@selector(customAction:)] ];
[super didReceiveMenuWillShowNotification:notification];
}
#pragma mark - Testing
- (void)pushMainViewController
{
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UINavigationController *nc = [sb instantiateInitialViewController];
[self.navigationController pushViewController:nc.topViewController animated:YES];
}
#pragma mark - Actions
- (void)receiveMessagePressed:(UIBarButtonItem *)sender
{
/**
* DEMO ONLY
*
* The following is simply to simulate received messages for the demo.
* Do not actually do this.
*/
/**
* Show the typing indicator to be shown
*/
self.showTypingIndicator = !self.showTypingIndicator;
/**
* Scroll to actually view the indicator
*/
[self scrollToBottomAnimated:YES];
/**
* Copy last sent message, this will be the new "received" message
*/
JSQMessage *copyMessage = [[self.demoData.messages lastObject] copy];
if (!copyMessage) {
copyMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdJobs
displayName:kJSQDemoAvatarDisplayNameJobs
text:@"First received!"];
}
/**
* Allow typing indicator to show
*/
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSMutableArray *userIds = [[self.demoData.users allKeys] mutableCopy];
[userIds removeObject:self.senderId];
NSString *randomUserId = userIds[arc4random_uniform((int)[userIds count])];
JSQMessage *newMessage = nil;
id<JSQMessageMediaData> newMediaData = nil;
id newMediaAttachmentCopy = nil;
if (copyMessage.isMediaMessage) {
/**
* Last message was a media message
*/
id<JSQMessageMediaData> copyMediaData = copyMessage.media;
if ([copyMediaData isKindOfClass:[JSQPhotoMediaItem class]]) {
JSQPhotoMediaItem *photoItemCopy = [((JSQPhotoMediaItem *)copyMediaData) copy];
photoItemCopy.appliesMediaViewMaskAsOutgoing = NO;
newMediaAttachmentCopy = [UIImage imageWithCGImage:photoItemCopy.image.CGImage];
/**
* Set image to nil to simulate "downloading" the image
* and show the placeholder view
*/
photoItemCopy.image = nil;
newMediaData = photoItemCopy;
}
else if ([copyMediaData isKindOfClass:[JSQLocationMediaItem class]]) {
JSQLocationMediaItem *locationItemCopy = [((JSQLocationMediaItem *)copyMediaData) copy];
locationItemCopy.appliesMediaViewMaskAsOutgoing = NO;
newMediaAttachmentCopy = [locationItemCopy.location copy];
/**
* Set location to nil to simulate "downloading" the location data
*/
locationItemCopy.location = nil;
newMediaData = locationItemCopy;
}
else if ([copyMediaData isKindOfClass:[JSQVideoMediaItem class]]) {
JSQVideoMediaItem *videoItemCopy = [((JSQVideoMediaItem *)copyMediaData) copy];
videoItemCopy.appliesMediaViewMaskAsOutgoing = NO;
newMediaAttachmentCopy = [videoItemCopy.fileURL copy];
/**
* Reset video item to simulate "downloading" the video
*/
videoItemCopy.fileURL = nil;
videoItemCopy.isReadyToPlay = NO;
newMediaData = videoItemCopy;
}
else if ([copyMediaData isKindOfClass:[JSQAudioMediaItem class]]) {
JSQAudioMediaItem *audioItemCopy = [((JSQAudioMediaItem *)copyMediaData) copy];
audioItemCopy.appliesMediaViewMaskAsOutgoing = NO;
newMediaAttachmentCopy = [audioItemCopy.audioData copy];
/**
* Reset audio item to simulate "downloading" the audio
*/
audioItemCopy.audioData = nil;
newMediaData = audioItemCopy;
}
else {
NSLog(@"%s error: unrecognized media item", __PRETTY_FUNCTION__);
}
newMessage = [JSQMessage messageWithSenderId:randomUserId
displayName:self.demoData.users[randomUserId]
media:newMediaData];
}
else {
/**
* Last message was a text message
*/
newMessage = [JSQMessage messageWithSenderId:randomUserId
displayName:self.demoData.users[randomUserId]
text:copyMessage.text];
}
/**
* Upon receiving a message, you should:
*
* 1. Play sound (optional)
* 2. Add new id<JSQMessageData> object to your data source
* 3. Call `finishReceivingMessage`
*/
// [JSQSystemSoundPlayer jsq_playMessageReceivedSound];
[self.demoData.messages addObject:newMessage];
[self finishReceivingMessageAnimated:YES];
if (newMessage.isMediaMessage) {
/**
* Simulate "downloading" media
*/
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
/**
* Media is "finished downloading", re-display visible cells
*
* If media cell is not visible, the next time it is dequeued the view controller will display its new attachment data
*
* Reload the specific item, or simply call `reloadData`
*/
if ([newMediaData isKindOfClass:[JSQPhotoMediaItem class]]) {
((JSQPhotoMediaItem *)newMediaData).image = newMediaAttachmentCopy;
[self.collectionView reloadData];
}
else if ([newMediaData isKindOfClass:[JSQLocationMediaItem class]]) {
[((JSQLocationMediaItem *)newMediaData)setLocation:newMediaAttachmentCopy withCompletionHandler:^{
[self.collectionView reloadData];
}];
}
else if ([newMediaData isKindOfClass:[JSQVideoMediaItem class]]) {
((JSQVideoMediaItem *)newMediaData).fileURL = newMediaAttachmentCopy;
((JSQVideoMediaItem *)newMediaData).isReadyToPlay = YES;
[self.collectionView reloadData];
}
else if ([newMediaData isKindOfClass:[JSQAudioMediaItem class]]) {
((JSQAudioMediaItem *)newMediaData).audioData = newMediaAttachmentCopy;
[self.collectionView reloadData];
}
else {
NSLog(@"%s error: unrecognized media item", __PRETTY_FUNCTION__);
}
});
}
});
}
- (void)closePressed:(UIBarButtonItem *)sender
{
[self.delegateModal didDismissJSQDemoViewController:self];
}
#pragma mark - JSQMessagesViewController method overrides
- (void)didPressSendButton:(UIButton *)button
withMessageText:(NSString *)text
senderId:(NSString *)senderId
senderDisplayName:(NSString *)senderDisplayName
date:(NSDate *)date
{
/**
* Sending a message. Your implementation of this method should do *at least* the following:
*
* 1. Play sound (optional)
* 2. Add new id<JSQMessageData> object to your data source
* 3. Call `finishSendingMessage`
*/
// [JSQSystemSoundPlayer jsq_playMessageSentSound];
JSQMessage *message = [[JSQMessage alloc] initWithSenderId:senderId
senderDisplayName:senderDisplayName
date:date
text:text];
[self.demoData.messages addObject:message];
[self finishSendingMessageAnimated:YES];
}
- (void)didPressAccessoryButton:(UIButton *)sender
{
[self.inputToolbar.contentView.textView resignFirstResponder];
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:NSLocalizedString(@"Media messages", nil)
delegate:self
cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
destructiveButtonTitle:nil
otherButtonTitles:NSLocalizedString(@"Send photo", nil), NSLocalizedString(@"Send location", nil), NSLocalizedString(@"Send video", nil), NSLocalizedString(@"Send video thumbnail", nil), NSLocalizedString(@"Send audio", nil), nil];
[sheet showFromToolbar:self.inputToolbar];
}
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
if (buttonIndex == actionSheet.cancelButtonIndex) {
[self.inputToolbar.contentView.textView becomeFirstResponder];
return;
}
switch (buttonIndex) {
case 0:
[self.demoData addPhotoMediaMessage];
break;
case 1:
{
__weak UICollectionView *weakView = self.collectionView;
[self.demoData addLocationMediaMessageCompletion:^{
[weakView reloadData];
}];
}
break;
case 2:
[self.demoData addVideoMediaMessage];
break;
case 3:
[self.demoData addVideoMediaMessageWithThumbnail];
break;
case 4:
[self.demoData addAudioMediaMessage];
break;
}
// [JSQSystemSoundPlayer jsq_playMessageSentSound];
[self finishSendingMessageAnimated:YES];
}
#pragma mark - JSQMessages CollectionView DataSource
- (NSString *)senderId {
return kJSQDemoAvatarIdSquires;
}
- (NSString *)senderDisplayName {
return kJSQDemoAvatarDisplayNameSquires;
}
- (id<JSQMessageData>)collectionView:(JSQMessagesCollectionView *)collectionView messageDataForItemAtIndexPath:(NSIndexPath *)indexPath
{
return [self.demoData.messages objectAtIndex:indexPath.item];
}
- (void)collectionView:(JSQMessagesCollectionView *)collectionView didDeleteMessageAtIndexPath:(NSIndexPath *)indexPath
{
[self.demoData.messages removeObjectAtIndex:indexPath.item];
}
- (id<JSQMessageBubbleImageDataSource>)collectionView:(JSQMessagesCollectionView *)collectionView messageBubbleImageDataForItemAtIndexPath:(NSIndexPath *)indexPath
{
/**
* You may return nil here if you do not want bubbles.
* In this case, you should set the background color of your collection view cell's textView.
*
* Otherwise, return your previously created bubble image data objects.
*/
JSQMessage *message = [self.demoData.messages objectAtIndex:indexPath.item];
if ([message.senderId isEqualToString:self.senderId]) {
return self.demoData.outgoingBubbleImageData;
}
return self.demoData.incomingBubbleImageData;
}
- (id<JSQMessageAvatarImageDataSource>)collectionView:(JSQMessagesCollectionView *)collectionView avatarImageDataForItemAtIndexPath:(NSIndexPath *)indexPath
{
/**
* Return `nil` here if you do not want avatars.
* If you do return `nil`, be sure to do the following in `viewDidLoad`:
*
* self.collectionView.collectionViewLayout.incomingAvatarViewSize = CGSizeZero;
* self.collectionView.collectionViewLayout.outgoingAvatarViewSize = CGSizeZero;
*
* It is possible to have only outgoing avatars or only incoming avatars, too.
*/
/**
* Return your previously created avatar image data objects.
*
* Note: these the avatars will be sized according to these values:
*
* self.collectionView.collectionViewLayout.incomingAvatarViewSize
* self.collectionView.collectionViewLayout.outgoingAvatarViewSize
*
* Override the defaults in `viewDidLoad`
*/
JSQMessage *message = [self.demoData.messages objectAtIndex:indexPath.item];
if ([message.senderId isEqualToString:self.senderId]) {
if (![NSUserDefaults outgoingAvatarSetting]) {
return nil;
}
}
else {
if (![NSUserDefaults incomingAvatarSetting]) {
return nil;
}
}
return [self.demoData.avatars objectForKey:message.senderId];
}
- (NSAttributedString *)collectionView:(JSQMessagesCollectionView *)collectionView attributedTextForCellTopLabelAtIndexPath:(NSIndexPath *)indexPath
{
/**
* This logic should be consistent with what you return from `heightForCellTopLabelAtIndexPath:`
* The other label text delegate methods should follow a similar pattern.
*
* Show a timestamp for every 3rd message
*/
if (indexPath.item % 3 == 0) {
JSQMessage *message = [self.demoData.messages objectAtIndex:indexPath.item];
return [[JSQMessagesTimestampFormatter sharedFormatter] attributedTimestampForDate:message.date];
}
return nil;
}
- (NSAttributedString *)collectionView:(JSQMessagesCollectionView *)collectionView attributedTextForMessageBubbleTopLabelAtIndexPath:(NSIndexPath *)indexPath
{
JSQMessage *message = [self.demoData.messages objectAtIndex:indexPath.item];
/**
* iOS7-style sender name labels
*/
if ([message.senderId isEqualToString:self.senderId]) {
return nil;
}
if (indexPath.item - 1 > 0) {
JSQMessage *previousMessage = [self.demoData.messages objectAtIndex:indexPath.item - 1];
if ([[previousMessage senderId] isEqualToString:message.senderId]) {
return nil;
}
}
/**
* Don't specify attributes to use the defaults.
*/
return [[NSAttributedString alloc] initWithString:message.senderDisplayName];
}
- (NSAttributedString *)collectionView:(JSQMessagesCollectionView *)collectionView attributedTextForCellBottomLabelAtIndexPath:(NSIndexPath *)indexPath
{
return nil;
}
#pragma mark - UICollectionView DataSource
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return [self.demoData.messages count];
}
- (UICollectionViewCell *)collectionView:(JSQMessagesCollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
/**
* Override point for customizing cells
*/
JSQMessagesCollectionViewCell *cell = (JSQMessagesCollectionViewCell *)[super collectionView:collectionView cellForItemAtIndexPath:indexPath];
/**
* Configure almost *anything* on the cell
*
* Text colors, label text, label colors, etc.
*
*
* DO NOT set `cell.textView.font` !
* Instead, you need to set `self.collectionView.collectionViewLayout.messageBubbleFont` to the font you want in `viewDidLoad`
*
*
* DO NOT manipulate cell layout information!
* Instead, override the properties you want on `self.collectionView.collectionViewLayout` from `viewDidLoad`
*/
JSQMessage *msg = [self.demoData.messages objectAtIndex:indexPath.item];
if (!msg.isMediaMessage) {
if ([msg.senderId isEqualToString:self.senderId]) {
cell.textView.textColor = [UIColor blackColor];
}
else {
cell.textView.textColor = [UIColor whiteColor];
}
cell.textView.linkTextAttributes = @{ NSForegroundColorAttributeName : cell.textView.textColor,
NSUnderlineStyleAttributeName : @(NSUnderlineStyleSingle | NSUnderlinePatternSolid) };
}
cell.accessoryButton.hidden = ![self shouldShowAccessoryButtonForMessage:msg];
return cell;
}
- (BOOL)shouldShowAccessoryButtonForMessage:(id<JSQMessageData>)message
{
return ([message isMediaMessage] && [NSUserDefaults accessoryButtonForMediaMessages]);
}
#pragma mark - UICollectionView Delegate
#pragma mark - Custom menu items
- (BOOL)collectionView:(UICollectionView *)collectionView canPerformAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
{
if (action == @selector(customAction:)) {
return YES;
}
return [super collectionView:collectionView canPerformAction:action forItemAtIndexPath:indexPath withSender:sender];
}
- (void)collectionView:(UICollectionView *)collectionView performAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
{
if (action == @selector(customAction:)) {
[self customAction:sender];
return;
}
[super collectionView:collectionView performAction:action forItemAtIndexPath:indexPath withSender:sender];
}
- (void)customAction:(id)sender
{
NSLog(@"Custom action received! Sender: %@", sender);
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Custom Action", nil)
message:nil
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK", nil)
otherButtonTitles:nil]
show];
}
#pragma mark - JSQMessages collection view flow layout delegate
#pragma mark - Adjusting cell label heights
- (CGFloat)collectionView:(JSQMessagesCollectionView *)collectionView
layout:(JSQMessagesCollectionViewFlowLayout *)collectionViewLayout heightForCellTopLabelAtIndexPath:(NSIndexPath *)indexPath
{
/**
* Each label in a cell has a `height` delegate method that corresponds to its text dataSource method
*/
/**
* This logic should be consistent with what you return from `attributedTextForCellTopLabelAtIndexPath:`
* The other label height delegate methods should follow similarly
*
* Show a timestamp for every 3rd message
*/
if (indexPath.item % 3 == 0) {
return kJSQMessagesCollectionViewCellLabelHeightDefault;
}
return 0.0f;
}
- (CGFloat)collectionView:(JSQMessagesCollectionView *)collectionView
layout:(JSQMessagesCollectionViewFlowLayout *)collectionViewLayout heightForMessageBubbleTopLabelAtIndexPath:(NSIndexPath *)indexPath
{
/**
* iOS7-style sender name labels
*/
JSQMessage *currentMessage = [self.demoData.messages objectAtIndex:indexPath.item];
if ([[currentMessage senderId] isEqualToString:self.senderId]) {
return 0.0f;
}
if (indexPath.item - 1 > 0) {
JSQMessage *previousMessage = [self.demoData.messages objectAtIndex:indexPath.item - 1];
if ([[previousMessage senderId] isEqualToString:[currentMessage senderId]]) {
return 0.0f;
}
}
return kJSQMessagesCollectionViewCellLabelHeightDefault;
}
- (CGFloat)collectionView:(JSQMessagesCollectionView *)collectionView
layout:(JSQMessagesCollectionViewFlowLayout *)collectionViewLayout heightForCellBottomLabelAtIndexPath:(NSIndexPath *)indexPath
{
return 0.0f;
}
#pragma mark - Responding to collection view tap events
- (void)collectionView:(JSQMessagesCollectionView *)collectionView
header:(JSQMessagesLoadEarlierHeaderView *)headerView didTapLoadEarlierMessagesButton:(UIButton *)sender
{
NSLog(@"Load earlier messages!");
}
- (void)collectionView:(JSQMessagesCollectionView *)collectionView didTapAvatarImageView:(UIImageView *)avatarImageView atIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Tapped avatar!");
}
- (void)collectionView:(JSQMessagesCollectionView *)collectionView didTapMessageBubbleAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Tapped message bubble!");
}
- (void)collectionView:(JSQMessagesCollectionView *)collectionView didTapCellAtIndexPath:(NSIndexPath *)indexPath touchLocation:(CGPoint)touchLocation
{
NSLog(@"Tapped cell at %@!", NSStringFromCGPoint(touchLocation));
}
#pragma mark - JSQMessagesComposerTextViewPasteDelegate methods
- (BOOL)composerTextView:(JSQMessagesComposerTextView *)textView shouldPasteWithSender:(id)sender
{
if ([UIPasteboard generalPasteboard].image) {
// If there's an image in the pasteboard, construct a media item with that image and `send` it.
JSQPhotoMediaItem *item = [[JSQPhotoMediaItem alloc] initWithImage:[UIPasteboard generalPasteboard].image];
JSQMessage *message = [[JSQMessage alloc] initWithSenderId:self.senderId
senderDisplayName:self.senderDisplayName
date:[NSDate date]
media:item];
[self.demoData.messages addObject:message];
[self finish
gitextract_skmjj783/
├── .cocoadocs.yml
├── .codecov.yml
├── .github/
│ ├── CONDUCT.md
│ ├── CONTRIBUTING.md
│ ├── ISSUE_TEMPLATE.md
│ └── PULL_REQUEST_TEMPLATE.md
├── .gitignore
├── .travis.yml
├── Assets/
│ ├── jsq_messages_banner.psd
│ ├── jsq_messages_icon.psd
│ ├── jsq_messages_splash.psd
│ └── jsq_messages_splash_ipad.psd
├── CHANGELOG.md
├── Documentation/
│ ├── apps_using_this_library.md
│ ├── contributor_onboarding.md
│ ├── faq.md
│ ├── getting_started.md
│ └── migration.md
├── JSQMessages.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ └── contents.xcworkspacedata
│ └── xcshareddata/
│ └── xcschemes/
│ └── JSQMessages.xcscheme
├── JSQMessages.xcworkspace/
│ └── contents.xcworkspacedata
├── JSQMessagesDemo/
│ ├── AppDelegate.h
│ ├── AppDelegate.m
│ ├── Base.lproj/
│ │ ├── Localizable.strings
│ │ └── Main.storyboard
│ ├── DemoMessagesViewController.h
│ ├── DemoMessagesViewController.m
│ ├── DemoModelData.h
│ ├── DemoModelData.m
│ ├── DemoSettingsViewController.h
│ ├── DemoSettingsViewController.m
│ ├── Images.xcassets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ ├── DemoAvatars/
│ │ │ ├── demo_avatar_cook.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── demo_avatar_jobs.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── demo_avatar_woz.imageset/
│ │ │ └── Contents.json
│ │ ├── LaunchImage.launchimage/
│ │ │ └── Contents.json
│ │ └── goldengate.imageset/
│ │ └── Contents.json
│ ├── Info.plist
│ ├── NSUserDefaults+DemoSettings.h
│ ├── NSUserDefaults+DemoSettings.m
│ ├── TableViewController.h
│ ├── TableViewController.m
│ ├── he.lproj/
│ │ ├── Localizable.strings
│ │ └── Main.strings
│ ├── jsq_messages_sample.m4a
│ └── main.m
├── JSQMessagesTests/
│ ├── CategoryTests/
│ │ ├── JSQMessagesNSBundleTests.m
│ │ ├── JSQMessagesNSStringTests.m
│ │ ├── JSQMessagesUIColorTests.m
│ │ ├── JSQMessagesUIImageTests.m
│ │ └── JSQMessagesUIViewTests.m
│ ├── ControllerTests/
│ │ └── JSQMessagesViewControllerTests.m
│ ├── FactoryTests/
│ │ ├── JSQMessagesAvatarImageFactoryTests.m
│ │ ├── JSQMessagesBubbleImageFactoryTests.m
│ │ ├── JSQMessagesMediaViewBubbleImageMaskerTests.m
│ │ ├── JSQMessagesTimestampFormatterTests.m
│ │ └── JSQMessagesToolbarButtonFactoryTests.m
│ ├── Info.plist
│ ├── LayoutTests/
│ │ ├── JSQMessagesCollectionViewFlowLayoutTests.m
│ │ └── JSQMessagesCollectionViewLayoutAttributesTests.m
│ ├── ModelTests/
│ │ ├── JSQAudioMediaItemTests.m
│ │ ├── JSQLocationMediaItemTests.m
│ │ ├── JSQMessageMediaTests.m
│ │ ├── JSQMessageTextTests.m
│ │ ├── JSQMessagesAvatarImageTests.m
│ │ ├── JSQMessagesBubbleImageTests.m
│ │ ├── JSQPhotoMediaItemTests.m
│ │ └── JSQVideoMediaItemTests.m
│ └── ViewTests/
│ ├── JSQMessagesCollectionViewCellTests.m
│ ├── JSQMessagesCollectionViewTests.m
│ ├── JSQMessagesComposerTextViewTests.m
│ ├── JSQMessagesInputToolbarTests.m
│ ├── JSQMessagesLabelTests.m
│ ├── JSQMessagesLoadEarlierHeaderViewTests.m
│ ├── JSQMessagesToolbarContentViewTests.m
│ └── JSQMessagesTypingIndicatorFooterViewTests.m
├── JSQMessagesViewController/
│ ├── Assets/
│ │ └── JSQMessagesAssets.bundle/
│ │ ├── Base.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── Sounds/
│ │ │ ├── message_received.aiff
│ │ │ └── message_sent.aiff
│ │ ├── ar.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── bs.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── cs.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── da.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── de.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── en.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── es.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── fa.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── fi.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── fr.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── he.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── hr.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── id.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── it.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── ja.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── ko.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── ms.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── nb.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── nl.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── pl.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── pt.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── ro.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── ru.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── sv.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── th.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── tr.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── vi.lproj/
│ │ │ └── JSQMessages.strings
│ │ ├── zh-Hans.lproj/
│ │ │ └── JSQMessages.strings
│ │ └── zh-Hant.lproj/
│ │ └── JSQMessages.strings
│ ├── Categories/
│ │ ├── NSBundle+JSQMessages.h
│ │ ├── NSBundle+JSQMessages.m
│ │ ├── NSString+JSQMessages.h
│ │ ├── NSString+JSQMessages.m
│ │ ├── UIColor+JSQMessages.h
│ │ ├── UIColor+JSQMessages.m
│ │ ├── UIImage+JSQMessages.h
│ │ ├── UIImage+JSQMessages.m
│ │ ├── UIView+JSQMessages.h
│ │ └── UIView+JSQMessages.m
│ ├── Controllers/
│ │ ├── JSQMessagesViewController.h
│ │ ├── JSQMessagesViewController.m
│ │ └── JSQMessagesViewController.xib
│ ├── Factories/
│ │ ├── JSQMessagesAvatarImageFactory.h
│ │ ├── JSQMessagesAvatarImageFactory.m
│ │ ├── JSQMessagesBubbleImageFactory.h
│ │ ├── JSQMessagesBubbleImageFactory.m
│ │ ├── JSQMessagesMediaViewBubbleImageMasker.h
│ │ ├── JSQMessagesMediaViewBubbleImageMasker.m
│ │ ├── JSQMessagesTimestampFormatter.h
│ │ ├── JSQMessagesTimestampFormatter.m
│ │ ├── JSQMessagesToolbarButtonFactory.h
│ │ ├── JSQMessagesToolbarButtonFactory.m
│ │ ├── JSQMessagesVideoThumbnailFactory.h
│ │ └── JSQMessagesVideoThumbnailFactory.m
│ ├── JSQMessages.h
│ ├── Layout/
│ │ ├── JSQAudioMediaViewAttributes.h
│ │ ├── JSQAudioMediaViewAttributes.m
│ │ ├── JSQMessagesBubbleSizeCalculating.h
│ │ ├── JSQMessagesBubblesSizeCalculator.h
│ │ ├── JSQMessagesBubblesSizeCalculator.m
│ │ ├── JSQMessagesCollectionViewFlowLayout.h
│ │ ├── JSQMessagesCollectionViewFlowLayout.m
│ │ ├── JSQMessagesCollectionViewFlowLayoutInvalidationContext.h
│ │ ├── JSQMessagesCollectionViewFlowLayoutInvalidationContext.m
│ │ ├── JSQMessagesCollectionViewLayoutAttributes.h
│ │ └── JSQMessagesCollectionViewLayoutAttributes.m
│ ├── Model/
│ │ ├── JSQAudioMediaItem.h
│ │ ├── JSQAudioMediaItem.m
│ │ ├── JSQLocationMediaItem.h
│ │ ├── JSQLocationMediaItem.m
│ │ ├── JSQMediaItem.h
│ │ ├── JSQMediaItem.m
│ │ ├── JSQMessage.h
│ │ ├── JSQMessage.m
│ │ ├── JSQMessageAvatarImageDataSource.h
│ │ ├── JSQMessageBubbleImageDataSource.h
│ │ ├── JSQMessageData.h
│ │ ├── JSQMessageMediaData.h
│ │ ├── JSQMessagesAvatarImage.h
│ │ ├── JSQMessagesAvatarImage.m
│ │ ├── JSQMessagesBubbleImage.h
│ │ ├── JSQMessagesBubbleImage.m
│ │ ├── JSQMessagesCollectionViewDataSource.h
│ │ ├── JSQMessagesCollectionViewDelegateFlowLayout.h
│ │ ├── JSQMessagesViewAccessoryButtonDelegate.h
│ │ ├── JSQPhotoMediaItem.h
│ │ ├── JSQPhotoMediaItem.m
│ │ ├── JSQVideoMediaItem.h
│ │ └── JSQVideoMediaItem.m
│ └── Views/
│ ├── JSQMessagesCellTextView.h
│ ├── JSQMessagesCellTextView.m
│ ├── JSQMessagesCollectionView.h
│ ├── JSQMessagesCollectionView.m
│ ├── JSQMessagesCollectionViewCell.h
│ ├── JSQMessagesCollectionViewCell.m
│ ├── JSQMessagesCollectionViewCellIncoming.h
│ ├── JSQMessagesCollectionViewCellIncoming.m
│ ├── JSQMessagesCollectionViewCellIncoming.xib
│ ├── JSQMessagesCollectionViewCellOutgoing.h
│ ├── JSQMessagesCollectionViewCellOutgoing.m
│ ├── JSQMessagesCollectionViewCellOutgoing.xib
│ ├── JSQMessagesComposerTextView.h
│ ├── JSQMessagesComposerTextView.m
│ ├── JSQMessagesInputToolbar.h
│ ├── JSQMessagesInputToolbar.m
│ ├── JSQMessagesLabel.h
│ ├── JSQMessagesLabel.m
│ ├── JSQMessagesLoadEarlierHeaderView.h
│ ├── JSQMessagesLoadEarlierHeaderView.m
│ ├── JSQMessagesLoadEarlierHeaderView.xib
│ ├── JSQMessagesMediaPlaceholderView.h
│ ├── JSQMessagesMediaPlaceholderView.m
│ ├── JSQMessagesToolbarContentView.h
│ ├── JSQMessagesToolbarContentView.m
│ ├── JSQMessagesToolbarContentView.xib
│ ├── JSQMessagesTypingIndicatorFooterView.h
│ ├── JSQMessagesTypingIndicatorFooterView.m
│ ├── JSQMessagesTypingIndicatorFooterView.xib
│ ├── JSQMessagesTypingView.h
│ └── JSQMessagesTypingView.m
├── JSQMessagesViewController.podspec
├── LICENSE
├── README.md
└── SwiftExample/
├── Podfile
├── Pods/
│ ├── Local Podspecs/
│ │ └── JSQMessagesViewController.podspec.json
│ ├── Pods.xcodeproj/
│ │ └── project.pbxproj
│ └── Target Support Files/
│ ├── JSQMessagesViewController/
│ │ ├── Info.plist
│ │ ├── JSQMessagesViewController-dummy.m
│ │ ├── JSQMessagesViewController-prefix.pch
│ │ ├── JSQMessagesViewController-umbrella.h
│ │ ├── JSQMessagesViewController.modulemap
│ │ └── JSQMessagesViewController.xcconfig
│ ├── Pods-SwiftExample/
│ │ ├── Info.plist
│ │ ├── Pods-SwiftExample-acknowledgements.markdown
│ │ ├── Pods-SwiftExample-acknowledgements.plist
│ │ ├── Pods-SwiftExample-dummy.m
│ │ ├── Pods-SwiftExample-frameworks.sh
│ │ ├── Pods-SwiftExample-resources.sh
│ │ ├── Pods-SwiftExample-umbrella.h
│ │ ├── Pods-SwiftExample.debug.xcconfig
│ │ ├── Pods-SwiftExample.modulemap
│ │ └── Pods-SwiftExample.release.xcconfig
│ └── Pods-SwiftExampleTests/
│ ├── Info.plist
│ ├── Pods-SwiftExampleTests-acknowledgements.markdown
│ ├── Pods-SwiftExampleTests-acknowledgements.plist
│ ├── Pods-SwiftExampleTests-dummy.m
│ ├── Pods-SwiftExampleTests-frameworks.sh
│ ├── Pods-SwiftExampleTests-resources.sh
│ ├── Pods-SwiftExampleTests-umbrella.h
│ ├── Pods-SwiftExampleTests.debug.xcconfig
│ ├── Pods-SwiftExampleTests.modulemap
│ └── Pods-SwiftExampleTests.release.xcconfig
├── SwiftExample/
│ ├── AppDelegate.swift
│ ├── Base.lproj/
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ ├── ChatViewController.swift
│ ├── Conversation.swift
│ ├── DemoConversation.swift
│ ├── Info.plist
│ ├── InitalTableViewController.swift
│ └── SettingsTableViewController.swift
├── SwiftExample.xcodeproj/
│ ├── project.pbxproj
│ └── project.xcworkspace/
│ └── contents.xcworkspacedata
├── SwiftExample.xcworkspace/
│ └── contents.xcworkspacedata
└── SwiftExampleTests/
├── ChatViewControllerTests.swift
├── Info.plist
└── SettingsTests.swift
Condensed preview — 248 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (998K chars).
[
{
"path": ".cocoadocs.yml",
"chars": 190,
"preview": "highlight-color: \"#43D15B\"\nhighlight-dark-color: \"#319942\"\ndarker-color: \"#8A998C\"\ndarker-dark-color: \"#454D46\"\nbackgrou"
},
{
"path": ".codecov.yml",
"chars": 528,
"preview": "codecov:\n branch: develop\n\ncoverage:\n precision: 2\n round: nearest\n range: \"60...100\"\n ignore:\n - JSQMessagesDem"
},
{
"path": ".github/CONDUCT.md",
"chars": 3261,
"preview": "# JSQMessagesViewController Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environme"
},
{
"path": ".github/CONTRIBUTING.md",
"chars": 2767,
"preview": "# Contributing to JSQMessagesViewController\n\n## Code of Conduct\n\nPlease read our [Code of Conduct](https://github.com/je"
},
{
"path": ".github/ISSUE_TEMPLATE.md",
"chars": 1388,
"preview": "> This library is ⚠️ [deprecated](https://www.jessesquires.com/blog/officially-deprecating-jsqmessagesviewcontroller/) ⚠"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 918,
"preview": "> This library is ⚠️ [deprecated](https://www.jessesquires.com/blog/officially-deprecating-jsqmessagesviewcontroller/) ⚠"
},
{
"path": ".gitignore",
"chars": 230,
"preview": ".DS_Store\n\n# Xcode\n/build/*\n*/build/*\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*"
},
{
"path": ".travis.yml",
"chars": 2898,
"preview": "language: objective-c\nosx_image: xcode8\ncache: cocoapods\n\nenv:\n global:\n - LANG=en_US.UTF-8\n\n - WORKSPACE=\"JSQMess"
},
{
"path": "CHANGELOG.md",
"chars": 6260,
"preview": "# CHANGELOG\n\nThe changelog for `JSQMessagesViewController`. Also see the [releases](https://github.com/jessesquires/JSQM"
},
{
"path": "Documentation/apps_using_this_library.md",
"chars": 3603,
"preview": "# Apps using this library\n\nThese are the (known) apps that use `JSQMessagesViewController`. Submit a [pull request](http"
},
{
"path": "Documentation/contributor_onboarding.md",
"chars": 8571,
"preview": "# Contributor Onboarding\n\n*Contributor onboarding guide for JSQMessagesViewController*\n\nThis guide is intended to bring "
},
{
"path": "Documentation/faq.md",
"chars": 4839,
"preview": "# FAQ\n\n*Frequently asked questions for JSQMessagesViewController.* \n\nContributions are welcome! Please submit a [pull re"
},
{
"path": "Documentation/getting_started.md",
"chars": 2748,
"preview": "# Getting Started\n\n*Getting started guide for JSQMessagesViewController*\n\n-----------------------------\n\n## For versions"
},
{
"path": "Documentation/migration.md",
"chars": 554,
"preview": "# Migration Guide\n\n*Migrating between major versions of JSQMessagesViewController?*\n\n-----------------------------\n\n## F"
},
{
"path": "JSQMessages.xcodeproj/project.pbxproj",
"chars": 82687,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "JSQMessages.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 156,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:JSQMessages.xco"
},
{
"path": "JSQMessages.xcodeproj/xcshareddata/xcschemes/JSQMessages.xcscheme",
"chars": 4969,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"0800\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "JSQMessages.xcworkspace/contents.xcworkspacedata",
"chars": 157,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:JSQMessages.xc"
},
{
"path": "JSQMessagesDemo/AppDelegate.h",
"chars": 530,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesDemo/AppDelegate.m",
"chars": 728,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesDemo/Base.lproj/Localizable.strings",
"chars": 1586,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesDemo/Base.lproj/Main.storyboard",
"chars": 40568,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "JSQMessagesDemo/DemoMessagesViewController.h",
"chars": 1025,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesDemo/DemoMessagesViewController.m",
"chars": 25784,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesDemo/DemoModelData.h",
"chars": 1772,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesDemo/DemoModelData.m",
"chars": 11681,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesDemo/DemoSettingsViewController.h",
"chars": 1055,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesDemo/DemoSettingsViewController.m",
"chars": 2093,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesDemo/Images.xcassets/AppIcon.appiconset/Contents.json",
"chars": 2006,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"iphone\",\n \"size\" : \"20x20\",\n \"scale\" : \"2x\"\n },\n {\n \"idiom\""
},
{
"path": "JSQMessagesDemo/Images.xcassets/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "JSQMessagesDemo/Images.xcassets/DemoAvatars/demo_avatar_cook.imageset/Contents.json",
"chars": 405,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\",\n \"filename\" : \"demo_avatar_cook.png\"\n "
},
{
"path": "JSQMessagesDemo/Images.xcassets/DemoAvatars/demo_avatar_jobs.imageset/Contents.json",
"chars": 405,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\",\n \"filename\" : \"demo_avatar_jobs.png\"\n "
},
{
"path": "JSQMessagesDemo/Images.xcassets/DemoAvatars/demo_avatar_woz.imageset/Contents.json",
"chars": 402,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\",\n \"filename\" : \"demo_avatar_woz.png\"\n }"
},
{
"path": "JSQMessagesDemo/Images.xcassets/LaunchImage.launchimage/Contents.json",
"chars": 2167,
"preview": "{\n \"images\" : [\n {\n \"extent\" : \"full-screen\",\n \"idiom\" : \"iphone\",\n \"subtype\" : \"736h\",\n \"filena"
},
{
"path": "JSQMessagesDemo/Images.xcassets/goldengate.imageset/Contents.json",
"chars": 387,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\",\n \"filename\" : \"goldengate.png\"\n },\n "
},
{
"path": "JSQMessagesDemo/Info.plist",
"chars": 1501,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "JSQMessagesDemo/NSUserDefaults+DemoSettings.h",
"chars": 994,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesDemo/NSUserDefaults+DemoSettings.m",
"chars": 2877,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesDemo/TableViewController.h",
"chars": 601,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesDemo/TableViewController.m",
"chars": 5760,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesDemo/he.lproj/Localizable.strings",
"chars": 1540,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesDemo/he.lproj/Main.strings",
"chars": 1811,
"preview": "\n/* Class = \"UILabel\"; text = \"Title\"; ObjectID = \"2qz-Z2-GmT\"; */\n\"2qz-Z2-GmT.text\" = \"כותרת\";\n\n/* Class = \"UILabel\"; t"
},
{
"path": "JSQMessagesDemo/main.m",
"chars": 563,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesTests/CategoryTests/JSQMessagesNSBundleTests.m",
"chars": 1194,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/CategoryTests/JSQMessagesNSStringTests.m",
"chars": 1320,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/CategoryTests/JSQMessagesUIColorTests.m",
"chars": 1980,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/CategoryTests/JSQMessagesUIImageTests.m",
"chars": 1736,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/CategoryTests/JSQMessagesUIViewTests.m",
"chars": 2050,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/ControllerTests/JSQMessagesViewControllerTests.m",
"chars": 3378,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/FactoryTests/JSQMessagesAvatarImageFactoryTests.m",
"chars": 3388,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/FactoryTests/JSQMessagesBubbleImageFactoryTests.m",
"chars": 12836,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/FactoryTests/JSQMessagesMediaViewBubbleImageMaskerTests.m",
"chars": 1002,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/FactoryTests/JSQMessagesTimestampFormatterTests.m",
"chars": 3587,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/FactoryTests/JSQMessagesToolbarButtonFactoryTests.m",
"chars": 1349,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/Info.plist",
"chars": 733,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "JSQMessagesTests/LayoutTests/JSQMessagesCollectionViewFlowLayoutTests.m",
"chars": 652,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/LayoutTests/JSQMessagesCollectionViewLayoutAttributesTests.m",
"chars": 1588,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/ModelTests/JSQAudioMediaItemTests.m",
"chars": 2144,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/ModelTests/JSQLocationMediaItemTests.m",
"chars": 2019,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/ModelTests/JSQMessageMediaTests.m",
"chars": 3070,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/ModelTests/JSQMessageTextTests.m",
"chars": 2685,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/ModelTests/JSQMessagesAvatarImageTests.m",
"chars": 2181,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/ModelTests/JSQMessagesBubbleImageTests.m",
"chars": 1599,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/ModelTests/JSQPhotoMediaItemTests.m",
"chars": 2242,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/ModelTests/JSQVideoMediaItemTests.m",
"chars": 1965,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/ViewTests/JSQMessagesCollectionViewCellTests.m",
"chars": 1438,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/ViewTests/JSQMessagesCollectionViewTests.m",
"chars": 1339,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/ViewTests/JSQMessagesComposerTextViewTests.m",
"chars": 3800,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/ViewTests/JSQMessagesInputToolbarTests.m",
"chars": 2016,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/ViewTests/JSQMessagesLabelTests.m",
"chars": 736,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/ViewTests/JSQMessagesLoadEarlierHeaderViewTests.m",
"chars": 781,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/ViewTests/JSQMessagesToolbarContentViewTests.m",
"chars": 1549,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesTests/ViewTests/JSQMessagesTypingIndicatorFooterViewTests.m",
"chars": 805,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// MIT License\n// Copyright (c) 2014 Jesse Squir"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/Base.lproj/JSQMessages.strings",
"chars": 901,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/ar.lproj/JSQMessages.strings",
"chars": 661,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/bs.lproj/JSQMessages.strings",
"chars": 908,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/cs.lproj/JSQMessages.strings",
"chars": 905,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/da.lproj/JSQMessages.strings",
"chars": 898,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/de.lproj/JSQMessages.strings",
"chars": 917,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/en.lproj/JSQMessages.strings",
"chars": 901,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/es.lproj/JSQMessages.strings",
"chars": 912,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/fa.lproj/JSQMessages.strings",
"chars": 470,
"preview": "/*\n Localization provided by MasihTak under MIT license\n The Mac OS X and iOS localization experts.\n https://masihtak.co"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/fi.lproj/JSQMessages.strings",
"chars": 663,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/fr.lproj/JSQMessages.strings",
"chars": 904,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/he.lproj/JSQMessages.strings",
"chars": 654,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/hr.lproj/JSQMessages.strings",
"chars": 908,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/id.lproj/JSQMessages.strings",
"chars": 660,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/it.lproj/JSQMessages.strings",
"chars": 670,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/ja.lproj/JSQMessages.strings",
"chars": 646,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/ko.lproj/JSQMessages.strings",
"chars": 644,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/ms.lproj/JSQMessages.strings",
"chars": 661,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/nb.lproj/JSQMessages.strings",
"chars": 899,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/nl.lproj/JSQMessages.strings",
"chars": 664,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/pl.lproj/JSQMessages.strings",
"chars": 674,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/pt.lproj/JSQMessages.strings",
"chars": 672,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/ro.lproj/JSQMessages.strings",
"chars": 671,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/ru.lproj/JSQMessages.strings",
"chars": 657,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/sv.lproj/JSQMessages.strings",
"chars": 670,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/th.lproj/JSQMessages.strings",
"chars": 657,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/tr.lproj/JSQMessages.strings",
"chars": 660,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/vi.lproj/JSQMessages.strings",
"chars": 656,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/zh-Hans.lproj/JSQMessages.strings",
"chars": 636,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Assets/JSQMessagesAssets.bundle/zh-Hant.lproj/JSQMessages.strings",
"chars": 636,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Categories/NSBundle+JSQMessages.h",
"chars": 1037,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Categories/NSBundle+JSQMessages.m",
"chars": 1030,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Categories/NSString+JSQMessages.h",
"chars": 617,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Categories/NSString+JSQMessages.m",
"chars": 584,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Categories/UIColor+JSQMessages.h",
"chars": 1613,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Categories/UIColor+JSQMessages.m",
"chars": 2647,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Categories/UIImage+JSQMessages.h",
"chars": 2093,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Categories/UIImage+JSQMessages.m",
"chars": 2833,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Categories/UIView+JSQMessages.h",
"chars": 1131,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Categories/UIView+JSQMessages.m",
"chars": 1341,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Controllers/JSQMessagesViewController.h",
"chars": 12593,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Controllers/JSQMessagesViewController.m",
"chars": 36452,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Controllers/JSQMessagesViewController.xib",
"chars": 3501,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" versi"
},
{
"path": "JSQMessagesViewController/Factories/JSQMessagesAvatarImageFactory.h",
"chars": 4692,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Factories/JSQMessagesAvatarImageFactory.m",
"chars": 5879,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Factories/JSQMessagesBubbleImageFactory.h",
"chars": 3561,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Factories/JSQMessagesBubbleImageFactory.m",
"chars": 3853,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Factories/JSQMessagesMediaViewBubbleImageMasker.h",
"chars": 3071,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Factories/JSQMessagesMediaViewBubbleImageMasker.m",
"chars": 2270,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Factories/JSQMessagesTimestampFormatter.h",
"chars": 3437,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Factories/JSQMessagesTimestampFormatter.m",
"chars": 3675,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Factories/JSQMessagesToolbarButtonFactory.h",
"chars": 1775,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Factories/JSQMessagesToolbarButtonFactory.m",
"chars": 3545,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Factories/JSQMessagesVideoThumbnailFactory.h",
"chars": 2659,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Factories/JSQMessagesVideoThumbnailFactory.m",
"chars": 2254,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/JSQMessages.h",
"chars": 2179,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Layout/JSQAudioMediaViewAttributes.h",
"chars": 3913,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Layout/JSQAudioMediaViewAttributes.m",
"chars": 3779,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Layout/JSQMessagesBubbleSizeCalculating.h",
"chars": 1968,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Layout/JSQMessagesBubblesSizeCalculator.h",
"chars": 1489,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Layout/JSQMessagesBubblesSizeCalculator.m",
"chars": 6573,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Layout/JSQMessagesCollectionViewFlowLayout.h",
"chars": 9031,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Layout/JSQMessagesCollectionViewFlowLayout.m",
"chars": 19868,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Layout/JSQMessagesCollectionViewFlowLayoutInvalidationContext.h",
"chars": 1637,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Layout/JSQMessagesCollectionViewFlowLayoutInvalidationContext.m",
"chars": 1508,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Layout/JSQMessagesCollectionViewLayoutAttributes.h",
"chars": 3635,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Layout/JSQMessagesCollectionViewLayoutAttributes.m",
"chars": 4905,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQAudioMediaItem.h",
"chars": 3888,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQAudioMediaItem.m",
"chars": 13289,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQLocationMediaItem.h",
"chars": 3498,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQLocationMediaItem.m",
"chars": 6666,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQMediaItem.h",
"chars": 1855,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQMediaItem.m",
"chars": 4091,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQMessage.h",
"chars": 5709,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQMessage.m",
"chars": 6072,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQMessageAvatarImageDataSource.h",
"chars": 2003,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQMessageBubbleImageDataSource.h",
"chars": 1438,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQMessageData.h",
"chars": 2894,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQMessageMediaData.h",
"chars": 3714,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQMessagesAvatarImage.h",
"chars": 2845,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQMessagesAvatarImage.m",
"chars": 2371,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQMessagesBubbleImage.h",
"chars": 1854,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQMessagesBubbleImage.m",
"chars": 1583,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQMessagesCollectionViewDataSource.h",
"chars": 7277,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQMessagesCollectionViewDelegateFlowLayout.h",
"chars": 5528,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQMessagesViewAccessoryButtonDelegate.h",
"chars": 1122,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n// Documentation\n// http://cocoadocs.org/docsets/JS"
},
{
"path": "JSQMessagesViewController/Model/JSQPhotoMediaItem.h",
"chars": 1578,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQPhotoMediaItem.m",
"chars": 3159,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQVideoMediaItem.h",
"chars": 3048,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Model/JSQVideoMediaItem.m",
"chars": 5419,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesCellTextView.h",
"chars": 573,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesCellTextView.m",
"chars": 2419,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesCollectionView.h",
"chars": 4144,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesCollectionView.m",
"chars": 6711,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesCollectionViewCell.h",
"chars": 7813,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesCollectionViewCell.m",
"chars": 14047,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesCollectionViewCellIncoming.h",
"chars": 656,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesCollectionViewCellIncoming.m",
"chars": 674,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesCollectionViewCellIncoming.xib",
"chars": 14714,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" versi"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesCollectionViewCellOutgoing.h",
"chars": 656,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesCollectionViewCellOutgoing.m",
"chars": 676,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesCollectionViewCellOutgoing.xib",
"chars": 14694,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" versi"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesComposerTextView.h",
"chars": 2255,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesComposerTextView.m",
"chars": 8765,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesInputToolbar.h",
"chars": 4213,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesInputToolbar.m",
"chars": 7045,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesLabel.h",
"chars": 942,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesLabel.m",
"chars": 1456,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesLoadEarlierHeaderView.h",
"chars": 2187,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesLoadEarlierHeaderView.m",
"chars": 1841,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesLoadEarlierHeaderView.xib",
"chars": 2596,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" versi"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesMediaPlaceholderView.h",
"chars": 3575,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesMediaPlaceholderView.m",
"chars": 3832,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesToolbarContentView.h",
"chars": 4505,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesToolbarContentView.m",
"chars": 5641,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesToolbarContentView.xib",
"chars": 5608,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" versi"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesTypingIndicatorFooterView.h",
"chars": 2371,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesTypingIndicatorFooterView.m",
"chars": 4966,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesTypingIndicatorFooterView.xib",
"chars": 3412,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" versi"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesTypingView.h",
"chars": 796,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController/Views/JSQMessagesTypingView.m",
"chars": 3534,
"preview": "//\n// Created by Jesse Squires\n// http://www.jessesquires.com\n//\n//\n// Documentation\n// http://cocoadocs.org/docsets"
},
{
"path": "JSQMessagesViewController.podspec",
"chars": 651,
"preview": "Pod::Spec.new do |s|\n\ts.name = 'JSQMessagesViewController'\n\ts.version = '7.3.5'\n\ts.summary = 'An elegant messages UI lib"
},
{
"path": "LICENSE",
"chars": 1107,
"preview": "\nMIT License\nCopyright (c) 2013-present Jesse Squires\n\nhttp://www.jessesquires.com\n\nPermission is hereby granted, free o"
},
{
"path": "README.md",
"chars": 5735,
"preview": "[](http://unmaintained.tech/)\n\n# :warning: Deprecated :war"
},
{
"path": "SwiftExample/Podfile",
"chars": 312,
"preview": "# Uncomment this line to define a global platform for your project\n platform :ios, '9.0'\n# Uncomment this line if you're"
},
{
"path": "SwiftExample/Pods/Local Podspecs/JSQMessagesViewController.podspec.json",
"chars": 1294,
"preview": "{\n \"name\": \"JSQMessagesViewController\",\n \"version\": \"7.3.4\",\n \"summary\": \"An elegant messages UI library for iOS.\",\n "
},
{
"path": "SwiftExample/Pods/Pods.xcodeproj/project.pbxproj",
"chars": 92914,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
}
]
// ... and 48 more files (download for full content)
About this extraction
This page contains the full source code of the jessesquires/JSQMessagesViewController GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 248 files (911.7 KB), approximately 248.6k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.