Compare commits
427 Commits
master
...
charlesmch
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b1cad8234c | ||
|
|
33dd72b7ba | ||
|
|
7d9e7562c6 | ||
|
|
44b820ef5d | ||
|
|
f9063f634f | ||
|
|
adbffe3e87 | ||
|
|
f03e14f754 | ||
|
|
3f74b56ca7 | ||
|
|
868cf70fae | ||
|
|
8ffe2518ef | ||
|
|
9e452ee59c | ||
|
|
bb8ec4afcc | ||
|
|
eb6205d0c9 | ||
|
|
221ad25fd7 | ||
|
|
d26758cd2b | ||
|
|
06d5c6e646 | ||
|
|
8c10f920bb | ||
|
|
146b84febc | ||
|
|
7a7deff318 | ||
|
|
560e59f8e4 | ||
|
|
ef3bf46e9f | ||
|
|
5d7a5f99f9 | ||
|
|
521686c112 | ||
|
|
7054e4b13e | ||
|
|
fe656ae0c1 | ||
|
|
929f1d80cd | ||
|
|
23bf3f0b1e | ||
|
|
e4927be6a8 | ||
|
|
0622f6f4d7 | ||
|
|
ef5c87f0b4 | ||
|
|
ed54d6c50d | ||
|
|
e630340c48 | ||
|
|
fa6917e4a8 | ||
|
|
25769603b7 | ||
|
|
026b1e31f3 | ||
|
|
a430cbed21 | ||
|
|
d099c56c96 | ||
|
|
8c6e4081ff | ||
|
|
7fdc6393c0 | ||
|
|
ade4e7a95d | ||
|
|
9c435347af | ||
|
|
5cb6acf71e | ||
|
|
66a54186da | ||
|
|
b7f487cc92 | ||
|
|
8c29756211 | ||
|
|
2a46bd19b1 | ||
|
|
6f4d6cc90c | ||
|
|
547e216e82 | ||
|
|
c4143c59a5 | ||
|
|
359d576668 | ||
|
|
3b4dc8f238 | ||
|
|
40ae3b28c3 | ||
|
|
b53eef5dd8 | ||
|
|
d0fea3d377 | ||
|
|
c0928db9e1 | ||
|
|
942ec7a016 | ||
|
|
aecb14f9b7 | ||
|
|
943d8d90ec | ||
|
|
f867ce223f | ||
|
|
a6209a38f2 | ||
|
|
64dbe7f08b | ||
|
|
532eb513a0 | ||
|
|
e32c63283d | ||
|
|
b959f61f82 | ||
|
|
99ff104590 | ||
|
|
aa12e5d19b | ||
|
|
38e80c2696 | ||
|
|
d35bd59bce | ||
|
|
0fef325f6a | ||
|
|
a1779e4a33 | ||
|
|
959e07cceb | ||
|
|
8c6b123457 | ||
|
|
8cba6e5d7f | ||
|
|
f06c939b47 | ||
|
|
6873264627 | ||
|
|
d2e4a06115 | ||
|
|
747bf802f2 | ||
|
|
caeb91576f | ||
|
|
f656a7b129 | ||
|
|
5b27c16472 | ||
|
|
34d37e3e59 | ||
|
|
5a5614c3b9 | ||
|
|
3dabbbf1f2 | ||
|
|
c938362d7c | ||
|
|
932e61d0f1 | ||
|
|
028860b5cd | ||
|
|
17b848c152 | ||
|
|
39dc4e46de | ||
|
|
8b95f41c55 | ||
|
|
f72235a2bf | ||
|
|
bc7bef4c99 | ||
|
|
299dd01b54 | ||
|
|
b537f708d6 | ||
|
|
c1641d68bf | ||
|
|
444283922d | ||
|
|
637d4e1c40 | ||
|
|
cd0c9f61ed | ||
|
|
4b9a5ff5ad | ||
|
|
d616d11809 | ||
|
|
e5979c1ca4 | ||
|
|
59d04621c3 | ||
|
|
6b54c75bc9 | ||
|
|
72e91ffbd2 | ||
|
|
93c4de3ec4 | ||
|
|
fe251ef91c | ||
|
|
d922149efe | ||
|
|
7c248fdb4f | ||
|
|
13824b2264 | ||
|
|
d16852af96 | ||
|
|
aaa6fefc41 | ||
|
|
51beebb07f | ||
|
|
a9d34e8da1 | ||
|
|
3dd0bab1dc | ||
|
|
31ba236883 | ||
|
|
f3ad9887bf | ||
|
|
403745cbd3 | ||
|
|
ad7c3b8f99 | ||
|
|
3464c63f69 | ||
|
|
0a4a628c76 | ||
|
|
2a60b406a6 | ||
|
|
b9999066a9 | ||
|
|
9c1efe10a9 | ||
|
|
7c4b4f4639 | ||
|
|
3d9bb6d6a4 | ||
|
|
685ef7019e | ||
|
|
0f6095fc5b | ||
|
|
a9721495d4 | ||
|
|
01edde38e7 | ||
|
|
b461d5a3b3 | ||
|
|
0c8b939406 | ||
|
|
0c33d88198 | ||
|
|
6621f6b584 | ||
|
|
a29cbb7c79 | ||
|
|
f5f2e67e5b | ||
|
|
03473dfe0a | ||
|
|
2f33e3c9cd | ||
|
|
b49a69a487 | ||
|
|
ec601a6c62 | ||
|
|
be5dc2764c | ||
|
|
1f97141421 | ||
|
|
6dda0b041a | ||
|
|
239f5e6fe8 | ||
|
|
c296dac954 | ||
|
|
69b5779f6b | ||
|
|
5d5551b913 | ||
|
|
90471f36a5 | ||
|
|
2c1210c892 | ||
|
|
932b7da2d9 | ||
|
|
776c94c264 | ||
|
|
7f7b850890 | ||
|
|
e65c34ac78 | ||
|
|
b846d4b4a3 | ||
|
|
2891d192f4 | ||
|
|
04e0a43eb4 | ||
|
|
69e38bcbad | ||
|
|
11af29dcbb | ||
|
|
54fff888f2 | ||
|
|
70c3498c46 | ||
|
|
911b115768 | ||
|
|
d7e2748f3e | ||
|
|
7b6a6863bf | ||
|
|
ca70936656 | ||
|
|
5b529462fb | ||
|
|
9a9e28b35c | ||
|
|
f693689ca6 | ||
|
|
5bcd72ffce | ||
|
|
a04482c1e8 | ||
|
|
42aaff754b | ||
|
|
2393ea6c16 | ||
|
|
6f90c0e93a | ||
|
|
807b5fe9ea | ||
|
|
4c52e50b51 | ||
|
|
18703786e5 | ||
|
|
c980b20292 | ||
|
|
e935338e17 | ||
|
|
5d1ddb909a | ||
|
|
0d19bb201d | ||
|
|
8e5f36593e | ||
|
|
88f2a908c7 | ||
|
|
419a14210c | ||
|
|
75692259db | ||
|
|
59cd37a969 | ||
|
|
b99b2a3b38 | ||
|
|
506e82f9be | ||
|
|
2baed6f61d | ||
|
|
238ec1d13d | ||
|
|
a58d3e34d2 | ||
|
|
ea14a506e8 | ||
|
|
53f66cd8a4 | ||
|
|
4a009760da | ||
|
|
820ad7c9b4 | ||
|
|
f50127ca4e | ||
|
|
7485f3d1d3 | ||
|
|
cc678456dc | ||
|
|
1803ffbd6c | ||
|
|
f29f2e284d | ||
|
|
8716568a4d | ||
|
|
f419972a89 | ||
|
|
faf95defde | ||
|
|
ebc8e2f02c | ||
|
|
f82cb30939 | ||
|
|
5a01def7fb | ||
|
|
e0c53ac15b | ||
|
|
ef4f67d7d7 | ||
|
|
a00fa9dc52 | ||
|
|
6ab06a44a8 | ||
|
|
027ed01416 | ||
|
|
88b0301449 | ||
|
|
155990c63b | ||
|
|
487e15a163 | ||
|
|
af61aa9335 | ||
|
|
695f09f968 | ||
|
|
0c5c2b6bfb | ||
|
|
123199aa6a | ||
|
|
3a49d81fdc | ||
|
|
36e5d25146 | ||
|
|
7917c423cc | ||
|
|
49135c660a | ||
|
|
553f5ecbb8 | ||
|
|
25a58853b2 | ||
|
|
9f64e6a25a | ||
|
|
8ba29137e8 | ||
|
|
ac25bd4f2f | ||
|
|
611ef2dab2 | ||
|
|
1968ffcfa7 | ||
|
|
f65b452b93 | ||
|
|
e72bfeed1f | ||
|
|
1e7ded798b | ||
|
|
12e3dc6442 | ||
|
|
a735dd3da5 | ||
|
|
b95e606447 | ||
|
|
42d85c66d5 | ||
|
|
e63f45308a | ||
|
|
684aac33e7 | ||
|
|
6648fe06f9 | ||
|
|
1d4be68944 | ||
|
|
0730fe5ebe | ||
|
|
9ebbcb5d97 | ||
|
|
678d3348ed | ||
|
|
27ed04dae6 | ||
|
|
dad900b185 | ||
|
|
1d8ced57f4 | ||
|
|
e217043e06 | ||
|
|
875eab6a54 | ||
|
|
0317f7ff8c | ||
|
|
42d4d369e7 | ||
|
|
07cccf00ee | ||
|
|
031de6dd0a | ||
|
|
cd46b83b69 | ||
|
|
9042e961b0 | ||
|
|
375439060b | ||
|
|
f38934e03d | ||
|
|
052dfdcdd9 | ||
|
|
165adaef06 | ||
|
|
f5cdd957e9 | ||
|
|
f8cbc84e0f | ||
|
|
5291d8c5d1 | ||
|
|
9fa0e40397 | ||
|
|
3e14180439 | ||
|
|
ba77b23076 | ||
|
|
5124c1247e | ||
|
|
48dfb0ea03 | ||
|
|
f72c03cde3 | ||
|
|
e0141a3d7c | ||
|
|
ddc20c96ee | ||
|
|
a3652df8b6 | ||
|
|
d701cbff14 | ||
|
|
6405d7dad6 | ||
|
|
12dd5b2744 | ||
|
|
5b0badf923 | ||
|
|
cd17e0de51 | ||
|
|
6d7ceda2bd | ||
|
|
983fb5823d | ||
|
|
679ac60698 | ||
|
|
49f5d7ec9d | ||
|
|
9752be93cf | ||
|
|
9a89ba2d12 | ||
|
|
e6480b57ea | ||
|
|
b344f2dfa3 | ||
|
|
933f0dfe6c | ||
|
|
d5272c4283 | ||
|
|
c07c12e26a | ||
|
|
ec2e0a9a39 | ||
|
|
62385e451a | ||
|
|
08ff2cb0cb | ||
|
|
8dea72a056 | ||
|
|
c5c7050d60 | ||
|
|
3fad9a9548 | ||
|
|
da6136da26 | ||
|
|
3c964a4d83 | ||
|
|
586c9597c0 | ||
|
|
c28d4bfd26 | ||
|
|
a7335bc2c1 | ||
|
|
cbeb533a54 | ||
|
|
c4749a7991 | ||
|
|
7b2b238153 | ||
|
|
676dc75c14 | ||
|
|
1140cac96f | ||
|
|
91e74b0f7b | ||
|
|
3898476714 | ||
|
|
16ed8c1f88 | ||
|
|
efa3c2b365 | ||
|
|
8cd4b0be87 | ||
|
|
122983ddbb | ||
|
|
2870560006 | ||
|
|
a2f8b39891 | ||
|
|
b656f8adf9 | ||
|
|
867115b03c | ||
|
|
c2651dd0a4 | ||
|
|
ec8dcf66d5 | ||
|
|
acbb692b3d | ||
|
|
7606339770 | ||
|
|
9551159a20 | ||
|
|
c8831f0b30 | ||
|
|
566ddb3301 | ||
|
|
ea373b0130 | ||
|
|
9859d3ab52 | ||
|
|
8e8f0998be | ||
|
|
27ec773edc | ||
|
|
34f046c452 | ||
|
|
7e7edbf675 | ||
|
|
98368fc105 | ||
|
|
08567a4be6 | ||
|
|
78c46c0ac4 | ||
|
|
2f94744368 | ||
|
|
ad761def43 | ||
|
|
c5c9c20246 | ||
|
|
c4d38a8407 | ||
|
|
9db018bfce | ||
|
|
0db2ab9e74 | ||
|
|
6a5aeb5ffb | ||
|
|
74acd93417 | ||
|
|
3247b45b13 | ||
|
|
bccad24efc | ||
|
|
5e9e368f4d | ||
|
|
bff4ae7b86 | ||
|
|
4c05c28f70 | ||
|
|
6b58a211c5 | ||
|
|
cb901cb026 | ||
|
|
cd974aa015 | ||
|
|
a6a2884b07 | ||
|
|
a859a6862a | ||
|
|
72e7343908 | ||
|
|
45590c3405 | ||
|
|
cd085c683f | ||
|
|
853a3fe1c5 | ||
|
|
7610526965 | ||
|
|
ab831aaf67 | ||
|
|
5c57cee47f | ||
|
|
dcebef9d1e | ||
|
|
547cec7287 | ||
|
|
72540e2553 | ||
|
|
1c5811107c | ||
|
|
ea42262a9a | ||
|
|
483f36402a | ||
|
|
7edc1312d1 | ||
|
|
6086d26bc8 | ||
|
|
e75c2fb166 | ||
|
|
0ed53ae8c5 | ||
|
|
fb7119d3b2 | ||
|
|
71a7f519fc | ||
|
|
62c6844ce6 | ||
|
|
dd0e214d13 | ||
|
|
25a887a31e | ||
|
|
bd82c11af6 | ||
|
|
3e69f1fc1d | ||
|
|
acb047f25d | ||
|
|
fc581c8b0b | ||
|
|
007a945959 | ||
|
|
56f8a9c648 | ||
|
|
0f5cd6c2fd | ||
|
|
86746bd9d6 | ||
|
|
94b19ccb08 | ||
|
|
88d2fe4ef4 | ||
|
|
97bfef24c9 | ||
|
|
f09dc0230e | ||
|
|
a30f9bdee9 | ||
|
|
e23a248797 | ||
|
|
05c97700a2 | ||
|
|
1f64013617 | ||
|
|
a6437be1ab | ||
|
|
e0ae6cdb1f | ||
|
|
d9aea32ed0 | ||
|
|
09db017b87 | ||
|
|
a180dcbee6 | ||
|
|
2698a699d8 | ||
|
|
0aa0ae2237 | ||
|
|
1fb791f964 | ||
|
|
0b8fb267d1 | ||
|
|
b728ff3b4a | ||
|
|
fa7e42bfa5 | ||
|
|
82534ea75d | ||
|
|
08cc2d14d4 | ||
|
|
720999efe9 | ||
|
|
0157f1a47e | ||
|
|
fc340cd166 | ||
|
|
399544ff5d | ||
|
|
245551f8ce | ||
|
|
27d7a2e09c | ||
|
|
9e6e0f2524 | ||
|
|
9893d4208f | ||
|
|
3e80be42db | ||
|
|
e354981b49 | ||
|
|
08377bc153 | ||
|
|
1acb68119e | ||
|
|
f31b214c1b | ||
|
|
ddf11e62e4 | ||
|
|
fa668ef7da | ||
|
|
e3a2babfb2 | ||
|
|
ed81bb2977 | ||
|
|
6e7647d14a | ||
|
|
99977d4938 | ||
|
|
df26f3cc16 | ||
|
|
1b9814ee5c | ||
|
|
eec8ff4236 | ||
|
|
3779613da8 | ||
|
|
f55bdad953 | ||
|
|
741f53f793 | ||
|
|
9bbdffa568 | ||
|
|
db40c8b588 | ||
|
|
dbad9a9325 | ||
|
|
5d21d699f6 | ||
|
|
b5ca3df47e | ||
|
|
191d2c3700 | ||
|
|
bbbb242521 | ||
|
|
174cae9b6c | ||
|
|
7d6534eeae |
34
.codecov.yml
Normal file
@ -0,0 +1,34 @@
|
||||
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"
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
behavior: default
|
||||
74
.github/CONDUCT.md
vendored
Normal file
@ -0,0 +1,74 @@
|
||||
# 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/
|
||||
51
.github/CONTRIBUTING.md
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
# Contributing to JSQMessagesViewController
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
Please read our [Code of Conduct](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/.github/CONDUCT.md). Intolerance, disrespect, 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:
|
||||
36
.github/ISSUE_TEMPLATE.md
vendored
Normal file
@ -0,0 +1,36 @@
|
||||
## New issue checklist
|
||||
<!-- Before submitting this issue, make sure you have done the following -->
|
||||
|
||||
- [ ] I have read all of 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).
|
||||
- [ ] I have reviewed the [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
|
||||
|
||||
- Library version(s):
|
||||
- iOS version(s):
|
||||
- Devices/Simulators affected:
|
||||
- Reproducible in the demo project? (Yes/No):
|
||||
- Related issues:
|
||||
|
||||
## Bug report
|
||||
|
||||
#### Expected behavior
|
||||
|
||||
> ...
|
||||
|
||||
#### Actual behavior
|
||||
|
||||
> ...
|
||||
|
||||
#### Steps to reproduce
|
||||
|
||||
> ...
|
||||
|
||||
#### Crash log? Screenshots? Videos? Sample project?
|
||||
|
||||
>...
|
||||
|
||||
## Question or Feature Request
|
||||
|
||||
> ...
|
||||
11
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
## Pull request checklist
|
||||
|
||||
- [ ] All tests pass. Demo project builds and runs.
|
||||
- [ ] I have resolved any merge conflicts.
|
||||
- [ ] I have followed the [coding style](https://github.com/jessesquires/HowToContribute#style-guidelines), and reviewed the [contributing guidelines](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/.github/CONTRIBUTING.md). Confirmation: ____
|
||||
|
||||
#### This fixes issue #___.
|
||||
|
||||
## What's in this pull request?
|
||||
|
||||
>...
|
||||
9
.gitignore
vendored
@ -1,6 +1,6 @@
|
||||
# Xcode
|
||||
|
||||
.DS_Store
|
||||
|
||||
# Xcode
|
||||
/build/*
|
||||
*/build/*
|
||||
*.pbxuser
|
||||
@ -18,8 +18,3 @@ DerivedData
|
||||
.idea/
|
||||
*.hmap
|
||||
*.xccheckout
|
||||
|
||||
|
||||
#CocoaPods
|
||||
|
||||
Pods
|
||||
48
.travis.yml
@ -1,10 +1,44 @@
|
||||
language: objective-c
|
||||
osx_image: xcode7.3
|
||||
|
||||
before_install:
|
||||
- export LANG=en_US.UTF-8
|
||||
- gem install cocoapods
|
||||
- brew update
|
||||
- if brew outdated | grep -qx xctool; then brew upgrade xctool; fi
|
||||
env:
|
||||
global:
|
||||
- LANG=en_US.UTF-8
|
||||
- WORKSPACE="JSQMessages.xcworkspace"
|
||||
- IOS_SCHEME="JSQMessages"
|
||||
- IOS_SDK=iphonesimulator9.3
|
||||
|
||||
script:
|
||||
- xctool clean build test -workspace JSQMessages.xcworkspace -scheme JSQMessages -sdk iphonesimulator7.1 ONLY_ACTIVE_ARCH=NO
|
||||
matrix:
|
||||
- DESTINATION="OS=8.1,name=iPhone 5" SDK="$IOS_SDK" SCHEME="$IOS_SCHEME" RUN_TESTS="YES" BUILD_EXAMPLE="NO" POD_LINT="NO" COVERAGE="NO"
|
||||
- DESTINATION="OS=9.0,name=iPhone 6 Plus" SDK="$IOS_SDK" SCHEME="$IOS_SCHEME" RUN_TESTS="NO" BUILD_EXAMPLE="NO" POD_LINT="YES" COVERAGE="YES"
|
||||
|
||||
before_install:
|
||||
- gem install xcpretty --no-rdoc --no-ri --no-document --quiet
|
||||
|
||||
# skip pod install on travis-ci
|
||||
# since we check-in the pods folder, etc. this isn't needed
|
||||
install: true
|
||||
|
||||
script:
|
||||
|
||||
- if [ $POD_LINT == "YES" ]; then
|
||||
pod spec lint;
|
||||
pod lib lint;
|
||||
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
|
||||
|
||||
# Build for reporting test coverage
|
||||
- if [ $COVERAGE == "YES" ]; then
|
||||
xcodebuild clean build test -workspace "$WORKSPACE" -scheme "$SCHEME" -sdk "$SDK" -destination "$DESTINATION" -configuration Debug ONLY_ACTIVE_ARCH=NO GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES;
|
||||
fi
|
||||
|
||||
after_success:
|
||||
|
||||
- if [ $COVERAGE == "YES" ]; then
|
||||
bash <(curl -s https://codecov.io/bash);
|
||||
fi
|
||||
|
||||
|
Before Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 10 KiB |
125
CHANGELOG.md
Normal file
@ -0,0 +1,125 @@
|
||||
# CHANGELOG
|
||||
|
||||
The changelog for `JSQMessagesViewController`. Also see the [releases](https://github.com/jessesquires/JSQMessagesViewController/releases) on GitHub.
|
||||
|
||||
--------------------------------------
|
||||
|
||||
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.
|
||||
@ -1,3 +0,0 @@
|
||||
## How To Contribute
|
||||
|
||||
Please follow these sweet [contribution guidelines](https://github.com/jessesquires/HowToContribute).
|
||||
@ -7,11 +7,9 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
36CF33BD29CF36EB06D0CCFD /* libPods-JSQMessagesTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 782026E9E518622532ED474D /* libPods-JSQMessagesTests.a */; };
|
||||
77CC17A895E6E12BC9CB549A /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 97E6750B77E8A7042BA0754B /* libPods.a */; };
|
||||
88078A9D19D8FEB5005B4595 /* JSQMessagesMediaPlaceholderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88078A9C19D8FEB5005B4595 /* JSQMessagesMediaPlaceholderView.m */; };
|
||||
54271E3B1C90469100294290 /* jsq_messages_sample.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 54271E3A1C90469100294290 /* jsq_messages_sample.m4a */; };
|
||||
54271E401C905D1600294290 /* JSQAudioMediaItemTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 54271E3F1C905D1600294290 /* JSQAudioMediaItemTests.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 */; };
|
||||
@ -21,53 +19,22 @@
|
||||
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 */; };
|
||||
886FFD2E19E9A65D00EB8485 /* UIDevice+JSQMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 886FFD2D19E9A65D00EB8485 /* UIDevice+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 */; };
|
||||
88A25FB519D8E01A00924534 /* JSQSystemSoundPlayer+JSQMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F5619D8E01A00924534 /* JSQSystemSoundPlayer+JSQMessages.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 */; };
|
||||
88A25FBA19D8E01A00924534 /* JSQMessagesKeyboardController.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F6119D8E01A00924534 /* JSQMessagesKeyboardController.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 */; };
|
||||
88A25FCE19D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F9219D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.m */; };
|
||||
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 */; };
|
||||
@ -96,30 +63,12 @@
|
||||
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 */; };
|
||||
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 */; };
|
||||
88E4D7131A0DBD6B000CC061 /* JSQMessages.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8841B88719F4988800EA16B6 /* JSQMessages.strings */; };
|
||||
94A4FA20C2FBD0D62614D5A8 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 97E6750B77E8A7042BA0754B /* libPods.a */; };
|
||||
FC15B7A91A1E880900F59801 /* JSQCallCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = FC15B7A81A1E880900F59801 /* JSQCallCollectionViewCell.xib */; };
|
||||
FC15B7B01A1F6AC800F59801 /* JSQMessagesCollectionViewCellIncoming.xib in Resources */ = {isa = PBXBuildFile; fileRef = FC15B7AE1A1F6AC800F59801 /* JSQMessagesCollectionViewCellIncoming.xib */; };
|
||||
FC15B7B11A1F6AC800F59801 /* JSQMessagesCollectionViewCellOutgoing.xib in Resources */ = {isa = PBXBuildFile; fileRef = FC15B7AF1A1F6AC800F59801 /* JSQMessagesCollectionViewCellOutgoing.xib */; };
|
||||
FC4FA03A1A1E1BD100DA100A /* JSQCall.m in Sources */ = {isa = PBXBuildFile; fileRef = FC4FA0391A1E1BD100DA100A /* JSQCall.m */; };
|
||||
FC4FA03D1A1E81AF00DA100A /* JSQCallCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = FC4FA03C1A1E81AF00DA100A /* JSQCallCollectionViewCell.m */; };
|
||||
FCA52AEF1A2B6ECE00CCADFA /* call_missed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FCA52AEE1A2B6ECE00CCADFA /* call_missed@2x.png */; };
|
||||
FCA52AF51A2B6FAE00CCADFA /* call_canceled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FCA52AF11A2B6FAE00CCADFA /* call_canceled@2x.png */; };
|
||||
FCA52AF61A2B6FAE00CCADFA /* call_failed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FCA52AF21A2B6FAE00CCADFA /* call_failed@2x.png */; };
|
||||
FCA52AF71A2B6FAE00CCADFA /* call_incoming@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FCA52AF31A2B6FAE00CCADFA /* call_incoming@2x.png */; };
|
||||
FCA52AF81A2B6FAE00CCADFA /* call_outgoing@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FCA52AF41A2B6FAE00CCADFA /* call_outgoing@2x.png */; };
|
||||
FCA52B021A2B9F0E00CCADFA /* warning_white@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FCA52B001A2B9F0E00CCADFA /* warning_white@2x.png */; };
|
||||
FCA52B031A2B9F0E00CCADFA /* error_white@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FCA52B011A2B9F0E00CCADFA /* error_white@2x.png */; };
|
||||
FCFA5E131A29FC1000C8E32E /* JSQDisplayedMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = FCFA5E121A29FC1000C8E32E /* JSQDisplayedMessage.m */; };
|
||||
FCFA5E161A29FE3B00C8E32E /* JSQInfoMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = FCFA5E151A29FE3B00C8E32E /* JSQInfoMessage.m */; };
|
||||
FCFA5E191A2A044500C8E32E /* JSQErrorMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = FCFA5E181A2A044500C8E32E /* JSQErrorMessage.m */; };
|
||||
FCFA5E1D1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = FCFA5E1B1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.m */; };
|
||||
FCFA5E1E1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = FCFA5E1C1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.xib */; };
|
||||
BF6DA766BD3B8893A67FB2BD /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C3F882AA48978C11F64DC2DF /* libPods.a */; };
|
||||
C8994EF7DDBE74B9E3F1A16C /* libPods-JSQMessagesTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E23238C8D8DF79244DEE1787 /* libPods-JSQMessagesTests.a */; };
|
||||
E8877F1947CE8050ECCD9539 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C3F882AA48978C11F64DC2DF /* libPods.a */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
@ -133,45 +82,22 @@
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
0844AD596023C7658D39E241 /* Pods-JSQMessagesTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JSQMessagesTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-JSQMessagesTests/Pods-JSQMessagesTests.release.xcconfig"; sourceTree = "<group>"; };
|
||||
223FBACE0F24ADEF8B7F3F24 /* Pods-JSQMessagesTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JSQMessagesTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-JSQMessagesTests/Pods-JSQMessagesTests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
27B7FD1B722B36B26CB3460B /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = "<group>"; };
|
||||
782026E9E518622532ED474D /* libPods-JSQMessagesTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JSQMessagesTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
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>"; };
|
||||
0B4D05069814EB50FB0F4229 /* Pods-JSQMessagesTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JSQMessagesTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-JSQMessagesTests/Pods-JSQMessagesTests.release.xcconfig"; sourceTree = "<group>"; };
|
||||
1D4D3B82D90888BCEAF890D3 /* Pods-JSQMessagesTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JSQMessagesTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-JSQMessagesTests/Pods-JSQMessagesTests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
3BA6237809BE0D008CFE3697 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
54271E3A1C90469100294290 /* jsq_messages_sample.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = jsq_messages_sample.m4a; sourceTree = "<group>"; };
|
||||
54271E3F1C905D1600294290 /* JSQAudioMediaItemTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQAudioMediaItemTests.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>"; };
|
||||
8841B88619F4988800EA16B6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/JSQMessages.strings; sourceTree = "<group>"; };
|
||||
8841B88819F4988900EA16B6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/JSQMessages.strings; sourceTree = "<group>"; };
|
||||
8841B88919F4988A00EA16B6 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/JSQMessages.strings; sourceTree = "<group>"; };
|
||||
8841B88A19F4988B00EA16B6 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/JSQMessages.strings; sourceTree = "<group>"; };
|
||||
8841B88B19F4988C00EA16B6 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/JSQMessages.strings"; sourceTree = "<group>"; };
|
||||
8841B88C19F4988F00EA16B6 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/JSQMessages.strings"; sourceTree = "<group>"; };
|
||||
8841B88D19F4989000EA16B6 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/JSQMessages.strings; sourceTree = "<group>"; };
|
||||
8841B88E19F4989100EA16B6 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/JSQMessages.strings; sourceTree = "<group>"; };
|
||||
8841B88F19F4989200EA16B6 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/JSQMessages.strings; sourceTree = "<group>"; };
|
||||
8841B89019F4989200EA16B6 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/JSQMessages.strings; sourceTree = "<group>"; };
|
||||
8841B89119F4989300EA16B6 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/JSQMessages.strings; sourceTree = "<group>"; };
|
||||
8841B89219F4989400EA16B6 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/JSQMessages.strings; sourceTree = "<group>"; };
|
||||
8841B89319F4989500EA16B6 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/JSQMessages.strings; sourceTree = "<group>"; };
|
||||
8841B89419F4989500EA16B6 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/JSQMessages.strings; sourceTree = "<group>"; };
|
||||
8841B89519F4989600EA16B6 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/JSQMessages.strings; 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>"; };
|
||||
886FFD2C19E9A65D00EB8485 /* UIDevice+JSQMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIDevice+JSQMessages.h"; sourceTree = "<group>"; };
|
||||
886FFD2D19E9A65D00EB8485 /* UIDevice+JSQMessages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIDevice+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>"; };
|
||||
@ -184,73 +110,13 @@
|
||||
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>"; };
|
||||
88A25F5519D8E01A00924534 /* JSQSystemSoundPlayer+JSQMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "JSQSystemSoundPlayer+JSQMessages.h"; sourceTree = "<group>"; };
|
||||
88A25F5619D8E01A00924534 /* JSQSystemSoundPlayer+JSQMessages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "JSQSystemSoundPlayer+JSQMessages.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>"; };
|
||||
88A25F6019D8E01A00924534 /* JSQMessagesKeyboardController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesKeyboardController.h; sourceTree = "<group>"; };
|
||||
88A25F6119D8E01A00924534 /* JSQMessagesKeyboardController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesKeyboardController.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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
@ -282,38 +148,12 @@
|
||||
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>"; };
|
||||
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>"; };
|
||||
97E6750B77E8A7042BA0754B /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
FC15B7A81A1E880900F59801 /* JSQCallCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQCallCollectionViewCell.xib; sourceTree = "<group>"; };
|
||||
FC15B7AE1A1F6AC800F59801 /* JSQMessagesCollectionViewCellIncoming.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQMessagesCollectionViewCellIncoming.xib; sourceTree = "<group>"; };
|
||||
FC15B7AF1A1F6AC800F59801 /* JSQMessagesCollectionViewCellOutgoing.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQMessagesCollectionViewCellOutgoing.xib; sourceTree = "<group>"; };
|
||||
FC4FA0381A1E1BD100DA100A /* JSQCall.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQCall.h; sourceTree = "<group>"; };
|
||||
FC4FA0391A1E1BD100DA100A /* JSQCall.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQCall.m; sourceTree = "<group>"; };
|
||||
FC4FA03B1A1E81AF00DA100A /* JSQCallCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQCallCollectionViewCell.h; sourceTree = "<group>"; };
|
||||
FC4FA03C1A1E81AF00DA100A /* JSQCallCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQCallCollectionViewCell.m; sourceTree = "<group>"; };
|
||||
FC5C727E4CCDA2B95A7BA30C /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
FCA52AEE1A2B6ECE00CCADFA /* call_missed@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "call_missed@2x.png"; path = "../../JSQMessagesDemo/call_missed@2x.png"; sourceTree = "<group>"; };
|
||||
FCA52AF11A2B6FAE00CCADFA /* call_canceled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_canceled@2x.png"; sourceTree = "<group>"; };
|
||||
FCA52AF21A2B6FAE00CCADFA /* call_failed@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_failed@2x.png"; sourceTree = "<group>"; };
|
||||
FCA52AF31A2B6FAE00CCADFA /* call_incoming@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_incoming@2x.png"; sourceTree = "<group>"; };
|
||||
FCA52AF41A2B6FAE00CCADFA /* call_outgoing@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_outgoing@2x.png"; sourceTree = "<group>"; };
|
||||
FCA52B001A2B9F0E00CCADFA /* warning_white@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "warning_white@2x.png"; sourceTree = "<group>"; };
|
||||
FCA52B011A2B9F0E00CCADFA /* error_white@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "error_white@2x.png"; sourceTree = "<group>"; };
|
||||
FCFA5E111A29FC1000C8E32E /* JSQDisplayedMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQDisplayedMessage.h; sourceTree = "<group>"; };
|
||||
FCFA5E121A29FC1000C8E32E /* JSQDisplayedMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQDisplayedMessage.m; sourceTree = "<group>"; };
|
||||
FCFA5E141A29FE3B00C8E32E /* JSQInfoMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQInfoMessage.h; sourceTree = "<group>"; };
|
||||
FCFA5E151A29FE3B00C8E32E /* JSQInfoMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQInfoMessage.m; sourceTree = "<group>"; };
|
||||
FCFA5E171A2A044500C8E32E /* JSQErrorMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQErrorMessage.h; sourceTree = "<group>"; };
|
||||
FCFA5E181A2A044500C8E32E /* JSQErrorMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQErrorMessage.m; sourceTree = "<group>"; };
|
||||
FCFA5E1A1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQDisplayedMessageCollectionViewCell.h; sourceTree = "<group>"; };
|
||||
FCFA5E1B1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQDisplayedMessageCollectionViewCell.m; sourceTree = "<group>"; };
|
||||
FCFA5E1C1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQDisplayedMessageCollectionViewCell.xib; sourceTree = "<group>"; };
|
||||
AD6E75315517DE46FE495B65 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = "<group>"; };
|
||||
C3F882AA48978C11F64DC2DF /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
E23238C8D8DF79244DEE1787 /* libPods-JSQMessagesTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JSQMessagesTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@ -327,7 +167,7 @@
|
||||
88445B3519E0AE4A0014F889 /* CoreGraphics.framework in Frameworks */,
|
||||
88445B3319E0AE450014F889 /* Foundation.framework in Frameworks */,
|
||||
88445B3119E0AE3F0014F889 /* UIKit.framework in Frameworks */,
|
||||
77CC17A895E6E12BC9CB549A /* libPods.a in Frameworks */,
|
||||
E8877F1947CE8050ECCD9539 /* libPods.a in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -342,48 +182,39 @@
|
||||
88445B3B19E0C0B10014F889 /* XCTest.framework in Frameworks */,
|
||||
88445B3919E0C0AC0014F889 /* Foundation.framework in Frameworks */,
|
||||
88445B3819E0C0A70014F889 /* UIKit.framework in Frameworks */,
|
||||
94A4FA20C2FBD0D62614D5A8 /* libPods.a in Frameworks */,
|
||||
36CF33BD29CF36EB06D0CCFD /* libPods-JSQMessagesTests.a in Frameworks */,
|
||||
C8994EF7DDBE74B9E3F1A16C /* libPods-JSQMessagesTests.a in Frameworks */,
|
||||
BF6DA766BD3B8893A67FB2BD /* libPods.a in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
2BBEF3CD91C31A49E5FF9E3C /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FC5C727E4CCDA2B95A7BA30C /* Pods.debug.xcconfig */,
|
||||
27B7FD1B722B36B26CB3460B /* Pods.release.xcconfig */,
|
||||
223FBACE0F24ADEF8B7F3F24 /* Pods-JSQMessagesTests.debug.xcconfig */,
|
||||
0844AD596023C7658D39E241 /* Pods-JSQMessagesTests.release.xcconfig */,
|
||||
);
|
||||
name = Pods;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
636A8663AEEE5C37B65C515D /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
88445B4319E1B5110014F889 /* MapKit.framework */,
|
||||
88445B4119E1B50B0014F889 /* CoreLocation.framework */,
|
||||
88445B3419E0AE4A0014F889 /* CoreGraphics.framework */,
|
||||
88445B4119E1B50B0014F889 /* CoreLocation.framework */,
|
||||
88445B3219E0AE450014F889 /* Foundation.framework */,
|
||||
782026E9E518622532ED474D /* libPods-JSQMessagesTests.a */,
|
||||
97E6750B77E8A7042BA0754B /* libPods.a */,
|
||||
88445B4319E1B5110014F889 /* MapKit.framework */,
|
||||
88445B3619E0AE5C0014F889 /* QuartzCore.framework */,
|
||||
88445B3019E0AE3F0014F889 /* UIKit.framework */,
|
||||
88445B3A19E0C0B10014F889 /* XCTest.framework */,
|
||||
C3F882AA48978C11F64DC2DF /* libPods.a */,
|
||||
E23238C8D8DF79244DEE1787 /* libPods-JSQMessagesTests.a */,
|
||||
);
|
||||
name = Frameworks;
|
||||
path = ../..;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
8841B88219F4983C00EA16B6 /* Strings */ = {
|
||||
842892590A65F355D8619D29 /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8841B88719F4988800EA16B6 /* JSQMessages.strings */,
|
||||
3BA6237809BE0D008CFE3697 /* Pods.debug.xcconfig */,
|
||||
AD6E75315517DE46FE495B65 /* Pods.release.xcconfig */,
|
||||
1D4D3B82D90888BCEAF890D3 /* Pods-JSQMessagesTests.debug.xcconfig */,
|
||||
0B4D05069814EB50FB0F4229 /* Pods-JSQMessagesTests.release.xcconfig */,
|
||||
);
|
||||
path = Strings;
|
||||
name = Pods;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
88A25EF919D8DEC400924534 = {
|
||||
@ -391,10 +222,11 @@
|
||||
children = (
|
||||
886C33FE19F45E30006B4997 /* JSQMessagesViewController.podspec */,
|
||||
88A25F3E19D8E01A00924534 /* JSQMessagesViewController */,
|
||||
636A8663AEEE5C37B65C515D /* Frameworks */,
|
||||
88A25F2B19D8DF2500924534 /* JSQMessagesDemo */,
|
||||
88A25F1E19D8DEC500924534 /* JSQMessagesTests */,
|
||||
2BBEF3CD91C31A49E5FF9E3C /* Pods */,
|
||||
88A25F0319D8DEC400924534 /* Products */,
|
||||
842892590A65F355D8619D29 /* Pods */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@ -432,6 +264,7 @@
|
||||
88A25F2B19D8DF2500924534 /* JSQMessagesDemo */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
54271E3A1C90469100294290 /* jsq_messages_sample.m4a */,
|
||||
88A25F2C19D8DF2500924534 /* AppDelegate.h */,
|
||||
88A25F2D19D8DF2500924534 /* AppDelegate.m */,
|
||||
88A25FD919D8E0C400924534 /* DemoMessagesViewController.h */,
|
||||
@ -457,12 +290,8 @@
|
||||
children = (
|
||||
88A25F3F19D8E01A00924534 /* Assets */,
|
||||
88A25F5419D8E01A00924534 /* Categories */,
|
||||
88A25F5F19D8E01A00924534 /* Controllers */,
|
||||
88A25F6519D8E01A00924534 /* Factories */,
|
||||
88A25F6E19D8E01A00924534 /* JSQMessages.h */,
|
||||
88A25F6F19D8E01A00924534 /* Layout */,
|
||||
88A25F7619D8E01A00924534 /* Model */,
|
||||
88A25F8919D8E01A00924534 /* Views */,
|
||||
);
|
||||
path = JSQMessagesViewController;
|
||||
sourceTree = "<group>";
|
||||
@ -470,9 +299,6 @@
|
||||
88A25F3F19D8E01A00924534 /* Assets */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FCA52AFB1A2B9BAD00CCADFA /* InfoError */,
|
||||
FCA52AF01A2B6F8A00CCADFA /* Calls */,
|
||||
8841B88219F4983C00EA16B6 /* Strings */,
|
||||
8861666C19F492B70025B958 /* JSQMessagesAssets.bundle */,
|
||||
);
|
||||
path = Assets;
|
||||
@ -481,145 +307,35 @@
|
||||
88A25F5419D8E01A00924534 /* Categories */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
88A25F5519D8E01A00924534 /* JSQSystemSoundPlayer+JSQMessages.h */,
|
||||
88A25F5619D8E01A00924534 /* JSQSystemSoundPlayer+JSQMessages.m */,
|
||||
88A25F5719D8E01A00924534 /* NSString+JSQMessages.h */,
|
||||
88A25F5819D8E01A00924534 /* NSString+JSQMessages.m */,
|
||||
88A25F5919D8E01A00924534 /* UIColor+JSQMessages.h */,
|
||||
88A25F5A19D8E01A00924534 /* UIColor+JSQMessages.m */,
|
||||
886FFD2C19E9A65D00EB8485 /* UIDevice+JSQMessages.h */,
|
||||
886FFD2D19E9A65D00EB8485 /* UIDevice+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 = (
|
||||
88A25F6019D8E01A00924534 /* JSQMessagesKeyboardController.h */,
|
||||
88A25F6119D8E01A00924534 /* JSQMessagesKeyboardController.m */,
|
||||
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 */,
|
||||
);
|
||||
path = Factories;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
88A25F6F19D8E01A00924534 /* Layout */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
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 = (
|
||||
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 */,
|
||||
FC4FA0381A1E1BD100DA100A /* JSQCall.h */,
|
||||
FC4FA0391A1E1BD100DA100A /* JSQCall.m */,
|
||||
FCFA5E111A29FC1000C8E32E /* JSQDisplayedMessage.h */,
|
||||
FCFA5E121A29FC1000C8E32E /* JSQDisplayedMessage.m */,
|
||||
FCFA5E141A29FE3B00C8E32E /* JSQInfoMessage.h */,
|
||||
FCFA5E151A29FE3B00C8E32E /* JSQInfoMessage.m */,
|
||||
FCFA5E171A2A044500C8E32E /* JSQErrorMessage.h */,
|
||||
FCFA5E181A2A044500C8E32E /* JSQErrorMessage.m */,
|
||||
);
|
||||
path = Model;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
88A25F8919D8E01A00924534 /* Views */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
636A8663AEEE5C37B65C515D /* Frameworks */,
|
||||
883C11761A09FB100092A16D /* JSQMessagesCellTextView.h */,
|
||||
883C11771A09FB100092A16D /* JSQMessagesCellTextView.m */,
|
||||
88A25F8A19D8E01A00924534 /* JSQMessagesCollectionView.h */,
|
||||
88A25F8B19D8E01A00924534 /* JSQMessagesCollectionView.m */,
|
||||
88A25F8C19D8E01A00924534 /* JSQMessagesCollectionViewCell.h */,
|
||||
88A25F8D19D8E01A00924534 /* JSQMessagesCollectionViewCell.m */,
|
||||
88A25F8E19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.h */,
|
||||
88A25F8F19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.m */,
|
||||
FC15B7AE1A1F6AC800F59801 /* JSQMessagesCollectionViewCellIncoming.xib */,
|
||||
88A25F9119D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.h */,
|
||||
88A25F9219D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.m */,
|
||||
FC15B7AF1A1F6AC800F59801 /* 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 */,
|
||||
FC4FA03B1A1E81AF00DA100A /* JSQCallCollectionViewCell.h */,
|
||||
FC4FA03C1A1E81AF00DA100A /* JSQCallCollectionViewCell.m */,
|
||||
FC15B7A81A1E880900F59801 /* JSQCallCollectionViewCell.xib */,
|
||||
FCFA5E1A1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.h */,
|
||||
FCFA5E1B1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.m */,
|
||||
FCFA5E1C1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.xib */,
|
||||
);
|
||||
path = Views;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
88A25FE219D8E18400924534 /* CategoryTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8873B60D1AB7B63E006DF9AC /* JSQMessagesNSBundleTests.m */,
|
||||
88A25FE319D8E18400924534 /* JSQMessagesNSStringTests.m */,
|
||||
88A25FE419D8E18400924534 /* JSQMessagesUIColorTests.m */,
|
||||
88A25FE519D8E18400924534 /* JSQMessagesUIImageTests.m */,
|
||||
@ -661,6 +377,7 @@
|
||||
88A25FF219D8E18400924534 /* ModelTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
54271E3F1C905D1600294290 /* JSQAudioMediaItemTests.m */,
|
||||
88C00A4D1A44D4C600B004B3 /* JSQLocationMediaItemTests.m */,
|
||||
88A25FF319D8E18400924534 /* JSQMessageMediaTests.m */,
|
||||
88A25FF419D8E18400924534 /* JSQMessagesAvatarImageTests.m */,
|
||||
@ -687,27 +404,6 @@
|
||||
path = ViewTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FCA52AF01A2B6F8A00CCADFA /* Calls */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FCA52AF11A2B6FAE00CCADFA /* call_canceled@2x.png */,
|
||||
FCA52AF21A2B6FAE00CCADFA /* call_failed@2x.png */,
|
||||
FCA52AF31A2B6FAE00CCADFA /* call_incoming@2x.png */,
|
||||
FCA52AF41A2B6FAE00CCADFA /* call_outgoing@2x.png */,
|
||||
FCA52AEE1A2B6ECE00CCADFA /* call_missed@2x.png */,
|
||||
);
|
||||
name = Calls;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FCA52AFB1A2B9BAD00CCADFA /* InfoError */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FCA52B001A2B9F0E00CCADFA /* warning_white@2x.png */,
|
||||
FCA52B011A2B9F0E00CCADFA /* error_white@2x.png */,
|
||||
);
|
||||
name = InfoError;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
@ -715,11 +411,12 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 88A25F2519D8DEC500924534 /* Build configuration list for PBXNativeTarget "JSQMessages" */;
|
||||
buildPhases = (
|
||||
3AF3068570D5C74873D84E30 /* Check Pods Manifest.lock */,
|
||||
90945CFDCD14BCFE538D66C9 /* Check Pods Manifest.lock */,
|
||||
88A25EFE19D8DEC400924534 /* Sources */,
|
||||
88A25EFF19D8DEC400924534 /* Frameworks */,
|
||||
88A25F0019D8DEC400924534 /* Resources */,
|
||||
4CCCD7A86E86CB86C48E303C /* Copy Pods Resources */,
|
||||
C8D68BB894C4DD38C5615198 /* Embed Pods Frameworks */,
|
||||
908FA537E0B2FD4A94A60411 /* Copy Pods Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@ -734,11 +431,12 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 88A25F2819D8DEC500924534 /* Build configuration list for PBXNativeTarget "JSQMessagesTests" */;
|
||||
buildPhases = (
|
||||
F4044DAC71D69462CA8CAE98 /* Check Pods Manifest.lock */,
|
||||
95BD949B70ECF8FE9CDDB707 /* Check Pods Manifest.lock */,
|
||||
88A25F1719D8DEC400924534 /* Sources */,
|
||||
88A25F1819D8DEC400924534 /* Frameworks */,
|
||||
88A25F1919D8DEC400924534 /* Resources */,
|
||||
F6B484334A138916FC111868 /* Copy Pods Resources */,
|
||||
78F522A7ECBD8D8774672696 /* Embed Pods Frameworks */,
|
||||
B85CD3AA4EFCF4765BE7FAD9 /* Copy Pods Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@ -756,7 +454,7 @@
|
||||
88A25EFA19D8DEC400924534 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 0600;
|
||||
LastUpgradeCheck = 0700;
|
||||
ORGANIZATIONNAME = "Hexed Bits";
|
||||
TargetAttributes = {
|
||||
88A25F0119D8DEC400924534 = {
|
||||
@ -805,26 +503,11 @@
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
88E4D7131A0DBD6B000CC061 /* JSQMessages.strings in Resources */,
|
||||
886C33FF19F45E30006B4997 /* JSQMessagesViewController.podspec in Resources */,
|
||||
8861666D19F492B70025B958 /* JSQMessagesAssets.bundle in Resources */,
|
||||
FC15B7B11A1F6AC800F59801 /* JSQMessagesCollectionViewCellOutgoing.xib in Resources */,
|
||||
88A25FD619D8E01A00924534 /* JSQMessagesToolbarContentView.xib in Resources */,
|
||||
FCA52AF71A2B6FAE00CCADFA /* call_incoming@2x.png in Resources */,
|
||||
88A25F3A19D8DF2500924534 /* Images.xcassets in Resources */,
|
||||
88A25FBC19D8E01A00924534 /* JSQMessagesViewController.xib in Resources */,
|
||||
FCA52AF81A2B6FAE00CCADFA /* call_outgoing@2x.png in Resources */,
|
||||
FCA52B021A2B9F0E00CCADFA /* warning_white@2x.png in Resources */,
|
||||
FCA52AF51A2B6FAE00CCADFA /* call_canceled@2x.png in Resources */,
|
||||
FCA52B031A2B9F0E00CCADFA /* error_white@2x.png in Resources */,
|
||||
FCA52AEF1A2B6ECE00CCADFA /* call_missed@2x.png in Resources */,
|
||||
88A25FD819D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.xib in Resources */,
|
||||
FCFA5E1E1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.xib in Resources */,
|
||||
54271E3B1C90469100294290 /* jsq_messages_sample.m4a in Resources */,
|
||||
88A25F3919D8DF2500924534 /* Main.storyboard in Resources */,
|
||||
FC15B7B01A1F6AC800F59801 /* JSQMessagesCollectionViewCellIncoming.xib in Resources */,
|
||||
88A25FD419D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.xib in Resources */,
|
||||
FC15B7A91A1E880900F59801 /* JSQCallCollectionViewCell.xib in Resources */,
|
||||
FCA52AF61A2B6FAE00CCADFA /* call_failed@2x.png in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -839,22 +522,22 @@
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
3AF3068570D5C74873D84E30 /* Check Pods Manifest.lock */ = {
|
||||
78F522A7ECBD8D8774672696 /* Embed Pods Frameworks */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Check Pods Manifest.lock";
|
||||
name = "Embed Pods Frameworks";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n";
|
||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
4CCCD7A86E86CB86C48E303C /* Copy Pods Resources */ = {
|
||||
908FA537E0B2FD4A94A60411 /* Copy Pods Resources */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@ -869,7 +552,7 @@
|
||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
F4044DAC71D69462CA8CAE98 /* Check Pods Manifest.lock */ = {
|
||||
90945CFDCD14BCFE538D66C9 /* Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@ -884,7 +567,22 @@
|
||||
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
F6B484334A138916FC111868 /* Copy Pods Resources */ = {
|
||||
95BD949B70ECF8FE9CDDB707 /* Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Check Pods Manifest.lock";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
B85CD3AA4EFCF4765BE7FAD9 /* Copy Pods Resources */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@ -899,6 +597,21 @@
|
||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-JSQMessagesTests/Pods-JSQMessagesTests-resources.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
C8D68BB894C4DD38C5615198 /* Embed Pods Frameworks */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Embed Pods Frameworks";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
@ -906,54 +619,16 @@
|
||||
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 */,
|
||||
883C11781A09FB100092A16D /* JSQMessagesCellTextView.m in Sources */,
|
||||
88A25FB919D8E01A00924534 /* UIView+JSQMessages.m in Sources */,
|
||||
FCFA5E131A29FC1000C8E32E /* JSQDisplayedMessage.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 */,
|
||||
FC4FA03A1A1E1BD100DA100A /* JSQCall.m in Sources */,
|
||||
88A25FC719D8E01A00924534 /* JSQMessagesBubbleImage.m in Sources */,
|
||||
88A25FC519D8E01A00924534 /* JSQMessage.m in Sources */,
|
||||
88A25FD719D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.m in Sources */,
|
||||
88A25FD319D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.m in Sources */,
|
||||
FC4FA03D1A1E81AF00DA100A /* JSQCallCollectionViewCell.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 */,
|
||||
FCFA5E1D1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.m in Sources */,
|
||||
88A25F3C19D8DF2500924534 /* main.m in Sources */,
|
||||
88A25F3719D8DF2500924534 /* AppDelegate.m in Sources */,
|
||||
886FFD2E19E9A65D00EB8485 /* UIDevice+JSQMessages.m in Sources */,
|
||||
88A25FB619D8E01A00924534 /* NSString+JSQMessages.m in Sources */,
|
||||
FCFA5E191A2A044500C8E32E /* JSQErrorMessage.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 */,
|
||||
88A25FBA19D8E01A00924534 /* JSQMessagesKeyboardController.m in Sources */,
|
||||
FCFA5E161A29FE3B00C8E32E /* JSQInfoMessage.m in Sources */,
|
||||
88A25FC019D8E01A00924534 /* JSQMessagesToolbarButtonFactory.m in Sources */,
|
||||
88A25FC219D8E01A00924534 /* JSQMessagesCollectionViewFlowLayoutInvalidationContext.m in Sources */,
|
||||
88A25FE119D8E0C400924534 /* TableViewController.m in Sources */,
|
||||
88A25FBD19D8E01A00924534 /* JSQMessagesAvatarImageFactory.m in Sources */,
|
||||
88A25FB519D8E01A00924534 /* JSQSystemSoundPlayer+JSQMessages.m in Sources */,
|
||||
88A25FD019D8E01A00924534 /* JSQMessagesComposerTextView.m in Sources */,
|
||||
88A25FC319D8E01A00924534 /* JSQMessagesCollectionViewLayoutAttributes.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -966,6 +641,7 @@
|
||||
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 */,
|
||||
@ -985,6 +661,7 @@
|
||||
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 */,
|
||||
88A2600519D8E18400924534 /* JSQMessagesKeyboardControllerTests.m in Sources */,
|
||||
@ -1003,28 +680,6 @@
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
8841B88719F4988800EA16B6 /* JSQMessages.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
8841B88619F4988800EA16B6 /* Base */,
|
||||
8841B88819F4988900EA16B6 /* en */,
|
||||
8841B88919F4988A00EA16B6 /* es */,
|
||||
8841B88A19F4988B00EA16B6 /* de */,
|
||||
8841B88B19F4988C00EA16B6 /* zh-Hans */,
|
||||
8841B88C19F4988F00EA16B6 /* zh-Hant */,
|
||||
8841B88D19F4989000EA16B6 /* ro */,
|
||||
8841B88E19F4989100EA16B6 /* pl */,
|
||||
8841B88F19F4989200EA16B6 /* ru */,
|
||||
8841B89019F4989200EA16B6 /* pt */,
|
||||
8841B89119F4989300EA16B6 /* fr */,
|
||||
8841B89219F4989400EA16B6 /* it */,
|
||||
8841B89319F4989500EA16B6 /* he */,
|
||||
8841B89419F4989500EA16B6 /* nl */,
|
||||
8841B89519F4989600EA16B6 /* tr */,
|
||||
);
|
||||
name = JSQMessages.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
88A25F3019D8DF2500924534 /* Main.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
@ -1056,6 +711,7 @@
|
||||
"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_OPTIMIZATION_LEVEL = 0;
|
||||
@ -1116,7 +772,7 @@
|
||||
};
|
||||
88A25F2619D8DEC500924534 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = FC5C727E4CCDA2B95A7BA30C /* Pods.debug.xcconfig */;
|
||||
baseConfigurationReference = 3BA6237809BE0D008CFE3697 /* Pods.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
||||
@ -1127,6 +783,7 @@
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 7.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 = "";
|
||||
};
|
||||
@ -1134,7 +791,7 @@
|
||||
};
|
||||
88A25F2719D8DEC500924534 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 27B7FD1B722B36B26CB3460B /* Pods.release.xcconfig */;
|
||||
baseConfigurationReference = AD6E75315517DE46FE495B65 /* Pods.release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
||||
@ -1145,6 +802,7 @@
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 7.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 = "";
|
||||
};
|
||||
@ -1152,20 +810,18 @@
|
||||
};
|
||||
88A25F2919D8DEC500924534 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 223FBACE0F24ADEF8B7F3F24 /* Pods-JSQMessagesTests.debug.xcconfig */;
|
||||
baseConfigurationReference = 1D4D3B82D90888BCEAF890D3 /* Pods-JSQMessagesTests.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(SDKROOT)/Developer/Library/Frameworks",
|
||||
"$(inherited)",
|
||||
);
|
||||
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";
|
||||
};
|
||||
@ -1173,16 +829,14 @@
|
||||
};
|
||||
88A25F2A19D8DEC500924534 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 0844AD596023C7658D39E241 /* Pods-JSQMessagesTests.release.xcconfig */;
|
||||
baseConfigurationReference = 0B4D05069814EB50FB0F4229 /* Pods-JSQMessagesTests.release.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(SDKROOT)/Developer/Library/Frameworks",
|
||||
"$(inherited)",
|
||||
);
|
||||
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";
|
||||
};
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0600"
|
||||
LastUpgradeVersion = "0730"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
@ -14,7 +14,7 @@
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "4F6B28C25B7B1259BD8C5B8B"
|
||||
BlueprintIdentifier = "D14DE867BBE115B80620BD22C0E35F79"
|
||||
BuildableName = "libPods.a"
|
||||
BlueprintName = "Pods"
|
||||
ReferencedContainer = "container:Pods/Pods.xcodeproj">
|
||||
@ -51,10 +51,10 @@
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
buildConfiguration = "Debug">
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
@ -76,17 +76,21 @@
|
||||
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"
|
||||
buildConfiguration = "Debug"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable>
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "88A25F0119D8DEC400924534"
|
||||
@ -99,12 +103,13 @@
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
buildConfiguration = "Release"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable>
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "88A25F0119D8DEC400924534"
|
||||
|
||||
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IDEDidComputeMac32BitWarning</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -1,26 +0,0 @@
|
||||
//
|
||||
// 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
|
||||
@ -1,35 +0,0 @@
|
||||
//
|
||||
// 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
|
||||
@ -1,360 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6245" systemVersion="13F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="JRd-Be-psV">
|
||||
<dependencies>
|
||||
<deployment defaultVersion="1792" identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/>
|
||||
</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" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
|
||||
<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="119" 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" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<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" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
|
||||
<sections>
|
||||
<tableViewSection headerTitle="Messages" id="ygb-Dp-o4r">
|
||||
<cells>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="Eii-ro-1yZ">
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Eii-ro-1yZ" id="qU9-o3-MWC">
|
||||
<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" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<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 firstAttribute="bottom" secondItem="K7N-os-fuc" secondAttribute="bottom" constant="6" id="IBG-gn-Fpk"/>
|
||||
<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 firstItem="K7N-os-fuc" firstAttribute="top" secondItem="qU9-o3-MWC" secondAttribute="top" constant="6" id="UbM-aE-caS"/>
|
||||
<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">
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="bZI-G1-eYA" id="1Ho-Zz-KN0">
|
||||
<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" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<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="bottom" secondItem="hMq-Ee-EJK" secondAttribute="bottom" constant="6" id="aef-Rh-49d"/>
|
||||
<constraint firstItem="hMq-Ee-EJK" firstAttribute="top" secondItem="1Ho-Zz-KN0" secondAttribute="top" constant="6" id="csX-us-yCd"/>
|
||||
<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">
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="2Th-gL-oAN" id="OFq-Mz-mbl">
|
||||
<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" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<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 firstAttribute="bottom" secondItem="baL-Tb-bTJ" secondAttribute="bottom" constant="6" id="Ff7-1T-EbZ"/>
|
||||
<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 firstItem="baL-Tb-bTJ" firstAttribute="top" secondItem="OFq-Mz-mbl" secondAttribute="top" constant="6" id="v5e-xk-srk"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
</tableViewCell>
|
||||
</cells>
|
||||
</tableViewSection>
|
||||
<tableViewSection headerTitle="Avatars" id="ns0-OO-PGu">
|
||||
<cells>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="hYS-4f-iL6">
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="hYS-4f-iL6" id="dk1-tc-gux">
|
||||
<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" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<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="fLZ-NC-aPO" firstAttribute="top" secondItem="dk1-tc-gux" secondAttribute="top" constant="6" id="S6i-he-vB9"/>
|
||||
<constraint firstItem="RUq-Pa-3nx" firstAttribute="leading" secondItem="dk1-tc-gux" secondAttribute="leading" constant="8" id="mhd-oX-p53"/>
|
||||
<constraint firstAttribute="bottom" secondItem="fLZ-NC-aPO" secondAttribute="bottom" constant="6" id="yyq-Sg-nJi"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
</tableViewCell>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="VF7-uo-6Pc">
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="VF7-uo-6Pc" id="zad-JQ-TRI">
|
||||
<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" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="LuM-mk-Zj6" secondAttribute="bottom" constant="6" id="1G7-8S-rYC"/>
|
||||
<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="LuM-mk-Zj6" firstAttribute="top" secondItem="zad-JQ-TRI" secondAttribute="top" constant="6" id="Y6a-JS-aLj"/>
|
||||
<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">
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="q07-lZ-YdI" id="btE-Mk-fSE">
|
||||
<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" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<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 firstItem="uXC-2j-cgi" firstAttribute="top" secondItem="btE-Mk-fSE" secondAttribute="top" constant="6" id="Ajq-5g-XKo"/>
|
||||
<constraint firstAttribute="bottom" secondItem="3d2-fZ-dx9" secondAttribute="bottom" constant="9" id="EzH-aB-ePQ"/>
|
||||
<constraint firstAttribute="bottom" secondItem="uXC-2j-cgi" secondAttribute="bottom" constant="6" id="RCb-Mi-FHX"/>
|
||||
<constraint firstItem="3d2-fZ-dx9" firstAttribute="top" secondItem="btE-Mk-fSE" secondAttribute="top" constant="10" id="btF-q4-HJg"/>
|
||||
<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="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>
|
||||
<simulatedMetricsContainer key="defaultSimulatedMetrics">
|
||||
<simulatedStatusBarMetrics key="statusBar"/>
|
||||
<simulatedOrientationMetrics key="orientation"/>
|
||||
<simulatedScreenMetrics key="destination" type="retina4"/>
|
||||
</simulatedMetricsContainer>
|
||||
</document>
|
||||
@ -1,48 +0,0 @@
|
||||
//
|
||||
// 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>
|
||||
|
||||
@property (weak, nonatomic) id<JSQDemoViewControllerDelegate> delegateModal;
|
||||
|
||||
@property (strong, nonatomic) DemoModelData *demoData;
|
||||
|
||||
- (void)receiveMessagePressed:(UIBarButtonItem *)sender;
|
||||
|
||||
- (void)closePressed:(UIBarButtonItem *)sender;
|
||||
|
||||
@end
|
||||
@ -1,584 +0,0 @@
|
||||
//
|
||||
// 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 "JSQCallCollectionViewCell.h"
|
||||
#import "JSQCall.h"
|
||||
|
||||
#import "JSQDisplayedMessageCollectionViewCell.h"
|
||||
#import "JSQErrorMessage.h"
|
||||
#import "JSQInfoMessage.h"
|
||||
|
||||
@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";
|
||||
|
||||
/**
|
||||
* You MUST set your senderId and display name
|
||||
*/
|
||||
self.senderId = kJSQDemoAvatarIdSquires;
|
||||
self.senderDisplayName = kJSQDemoAvatarDisplayNameSquires;
|
||||
|
||||
|
||||
/**
|
||||
* Load up our fake data for the demo
|
||||
*/
|
||||
self.demoData = [[DemoModelData alloc] init];
|
||||
|
||||
|
||||
/**
|
||||
* 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:UIBarButtonItemStyleBordered
|
||||
target:self
|
||||
action:@selector(receiveMessagePressed:)];
|
||||
|
||||
/**
|
||||
* Customize your toolbar buttons
|
||||
*
|
||||
* self.inputToolbar.contentView.leftBarButtonItem = custom button or nil to remove
|
||||
* self.inputToolbar.contentView.rightBarButtonItem = custom button or nil to remove
|
||||
*/
|
||||
}
|
||||
|
||||
- (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 - 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)(1.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 isKindOfClass:[JSQMessage class]]) {
|
||||
/**
|
||||
* 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 {
|
||||
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 {
|
||||
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
|
||||
{
|
||||
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"Media messages"
|
||||
delegate:self
|
||||
cancelButtonTitle:@"Cancel"
|
||||
destructiveButtonTitle:nil
|
||||
otherButtonTitles:@"Send photo", @"Send location", @"Send video", nil];
|
||||
|
||||
[sheet showFromToolbar:self.inputToolbar];
|
||||
}
|
||||
|
||||
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
|
||||
{
|
||||
if (buttonIndex == actionSheet.cancelButtonIndex) {
|
||||
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;
|
||||
}
|
||||
|
||||
[JSQSystemSoundPlayer jsq_playMessageSentSound];
|
||||
|
||||
[self finishSendingMessageAnimated:YES];
|
||||
}
|
||||
|
||||
|
||||
|
||||
#pragma mark - JSQMessages CollectionView DataSource
|
||||
|
||||
- (id<JSQMessageData>)collectionView:(JSQMessagesCollectionView *)collectionView messageDataForItemAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
return [self.demoData.messages objectAtIndex: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 isKindOfClass:[JSQCall class]] || ![message isKindOfClass:[JSQErrorMessage class]] || ![message isKindOfClass:[JSQInfoMessage class]]) return nil;
|
||||
|
||||
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
|
||||
*/
|
||||
|
||||
JSQMessage *msg = [self.demoData.messages objectAtIndex:indexPath.item];
|
||||
|
||||
if ([msg isKindOfClass:[JSQMessage class]])
|
||||
{
|
||||
JSQMessagesCollectionViewCell *cell = (JSQMessagesCollectionViewCell *)[super collectionView:collectionView cellForItemAtIndexPath:indexPath];
|
||||
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) };
|
||||
}
|
||||
|
||||
return cell;
|
||||
|
||||
} else if ([msg isKindOfClass:[JSQCall class]]) {
|
||||
JSQCallCollectionViewCell *cell = (JSQCallCollectionViewCell *)[super collectionView:collectionView cellForItemAtIndexPath:indexPath];
|
||||
return cell;
|
||||
} else {
|
||||
JSQDisplayedMessageCollectionViewCell * cell = (JSQDisplayedMessageCollectionViewCell *)[super collectionView:collectionView cellForItemAtIndexPath:indexPath];
|
||||
return cell;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#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));
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,61 +0,0 @@
|
||||
//
|
||||
// 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>
|
||||
#import <CoreLocation/CoreLocation.h>
|
||||
|
||||
#import "JSQMessages.h"
|
||||
|
||||
/**
|
||||
* This is for demo/testing purposes only.
|
||||
* This object sets up some fake model data.
|
||||
* Do not actually do anything like this.
|
||||
*/
|
||||
|
||||
static NSString * const kJSQDemoAvatarDisplayNameSquires = @"Jesse Squires";
|
||||
static NSString * const kJSQDemoAvatarDisplayNameCook = @"Tim Cook";
|
||||
static NSString * const kJSQDemoAvatarDisplayNameJobs = @"Jobs";
|
||||
static NSString * const kJSQDemoAvatarDisplayNameWoz = @"Steve Wozniak";
|
||||
|
||||
static NSString * const kJSQDemoAvatarIdSquires = @"053496-4509-289";
|
||||
static NSString * const kJSQDemoAvatarIdCook = @"468-768355-23123";
|
||||
static NSString * const kJSQDemoAvatarIdJobs = @"707-8956784-57";
|
||||
static NSString * const kJSQDemoAvatarIdWoz = @"309-41802-93823";
|
||||
|
||||
|
||||
|
||||
@interface DemoModelData : NSObject
|
||||
|
||||
@property (strong, nonatomic) NSMutableArray *messages;
|
||||
|
||||
@property (strong, nonatomic) NSDictionary *avatars;
|
||||
|
||||
@property (strong, nonatomic) JSQMessagesBubbleImage *outgoingBubbleImageData;
|
||||
|
||||
@property (strong, nonatomic) JSQMessagesBubbleImage *incomingBubbleImageData;
|
||||
|
||||
@property (strong, nonatomic) NSDictionary *users;
|
||||
|
||||
- (void)addPhotoMediaMessage;
|
||||
|
||||
- (void)addLocationMediaMessageCompletion:(JSQLocationMediaItemCompletionBlock)completion;
|
||||
|
||||
- (void)addVideoMediaMessage;
|
||||
|
||||
@end
|
||||
@ -1,236 +0,0 @@
|
||||
//
|
||||
// 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 "DemoModelData.h"
|
||||
|
||||
#import "NSUserDefaults+DemoSettings.h"
|
||||
|
||||
#import "JSQCall.h"
|
||||
#import "JSQInfoMessage.h"
|
||||
#import "JSQErrorMessage.h"
|
||||
|
||||
/**
|
||||
* This is for demo/testing purposes only.
|
||||
* This object sets up some fake model data.
|
||||
* Do not actually do anything like this.
|
||||
*/
|
||||
|
||||
@implementation DemoModelData
|
||||
|
||||
- (instancetype)init
|
||||
{
|
||||
self = [super init];
|
||||
if (self) {
|
||||
|
||||
if ([NSUserDefaults emptyMessagesSetting]) {
|
||||
self.messages = [NSMutableArray new];
|
||||
}
|
||||
else {
|
||||
[self loadFakeMessages];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create avatar images once.
|
||||
*
|
||||
* Be sure to create your avatars one time and reuse them for good performance.
|
||||
*
|
||||
* If you are not using avatars, ignore this.
|
||||
*/
|
||||
JSQMessagesAvatarImage *jsqImage = [JSQMessagesAvatarImageFactory avatarImageWithUserInitials:@"JSQ"
|
||||
backgroundColor:[UIColor colorWithWhite:0.85f alpha:1.0f]
|
||||
textColor:[UIColor colorWithWhite:0.60f alpha:1.0f]
|
||||
font:[UIFont systemFontOfSize:14.0f]
|
||||
diameter:kJSQMessagesCollectionViewAvatarSizeDefault];
|
||||
|
||||
JSQMessagesAvatarImage *cookImage = [JSQMessagesAvatarImageFactory avatarImageWithImage:[UIImage imageNamed:@"demo_avatar_cook"]
|
||||
diameter:kJSQMessagesCollectionViewAvatarSizeDefault];
|
||||
|
||||
JSQMessagesAvatarImage *jobsImage = [JSQMessagesAvatarImageFactory avatarImageWithImage:[UIImage imageNamed:@"demo_avatar_jobs"]
|
||||
diameter:kJSQMessagesCollectionViewAvatarSizeDefault];
|
||||
|
||||
JSQMessagesAvatarImage *wozImage = [JSQMessagesAvatarImageFactory avatarImageWithImage:[UIImage imageNamed:@"demo_avatar_woz"]
|
||||
diameter:kJSQMessagesCollectionViewAvatarSizeDefault];
|
||||
|
||||
self.avatars = @{ kJSQDemoAvatarIdSquires : jsqImage,
|
||||
kJSQDemoAvatarIdCook : cookImage,
|
||||
kJSQDemoAvatarIdJobs : jobsImage,
|
||||
kJSQDemoAvatarIdWoz : wozImage };
|
||||
|
||||
|
||||
self.users = @{ kJSQDemoAvatarIdJobs : kJSQDemoAvatarDisplayNameJobs,
|
||||
kJSQDemoAvatarIdCook : kJSQDemoAvatarDisplayNameCook,
|
||||
kJSQDemoAvatarIdWoz : kJSQDemoAvatarDisplayNameWoz,
|
||||
kJSQDemoAvatarIdSquires : kJSQDemoAvatarDisplayNameSquires };
|
||||
|
||||
|
||||
/**
|
||||
* Create message bubble images objects.
|
||||
*
|
||||
* Be sure to create your bubble images one time and reuse them for good performance.
|
||||
*
|
||||
*/
|
||||
JSQMessagesBubbleImageFactory *bubbleFactory = [[JSQMessagesBubbleImageFactory alloc] init];
|
||||
|
||||
self.outgoingBubbleImageData = [bubbleFactory outgoingMessagesBubbleImageWithColor:[UIColor jsq_messageBubbleLightGrayColor]];
|
||||
self.incomingBubbleImageData = [bubbleFactory incomingMessagesBubbleImageWithColor:[UIColor jsq_messageBubbleGreenColor]];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)loadFakeMessages
|
||||
{
|
||||
/**
|
||||
* Load some fake messages for demo.
|
||||
*
|
||||
* You should have a mutable array or orderedSet, or something.
|
||||
*/
|
||||
self.messages = [[NSMutableArray alloc] initWithObjects:
|
||||
[[JSQCall alloc] initWithCallerId:kJSQDemoAvatarIdWoz
|
||||
callerDisplayName:kJSQDemoAvatarDisplayNameWoz
|
||||
date:[NSDate date]
|
||||
status:kCallOutgoing],
|
||||
[[JSQMessage alloc] initWithSenderId:kJSQDemoAvatarIdSquires
|
||||
senderDisplayName:kJSQDemoAvatarDisplayNameSquires
|
||||
date:[NSDate distantPast]
|
||||
text:@"Welcome to JSQMessages: A messaging UI framework for iOS."],
|
||||
[[JSQMessage alloc] initWithSenderId:kJSQDemoAvatarIdSquires
|
||||
senderDisplayName:kJSQDemoAvatarDisplayNameSquires
|
||||
date:[NSDate distantPast]
|
||||
text:@"Welcome to JSQMessages: A messaging UI framework for iOS."],
|
||||
[[JSQMessage alloc] initWithSenderId:kJSQDemoAvatarIdWoz
|
||||
senderDisplayName:kJSQDemoAvatarDisplayNameWoz
|
||||
date:[NSDate distantPast]
|
||||
text:@"It is simple, elegant, and easy to use. There are super sweet default settings, but you can customize like crazy."],
|
||||
|
||||
[[JSQMessage alloc] initWithSenderId:kJSQDemoAvatarIdSquires
|
||||
senderDisplayName:kJSQDemoAvatarDisplayNameSquires
|
||||
date:[NSDate distantPast]
|
||||
text:@"It even has data detectors. You can call me tonight. My cell number is 123-456-7890. My website is www.hexedbits.com."],
|
||||
|
||||
[[JSQMessage alloc] initWithSenderId:kJSQDemoAvatarIdJobs
|
||||
senderDisplayName:kJSQDemoAvatarDisplayNameJobs
|
||||
date:[NSDate date]
|
||||
text:@"JSQMessagesViewController is nearly an exact replica of the iOS Messages App. And perhaps, better."],
|
||||
|
||||
[[JSQMessage alloc] initWithSenderId:kJSQDemoAvatarIdCook
|
||||
senderDisplayName:kJSQDemoAvatarDisplayNameCook
|
||||
date:[NSDate date]
|
||||
text:@"It is unit-tested, free, open-source, and documented."],
|
||||
|
||||
[[JSQMessage alloc] initWithSenderId:kJSQDemoAvatarIdSquires
|
||||
senderDisplayName:kJSQDemoAvatarDisplayNameSquires
|
||||
date:[NSDate date]
|
||||
text:@"Now with media messages!"],
|
||||
[[JSQCall alloc] initWithCallerId:kJSQDemoAvatarIdWoz
|
||||
callerDisplayName:kJSQDemoAvatarDisplayNameWoz
|
||||
date:[NSDate date]
|
||||
status:kCallIncoming],
|
||||
[[JSQCall alloc] initWithCallerId:kJSQDemoAvatarIdWoz
|
||||
callerDisplayName:kJSQDemoAvatarDisplayNameWoz
|
||||
date:[NSDate date]
|
||||
status:kCallMissed],
|
||||
[[JSQInfoMessage alloc] initWithInfoType:JSQInfoMessageTypeSessionDidEnd
|
||||
senderId:kJSQDemoAvatarIdCook
|
||||
senderDisplayName:kJSQDemoAvatarDisplayNameCook
|
||||
date:[NSDate date]],
|
||||
[[JSQErrorMessage alloc] initWithErrorType:JSQErrorMessageMissingKeyId
|
||||
senderId:kJSQDemoAvatarIdCook
|
||||
senderDisplayName:kJSQDemoAvatarDisplayNameCook
|
||||
date:[NSDate date]],
|
||||
[[JSQErrorMessage alloc] initWithErrorType:JSQErrorMessageInvalidMessage
|
||||
senderId:kJSQDemoAvatarIdCook
|
||||
senderDisplayName:kJSQDemoAvatarDisplayNameCook
|
||||
date:[NSDate date]],
|
||||
[[JSQErrorMessage alloc] initWithErrorType:JSQErrorMessageInvalidVersion
|
||||
senderId:kJSQDemoAvatarIdCook
|
||||
senderDisplayName:kJSQDemoAvatarDisplayNameCook
|
||||
date:[NSDate date]],
|
||||
[[JSQErrorMessage alloc] initWithErrorType:JSQErrorMessageInvalidKeyException
|
||||
senderId:kJSQDemoAvatarIdCook
|
||||
senderDisplayName:kJSQDemoAvatarDisplayNameCook
|
||||
date:[NSDate date]],
|
||||
[[JSQErrorMessage alloc] initWithErrorType:JSQErrorMessageWrongTrustedIdentityKey
|
||||
senderId:kJSQDemoAvatarIdCook
|
||||
senderDisplayName:kJSQDemoAvatarDisplayNameCook
|
||||
date:[NSDate date]],
|
||||
|
||||
nil];
|
||||
|
||||
[self addPhotoMediaMessage];
|
||||
|
||||
/**
|
||||
* Setting to load extra messages for testing/demo
|
||||
*/
|
||||
if ([NSUserDefaults extraMessagesSetting]) {
|
||||
NSArray *copyOfMessages = [self.messages copy];
|
||||
for (NSUInteger i = 0; i < 4; i++) {
|
||||
[self.messages addObjectsFromArray:copyOfMessages];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Setting to load REALLY long message for testing/demo
|
||||
* You should see "END" twice
|
||||
*/
|
||||
if ([NSUserDefaults longMessageSetting]) {
|
||||
JSQMessage *reallyLongMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdSquires
|
||||
displayName:kJSQDemoAvatarDisplayNameSquires
|
||||
text:@"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur? END Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur? END"];
|
||||
|
||||
[self.messages addObject:reallyLongMessage];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)addPhotoMediaMessage
|
||||
{
|
||||
JSQPhotoMediaItem *photoItem = [[JSQPhotoMediaItem alloc] initWithImage:[UIImage imageNamed:@"goldengate"]];
|
||||
JSQMessage *photoMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdSquires
|
||||
displayName:kJSQDemoAvatarDisplayNameSquires
|
||||
media:photoItem];
|
||||
[self.messages addObject:photoMessage];
|
||||
}
|
||||
|
||||
- (void)addLocationMediaMessageCompletion:(JSQLocationMediaItemCompletionBlock)completion
|
||||
{
|
||||
CLLocation *ferryBuildingInSF = [[CLLocation alloc] initWithLatitude:37.795313 longitude:-122.393757];
|
||||
|
||||
JSQLocationMediaItem *locationItem = [[JSQLocationMediaItem alloc] init];
|
||||
[locationItem setLocation:ferryBuildingInSF withCompletionHandler:completion];
|
||||
|
||||
JSQMessage *locationMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdSquires
|
||||
displayName:kJSQDemoAvatarDisplayNameSquires
|
||||
media:locationItem];
|
||||
[self.messages addObject:locationMessage];
|
||||
}
|
||||
|
||||
- (void)addVideoMediaMessage
|
||||
{
|
||||
// don't have a real video, just pretending
|
||||
NSURL *videoURL = [NSURL URLWithString:@"file://"];
|
||||
|
||||
JSQVideoMediaItem *videoItem = [[JSQVideoMediaItem alloc] initWithFileURL:videoURL isReadyToPlay:YES];
|
||||
JSQMessage *videoMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdSquires
|
||||
displayName:kJSQDemoAvatarDisplayNameSquires
|
||||
media:videoItem];
|
||||
[self.messages addObject:videoMessage];
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,42 +0,0 @@
|
||||
//
|
||||
// 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>
|
||||
|
||||
/**
|
||||
* This is for demo/testing purposes only.
|
||||
*
|
||||
* This is a terrible idea for a real app.
|
||||
*/
|
||||
|
||||
@interface DemoSettingsViewController : UITableViewController
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UISwitch *extraMessagesSwitch;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UISwitch *longMessageSwitch;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UISwitch *emptySwitch;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UISwitch *incomingAvatarsSwitch;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UISwitch *outgoingAvatarsSwitch;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UISwitch *springySwitch;
|
||||
|
||||
@end
|
||||
@ -1,72 +0,0 @@
|
||||
//
|
||||
// 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 "DemoSettingsViewController.h"
|
||||
|
||||
#import "NSUserDefaults+DemoSettings.h"
|
||||
|
||||
|
||||
/**
|
||||
* This is for demo/testing purposes only.
|
||||
*
|
||||
* This is a terrible idea for a real app.
|
||||
*/
|
||||
|
||||
@implementation DemoSettingsViewController
|
||||
|
||||
- (void)viewDidLoad
|
||||
{
|
||||
[super viewDidLoad];
|
||||
|
||||
self.extraMessagesSwitch.on = [NSUserDefaults extraMessagesSetting];
|
||||
self.longMessageSwitch.on = [NSUserDefaults longMessageSetting];
|
||||
self.emptySwitch.on = [NSUserDefaults emptyMessagesSetting];
|
||||
|
||||
self.incomingAvatarsSwitch.on = [NSUserDefaults incomingAvatarSetting];
|
||||
self.outgoingAvatarsSwitch.on = [NSUserDefaults outgoingAvatarSetting];
|
||||
|
||||
self.springySwitch.on = [NSUserDefaults springinessSetting];
|
||||
}
|
||||
|
||||
- (IBAction)didTapSwitch:(UISwitch *)sender
|
||||
{
|
||||
if (sender == self.extraMessagesSwitch) {
|
||||
[NSUserDefaults saveExtraMessagesSetting:sender.on];
|
||||
|
||||
}
|
||||
else if (sender == self.longMessageSwitch) {
|
||||
[NSUserDefaults saveLongMessageSetting:sender.on];
|
||||
}
|
||||
else if (sender == self.emptySwitch) {
|
||||
[NSUserDefaults saveEmptyMessagesSetting:sender.on];
|
||||
}
|
||||
else if (sender == self.incomingAvatarsSwitch) {
|
||||
[NSUserDefaults saveIncomingAvatarSetting:sender.on];
|
||||
}
|
||||
else if (sender == self.outgoingAvatarsSwitch) {
|
||||
[NSUserDefaults saveOutgoingAvatarSetting:sender.on];
|
||||
}
|
||||
else if (sender == self.springySwitch) {
|
||||
[NSUserDefaults saveSpringinessSetting:sender.on];
|
||||
}
|
||||
|
||||
[[NSUserDefaults standardUserDefaults] synchronize];
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
@ -1,80 +0,0 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-Small@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-87.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-Spotlight-iOS7@2x-1.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-120-1.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-120.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-180.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-Small.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-Small@2x-1.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-Spotlight-iOS7.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-Spotlight-iOS7@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-76.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-76@2x.png",
|
||||
"scale" : "2x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 760 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 947 B |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
@ -1,23 +0,0 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "demo_avatar_cook.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "demo_avatar_cook@2x.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x",
|
||||
"filename" : "demo_avatar_cook@3x.png"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 68 KiB |
@ -1,23 +0,0 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "demo_avatar_jobs.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "demo_avatar_jobs@2x.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x",
|
||||
"filename" : "demo_avatar_jobs@3x.png"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 20 KiB |
@ -1,23 +0,0 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "demo_avatar_woz.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "demo_avatar_woz@2x.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x",
|
||||
"filename" : "demo_avatar_woz@3x.png"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 65 KiB |
@ -1,84 +0,0 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"extent" : "full-screen",
|
||||
"idiom" : "iphone",
|
||||
"subtype" : "736h",
|
||||
"filename" : "jsq_messages_splash_55inch.png",
|
||||
"minimum-system-version" : "8.0",
|
||||
"orientation" : "portrait",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"extent" : "full-screen",
|
||||
"idiom" : "iphone",
|
||||
"subtype" : "736h",
|
||||
"filename" : "jsq_messages_splash_55inch_landscape.png",
|
||||
"minimum-system-version" : "8.0",
|
||||
"orientation" : "landscape",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"extent" : "full-screen",
|
||||
"idiom" : "iphone",
|
||||
"subtype" : "667h",
|
||||
"filename" : "jsq_messages_splash_47inch.png",
|
||||
"minimum-system-version" : "8.0",
|
||||
"orientation" : "portrait",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"orientation" : "portrait",
|
||||
"idiom" : "iphone",
|
||||
"extent" : "full-screen",
|
||||
"minimum-system-version" : "7.0",
|
||||
"filename" : "splash_iphone35inch.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"extent" : "full-screen",
|
||||
"idiom" : "iphone",
|
||||
"subtype" : "retina4",
|
||||
"filename" : "slpash_iphone4inch.png",
|
||||
"minimum-system-version" : "7.0",
|
||||
"orientation" : "portrait",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"orientation" : "portrait",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"minimum-system-version" : "7.0",
|
||||
"filename" : "jsq_messages_splash_ipad.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"orientation" : "landscape",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"minimum-system-version" : "7.0",
|
||||
"filename" : "jsq_messages_splash_ipad~landscape.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"orientation" : "portrait",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"minimum-system-version" : "7.0",
|
||||
"filename" : "jsq_messages_splash_ipad@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"orientation" : "landscape",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"minimum-system-version" : "7.0",
|
||||
"filename" : "jsq_messages_splash_ipad@2x~landscape.png",
|
||||
"scale" : "2x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 12 KiB |
@ -1,23 +0,0 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "goldengate.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "goldengate@2x.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x",
|
||||
"filename" : "goldengate@3x.png"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 176 KiB |
|
Before Width: | Height: | Size: 196 KiB |
|
Before Width: | Height: | Size: 651 KiB |
@ -1,47 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.hexedbits.$(PRODUCT_NAME:rfc1034identifier)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>6.1.1</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>6.1.1</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIMainStoryboardFile</key>
|
||||
<string>Main</string>
|
||||
<key>UIRequiredDeviceCapabilities</key>
|
||||
<array>
|
||||
<string>armv7</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -1,41 +0,0 @@
|
||||
//
|
||||
// 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>
|
||||
|
||||
@interface NSUserDefaults (DemoSettings)
|
||||
|
||||
+ (void)saveExtraMessagesSetting:(BOOL)value;
|
||||
+ (BOOL)extraMessagesSetting;
|
||||
|
||||
+ (void)saveLongMessageSetting:(BOOL)value;
|
||||
+ (BOOL)longMessageSetting;
|
||||
|
||||
+ (void)saveEmptyMessagesSetting:(BOOL)value;
|
||||
+ (BOOL)emptyMessagesSetting;
|
||||
|
||||
+ (void)saveSpringinessSetting:(BOOL)value;
|
||||
+ (BOOL)springinessSetting;
|
||||
|
||||
+ (void)saveOutgoingAvatarSetting:(BOOL)value;
|
||||
+ (BOOL)outgoingAvatarSetting;
|
||||
|
||||
+ (void)saveIncomingAvatarSetting:(BOOL)value;
|
||||
+ (BOOL)incomingAvatarSetting;
|
||||
|
||||
@end
|
||||
@ -1,91 +0,0 @@
|
||||
//
|
||||
// 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 "NSUserDefaults+DemoSettings.h"
|
||||
|
||||
static NSString * const kSettingExtraMessages = @"kSettingExtraMessages";
|
||||
static NSString * const kSettingLongMessage = @"kSettingLongMessage";
|
||||
static NSString * const kSettingEmptyMessages = @"kSettingEmptyMessages";
|
||||
static NSString * const kSettingSpringiness = @"kSettingSpringiness";
|
||||
static NSString * const kSettingIncomingAvatar = @"kSettingIncomingAvatar";
|
||||
static NSString * const kSettingOutgoingAvatar = @"kSettingOutgoingAvatar";
|
||||
|
||||
|
||||
@implementation NSUserDefaults (DemoSettings)
|
||||
|
||||
+ (void)saveExtraMessagesSetting:(BOOL)value
|
||||
{
|
||||
[[NSUserDefaults standardUserDefaults] setBool:value forKey:kSettingExtraMessages];
|
||||
}
|
||||
|
||||
+ (BOOL)extraMessagesSetting
|
||||
{
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:kSettingExtraMessages];
|
||||
}
|
||||
|
||||
+ (void)saveLongMessageSetting:(BOOL)value
|
||||
{
|
||||
[[NSUserDefaults standardUserDefaults] setBool:value forKey:kSettingLongMessage];
|
||||
}
|
||||
|
||||
+ (BOOL)longMessageSetting
|
||||
{
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:kSettingLongMessage];
|
||||
}
|
||||
|
||||
+ (void)saveEmptyMessagesSetting:(BOOL)value
|
||||
{
|
||||
[[NSUserDefaults standardUserDefaults] setBool:value forKey:kSettingEmptyMessages];
|
||||
}
|
||||
|
||||
+ (BOOL)emptyMessagesSetting
|
||||
{
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:kSettingEmptyMessages];
|
||||
}
|
||||
|
||||
+ (void)saveSpringinessSetting:(BOOL)value
|
||||
{
|
||||
[[NSUserDefaults standardUserDefaults] setBool:value forKey:kSettingSpringiness];
|
||||
}
|
||||
|
||||
+ (BOOL)springinessSetting
|
||||
{
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:kSettingSpringiness];
|
||||
}
|
||||
|
||||
+ (void)saveOutgoingAvatarSetting:(BOOL)value
|
||||
{
|
||||
[[NSUserDefaults standardUserDefaults] setBool:value forKey:kSettingOutgoingAvatar];
|
||||
}
|
||||
|
||||
+ (BOOL)outgoingAvatarSetting
|
||||
{
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:kSettingOutgoingAvatar];
|
||||
}
|
||||
|
||||
+ (void)saveIncomingAvatarSetting:(BOOL)value
|
||||
{
|
||||
[[NSUserDefaults standardUserDefaults] setBool:value forKey:kSettingIncomingAvatar];
|
||||
}
|
||||
|
||||
+ (BOOL)incomingAvatarSetting
|
||||
{
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:kSettingIncomingAvatar];
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,28 +0,0 @@
|
||||
//
|
||||
// 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>
|
||||
|
||||
#import "DemoMessagesViewController.h"
|
||||
|
||||
@interface TableViewController : UITableViewController <JSQDemoViewControllerDelegate>
|
||||
|
||||
- (IBAction)unwindSegue:(UIStoryboardSegue *)sender;
|
||||
|
||||
@end
|
||||
@ -1,171 +0,0 @@
|
||||
//
|
||||
// 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 "TableViewController.h"
|
||||
|
||||
@implementation TableViewController
|
||||
|
||||
#pragma mark - View lifecycle
|
||||
|
||||
- (void)viewDidLoad
|
||||
{
|
||||
[super viewDidLoad];
|
||||
self.title = @"JSQMessagesViewController";
|
||||
}
|
||||
|
||||
- (void)viewWillAppear:(BOOL)animated
|
||||
{
|
||||
[super viewWillAppear:animated];
|
||||
[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
|
||||
}
|
||||
|
||||
#pragma mark - Table view data source
|
||||
|
||||
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
|
||||
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
|
||||
{
|
||||
if (section == 2) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
static NSString *CellIdentifier = @"CellIdentifier";
|
||||
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
|
||||
if (!cell) {
|
||||
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
|
||||
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
|
||||
}
|
||||
|
||||
if (indexPath.section == 0) {
|
||||
switch (indexPath.row) {
|
||||
case 0:
|
||||
cell.textLabel.text = @"Push via storyboard";
|
||||
break;
|
||||
case 1:
|
||||
cell.textLabel.text = @"Push programmatically";
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (indexPath.section == 1) {
|
||||
switch (indexPath.row) {
|
||||
case 0:
|
||||
cell.textLabel.text = @"Modal via storyboard";
|
||||
break;
|
||||
case 1:
|
||||
cell.textLabel.text = @"Modal programmatically";
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (indexPath.section == 2) {
|
||||
switch (indexPath.row) {
|
||||
case 0:
|
||||
cell.textLabel.text = @"Settings";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return cell;
|
||||
}
|
||||
|
||||
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
|
||||
{
|
||||
switch (section) {
|
||||
case 0:
|
||||
return @"Presentation";
|
||||
case 2:
|
||||
return @"Demo options";
|
||||
default:
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
|
||||
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
|
||||
{
|
||||
return (section == [tableView numberOfSections] - 1) ? @"Copyright © 2014\nJesse Squires\nMIT License" : nil;
|
||||
}
|
||||
|
||||
#pragma mark - Table view delegate
|
||||
|
||||
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
if (indexPath.section == 0) {
|
||||
switch (indexPath.row) {
|
||||
case 0:
|
||||
[self performSegueWithIdentifier:@"seguePushDemoVC" sender:self];
|
||||
break;
|
||||
case 1:
|
||||
{
|
||||
DemoMessagesViewController *vc = [DemoMessagesViewController messagesViewController];
|
||||
[self.navigationController pushViewController:vc animated:YES];
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (indexPath.section == 1) {
|
||||
switch (indexPath.row) {
|
||||
case 0:
|
||||
[self performSegueWithIdentifier:@"segueModalDemoVC" sender:self];
|
||||
break;
|
||||
case 1:
|
||||
{
|
||||
DemoMessagesViewController *vc = [DemoMessagesViewController messagesViewController];
|
||||
vc.delegateModal = self;
|
||||
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:vc];
|
||||
[self presentViewController:nc animated:YES completion:nil];
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (indexPath.section == 2) {
|
||||
switch (indexPath.row) {
|
||||
case 0:
|
||||
[self performSegueWithIdentifier:@"SegueToSettings" sender:self];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Segues
|
||||
|
||||
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
|
||||
{
|
||||
if ([segue.identifier isEqualToString:@"segueModalDemoVC"]) {
|
||||
UINavigationController *nc = segue.destinationViewController;
|
||||
DemoMessagesViewController *vc = (DemoMessagesViewController *)nc.topViewController;
|
||||
vc.delegateModal = self;
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)unwindSegue:(UIStoryboardSegue *)sender { }
|
||||
|
||||
#pragma mark - Demo delegate
|
||||
|
||||
- (void)didDismissJSQDemoViewController:(DemoMessagesViewController *)vc
|
||||
{
|
||||
[self dismissViewControllerAnimated:YES completion:nil];
|
||||
}
|
||||
|
||||
@end
|
||||
|
Before Width: | Height: | Size: 14 KiB |
@ -1,28 +0,0 @@
|
||||
//
|
||||
// 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 <UIKit/UIKit.h>
|
||||
|
||||
#import "AppDelegate.h"
|
||||
|
||||
int main(int argc, char * argv[])
|
||||
{
|
||||
@autoreleasepool {
|
||||
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
|
||||
}
|
||||
}
|
||||
@ -1,40 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "NSString+JSQMessages.h"
|
||||
|
||||
|
||||
@interface JSQMessagesNSStringTests : XCTestCase
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesNSStringTests
|
||||
|
||||
- (void)testTrimingStringWhitespace
|
||||
{
|
||||
// GIVEN: a string of text
|
||||
NSString *loremIpsum = @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
|
||||
|
||||
// WHEN: the text is wrapped in white space
|
||||
NSString *string1 = [NSString stringWithFormat:@" %@ ", loremIpsum];
|
||||
NSString *string2 = [NSString stringWithFormat:@" %@", loremIpsum];
|
||||
NSString *string3 = [NSString stringWithFormat:@"%@ ", loremIpsum];
|
||||
|
||||
// THEN: we can successfully trim extra white space
|
||||
XCTAssertEqualObjects(loremIpsum, [string1 jsq_stringByTrimingWhitespace], @"Strings should be equal after trimming whitespace");
|
||||
|
||||
XCTAssertEqualObjects(loremIpsum, [string2 jsq_stringByTrimingWhitespace], @"Strings should be equal after trimming whitespace");
|
||||
|
||||
XCTAssertEqualObjects(loremIpsum, [string3 jsq_stringByTrimingWhitespace], @"Strings should be equal after trimming whitespace");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,61 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "UIColor+JSQMessages.h"
|
||||
|
||||
|
||||
@interface JSQMessagesUIColorTests : XCTestCase
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesUIColorTests
|
||||
|
||||
- (void)testDarkeningColors
|
||||
{
|
||||
// GIVEN: a color and darkening value
|
||||
CGFloat r = 0.89f, g = 0.34f, b = 0.67f, a = 1.0f;
|
||||
CGFloat darkeningValue = 0.12f;
|
||||
UIColor *color = [UIColor colorWithRed:r green:g blue:b alpha:a];
|
||||
|
||||
// WHEN: we darken that color
|
||||
UIColor *darkColor = [color jsq_colorByDarkeningColorWithValue:darkeningValue];
|
||||
|
||||
// THEN: each RGB value is changed accordingly
|
||||
CGFloat dr, dg, db, da;
|
||||
[darkColor getRed:&dr green:&dg blue:&db alpha:&da];
|
||||
|
||||
XCTAssertEqual(dr, r - darkeningValue, @"Red values should be equal");
|
||||
XCTAssertEqual(dg, g - darkeningValue, @"Green values should be equal");
|
||||
XCTAssertEqual(db, b - darkeningValue, @"Blue values should be equal");
|
||||
XCTAssertEqual(da, a, @"Alpha values should be equal");
|
||||
}
|
||||
|
||||
- (void)testDarkeningColorsFloorToZero
|
||||
{
|
||||
// GIVEN: a color and darkening value
|
||||
CGFloat r = 0.89f, g = 0.24f, b = 0.67f, a = 1.0f;
|
||||
CGFloat darkeningValue = 0.5f;
|
||||
UIColor *color = [UIColor colorWithRed:r green:g blue:b alpha:a];
|
||||
|
||||
// WHEN: we dark that color, such that some RGB values will be negative
|
||||
UIColor *darkColor = [color jsq_colorByDarkeningColorWithValue:darkeningValue];
|
||||
|
||||
// THEN: the RGB values are floored to zero instead of being negative
|
||||
CGFloat dr, dg, db, da;
|
||||
[darkColor getRed:&dr green:&dg blue:&db alpha:&da];
|
||||
XCTAssertEqual(dr, r - darkeningValue, @"Red values should be equal");
|
||||
XCTAssertEqual(dg, 0.0f, @"Green values should be floored to zero");
|
||||
XCTAssertEqual(db, b - darkeningValue, @"Blue values should be equal");
|
||||
XCTAssertEqual(da, a, @"Alpha values should be equal");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,67 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "UIImage+JSQMessages.h"
|
||||
|
||||
|
||||
@interface JSQMessagesUIImageTests : XCTestCase
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesUIImageTests
|
||||
|
||||
- (void)testImageMasking
|
||||
{
|
||||
// GIVEN: an image
|
||||
UIImage *img = [UIImage jsq_bubbleCompactImage];
|
||||
XCTAssertNotNil(img, @"Image should not be nil");
|
||||
|
||||
// WHEN: we mask that image
|
||||
UIImage *imgMasked = [img jsq_imageMaskedWithColor:[UIColor whiteColor]];
|
||||
XCTAssertNotNil(imgMasked, @"Image should not be nil");
|
||||
|
||||
// THEN: masking should succeed, and the new image should have the same properties
|
||||
XCTAssertTrue(CGSizeEqualToSize(img.size, imgMasked.size), @"Image sizes should be equal");
|
||||
|
||||
XCTAssertEqual(img.scale, imgMasked.scale, @"Image scales should be equal");
|
||||
|
||||
XCTAssertThrows([img jsq_imageMaskedWithColor:nil], @"Should throw when passing nil color");
|
||||
}
|
||||
|
||||
- (void)testImageAssets
|
||||
{
|
||||
// GIVEN: our image assets
|
||||
|
||||
// WHEN: we create a new UIImage object
|
||||
|
||||
// THEN: the image is created successfully
|
||||
|
||||
XCTAssertNotNil([UIImage jsq_bubbleRegularImage]);
|
||||
|
||||
XCTAssertNotNil([UIImage jsq_bubbleRegularTaillessImage]);
|
||||
|
||||
XCTAssertNotNil([UIImage jsq_bubbleRegularStrokedImage]);
|
||||
|
||||
XCTAssertNotNil([UIImage jsq_bubbleRegularStrokedTaillessImage]);
|
||||
|
||||
XCTAssertNotNil([UIImage jsq_bubbleCompactImage]);
|
||||
|
||||
XCTAssertNotNil([UIImage jsq_bubbleCompactTaillessImage]);
|
||||
|
||||
XCTAssertNotNil([UIImage jsq_defaultAccessoryImage]);
|
||||
|
||||
XCTAssertNotNil([UIImage jsq_defaultTypingIndicatorImage]);
|
||||
|
||||
XCTAssertNotNil([UIImage jsq_defaultPlayImage]);
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,59 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "UIView+JSQMessages.h"
|
||||
|
||||
|
||||
@interface JSQMessagesUIViewTests : XCTestCase
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesUIViewTests
|
||||
|
||||
- (void)testViewAutoLayoutPinEdges
|
||||
{
|
||||
// GIVEN: a superview and subview
|
||||
UIView *superview = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 50.0f, 50.0f)];
|
||||
[superview setTranslatesAutoresizingMaskIntoConstraints:NO];
|
||||
|
||||
UIView *subview = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 25.0f, 25.0f)];
|
||||
[subview setTranslatesAutoresizingMaskIntoConstraints:NO];
|
||||
|
||||
// WHEN: we add the subview to the superview
|
||||
[superview addSubview:subview];
|
||||
|
||||
// WHEN: we pin the edges of the subview to the superview
|
||||
XCTAssertNoThrow([superview jsq_pinAllEdgesOfSubview:subview], @"Pinning edges of subview to superview should not throw");
|
||||
[superview setNeedsUpdateConstraints];
|
||||
[superview layoutIfNeeded];
|
||||
|
||||
// THEN: add the layout constraints and laying out the views succeeds
|
||||
|
||||
XCTAssertEqual([[superview constraints] count], 4U, @"Superview should have 4 constraints");
|
||||
|
||||
XCTAssertEqual([[subview constraints] count], 0U, @"Subview should have 0 constraints");
|
||||
|
||||
for (NSLayoutConstraint *eachConstraint in [superview constraints]) {
|
||||
|
||||
XCTAssertEqualObjects(eachConstraint.firstItem, superview, @"Constraint first item should be equal to superview");
|
||||
|
||||
XCTAssertEqualObjects(eachConstraint.secondItem, subview, @"Constraint second item should be equal to subview");
|
||||
|
||||
XCTAssertEqual(eachConstraint.relation, NSLayoutRelationEqual, @"Constraint relation should be NSLayoutRelationEqual");
|
||||
|
||||
XCTAssertEqual(eachConstraint.multiplier, 1.0f, @"Constraint multiplier should be 1.0");
|
||||
|
||||
XCTAssertEqual(eachConstraint.constant, 0.0f, @"Constraint constant should be 0.0");
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,46 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQMessagesKeyboardController.h"
|
||||
|
||||
|
||||
@interface JSQMessagesKeyboardControllerTests : XCTestCase
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesKeyboardControllerTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testKeyboardControllerInit
|
||||
{
|
||||
JSQMessagesKeyboardController *keyboardController = [[JSQMessagesKeyboardController alloc] initWithTextView:[UITextView new]
|
||||
contextView:[UIView new]
|
||||
panGestureRecognizer:[UIPanGestureRecognizer new]
|
||||
delegate:nil];
|
||||
XCTAssertNotNil(keyboardController, @"Keyboard controller should not be nil");
|
||||
|
||||
XCTAssertThrows([[JSQMessagesKeyboardController alloc] initWithTextView:nil
|
||||
contextView:nil
|
||||
panGestureRecognizer:nil
|
||||
delegate:nil], @"Invalid init should throw");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,103 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import <OCMock/OCMock.h>
|
||||
|
||||
#import "JSQMessagesViewController.h"
|
||||
#import "DemoMessagesViewController.h"
|
||||
|
||||
|
||||
@interface JSQMessagesViewController ()
|
||||
|
||||
- (void)jsq_configureMessagesViewController;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
||||
|
||||
@interface JSQMessagesViewControllerTests : XCTestCase
|
||||
@end
|
||||
|
||||
|
||||
|
||||
@implementation JSQMessagesViewControllerTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testJSQMessagesViewControllerInit
|
||||
{
|
||||
UINib *nib = [JSQMessagesViewController nib];
|
||||
XCTAssertNotNil(nib, @"Nib should not be nil");
|
||||
|
||||
JSQMessagesViewController *vc = [JSQMessagesViewController messagesViewController];
|
||||
[vc view];
|
||||
XCTAssertNotNil(vc, @"View controller should not be nil");
|
||||
XCTAssertNotNil(vc.view, @"View should not be nil");
|
||||
XCTAssertNotNil(vc.collectionView, @"Collection view should not be nil");
|
||||
XCTAssertNotNil(vc.inputToolbar, @"Input toolbar should not be nil");
|
||||
|
||||
XCTAssertEqualObjects(vc.senderId, @"JSQDefaultSender", @"Property should be equal to default value");
|
||||
XCTAssertEqualObjects(vc.senderDisplayName, @"JSQDefaultSender", @"Property should be equal to default value");
|
||||
XCTAssertEqual(vc.automaticallyAdjustsScrollViewInsets, YES, @"Property should be equal to default value");
|
||||
|
||||
XCTAssertEqualObjects(vc.incomingCellIdentifier, [JSQMessagesCollectionViewCellIncoming cellReuseIdentifier], @"Property should be equal to default value");
|
||||
XCTAssertEqualObjects(vc.outgoingCellIdentifier, [JSQMessagesCollectionViewCellOutgoing cellReuseIdentifier], @"Property should be equal to default value");
|
||||
|
||||
XCTAssertEqual(vc.showTypingIndicator, NO, @"Property should be equal to default value");
|
||||
XCTAssertEqual(vc.showLoadEarlierMessagesHeader, NO, @"Property should be equal to default value");
|
||||
}
|
||||
|
||||
- (void)testJSQMessagesViewControllerSubclassInitProgramatically
|
||||
{
|
||||
DemoMessagesViewController *demoVC = [DemoMessagesViewController messagesViewController];
|
||||
[demoVC view];
|
||||
XCTAssertNotNil(demoVC, @"View controller should not be nil");
|
||||
XCTAssertTrue([demoVC isKindOfClass:[DemoMessagesViewController class]], @"View controller should be kind of class: %@", [DemoMessagesViewController class]);
|
||||
XCTAssertNotNil(demoVC.view, @"View should not be nil");
|
||||
XCTAssertNotNil(demoVC.collectionView, @"Collection view should not be nil");
|
||||
XCTAssertNotNil(demoVC.inputToolbar, @"Input toolbar should not be nil");
|
||||
}
|
||||
|
||||
- (void)testJSQMessagesViewControllerSubclassInitStoryboards
|
||||
{
|
||||
UIStoryboard *mainSB = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
|
||||
XCTAssertNotNil(mainSB, @"Storyboard should not be nil");
|
||||
|
||||
DemoMessagesViewController *demoVC = [mainSB instantiateViewControllerWithIdentifier:@"DemoVC"];
|
||||
[demoVC view];
|
||||
XCTAssertNotNil(demoVC, @"View controller should not be nil");
|
||||
XCTAssertTrue([demoVC isKindOfClass:[DemoMessagesViewController class]], @"View controller should be kind of class: %@", [DemoMessagesViewController class]);
|
||||
XCTAssertNotNil(demoVC.view, @"View should not be nil");
|
||||
XCTAssertNotNil(demoVC.collectionView, @"Collection view should not be nil");
|
||||
XCTAssertNotNil(demoVC.inputToolbar, @"Input toolbar should not be nil");
|
||||
}
|
||||
|
||||
- (void)testViewConfiguration
|
||||
{
|
||||
JSQMessagesViewController *vc = [JSQMessagesViewController messagesViewController];
|
||||
|
||||
id mockVC = [OCMockObject partialMockForObject:vc];
|
||||
[[mockVC expect] jsq_configureMessagesViewController];
|
||||
[vc view];
|
||||
[mockVC verify];
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,73 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQMessagesAvatarImageFactory.h"
|
||||
|
||||
|
||||
@interface JSQMessagesAvatarImageFactoryTests : XCTestCase
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesAvatarImageFactoryTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testAvatarImage
|
||||
{
|
||||
UIImage *image = [UIImage imageNamed:@"demo_avatar_jobs"];
|
||||
XCTAssertNotNil(image, @"Image should not be nil");
|
||||
|
||||
CGFloat diameter = 50.0f;
|
||||
JSQMessagesAvatarImage *avatar = [JSQMessagesAvatarImageFactory avatarImageWithPlaceholder:image diameter:diameter];
|
||||
|
||||
XCTAssertNotNil(avatar, @"Avatar should not be nil");
|
||||
XCTAssertTrue(CGSizeEqualToSize(avatar.avatarPlaceholderImage.size, CGSizeMake(diameter, diameter)), @"Avatar size should be equal to diameter");
|
||||
XCTAssertEqual(avatar.avatarPlaceholderImage.scale, [UIScreen mainScreen].scale, @"Avatar scale should be equal to screen scale");
|
||||
|
||||
avatar.avatarImage = [JSQMessagesAvatarImageFactory circularAvatarImage:image withDiameter:diameter];
|
||||
XCTAssertTrue(CGSizeEqualToSize(avatar.avatarImage.size, CGSizeMake(diameter, diameter)), @"Avatar size should be equal to diameter");
|
||||
XCTAssertEqual(avatar.avatarImage.scale, [UIScreen mainScreen].scale, @"Avatar scale should be equal to screen scale");
|
||||
|
||||
avatar.avatarHighlightedImage = [JSQMessagesAvatarImageFactory circularAvatarHighlightedImage:image withDiameter:diameter];
|
||||
XCTAssertTrue(CGSizeEqualToSize(avatar.avatarHighlightedImage.size, CGSizeMake(diameter, diameter)), @"Avatar size should be equal to diameter");
|
||||
XCTAssertEqual(avatar.avatarHighlightedImage.scale, [UIScreen mainScreen].scale, @"Avatar scale should be equal to screen scale");
|
||||
}
|
||||
|
||||
- (void)testAvatarInitialsImage
|
||||
{
|
||||
CGFloat diameter = 50.0f;
|
||||
JSQMessagesAvatarImage *avatar = [JSQMessagesAvatarImageFactory avatarImageWithUserInitials:@"JSQ"
|
||||
backgroundColor:[UIColor lightGrayColor]
|
||||
textColor:[UIColor darkGrayColor]
|
||||
font:[UIFont systemFontOfSize:13.0f]
|
||||
diameter:diameter];
|
||||
|
||||
XCTAssertNotNil(avatar, @"Avatar should not be nil");
|
||||
XCTAssertTrue(CGSizeEqualToSize(avatar.avatarImage.size, CGSizeMake(diameter, diameter)), @"Avatar size should be equal to diameter");
|
||||
XCTAssertEqual(avatar.avatarImage.scale, [UIScreen mainScreen].scale, @"Avatar scale should be equal to screen scale");
|
||||
|
||||
XCTAssertTrue(CGSizeEqualToSize(avatar.avatarHighlightedImage.size, CGSizeMake(diameter, diameter)), @"Avatar size should be equal to diameter");
|
||||
XCTAssertEqual(avatar.avatarHighlightedImage.scale, [UIScreen mainScreen].scale, @"Avatar scale should be equal to screen scale");
|
||||
|
||||
XCTAssertTrue(CGSizeEqualToSize(avatar.avatarPlaceholderImage.size, CGSizeMake(diameter, diameter)), @"Avatar size should be equal to diameter");
|
||||
XCTAssertEqual(avatar.avatarPlaceholderImage.scale, [UIScreen mainScreen].scale, @"Avatar scale should be equal to screen scale");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,135 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQMessagesBubbleImageFactory.h"
|
||||
|
||||
#import "UIImage+JSQMessages.h"
|
||||
|
||||
|
||||
@interface JSQMessagesBubbleImageFactoryTests : XCTestCase
|
||||
|
||||
@property (strong, nonatomic) JSQMessagesBubbleImageFactory *factory;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesBubbleImageFactoryTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
self.factory = [[JSQMessagesBubbleImageFactory alloc] init];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
self.factory = nil;
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testOutgoingMessageBubbleImageView
|
||||
{
|
||||
UIImage *bubble = [UIImage jsq_bubbleCompactImage];
|
||||
XCTAssertNotNil(bubble, @"Bubble image should not be nil");
|
||||
|
||||
CGPoint center = CGPointMake(bubble.size.width / 2.0f, bubble.size.height / 2.0f);
|
||||
UIEdgeInsets capInsets = UIEdgeInsetsMake(center.y, center.x, center.y, center.x);
|
||||
|
||||
JSQMessagesBubbleImage *bubbleImage = [self.factory outgoingMessagesBubbleImageWithColor:[UIColor lightGrayColor]];
|
||||
XCTAssertNotNil(bubbleImage, @"Bubble image should not be nil");
|
||||
|
||||
XCTAssertNotNil(bubbleImage.messageBubbleImage, "Image should not be nil");
|
||||
XCTAssertEqual(bubbleImage.messageBubbleImage.scale, bubble.scale, @"Image scale should equal bubble image scale");
|
||||
XCTAssertEqual(bubbleImage.messageBubbleImage.imageOrientation, bubble.imageOrientation, @"Image orientation should equal bubble image orientation");
|
||||
XCTAssertTrue(bubbleImage.messageBubbleImage.resizingMode == UIImageResizingModeStretch, @"Image should be stretchable");
|
||||
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(bubbleImage.messageBubbleImage.capInsets, capInsets), @"Image capInsets should be equal to capInsets");
|
||||
|
||||
|
||||
XCTAssertNotNil(bubbleImage.messageBubbleHighlightedImage, @"Highlighted image should not be nil");
|
||||
XCTAssertEqual(bubbleImage.messageBubbleHighlightedImage.scale, bubble.scale, @"HighlightedImage scale should equal bubble image scale");
|
||||
XCTAssertEqual(bubbleImage.messageBubbleHighlightedImage.imageOrientation, bubble.imageOrientation, @"HighlightedImage orientation should equal bubble image orientation");
|
||||
XCTAssertTrue(bubbleImage.messageBubbleHighlightedImage.resizingMode == UIImageResizingModeStretch, @"HighlightedImage should be stretchable");
|
||||
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(bubbleImage.messageBubbleHighlightedImage.capInsets, capInsets), @"HighlightedImage capInsets should be equal to capInsets");
|
||||
}
|
||||
|
||||
- (void)testIncomingMessageBubbleImageView
|
||||
{
|
||||
UIImage *bubble = [UIImage jsq_bubbleCompactImage];
|
||||
XCTAssertNotNil(bubble, @"Bubble image should not be nil");
|
||||
|
||||
CGPoint center = CGPointMake(bubble.size.width / 2.0f, bubble.size.height / 2.0f);
|
||||
UIEdgeInsets capInsets = UIEdgeInsetsMake(center.y, center.x, center.y, center.x);
|
||||
|
||||
JSQMessagesBubbleImage *bubbleImage = [self.factory incomingMessagesBubbleImageWithColor:[UIColor lightGrayColor]];
|
||||
XCTAssertNotNil(bubbleImage, @"Bubble image should not be nil");
|
||||
|
||||
XCTAssertNotNil(bubbleImage.messageBubbleImage, "Image should not be nil");
|
||||
XCTAssertEqual(bubbleImage.messageBubbleImage.scale, bubble.scale, @"Image scale should equal bubble image scale");
|
||||
XCTAssertEqual(bubbleImage.messageBubbleImage.imageOrientation, UIImageOrientationUpMirrored, @"Image orientation should be flipped");
|
||||
XCTAssertTrue(bubbleImage.messageBubbleImage.resizingMode == UIImageResizingModeStretch, @"Image should be stretchable");
|
||||
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(bubbleImage.messageBubbleImage.capInsets, capInsets), @"Image capInsets should be equal to capInsets");
|
||||
|
||||
|
||||
XCTAssertNotNil(bubbleImage.messageBubbleHighlightedImage, @"Highlighted image should not be nil");
|
||||
XCTAssertEqual(bubbleImage.messageBubbleHighlightedImage.scale, bubble.scale, @"HighlightedImage scale should equal bubble image scale");
|
||||
XCTAssertEqual(bubbleImage.messageBubbleHighlightedImage.imageOrientation, UIImageOrientationUpMirrored, @"Image orientation should be flipped");
|
||||
XCTAssertTrue(bubbleImage.messageBubbleHighlightedImage.resizingMode == UIImageResizingModeStretch, @"HighlightedImage should be stretchable");
|
||||
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(bubbleImage.messageBubbleHighlightedImage.capInsets, capInsets), @"HighlightedImage capInsets should be equal to capInsets");
|
||||
}
|
||||
|
||||
- (void)testCustomOutgoingMessageBubbleImageView
|
||||
{
|
||||
UIImage *bubble = [UIImage jsq_bubbleRegularStrokedTaillessImage];
|
||||
XCTAssertNotNil(bubble, @"Bubble image should not be nil");
|
||||
|
||||
UIEdgeInsets capInsets = UIEdgeInsetsMake(1, 1, 1, 1);
|
||||
JSQMessagesBubbleImageFactory *factory = [[JSQMessagesBubbleImageFactory alloc] initWithBubbleImage:bubble capInsets:capInsets];
|
||||
JSQMessagesBubbleImage *bubbleImage = [factory outgoingMessagesBubbleImageWithColor:[UIColor lightGrayColor]];
|
||||
XCTAssertNotNil(bubbleImage, @"Bubble image should not be nil");
|
||||
|
||||
XCTAssertNotNil(bubbleImage.messageBubbleImage, "Image should not be nil");
|
||||
XCTAssertEqual(bubbleImage.messageBubbleImage.scale, bubble.scale, @"Image scale should equal bubble image scale");
|
||||
XCTAssertEqual(bubbleImage.messageBubbleImage.imageOrientation, bubble.imageOrientation, @"Image orientation should equal bubble image orientation");
|
||||
XCTAssertTrue(bubbleImage.messageBubbleImage.resizingMode == UIImageResizingModeStretch, @"Image should be stretchable");
|
||||
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(bubbleImage.messageBubbleImage.capInsets, capInsets), @"Image capInsets should be equal to capInsets");
|
||||
|
||||
XCTAssertNotNil(bubbleImage.messageBubbleHighlightedImage, @"Highlighted image should not be nil");
|
||||
XCTAssertEqual(bubbleImage.messageBubbleHighlightedImage.scale, bubble.scale, @"HighlightedImage scale should equal bubble image scale");
|
||||
XCTAssertEqual(bubbleImage.messageBubbleHighlightedImage.imageOrientation, bubble.imageOrientation, @"HighlightedImage orientation should equal bubble image orientation");
|
||||
XCTAssertTrue(bubbleImage.messageBubbleHighlightedImage.resizingMode == UIImageResizingModeStretch, @"HighlightedImage should be stretchable");
|
||||
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(bubbleImage.messageBubbleHighlightedImage.capInsets, capInsets), @"HighlightedImage capInsets should be equal to capInsets");
|
||||
}
|
||||
|
||||
- (void)testCustomIncomingMessageBubbleImageView
|
||||
{
|
||||
UIImage *bubble = [UIImage jsq_bubbleRegularStrokedTaillessImage];
|
||||
XCTAssertNotNil(bubble, @"Bubble image should not be nil");
|
||||
|
||||
UIEdgeInsets capInsets = UIEdgeInsetsMake(1, 1, 1, 1);
|
||||
JSQMessagesBubbleImageFactory *factory = [[JSQMessagesBubbleImageFactory alloc] initWithBubbleImage:bubble capInsets:capInsets];
|
||||
JSQMessagesBubbleImage *bubbleImage = [factory incomingMessagesBubbleImageWithColor:[UIColor lightGrayColor]];
|
||||
XCTAssertNotNil(bubbleImage, @"Bubble image should not be nil");
|
||||
|
||||
XCTAssertNotNil(bubbleImage.messageBubbleImage, "Image should not be nil");
|
||||
XCTAssertEqual(bubbleImage.messageBubbleImage.scale, bubble.scale, @"Image scale should equal bubble image scale");
|
||||
XCTAssertEqual(bubbleImage.messageBubbleImage.imageOrientation, UIImageOrientationUpMirrored, @"Image orientation should be flipped");
|
||||
XCTAssertTrue(bubbleImage.messageBubbleImage.resizingMode == UIImageResizingModeStretch, @"Image should be stretchable");
|
||||
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(bubbleImage.messageBubbleImage.capInsets, capInsets), @"Image capInsets should be equal to capInsets");
|
||||
|
||||
XCTAssertNotNil(bubbleImage.messageBubbleHighlightedImage, @"Highlighted image should not be nil");
|
||||
XCTAssertEqual(bubbleImage.messageBubbleHighlightedImage.scale, bubble.scale, @"HighlightedImage scale should equal bubble image scale");
|
||||
XCTAssertEqual(bubbleImage.messageBubbleHighlightedImage.imageOrientation, UIImageOrientationUpMirrored, @"Image orientation should be flipped");
|
||||
XCTAssertTrue(bubbleImage.messageBubbleHighlightedImage.resizingMode == UIImageResizingModeStretch, @"HighlightedImage should be stretchable");
|
||||
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(bubbleImage.messageBubbleHighlightedImage.capInsets, capInsets), @"HighlightedImage capInsets should be equal to capInsets");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,37 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQMessagesMediaViewBubbleImageMasker.h"
|
||||
|
||||
|
||||
@interface JSQMessagesMediaViewBubbleImageMaskerTests : XCTestCase
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesMediaViewBubbleImageMaskerTests
|
||||
|
||||
- (void)testMediaViewBubbleImageMasker
|
||||
{
|
||||
// GIVEN: a new masker object
|
||||
JSQMessagesMediaViewBubbleImageMasker *masker = [[JSQMessagesMediaViewBubbleImageMasker alloc] init];
|
||||
XCTAssertNotNil(masker);
|
||||
|
||||
// WHEN: we apply a mask to a view
|
||||
UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
|
||||
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
|
||||
|
||||
// THEN: it succeeds without an error
|
||||
XCTAssertNoThrow([masker applyOutgoingBubbleImageMaskToMediaView:view1]);
|
||||
XCTAssertNoThrow([masker applyIncomingBubbleImageMaskToMediaView:view2]);
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,104 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQMessagesTimestampFormatter.h"
|
||||
|
||||
|
||||
@interface JSQMessagesTimestampFormatterTests : XCTestCase
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesTimestampFormatterTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testTimestampFormatterInit
|
||||
{
|
||||
JSQMessagesTimestampFormatter *formatter = [JSQMessagesTimestampFormatter sharedFormatter];
|
||||
XCTAssertNotNil(formatter, @"Formatter should not be nil");
|
||||
XCTAssertEqualObjects(formatter, [JSQMessagesTimestampFormatter sharedFormatter], @"Shared formatter should return the same instance");
|
||||
|
||||
UIColor *color = [UIColor lightGrayColor];
|
||||
|
||||
NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
|
||||
paragraphStyle.alignment = NSTextAlignmentCenter;
|
||||
|
||||
NSDictionary *dateAttrs = @{ NSFontAttributeName : [UIFont boldSystemFontOfSize:12.0f],
|
||||
NSForegroundColorAttributeName : color,
|
||||
NSParagraphStyleAttributeName : paragraphStyle };
|
||||
|
||||
NSDictionary *timeAttrs = @{ NSFontAttributeName : [UIFont systemFontOfSize:12.0f],
|
||||
NSForegroundColorAttributeName : color,
|
||||
NSParagraphStyleAttributeName : paragraphStyle };
|
||||
|
||||
XCTAssertEqualObjects(formatter.dateTextAttributes, dateAttrs, @"Date attributes should be equal to default values");
|
||||
|
||||
XCTAssertEqualObjects(formatter.timeTextAttributes, timeAttrs, @"Time attributes should be equal to default values");
|
||||
|
||||
XCTAssertNotNil(formatter.dateFormatter, @"Property should not be nil");
|
||||
}
|
||||
|
||||
- (void)testTimestampForDate
|
||||
{
|
||||
NSDateComponents *components = [[NSDateComponents alloc] init];
|
||||
[components setCalendar:[NSCalendar currentCalendar]];
|
||||
[components setYear:2013];
|
||||
[components setMonth:6];
|
||||
[components setDay:6];
|
||||
[components setHour:19];
|
||||
[components setMinute:6];
|
||||
[components setSecond:0];
|
||||
|
||||
NSDate *date = [components date];
|
||||
|
||||
NSString *timestampString = [[JSQMessagesTimestampFormatter sharedFormatter] timestampForDate:date];
|
||||
|
||||
XCTAssertEqualObjects(timestampString, @"Jun 6, 2013, 7:06 PM", @"Timestamp string should return expected value");
|
||||
|
||||
NSAttributedString *timestampAttributedString = [[JSQMessagesTimestampFormatter sharedFormatter] attributedTimestampForDate:date];
|
||||
|
||||
XCTAssertEqualObjects([timestampAttributedString string], @"Jun 6, 2013 7:06 PM", @"Attributed timestamp string should return expected value");
|
||||
}
|
||||
|
||||
- (void)testTimeForDate
|
||||
{
|
||||
NSDateComponents *components = [[NSDateComponents alloc] init];
|
||||
[components setCalendar:[NSCalendar currentCalendar]];
|
||||
[components setHour:7];
|
||||
[components setMinute:6];
|
||||
[components setSecond:0];
|
||||
|
||||
NSDate *date = [components date];
|
||||
|
||||
NSString *timeForDateString = [[JSQMessagesTimestampFormatter sharedFormatter] timeForDate:date];
|
||||
|
||||
XCTAssertEqualObjects(timeForDateString, @"7:06 AM", @"Time string should return expected value");
|
||||
}
|
||||
|
||||
- (void)testRelativeDataForDate
|
||||
{
|
||||
NSDate *date = [NSDate date];
|
||||
|
||||
NSString *relativeDateString = [[JSQMessagesTimestampFormatter sharedFormatter] relativeDateForDate:date];
|
||||
|
||||
XCTAssertEqualObjects(relativeDateString, @"Today", @"Relative date string shoudl return expected value");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,37 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQMessagesToolbarButtonFactory.h"
|
||||
|
||||
#import "UIColor+JSQMessages.h"
|
||||
|
||||
|
||||
@interface JSQMessagesToolbarButtonFactoryTests : XCTestCase
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesToolbarButtonFactoryTests
|
||||
|
||||
- (void)testDefaultSendButtonItem
|
||||
{
|
||||
UIButton *button = [JSQMessagesToolbarButtonFactory defaultSendButtonItem];
|
||||
XCTAssertNotNil(button, @"Button should not be nil");
|
||||
}
|
||||
|
||||
- (void)testDefaultAccessoryButtonItem
|
||||
{
|
||||
UIButton *button = [JSQMessagesToolbarButtonFactory defaultAccessoryButtonItem];
|
||||
XCTAssertNotNil(button, @"Button should not be nil");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,24 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.hexedbits.$(PRODUCT_NAME:rfc1034identifier)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -1,38 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQMessagesCollectionViewFlowLayout.h"
|
||||
|
||||
|
||||
@interface JSQMessagesCollectionViewFlowLayoutTests : XCTestCase
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesCollectionViewFlowLayoutTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testFlowLayoutInit
|
||||
{
|
||||
JSQMessagesCollectionViewFlowLayout *layout = [[JSQMessagesCollectionViewFlowLayout alloc] init];
|
||||
XCTAssertNotNil(layout, @"Layout should not be nil");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,52 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQMessagesCollectionViewLayoutAttributes.h"
|
||||
|
||||
|
||||
@interface JSQMessagesCollectionViewLayoutAttributesTests : XCTestCase
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesCollectionViewLayoutAttributesTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testLayoutAttributesInitAndIsEqual
|
||||
{
|
||||
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];
|
||||
JSQMessagesCollectionViewLayoutAttributes *attrs = [JSQMessagesCollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
|
||||
attrs.messageBubbleFont = [UIFont systemFontOfSize:15.0f];
|
||||
attrs.messageBubbleContainerViewWidth = 40.0f;
|
||||
attrs.textViewTextContainerInsets = UIEdgeInsetsMake(10.0f, 8.0f, 10.0f, 8.0f);
|
||||
attrs.textViewFrameInsets = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, 6.0f);
|
||||
attrs.incomingAvatarViewSize = CGSizeMake(34.0f, 34.0f);
|
||||
attrs.outgoingAvatarViewSize = CGSizeZero;
|
||||
attrs.cellTopLabelHeight = 20.0f;
|
||||
attrs.messageBubbleTopLabelHeight = 10.0f;
|
||||
attrs.cellBottomLabelHeight = 15.0f;
|
||||
XCTAssertNotNil(attrs, @"Layout attributes should not be nil");
|
||||
|
||||
JSQMessagesCollectionViewLayoutAttributes *copy = [attrs copy];
|
||||
XCTAssertEqualObjects(attrs, copy, @"Copied attributes should be equal");
|
||||
XCTAssertEqual([attrs hash], [copy hash], @"Copied attributes hashes should be equal");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,64 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQLocationMediaItem.h"
|
||||
|
||||
|
||||
@interface JSQLocationMediaItemTests : XCTestCase
|
||||
|
||||
@property (strong, nonatomic) CLLocation *location;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQLocationMediaItemTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
self.location = [[CLLocation alloc] initWithLatitude:37.795313 longitude:-122.393757];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
self.location = nil;
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testLocationItemInit
|
||||
{
|
||||
JSQLocationMediaItem *item = [[JSQLocationMediaItem alloc] initWithLocation:self.location];
|
||||
XCTAssertNotNil(item);
|
||||
}
|
||||
|
||||
- (void)testMediaDataProtocol
|
||||
{
|
||||
JSQLocationMediaItem *item = [[JSQLocationMediaItem alloc] init];
|
||||
|
||||
XCTAssertTrue(!CGSizeEqualToSize([item mediaViewDisplaySize], CGSizeZero));
|
||||
XCTAssertNotNil([item mediaPlaceholderView]);
|
||||
XCTAssertNil([item mediaView], @"Media view should be nil if location is nil");
|
||||
|
||||
XCTestExpectation *expectation = [self expectationWithDescription:[NSString stringWithFormat:@"%s", __PRETTY_FUNCTION__]];
|
||||
|
||||
[item setLocation:self.location withCompletionHandler:^{
|
||||
[expectation fulfill];
|
||||
}];
|
||||
|
||||
[self waitForExpectationsWithTimeout:5 handler:^(NSError *error) {
|
||||
XCTAssertNil(error, @"Expectation should not error");
|
||||
}];
|
||||
|
||||
XCTAssertNotNil([item mediaView], @"Media view should NOT be nil once item has media data");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,112 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import <OCMock/OCMock.h>
|
||||
|
||||
#import "JSQMessage.h"
|
||||
|
||||
|
||||
// Fake media object for testing
|
||||
@interface FakeMedia : NSObject <JSQMessageMediaData, NSCoding>
|
||||
@end
|
||||
|
||||
@implementation FakeMedia
|
||||
|
||||
- (UIView *)mediaView { return [UIView new]; }
|
||||
- (UIView *)mediaPlaceholderView { return [self mediaView]; }
|
||||
- (CGSize)mediaViewDisplaySize { return CGSizeMake(50, 50); }
|
||||
|
||||
- (void)encodeWithCoder:(NSCoder *)aCoder { }
|
||||
- (id)initWithCoder:(NSCoder *)aDecoder { return [self init]; }
|
||||
|
||||
- (BOOL)isEqual:(id)object { return YES; }
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
||||
|
||||
@interface JSQMessageMediaTests : XCTestCase
|
||||
|
||||
@property (strong, nonatomic) NSString *senderId;
|
||||
@property (strong, nonatomic) NSString *senderDisplayName;
|
||||
@property (strong, nonatomic) NSDate *date;
|
||||
@property (strong, nonatomic) id<JSQMessageMediaData> mockMediaData;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessageMediaTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
self.senderId = @"324543-43556-212343";
|
||||
self.senderDisplayName = @"Jesse Squires";
|
||||
self.date = [NSDate date];
|
||||
self.mockMediaData = [OCMockObject mockForProtocol:@protocol(JSQMessageMediaData)];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
self.senderId = nil;
|
||||
self.senderDisplayName = nil;
|
||||
self.date = nil;
|
||||
self.mockMediaData = nil;
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testMediaMessageInit
|
||||
{
|
||||
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId
|
||||
senderDisplayName:self.senderDisplayName
|
||||
date:self.date
|
||||
media:self.mockMediaData];
|
||||
XCTAssertNotNil(msg, @"Message should not be nil");
|
||||
}
|
||||
|
||||
- (void)testMediaMessageInvalidInit
|
||||
{
|
||||
XCTAssertThrows([[JSQMessage alloc] init], @"Invalid init should throw");
|
||||
XCTAssertThrows([[JSQMessage alloc] initWithSenderId:nil senderDisplayName:nil date:nil media:nil], @"Invalid init should throw");
|
||||
}
|
||||
|
||||
- (void)testMediaMessageIsEqual
|
||||
{
|
||||
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId
|
||||
senderDisplayName:self.senderDisplayName
|
||||
date:self.date
|
||||
media:self.mockMediaData];
|
||||
JSQMessage *copy = [msg copy];
|
||||
|
||||
XCTAssertEqualObjects(msg, copy, @"Copied messages should be equal");
|
||||
|
||||
XCTAssertEqual([msg hash], [copy hash], @"Copied messages hashes should be equal");
|
||||
|
||||
XCTAssertEqualObjects(msg, msg, @"Messages should be equal to itself");
|
||||
}
|
||||
|
||||
- (void)testMediaMessageArchiving
|
||||
{
|
||||
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId
|
||||
senderDisplayName:self.senderDisplayName
|
||||
date:self.date
|
||||
media:[FakeMedia new]];
|
||||
|
||||
NSData *msgData = [NSKeyedArchiver archivedDataWithRootObject:msg];
|
||||
|
||||
JSQMessage *unarchivedMsg = [NSKeyedUnarchiver unarchiveObjectWithData:msgData];
|
||||
|
||||
XCTAssertEqualObjects(msg, unarchivedMsg, @"Message should be equal");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,95 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQMessage.h"
|
||||
|
||||
|
||||
@interface JSQMessageTextTests : XCTestCase
|
||||
|
||||
@property (strong, nonatomic) NSString *senderId;
|
||||
@property (strong, nonatomic) NSString *senderDisplayName;
|
||||
@property (strong, nonatomic) NSDate *date;
|
||||
@property (strong, nonatomic) NSString *text;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessageTextTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
|
||||
self.senderId = @"324543-43556-212343";
|
||||
self.senderDisplayName = @"Jesse Squires";
|
||||
self.date = [NSDate date];
|
||||
|
||||
self.text = @"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque"
|
||||
@"laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi"
|
||||
@"architecto beatae vitae dicta sunt explicabo.";
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
self.senderId = nil;
|
||||
self.senderDisplayName = nil;
|
||||
self.date = nil;
|
||||
self.text = nil;
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
#pragma mark - Text messages
|
||||
|
||||
- (void)testTextMessageInit
|
||||
{
|
||||
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId
|
||||
senderDisplayName:self.senderDisplayName
|
||||
date:self.date
|
||||
text:self.text];
|
||||
XCTAssertNotNil(msg, @"Message should not be nil");
|
||||
}
|
||||
|
||||
- (void)testTextMessageInvalidInit
|
||||
{
|
||||
XCTAssertThrows([[JSQMessage alloc] init], @"Invalid init should throw");
|
||||
XCTAssertThrows([[JSQMessage alloc] initWithSenderId:nil senderDisplayName:nil date:nil text:nil], @"Invalid init should throw");
|
||||
}
|
||||
|
||||
- (void)testTextMessageIsEqual
|
||||
{
|
||||
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId
|
||||
senderDisplayName:self.senderDisplayName
|
||||
date:self.date
|
||||
text:self.text];
|
||||
JSQMessage *copy = [msg copy];
|
||||
|
||||
XCTAssertEqualObjects(msg, copy, @"Copied messages should be equal");
|
||||
|
||||
XCTAssertEqual([msg hash], [copy hash], @"Copied messages hashes should be equal");
|
||||
|
||||
XCTAssertEqualObjects(msg, msg, @"Messages should be equal to itself");
|
||||
}
|
||||
|
||||
- (void)testTextMessageArchiving
|
||||
{
|
||||
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId
|
||||
senderDisplayName:self.senderDisplayName
|
||||
date:self.date
|
||||
text:self.text];
|
||||
NSData *msgData = [NSKeyedArchiver archivedDataWithRootObject:msg];
|
||||
|
||||
JSQMessage *unarchivedMsg = [NSKeyedUnarchiver unarchiveObjectWithData:msgData];
|
||||
|
||||
XCTAssertEqualObjects(msg, unarchivedMsg, @"Message should be equal");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,75 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQMessagesAvatarImage.h"
|
||||
|
||||
|
||||
@interface JSQMessagesAvatarImageTests : XCTestCase
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesAvatarImageTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testInitInvalid
|
||||
{
|
||||
XCTAssertThrows([[JSQMessagesAvatarImage alloc] init], @"Invalid init should throw");
|
||||
XCTAssertThrows([JSQMessagesAvatarImage avatarImageWithPlaceholder:nil], @"Invalid init should throw");
|
||||
XCTAssertThrows([[JSQMessagesAvatarImage alloc] initWithAvatarImage:nil highlightedImage:nil placeholderImage:nil], @"Invalid init should throw");
|
||||
}
|
||||
|
||||
- (void)testInitValid
|
||||
{
|
||||
UIImage *mockImage = [UIImage imageNamed:@"demo_avatar_jobs"];
|
||||
JSQMessagesAvatarImage *avatar = [JSQMessagesAvatarImage avatarImageWithPlaceholder:mockImage];
|
||||
XCTAssertNotNil(avatar, @"Valid init should succeed");
|
||||
|
||||
JSQMessagesAvatarImage *avatar2 = [JSQMessagesAvatarImage avatarWithImage:mockImage];
|
||||
XCTAssertNotNil(avatar2, @"Valid init should succeed");
|
||||
|
||||
XCTAssertEqualObjects(avatar2.avatarImage, avatar2.avatarHighlightedImage);
|
||||
XCTAssertEqualObjects(avatar2.avatarHighlightedImage, avatar2.avatarPlaceholderImage);
|
||||
}
|
||||
|
||||
- (void)testCopy
|
||||
{
|
||||
UIImage *mockImage = [UIImage imageNamed:@"demo_avatar_jobs"];
|
||||
JSQMessagesAvatarImage *avatar = [[JSQMessagesAvatarImage alloc] initWithAvatarImage:mockImage
|
||||
highlightedImage:mockImage
|
||||
placeholderImage:mockImage];
|
||||
|
||||
JSQMessagesAvatarImage *copy = [avatar copy];
|
||||
XCTAssertNotNil(copy, @"Copy should succeed");
|
||||
|
||||
XCTAssertFalse(avatar == copy, @"Copy should return new, distinct instance");
|
||||
|
||||
XCTAssertNotEqualObjects(avatar.avatarImage, copy.avatarImage, @"Images should not be equal");
|
||||
XCTAssertNotEqual(avatar.avatarImage, copy.avatarImage, @"Images should not be equal");
|
||||
|
||||
XCTAssertNotEqualObjects(avatar.avatarHighlightedImage, copy.avatarHighlightedImage, @"Images should not be equal");
|
||||
XCTAssertNotEqual(avatar.avatarHighlightedImage, copy.avatarHighlightedImage, @"Images should not be equal");
|
||||
|
||||
XCTAssertNotEqualObjects(avatar.avatarPlaceholderImage, copy.avatarPlaceholderImage, @"Images should not be equal");
|
||||
XCTAssertNotEqual(avatar.avatarPlaceholderImage, copy.avatarPlaceholderImage, @"Images should not be equal");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,65 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQMessagesBubbleImage.h"
|
||||
|
||||
#import "UIImage+JSQMessages.h"
|
||||
|
||||
|
||||
@interface JSQMessagesBubbleImageTests : XCTestCase
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesBubbleImageTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testInitInvalid
|
||||
{
|
||||
XCTAssertThrows([[JSQMessagesBubbleImage alloc] init], @"Invalid init should throw");
|
||||
XCTAssertThrows([[JSQMessagesBubbleImage alloc] initWithMessageBubbleImage:nil highlightedImage:nil], @"Invalid init should throw");
|
||||
}
|
||||
|
||||
- (void)testInitValid
|
||||
{
|
||||
UIImage *mockImage = [UIImage jsq_bubbleCompactImage];
|
||||
JSQMessagesBubbleImage *bubbleImage = [[JSQMessagesBubbleImage alloc] initWithMessageBubbleImage:mockImage highlightedImage:mockImage];
|
||||
XCTAssertNotNil(bubbleImage, @"Valid init should succeed");
|
||||
}
|
||||
|
||||
- (void)testCopy
|
||||
{
|
||||
UIImage *mockImage = [UIImage jsq_bubbleCompactImage];
|
||||
JSQMessagesBubbleImage *bubbleImage = [[JSQMessagesBubbleImage alloc] initWithMessageBubbleImage:mockImage highlightedImage:mockImage];
|
||||
|
||||
JSQMessagesBubbleImage *copy = [bubbleImage copy];
|
||||
XCTAssertNotNil(copy, @"Copy should succeed");
|
||||
|
||||
XCTAssertFalse(bubbleImage == copy, @"Copy should return new, distinct instance");
|
||||
|
||||
XCTAssertNotEqualObjects(bubbleImage.messageBubbleImage, copy.messageBubbleImage, @"Images should not be equal");
|
||||
XCTAssertNotEqual(bubbleImage.messageBubbleImage, copy.messageBubbleImage, @"Images should not be equal");
|
||||
|
||||
XCTAssertNotEqualObjects(bubbleImage.messageBubbleHighlightedImage, copy.messageBubbleHighlightedImage, @"Images should not be equal");
|
||||
XCTAssertNotEqual(bubbleImage.messageBubbleHighlightedImage, copy.messageBubbleHighlightedImage, @"Images should not be equal");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,76 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQPhotoMediaItem.h"
|
||||
|
||||
|
||||
@interface JSQPhotoMediaItemTests : XCTestCase
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQPhotoMediaItemTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testPhotoItemInit
|
||||
{
|
||||
JSQPhotoMediaItem *item = [[JSQPhotoMediaItem alloc] initWithImage:[UIImage new]];
|
||||
XCTAssertNotNil(item);
|
||||
}
|
||||
|
||||
- (void)testPhotoItemIsEqual
|
||||
{
|
||||
JSQPhotoMediaItem *item = [[JSQPhotoMediaItem alloc] initWithImage:[UIImage imageNamed:@"demo_avatar_jobs"]];
|
||||
|
||||
JSQPhotoMediaItem *copy = [item copy];
|
||||
|
||||
XCTAssertEqualObjects(item, copy, @"Copied items should be equal");
|
||||
|
||||
XCTAssertEqual([item hash], [copy hash], @"Copied item hashes should be equal");
|
||||
|
||||
XCTAssertEqualObjects(item, item, @"Item should be equal to itself");
|
||||
}
|
||||
|
||||
- (void)testPhotoItemArchiving
|
||||
{
|
||||
JSQPhotoMediaItem *item = [[JSQPhotoMediaItem alloc] initWithImage:[UIImage new]];
|
||||
|
||||
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:item];
|
||||
|
||||
JSQPhotoMediaItem *unarchivedItem = [NSKeyedUnarchiver unarchiveObjectWithData:data];
|
||||
|
||||
XCTAssertEqualObjects(item, unarchivedItem);
|
||||
}
|
||||
|
||||
- (void)testMediaDataProtocol
|
||||
{
|
||||
JSQPhotoMediaItem *item = [[JSQPhotoMediaItem alloc] initWithImage:nil];
|
||||
|
||||
XCTAssertTrue(!CGSizeEqualToSize([item mediaViewDisplaySize], CGSizeZero));
|
||||
XCTAssertNotNil([item mediaPlaceholderView]);
|
||||
XCTAssertNil([item mediaView], @"Media view should be nil if image is nil");
|
||||
|
||||
item.image = [UIImage imageNamed:@"demo_avatar_jobs"];
|
||||
|
||||
XCTAssertNotNil([item mediaView], @"Media view should NOT be nil once item has media data");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,77 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQVideoMediaItem.h"
|
||||
|
||||
|
||||
@interface JSQVideoMediaItemTests : XCTestCase
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQVideoMediaItemTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testVideoMediaItemInit
|
||||
{
|
||||
JSQVideoMediaItem *item = [[JSQVideoMediaItem alloc] initWithFileURL:[NSURL URLWithString:@"file://"] isReadyToPlay:NO];
|
||||
XCTAssertNotNil(item);
|
||||
}
|
||||
|
||||
- (void)testVideoItemIsEqual
|
||||
{
|
||||
JSQVideoMediaItem *item = [[JSQVideoMediaItem alloc] initWithFileURL:[NSURL URLWithString:@"file://"] isReadyToPlay:YES];
|
||||
|
||||
JSQVideoMediaItem *copy = [item copy];
|
||||
|
||||
XCTAssertEqualObjects(item, copy, @"Copied items should be equal");
|
||||
|
||||
XCTAssertEqual([item hash], [copy hash], @"Copied item hashes should be equal");
|
||||
|
||||
XCTAssertEqualObjects(item, item, @"Item should be equal to itself");
|
||||
}
|
||||
|
||||
- (void)testVideoItemArchiving
|
||||
{
|
||||
JSQVideoMediaItem *item = [[JSQVideoMediaItem alloc] initWithFileURL:[NSURL URLWithString:@"file://"] isReadyToPlay:YES];
|
||||
|
||||
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:item];
|
||||
|
||||
JSQVideoMediaItem *unarchivedItem = [NSKeyedUnarchiver unarchiveObjectWithData:data];
|
||||
|
||||
XCTAssertEqualObjects(item, unarchivedItem);
|
||||
}
|
||||
|
||||
- (void)testMediaDataProtocol
|
||||
{
|
||||
JSQVideoMediaItem *item = [[JSQVideoMediaItem alloc] init];
|
||||
|
||||
XCTAssertTrue(!CGSizeEqualToSize([item mediaViewDisplaySize], CGSizeZero));
|
||||
XCTAssertNotNil([item mediaPlaceholderView]);
|
||||
XCTAssertNil([item mediaView], @"Media view should be nil if fileURL is nil, and readyToPlay is NO");
|
||||
|
||||
item.fileURL = [NSURL URLWithString:@"file://"];
|
||||
item.isReadyToPlay = YES;
|
||||
|
||||
XCTAssertNotNil([item mediaView], @"Media view should NOT be nil once item has media data");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,53 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQMessagesCollectionViewCellIncoming.h"
|
||||
#import "JSQMessagesCollectionViewCellOutgoing.h"
|
||||
|
||||
|
||||
@interface JSQMessagesCollectionViewCellTests : XCTestCase
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesCollectionViewCellTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testMessagesIncomingCollectionViewCellInit
|
||||
{
|
||||
UINib *incomingCell = [JSQMessagesCollectionViewCellIncoming nib];
|
||||
XCTAssertNotNil(incomingCell, @"Nib should not be nil");
|
||||
|
||||
NSString *incomingCellId = [JSQMessagesCollectionViewCellIncoming cellReuseIdentifier];
|
||||
XCTAssertNotNil(incomingCellId, @"Cell identifier should not be nil");
|
||||
XCTAssertEqualObjects(incomingCellId, NSStringFromClass([JSQMessagesCollectionViewCellIncoming class]));
|
||||
}
|
||||
|
||||
- (void)testMessagesOutgoingCollectionViewCellInit
|
||||
{
|
||||
UINib *outgoingCell = [JSQMessagesCollectionViewCellOutgoing nib];
|
||||
XCTAssertNotNil(outgoingCell, @"Nib should not be nil");
|
||||
|
||||
NSString *outgoingCellId = [JSQMessagesCollectionViewCellOutgoing cellReuseIdentifier];
|
||||
XCTAssertNotNil(outgoingCellId, @"Cell identifier should not be nil");
|
||||
XCTAssertEqualObjects(outgoingCellId, NSStringFromClass([JSQMessagesCollectionViewCellOutgoing class]));
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,47 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQMessagesCollectionView.h"
|
||||
#import "JSQMessagesCollectionViewFlowLayout.h"
|
||||
|
||||
|
||||
@interface JSQMessagesCollectionViewTests : XCTestCase
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesCollectionViewTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testCollectionViewInit
|
||||
{
|
||||
JSQMessagesCollectionViewFlowLayout *layout = [[JSQMessagesCollectionViewFlowLayout alloc] init];
|
||||
|
||||
JSQMessagesCollectionView *view = [[JSQMessagesCollectionView alloc] initWithFrame:[UIScreen mainScreen].bounds
|
||||
collectionViewLayout:layout];
|
||||
|
||||
XCTAssertNotNil(view, @"Collection view should not be nil");
|
||||
XCTAssertEqualObjects(view.backgroundColor, [UIColor whiteColor], @"Property should be equal to default value");
|
||||
XCTAssertEqual(view.keyboardDismissMode, UIScrollViewKeyboardDismissModeInteractive, @"Property should be equal to default value");
|
||||
XCTAssertEqual(view.alwaysBounceVertical, YES, @"Property should be equal to default value");
|
||||
XCTAssertEqual(view.bounces, YES, @"Property should be equal to default value");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,70 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQMessagesComposerTextView.h"
|
||||
|
||||
|
||||
@interface JSQMessagesComposerTextViewTests : XCTestCase
|
||||
|
||||
@property (strong, nonatomic) JSQMessagesComposerTextView *textView;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesComposerTextViewTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
|
||||
self.textView = [[JSQMessagesComposerTextView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 300.0f, 50.0f)
|
||||
textContainer:[NSTextContainer new]];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
self.textView = nil;
|
||||
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testComposerTextViewInit
|
||||
{
|
||||
XCTAssertNotNil(self.textView, @"Text view should not be nil");
|
||||
|
||||
XCTAssertNil(self.textView.text, @"Property should be equal to default value");
|
||||
XCTAssertNil(self.textView.placeHolder, @"Property should be equal to default value");
|
||||
XCTAssertEqualObjects(self.textView.placeHolderTextColor, [UIColor lightGrayColor], @"Property should be equal to default value");
|
||||
|
||||
XCTAssertEqualObjects(self.textView.backgroundColor, [UIColor whiteColor], @"Property should be equal to default value");
|
||||
|
||||
XCTAssertEqual(self.textView.layer.borderWidth, 0.5f, @"Property should be equal to default value");
|
||||
XCTAssertEqual(self.textView.layer.borderColor, [UIColor lightGrayColor].CGColor, @"Property should be equal to default value");
|
||||
XCTAssertEqual(self.textView.layer.cornerRadius, 6.0f, @"Property should be equal to default value");
|
||||
|
||||
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.textView.scrollIndicatorInsets, UIEdgeInsetsMake(6.0f, 0.0f, 6.0f, 0.0f)), @"Property should be equal to default value");
|
||||
|
||||
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.textView.textContainerInset, UIEdgeInsetsMake(4.0f, 2.0f, 4.0f, 2.0f)), @"Property should be equal to default value");
|
||||
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.textView.contentInset, UIEdgeInsetsMake(1.0f, 0.0f, 1.0f, 0.0f)), @"Property should be equal to default value");
|
||||
|
||||
XCTAssertEqual(self.textView.scrollEnabled, YES, @"Property should be equal to default value");
|
||||
XCTAssertEqual(self.textView.scrollsToTop, NO, @"Property should be equal to default value");
|
||||
XCTAssertEqual(self.textView.userInteractionEnabled, YES, @"Property should be equal to default value");
|
||||
|
||||
XCTAssertEqual(self.textView.contentMode, UIViewContentModeRedraw, @"Property should be equal to default value");
|
||||
XCTAssertEqual(self.textView.dataDetectorTypes, UIDataDetectorTypeNone, @"Property should be equal to default value");
|
||||
XCTAssertEqual(self.textView.keyboardAppearance, UIKeyboardAppearanceDefault, @"Property should be equal to default value");
|
||||
XCTAssertEqual(self.textView.keyboardType, UIKeyboardTypeDefault, @"Property should be equal to default value");
|
||||
XCTAssertEqual(self.textView.returnKeyType, UIReturnKeyDefault, @"Property should be equal to default value");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,44 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQMessagesViewController.h"
|
||||
#import "JSQMessagesInputToolbar.h"
|
||||
|
||||
|
||||
@interface JSQMessagesInputToolbarTests : XCTestCase
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesInputToolbarTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testInputToolbarInit
|
||||
{
|
||||
JSQMessagesViewController *vc = [JSQMessagesViewController messagesViewController];
|
||||
[vc loadView];
|
||||
|
||||
JSQMessagesInputToolbar *toolbar = vc.inputToolbar;
|
||||
XCTAssertNotNil(toolbar, @"Toolbar should not be nil");
|
||||
XCTAssertNotNil(toolbar.contentView, @"Toolbar content view should not be nil");
|
||||
XCTAssertEqual(toolbar.sendButtonOnRight, YES, @"Property should be equal to default value");
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,39 +0,0 @@
|
||||
//
|
||||
// Created by Jesse Squires
|
||||
// http://www.jessesquires.com
|
||||
//
|
||||
//
|
||||
// MIT License
|
||||
// Copyright (c) 2014 Jesse Squires
|
||||
// http://opensource.org/licenses/MIT
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "JSQMessagesLabel.h"
|
||||
|
||||
|
||||
@interface JSQMessagesLabelTests : XCTestCase
|
||||
@end
|
||||
|
||||
|
||||
@implementation JSQMessagesLabelTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
[super setUp];
|
||||
}
|
||||
|
||||
- (void)tearDown
|
||||
{
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testMessagesLabelInit
|
||||
{
|
||||
JSQMessagesLabel *label = [[JSQMessagesLabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 200.0f, 40.0f)];
|
||||
XCTAssertNotNil(label, @"Label should not be nil");
|
||||
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(label.textInsets, UIEdgeInsetsZero), @"Property should be equal to default value");
|
||||
}
|
||||
|
||||
@end
|
||||