├── .gitignore
├── .travis.yml
├── Attributes
├── CoreText and TextKit Attributes.pdf
├── CoreText and TextKit
│ ├── Attachment.png
│ ├── BackgroundColor.png
│ ├── Baseline.png
│ ├── Color.png
│ ├── Effect.png
│ ├── Expansion.png
│ ├── Font.png
│ ├── Kern.png
│ ├── Ligature.png
│ ├── Link.png
│ ├── Obliqueness.png
│ ├── Paragraph
│ │ ├── Alignment.png
│ │ ├── BaseWritingDirection.png
│ │ ├── FirstLineHeadIndent.png
│ │ ├── HeadIndent.png
│ │ ├── HyphenationFactor.png
│ │ ├── LineBreakMode.png
│ │ ├── LineHeightMultiple.png
│ │ ├── LineSpacing.png
│ │ ├── MaximumLineHeight.png
│ │ ├── MinimumLineHeight.png
│ │ ├── ParagraphSpacing.png
│ │ ├── Tab.png
│ │ └── TailIndent.png
│ ├── Ruby.png
│ ├── RunDelegate.png
│ ├── Shadow.png
│ ├── Strikethrough.png
│ ├── StrikethroughColor.png
│ ├── Stroke.png
│ ├── StrokeColor.png
│ ├── Superscript.png
│ ├── Underline.png
│ ├── UnderlineColor.png
│ ├── VerticalForms.png
│ └── WriteDirection.png
├── YYText Extended
│ ├── YYTextAttachment.gif
│ ├── YYTextBackedString.png
│ ├── YYTextBackgroundBorder.png
│ ├── YYTextBinding.gif
│ ├── YYTextBlockBorder.png
│ ├── YYTextBorder.png
│ ├── YYTextHighlight.gif
│ └── YYTextShadow.png
└── architecture.png
├── Demo
├── DemoSnapshot
│ ├── text_markdown.gif
│ ├── text_paste.gif
│ ├── text_path.gif
│ └── text_vertical.gif
├── YYTextDemo.xcodeproj
│ ├── project.pbxproj
│ └── project.xcworkspace
│ │ └── contents.xcworkspacedata
└── YYTextDemo
│ ├── AppDelegate.h
│ ├── AppDelegate.m
│ ├── Assets.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
│ ├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
│ ├── CALayer+YYAdd.h
│ ├── CALayer+YYAdd.m
│ ├── EmoticonQQ.bundle
│ ├── 001@2x.gif
│ ├── 001@2x.png
│ ├── 002@2x.gif
│ ├── 002@2x.png
│ ├── 003@2x.gif
│ ├── 003@2x.png
│ ├── 004@2x.gif
│ ├── 004@2x.png
│ ├── 005@2x.gif
│ ├── 005@2x.png
│ ├── 006@2x.gif
│ ├── 006@2x.png
│ ├── 007@2x.gif
│ ├── 007@2x.png
│ ├── 008@2x.gif
│ ├── 008@2x.png
│ ├── 009@2x.gif
│ ├── 009@2x.png
│ ├── 010@2x.gif
│ ├── 010@2x.png
│ ├── 011@2x.gif
│ ├── 011@2x.png
│ ├── 012@2x.gif
│ ├── 012@2x.png
│ ├── 013@2x.gif
│ ├── 013@2x.png
│ ├── 014@2x.gif
│ ├── 014@2x.png
│ ├── 015@2x.gif
│ ├── 015@2x.png
│ ├── 016@2x.gif
│ ├── 016@2x.png
│ ├── 017@2x.gif
│ ├── 017@2x.png
│ ├── 018@2x.gif
│ ├── 018@2x.png
│ ├── 019@2x.gif
│ ├── 019@2x.png
│ ├── 020@2x.gif
│ ├── 020@2x.png
│ ├── 021@2x.gif
│ ├── 021@2x.png
│ ├── 022@2x.gif
│ ├── 022@2x.png
│ ├── 023@2x.gif
│ ├── 023@2x.png
│ ├── 024@2x.gif
│ ├── 024@2x.png
│ ├── 025@2x.gif
│ ├── 025@2x.png
│ ├── 026@2x.gif
│ ├── 026@2x.png
│ ├── 027@2x.gif
│ ├── 027@2x.png
│ ├── 028@2x.gif
│ ├── 028@2x.png
│ ├── 029@2x.gif
│ ├── 029@2x.png
│ ├── 030@2x.gif
│ ├── 030@2x.png
│ ├── 031@2x.gif
│ ├── 031@2x.png
│ ├── 032@2x.gif
│ ├── 032@2x.png
│ ├── 033@2x.gif
│ ├── 033@2x.png
│ ├── 034@2x.gif
│ ├── 034@2x.png
│ ├── 035@2x.gif
│ ├── 035@2x.png
│ ├── 036@2x.gif
│ ├── 036@2x.png
│ ├── 037@2x.gif
│ ├── 037@2x.png
│ ├── 038@2x.gif
│ ├── 038@2x.png
│ ├── 039@2x.gif
│ ├── 039@2x.png
│ ├── 040@2x.gif
│ ├── 040@2x.png
│ ├── 041@2x.gif
│ ├── 041@2x.png
│ ├── 042@2x.gif
│ ├── 042@2x.png
│ ├── 043@2x.gif
│ ├── 043@2x.png
│ ├── 044@2x.gif
│ ├── 044@2x.png
│ ├── 045@2x.gif
│ ├── 045@2x.png
│ ├── 046@2x.gif
│ ├── 046@2x.png
│ ├── 047@2x.gif
│ ├── 047@2x.png
│ ├── 048@2x.gif
│ ├── 048@2x.png
│ ├── 049@2x.gif
│ ├── 049@2x.png
│ ├── 050@2x.gif
│ ├── 050@2x.png
│ ├── 051@2x.gif
│ ├── 051@2x.png
│ ├── 052@2x.gif
│ ├── 052@2x.png
│ ├── 053@2x.gif
│ ├── 053@2x.png
│ ├── 054@2x.gif
│ ├── 054@2x.png
│ ├── 055@2x.gif
│ ├── 055@2x.png
│ ├── 056@2x.gif
│ ├── 056@2x.png
│ ├── 057@2x.gif
│ ├── 057@2x.png
│ ├── 058@2x.gif
│ ├── 058@2x.png
│ ├── 059@2x.gif
│ ├── 059@2x.png
│ ├── 060@2x.gif
│ ├── 060@2x.png
│ ├── 061@2x.gif
│ ├── 061@2x.png
│ ├── 062@2x.gif
│ ├── 062@2x.png
│ ├── 063@2x.gif
│ ├── 063@2x.png
│ ├── 064@2x.gif
│ ├── 064@2x.png
│ ├── 065@2x.gif
│ ├── 065@2x.png
│ ├── 066@2x.gif
│ ├── 066@2x.png
│ ├── 067@2x.gif
│ ├── 067@2x.png
│ ├── 068@2x.gif
│ ├── 068@2x.png
│ ├── 069@2x.gif
│ ├── 069@2x.png
│ ├── 070@2x.gif
│ ├── 070@2x.png
│ ├── 071@2x.gif
│ ├── 071@2x.png
│ ├── 072@2x.gif
│ ├── 072@2x.png
│ ├── 073@2x.gif
│ ├── 073@2x.png
│ ├── 074@2x.gif
│ ├── 074@2x.png
│ ├── 075@2x.gif
│ ├── 075@2x.png
│ ├── 076@2x.gif
│ ├── 076@2x.png
│ ├── 077@2x.gif
│ ├── 077@2x.png
│ ├── 078@2x.gif
│ ├── 078@2x.png
│ ├── 079@2x.gif
│ ├── 079@2x.png
│ ├── 080@2x.gif
│ ├── 080@2x.png
│ ├── 081@2x.gif
│ ├── 081@2x.png
│ ├── 082@2x.gif
│ ├── 082@2x.png
│ ├── 083@2x.gif
│ ├── 083@2x.png
│ ├── 084@2x.gif
│ ├── 084@2x.png
│ ├── 085@2x.gif
│ ├── 085@2x.png
│ ├── 086@2x.gif
│ ├── 086@2x.png
│ ├── 087@2x.gif
│ ├── 087@2x.png
│ ├── 088@2x.gif
│ ├── 088@2x.png
│ ├── 089@2x.gif
│ ├── 089@2x.png
│ ├── 090@2x.gif
│ ├── 090@2x.png
│ ├── 091@2x.gif
│ ├── 091@2x.png
│ ├── 092@2x.gif
│ ├── 092@2x.png
│ ├── 093@2x.gif
│ ├── 093@2x.png
│ ├── 094@2x.gif
│ ├── 094@2x.png
│ ├── 095@2x.gif
│ ├── 095@2x.png
│ ├── 096@2x.gif
│ ├── 096@2x.png
│ ├── 097@2x.gif
│ ├── 097@2x.png
│ ├── 098@2x.gif
│ ├── 098@2x.png
│ ├── 099@2x.gif
│ ├── 099@2x.png
│ ├── 100@2x.gif
│ ├── 100@2x.png
│ ├── 101@2x.gif
│ ├── 101@2x.png
│ ├── 102@2x.gif
│ ├── 102@2x.png
│ ├── 103@2x.gif
│ ├── 103@2x.png
│ ├── 104@2x.gif
│ ├── 104@2x.png
│ ├── 105@2x.gif
│ ├── 105@2x.png
│ ├── 106@2x.gif
│ ├── 106@2x.png
│ ├── 107@2x.gif
│ ├── 107@2x.png
│ ├── 108@2x.gif
│ ├── 108@2x.png
│ ├── 109@2x.gif
│ ├── 109@2x.png
│ ├── 110@2x.gif
│ ├── 110@2x.png
│ ├── 111@2x.gif
│ ├── 111@2x.png
│ ├── 112@2x.gif
│ ├── 112@2x.png
│ ├── 113@2x.gif
│ ├── 113@2x.png
│ ├── 114@2x.gif
│ ├── 114@2x.png
│ ├── 115@2x.gif
│ ├── 115@2x.png
│ ├── 116@2x.gif
│ ├── 116@2x.png
│ ├── 117@2x.gif
│ ├── 117@2x.png
│ ├── 118@2x.gif
│ ├── 118@2x.png
│ ├── 119@2x.gif
│ ├── 119@2x.png
│ ├── 120@2x.gif
│ ├── 120@2x.png
│ ├── 121@2x.gif
│ ├── 121@2x.png
│ ├── 122@2x.gif
│ ├── 122@2x.png
│ ├── 123@2x.gif
│ ├── 123@2x.png
│ ├── 124@2x.gif
│ ├── 124@2x.png
│ ├── 125@2x.gif
│ ├── 125@2x.png
│ ├── 126@2x.gif
│ ├── 126@2x.png
│ ├── 127@2x.gif
│ ├── 127@2x.png
│ ├── 128@2x.gif
│ ├── 128@2x.png
│ ├── 129@2x.gif
│ ├── 129@2x.png
│ ├── 130@2x.gif
│ ├── 130@2x.png
│ ├── 131@2x.gif
│ ├── 131@2x.png
│ ├── 132@2x.gif
│ ├── 132@2x.png
│ ├── 133@2x.gif
│ ├── 133@2x.png
│ ├── 134@2x.gif
│ ├── 134@2x.png
│ ├── 135@2x.gif
│ ├── 135@2x.png
│ ├── 136@2x.gif
│ ├── 136@2x.png
│ ├── 137@2x.gif
│ ├── 137@2x.png
│ ├── 138@2x.gif
│ ├── 138@2x.png
│ ├── 139@2x.gif
│ ├── 139@2x.png
│ ├── 140@2x.gif
│ ├── 140@2x.png
│ ├── 141@2x.gif
│ ├── 141@2x.png
│ └── info.plist
│ ├── Info.plist
│ ├── NSBundle+YYAdd.h
│ ├── NSBundle+YYAdd.m
│ ├── NSData+YYAdd.h
│ ├── NSData+YYAdd.m
│ ├── NSString+YYAdd.h
│ ├── NSString+YYAdd.m
│ ├── UIControl+YYAdd.h
│ ├── UIControl+YYAdd.m
│ ├── UIGestureRecognizer+YYAdd.h
│ ├── UIGestureRecognizer+YYAdd.m
│ ├── UIImage+YYWebImage.h
│ ├── UIImage+YYWebImage.m
│ ├── UIView+YYAdd.h
│ ├── UIView+YYAdd.m
│ ├── ViewController.h
│ ├── ViewController.m
│ ├── YYFPSLabel.h
│ ├── YYFPSLabel.m
│ ├── YYGestureRecognizer.h
│ ├── YYGestureRecognizer.m
│ ├── YYImage
│ ├── Animated image support.txt
│ ├── YYAnimatedImageView.h
│ ├── YYAnimatedImageView.m
│ ├── YYFrameImage.h
│ ├── YYFrameImage.m
│ ├── YYImage.h
│ ├── YYImage.m
│ ├── YYImageCoder.h
│ ├── YYImageCoder.m
│ ├── YYSpriteSheetImage.h
│ └── YYSpriteSheetImage.m
│ ├── YYTextAsyncExample.h
│ ├── YYTextAsyncExample.m
│ ├── YYTextAttachmentExample.h
│ ├── YYTextAttachmentExample.m
│ ├── YYTextAttributeExample.h
│ ├── YYTextAttributeExample.m
│ ├── YYTextBindingExample.h
│ ├── YYTextBindingExample.m
│ ├── YYTextCopyPasteExample.h
│ ├── YYTextCopyPasteExample.m
│ ├── YYTextEditExample.h
│ ├── YYTextEditExample.m
│ ├── YYTextEmoticonExample.h
│ ├── YYTextEmoticonExample.m
│ ├── YYTextExample.h
│ ├── YYTextExample.m
│ ├── YYTextExampleHelper.h
│ ├── YYTextExampleHelper.m
│ ├── YYTextMarkdownExample.h
│ ├── YYTextMarkdownExample.m
│ ├── YYTextRubyExample.h
│ ├── YYTextRubyExample.m
│ ├── YYTextTagExample.h
│ ├── YYTextTagExample.m
│ ├── YYTextUndoRedoExample.h
│ ├── YYTextUndoRedoExample.m
│ ├── YYWeakProxy.h
│ ├── YYWeakProxy.m
│ ├── dribbble256_imageio.png
│ ├── dribbble64_imageio.png
│ ├── main.m
│ └── pia@2x.png
├── Framework
├── Info.plist
└── YYText.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ └── contents.xcworkspacedata
│ └── xcshareddata
│ └── xcschemes
│ └── YYText.xcscheme
├── LICENSE
├── README.md
├── YYText.podspec
└── YYText
├── Component
├── YYTextContainerView.h
├── YYTextContainerView.m
├── YYTextDebugOption.h
├── YYTextDebugOption.m
├── YYTextEffectWindow.h
├── YYTextEffectWindow.m
├── YYTextInput.h
├── YYTextInput.m
├── YYTextKeyboardManager.h
├── YYTextKeyboardManager.m
├── YYTextLayout.h
├── YYTextLayout.m
├── YYTextLine.h
├── YYTextLine.m
├── YYTextMagnifier.h
├── YYTextMagnifier.m
├── YYTextSelectionView.h
└── YYTextSelectionView.m
├── String
├── YYTextArchiver.h
├── YYTextArchiver.m
├── YYTextAttribute.h
├── YYTextAttribute.m
├── YYTextParser.h
├── YYTextParser.m
├── YYTextRubyAnnotation.h
├── YYTextRubyAnnotation.m
├── YYTextRunDelegate.h
└── YYTextRunDelegate.m
├── Utility
├── NSAttributedString+YYText.h
├── NSAttributedString+YYText.m
├── NSParagraphStyle+YYText.h
├── NSParagraphStyle+YYText.m
├── UIPasteboard+YYText.h
├── UIPasteboard+YYText.m
├── UIView+YYText.h
├── UIView+YYText.m
├── YYTextAsyncLayer.h
├── YYTextAsyncLayer.m
├── YYTextTransaction.h
├── YYTextTransaction.m
├── YYTextUtilities.h
├── YYTextUtilities.m
├── YYTextWeakProxy.h
└── YYTextWeakProxy.m
├── YYLabel.h
├── YYLabel.m
├── YYText.h
├── YYTextView.h
└── YYTextView.m
/.gitignore:
--------------------------------------------------------------------------------
1 | # OS X
2 | .DS_Store
3 |
4 | # Xcode
5 | #
6 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
7 |
8 | ## Build generated
9 | build/
10 | DerivedData/
11 |
12 | ## Various settings
13 | *.pbxuser
14 | !default.pbxuser
15 | *.mode1v3
16 | !default.mode1v3
17 | *.mode2v3
18 | !default.mode2v3
19 | *.perspectivev3
20 | !default.perspectivev3
21 | xcuserdata/
22 |
23 | ## Other
24 | *.moved-aside
25 | *.xccheckout
26 | *.xcuserstate
27 | *.xcscmblueprint
28 |
29 | ## Obj-C/Swift specific
30 | *.hmap
31 | *.ipa
32 | *.dSYM.zip
33 | *.dSYM
34 |
35 | # CocoaPods
36 | #
37 | # We recommend against adding the Pods directory to your .gitignore. However
38 | # you should judge for yourself, the pros and cons are mentioned at:
39 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
40 | #
41 | # Pods/
42 |
43 | # Carthage
44 | #
45 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
46 | # Carthage/Checkouts
47 |
48 | Carthage/Build
49 |
50 | # fastlane
51 | #
52 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
53 | # screenshots whenever they are needed.
54 | # For more information about the recommended setup visit:
55 | # https://docs.fastlane.tools/best-practices/source-control/#source-control
56 |
57 | fastlane/report.xml
58 | fastlane/Preview.html
59 | fastlane/screenshots
60 | fastlane/test_output
61 |
62 | # Code Injection
63 | #
64 | # After new code Injection tools there's a generated folder /iOSInjectionProject
65 | # https://github.com/johnno1962/injectionforxcode
66 |
67 | iOSInjectionProject/
68 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: objective-c
2 | osx_image: xcode8
3 | xcode_project: Framework/YYText.xcodeproj
4 | xcode_scheme: YYText
5 |
6 | before_install:
7 | - env
8 | - xcodebuild -version
9 | - xcodebuild -showsdks
10 | - xcpretty --version
11 |
12 | script:
13 | - set -o pipefail
14 | - xcodebuild clean build -project "$TRAVIS_XCODE_PROJECT" -scheme "$TRAVIS_XCODE_SCHEME" | xcpretty
15 |
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit Attributes.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit Attributes.pdf
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Attachment.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Attachment.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/BackgroundColor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/BackgroundColor.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Baseline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Baseline.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Color.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Color.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Effect.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Effect.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Expansion.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Expansion.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Font.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Font.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Kern.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Kern.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Ligature.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Ligature.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Link.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Link.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Obliqueness.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Obliqueness.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Paragraph/Alignment.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Paragraph/Alignment.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Paragraph/BaseWritingDirection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Paragraph/BaseWritingDirection.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Paragraph/FirstLineHeadIndent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Paragraph/FirstLineHeadIndent.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Paragraph/HeadIndent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Paragraph/HeadIndent.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Paragraph/HyphenationFactor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Paragraph/HyphenationFactor.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Paragraph/LineBreakMode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Paragraph/LineBreakMode.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Paragraph/LineHeightMultiple.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Paragraph/LineHeightMultiple.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Paragraph/LineSpacing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Paragraph/LineSpacing.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Paragraph/MaximumLineHeight.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Paragraph/MaximumLineHeight.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Paragraph/MinimumLineHeight.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Paragraph/MinimumLineHeight.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Paragraph/ParagraphSpacing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Paragraph/ParagraphSpacing.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Paragraph/Tab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Paragraph/Tab.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Paragraph/TailIndent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Paragraph/TailIndent.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Ruby.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Ruby.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/RunDelegate.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/RunDelegate.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Shadow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Shadow.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Strikethrough.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Strikethrough.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/StrikethroughColor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/StrikethroughColor.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Stroke.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Stroke.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/StrokeColor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/StrokeColor.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Superscript.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Superscript.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/Underline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/Underline.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/UnderlineColor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/UnderlineColor.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/VerticalForms.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/VerticalForms.png
--------------------------------------------------------------------------------
/Attributes/CoreText and TextKit/WriteDirection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/CoreText and TextKit/WriteDirection.png
--------------------------------------------------------------------------------
/Attributes/YYText Extended/YYTextAttachment.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/YYText Extended/YYTextAttachment.gif
--------------------------------------------------------------------------------
/Attributes/YYText Extended/YYTextBackedString.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/YYText Extended/YYTextBackedString.png
--------------------------------------------------------------------------------
/Attributes/YYText Extended/YYTextBackgroundBorder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/YYText Extended/YYTextBackgroundBorder.png
--------------------------------------------------------------------------------
/Attributes/YYText Extended/YYTextBinding.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/YYText Extended/YYTextBinding.gif
--------------------------------------------------------------------------------
/Attributes/YYText Extended/YYTextBlockBorder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/YYText Extended/YYTextBlockBorder.png
--------------------------------------------------------------------------------
/Attributes/YYText Extended/YYTextBorder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/YYText Extended/YYTextBorder.png
--------------------------------------------------------------------------------
/Attributes/YYText Extended/YYTextHighlight.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/YYText Extended/YYTextHighlight.gif
--------------------------------------------------------------------------------
/Attributes/YYText Extended/YYTextShadow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/YYText Extended/YYTextShadow.png
--------------------------------------------------------------------------------
/Attributes/architecture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Attributes/architecture.png
--------------------------------------------------------------------------------
/Demo/DemoSnapshot/text_markdown.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/DemoSnapshot/text_markdown.gif
--------------------------------------------------------------------------------
/Demo/DemoSnapshot/text_paste.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/DemoSnapshot/text_paste.gif
--------------------------------------------------------------------------------
/Demo/DemoSnapshot/text_path.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/DemoSnapshot/text_path.gif
--------------------------------------------------------------------------------
/Demo/DemoSnapshot/text_vertical.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/DemoSnapshot/text_vertical.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/AppDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.h
3 | // YYTextDemo
4 | //
5 | // Created by ibireme on 15/10/17.
6 | // Copyright © 2015年 ibireme. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface AppDelegate : UIResponder
12 |
13 | @property (strong, nonatomic) UIWindow *window;
14 |
15 |
16 | @end
17 |
18 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/AppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.m
3 | // YYTextDemo
4 | //
5 | // Created by ibireme on 15/10/17.
6 | // Copyright © 2015年 ibireme. All rights reserved.
7 | //
8 |
9 | #import "AppDelegate.h"
10 |
11 | @interface AppDelegate ()
12 |
13 | @end
14 |
15 | @implementation AppDelegate
16 |
17 |
18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
19 | // Override point for customization after application launch.
20 | return YES;
21 | }
22 |
23 | - (void)applicationWillResignActive:(UIApplication *)application {
24 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
25 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
26 | }
27 |
28 | - (void)applicationDidEnterBackground:(UIApplication *)application {
29 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
31 | }
32 |
33 | - (void)applicationWillEnterForeground:(UIApplication *)application {
34 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
35 | }
36 |
37 | - (void)applicationDidBecomeActive:(UIApplication *)application {
38 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
39 | }
40 |
41 | - (void)applicationWillTerminate:(UIApplication *)application {
42 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
43 | }
44 |
45 | @end
46 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | }
88 | ],
89 | "info" : {
90 | "version" : 1,
91 | "author" : "xcode"
92 | }
93 | }
--------------------------------------------------------------------------------
/Demo/YYTextDemo/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/001@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/001@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/001@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/001@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/002@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/002@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/002@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/002@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/003@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/003@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/003@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/003@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/004@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/004@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/004@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/004@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/005@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/005@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/005@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/005@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/006@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/006@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/006@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/006@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/007@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/007@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/007@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/007@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/008@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/008@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/008@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/008@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/009@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/009@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/009@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/009@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/010@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/010@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/010@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/010@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/011@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/011@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/011@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/011@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/012@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/012@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/012@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/012@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/013@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/013@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/013@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/013@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/014@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/014@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/014@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/014@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/015@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/015@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/015@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/015@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/016@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/016@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/016@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/016@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/017@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/017@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/017@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/017@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/018@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/018@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/018@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/018@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/019@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/019@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/019@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/019@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/020@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/020@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/020@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/020@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/021@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/021@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/021@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/021@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/022@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/022@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/022@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/022@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/023@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/023@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/023@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/023@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/024@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/024@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/024@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/024@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/025@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/025@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/025@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/025@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/026@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/026@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/026@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/026@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/027@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/027@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/027@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/027@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/028@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/028@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/028@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/028@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/029@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/029@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/029@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/029@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/030@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/030@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/030@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/030@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/031@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/031@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/031@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/031@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/032@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/032@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/032@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/032@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/033@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/033@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/033@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/033@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/034@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/034@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/034@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/034@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/035@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/035@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/035@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/035@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/036@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/036@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/036@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/036@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/037@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/037@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/037@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/037@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/038@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/038@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/038@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/038@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/039@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/039@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/039@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/039@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/040@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/040@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/040@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/040@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/041@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/041@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/041@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/041@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/042@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/042@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/042@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/042@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/043@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/043@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/043@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/043@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/044@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/044@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/044@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/044@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/045@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/045@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/045@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/045@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/046@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/046@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/046@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/046@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/047@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/047@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/047@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/047@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/048@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/048@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/048@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/048@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/049@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/049@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/049@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/049@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/050@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/050@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/050@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/050@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/051@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/051@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/051@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/051@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/052@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/052@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/052@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/052@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/053@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/053@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/053@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/053@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/054@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/054@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/054@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/054@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/055@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/055@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/055@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/055@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/056@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/056@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/056@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/056@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/057@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/057@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/057@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/057@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/058@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/058@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/058@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/058@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/059@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/059@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/059@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/059@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/060@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/060@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/060@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/060@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/061@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/061@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/061@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/061@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/062@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/062@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/062@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/062@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/063@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/063@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/063@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/063@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/064@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/064@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/064@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/064@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/065@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/065@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/065@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/065@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/066@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/066@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/066@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/066@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/067@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/067@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/067@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/067@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/068@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/068@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/068@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/068@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/069@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/069@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/069@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/069@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/070@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/070@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/070@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/070@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/071@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/071@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/071@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/071@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/072@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/072@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/072@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/072@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/073@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/073@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/073@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/073@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/074@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/074@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/074@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/074@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/075@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/075@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/075@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/075@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/076@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/076@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/076@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/076@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/077@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/077@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/077@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/077@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/078@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/078@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/078@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/078@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/079@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/079@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/079@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/079@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/080@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/080@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/080@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/080@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/081@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/081@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/081@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/081@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/082@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/082@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/082@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/082@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/083@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/083@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/083@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/083@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/084@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/084@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/084@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/084@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/085@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/085@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/085@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/085@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/086@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/086@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/086@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/086@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/087@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/087@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/087@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/087@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/088@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/088@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/088@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/088@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/089@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/089@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/089@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/089@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/090@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/090@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/090@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/090@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/091@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/091@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/091@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/091@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/092@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/092@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/092@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/092@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/093@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/093@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/093@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/093@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/094@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/094@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/094@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/094@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/095@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/095@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/095@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/095@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/096@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/096@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/096@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/096@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/097@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/097@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/097@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/097@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/098@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/098@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/098@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/098@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/099@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/099@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/099@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/099@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/100@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/100@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/100@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/100@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/101@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/101@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/101@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/101@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/102@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/102@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/102@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/102@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/103@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/103@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/103@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/103@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/104@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/104@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/104@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/104@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/105@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/105@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/105@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/105@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/106@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/106@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/106@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/106@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/107@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/107@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/107@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/107@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/108@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/108@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/108@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/108@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/109@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/109@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/109@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/109@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/110@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/110@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/110@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/110@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/111@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/111@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/111@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/111@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/112@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/112@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/112@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/112@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/113@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/113@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/113@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/113@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/114@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/114@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/114@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/114@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/115@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/115@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/115@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/115@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/116@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/116@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/116@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/116@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/117@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/117@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/117@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/117@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/118@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/118@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/118@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/118@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/119@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/119@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/119@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/119@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/120@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/120@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/120@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/120@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/121@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/121@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/121@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/121@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/122@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/122@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/122@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/122@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/123@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/123@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/123@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/123@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/124@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/124@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/124@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/124@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/125@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/125@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/125@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/125@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/126@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/126@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/126@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/126@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/127@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/127@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/127@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/127@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/128@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/128@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/128@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/128@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/129@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/129@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/129@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/129@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/130@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/130@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/130@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/130@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/131@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/131@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/131@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/131@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/132@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/132@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/132@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/132@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/133@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/133@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/133@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/133@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/134@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/134@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/134@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/134@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/135@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/135@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/135@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/135@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/136@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/136@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/136@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/136@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/137@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/137@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/137@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/137@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/138@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/138@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/138@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/138@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/139@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/139@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/139@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/139@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/140@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/140@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/140@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/140@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/141@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/141@2x.gif
--------------------------------------------------------------------------------
/Demo/YYTextDemo/EmoticonQQ.bundle/141@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/EmoticonQQ.bundle/141@2x.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleLocalizations
14 |
15 | en
16 | zh
17 | zh_TW
18 | ja
19 | fr
20 | de
21 | it
22 | ko
23 |
24 | CFBundleName
25 | $(PRODUCT_NAME)
26 | CFBundlePackageType
27 | APPL
28 | CFBundleShortVersionString
29 | 1.0
30 | CFBundleVersion
31 | 1
32 | LSRequiresIPhoneOS
33 |
34 | UILaunchStoryboardName
35 | LaunchScreen
36 | UIMainStoryboardFile
37 | Main
38 | UIRequiredDeviceCapabilities
39 |
40 | armv7
41 |
42 | UISupportedInterfaceOrientations
43 |
44 | UIInterfaceOrientationPortrait
45 | UIInterfaceOrientationLandscapeLeft
46 | UIInterfaceOrientationLandscapeRight
47 |
48 | UISupportedInterfaceOrientations~ipad
49 |
50 | UIInterfaceOrientationPortrait
51 | UIInterfaceOrientationPortraitUpsideDown
52 | UIInterfaceOrientationLandscapeLeft
53 | UIInterfaceOrientationLandscapeRight
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/NSBundle+YYAdd.m:
--------------------------------------------------------------------------------
1 | //
2 | // NSBundle+YYAdd.m
3 | // YYCategories
4 | //
5 | // Created by ibireme on 14/10/20.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import "NSBundle+YYAdd.h"
13 | #import "NSString+YYAdd.h"
14 |
15 |
16 | @implementation NSBundle (YYAdd)
17 |
18 | + (NSArray *)preferredScales {
19 | static NSArray *scales;
20 | static dispatch_once_t onceToken;
21 | dispatch_once(&onceToken, ^{
22 | CGFloat screenScale = [UIScreen mainScreen].scale;
23 | if (screenScale <= 1) {
24 | scales = @[@1,@2,@3];
25 | } else if (screenScale <= 2) {
26 | scales = @[@2,@3,@1];
27 | } else {
28 | scales = @[@3,@2,@1];
29 | }
30 | });
31 | return scales;
32 | }
33 |
34 | + (NSString *)pathForScaledResource:(NSString *)name ofType:(NSString *)ext inDirectory:(NSString *)bundlePath {
35 | if (name.length == 0) return nil;
36 | if ([name hasSuffix:@"/"]) return [self pathForResource:name ofType:ext inDirectory:bundlePath];
37 |
38 | NSString *path = nil;
39 | NSArray *scales = [self preferredScales];
40 | for (int s = 0; s < scales.count; s++) {
41 | CGFloat scale = ((NSNumber *)scales[s]).floatValue;
42 | NSString *scaledName = ext.length ? [name stringByAppendingNameScale:scale]
43 | : [name stringByAppendingPathScale:scale];
44 | path = [self pathForResource:scaledName ofType:ext inDirectory:bundlePath];
45 | if (path) break;
46 | }
47 |
48 | return path;
49 | }
50 |
51 | - (NSString *)pathForScaledResource:(NSString *)name ofType:(NSString *)ext {
52 | if (name.length == 0) return nil;
53 | if ([name hasSuffix:@"/"]) return [self pathForResource:name ofType:ext];
54 |
55 | NSString *path = nil;
56 | NSArray *scales = [NSBundle preferredScales];
57 | for (int s = 0; s < scales.count; s++) {
58 | CGFloat scale = ((NSNumber *)scales[s]).floatValue;
59 | NSString *scaledName = ext.length ? [name stringByAppendingNameScale:scale]
60 | : [name stringByAppendingPathScale:scale];
61 | path = [self pathForResource:scaledName ofType:ext];
62 | if (path) break;
63 | }
64 |
65 | return path;
66 | }
67 |
68 | - (NSString *)pathForScaledResource:(NSString *)name ofType:(NSString *)ext inDirectory:(NSString *)subpath {
69 | if (name.length == 0) return nil;
70 | if ([name hasSuffix:@"/"]) return [self pathForResource:name ofType:ext];
71 |
72 | NSString *path = nil;
73 | NSArray *scales = [NSBundle preferredScales];
74 | for (int s = 0; s < scales.count; s++) {
75 | CGFloat scale = ((NSNumber *)scales[s]).floatValue;
76 | NSString *scaledName = ext.length ? [name stringByAppendingNameScale:scale]
77 | : [name stringByAppendingPathScale:scale];
78 | path = [self pathForResource:scaledName ofType:ext inDirectory:subpath];
79 | if (path) break;
80 | }
81 |
82 | return path;
83 | }
84 |
85 | @end
86 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/NSData+YYAdd.h:
--------------------------------------------------------------------------------
1 | //
2 | // NSData+YYAdd.h
3 | // YYKit
4 | //
5 | // Created by ibireme on 13/4/4.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | /**
15 | Provide hash, encrypt, encode and some common method for `NSData`.
16 | */
17 | @interface NSData (YYAdd)
18 |
19 | #pragma mark - Others
20 | ///=============================================================================
21 | /// @name Others
22 | ///=============================================================================
23 |
24 | /**
25 | Create data from the file in main bundle (similar to [UIImage imageNamed:]).
26 |
27 | @param name The file name (in main bundle).
28 |
29 | @return A new data create from the file.
30 | */
31 | + (NSData *)dataNamed:(NSString *)name;
32 |
33 | @end
34 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/NSData+YYAdd.m:
--------------------------------------------------------------------------------
1 | //
2 | // NSData+YYAdd.m
3 | // YYKit
4 | //
5 | // Created by ibireme on 13/4/4.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import "NSData+YYAdd.h"
13 |
14 | @implementation NSData (YYAdd)
15 |
16 | + (NSData *)dataNamed:(NSString *)name {
17 | NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@""];
18 | if (!path) return nil;
19 | NSData *data = [NSData dataWithContentsOfFile:path];
20 | return data;
21 | }
22 |
23 | @end
24 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/UIControl+YYAdd.h:
--------------------------------------------------------------------------------
1 | //
2 | // UIControl+YYAdd.h
3 | // YYKit
4 | //
5 | // Created by ibireme on 13/4/5.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | /**
15 | Provides extensions for `UIControl`.
16 | */
17 | @interface UIControl (YYAdd)
18 |
19 | /**
20 | Removes all targets and actions for a particular event (or events)
21 | from an internal dispatch table.
22 | */
23 | - (void)removeAllTargets;
24 |
25 | /**
26 | Adds or replaces a target and action for a particular event (or events)
27 | to an internal dispatch table.
28 |
29 | @param target The target object—that is, the object to which the
30 | action message is sent. If this is nil, the responder
31 | chain is searched for an object willing to respond to the
32 | action message.
33 |
34 | @param action A selector identifying an action message. It cannot be NULL.
35 |
36 | @param controlEvents A bitmask specifying the control events for which the
37 | action message is sent.
38 | */
39 | - (void)setTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
40 |
41 | /**
42 | Adds a block for a particular event (or events) to an internal dispatch table.
43 | It will cause a strong reference to @a block.
44 |
45 | @param block The block which is invoked then the action message is
46 | sent (cannot be nil). The block is retained.
47 |
48 | @param controlEvents A bitmask specifying the control events for which the
49 | action message is sent.
50 | */
51 | - (void)addBlockForControlEvents:(UIControlEvents)controlEvents block:(void (^)(id sender))block;
52 |
53 | /**
54 | Adds or replaces a block for a particular event (or events) to an internal
55 | dispatch table. It will cause a strong reference to @a block.
56 |
57 | @param block The block which is invoked then the action message is
58 | sent (cannot be nil). The block is retained.
59 |
60 | @param controlEvents A bitmask specifying the control events for which the
61 | action message is sent.
62 | */
63 | - (void)setBlockForControlEvents:(UIControlEvents)controlEvents block:(void (^)(id sender))block;
64 |
65 | /**
66 | Removes all blocks for a particular event (or events) from an internal
67 | dispatch table.
68 |
69 | @param controlEvents A bitmask specifying the control events for which the
70 | action message is sent.
71 | */
72 | - (void)removeAllBlocksForControlEvents:(UIControlEvents)controlEvents;
73 |
74 | @end
75 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/UIGestureRecognizer+YYAdd.h:
--------------------------------------------------------------------------------
1 | //
2 | // UIGestureRecognizer+YYAdd.h
3 | // YYKit
4 | //
5 | // Created by ibireme on 13/10/13.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | /**
15 | Provides extensions for `UIGestureRecognizer`.
16 | */
17 | @interface UIGestureRecognizer (YYAdd)
18 |
19 | /**
20 | Initializes an allocated gesture-recognizer object with a action block.
21 |
22 | @param block An action block that to handle the gesture recognized by the
23 | receiver. nil is invalid. It is retained by the gesture.
24 |
25 | @return An initialized instance of a concrete UIGestureRecognizer subclass or
26 | nil if an error occurred in the attempt to initialize the object.
27 | */
28 | - (instancetype)initWithActionBlock:(void (^)(id sender))block;
29 |
30 | /**
31 | Adds an action block to a gesture-recognizer object. It is retained by the
32 | gesture.
33 |
34 | @param block A block invoked by the action message. nil is not a valid value.
35 | */
36 | - (void)addActionBlock:(void (^)(id sender))block;
37 |
38 | /**
39 | Remove all action blocks.
40 | */
41 | - (void)removeAllActionBlocks;
42 |
43 | @end
44 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/UIGestureRecognizer+YYAdd.m:
--------------------------------------------------------------------------------
1 | //
2 | // UIGestureRecognizer+YYAdd.m
3 | // YYKit
4 | //
5 | // Created by ibireme on 13/10/13.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import "UIGestureRecognizer+YYAdd.h"
13 | #import
14 |
15 | static const int block_key;
16 |
17 | @interface _YYUIGestureRecognizerBlockTarget : NSObject
18 |
19 | @property (nonatomic, copy) void (^block)(id sender);
20 |
21 | - (id)initWithBlock:(void (^)(id sender))block;
22 | - (void)invoke:(id)sender;
23 |
24 | @end
25 |
26 | @implementation _YYUIGestureRecognizerBlockTarget
27 |
28 | - (id)initWithBlock:(void (^)(id sender))block{
29 | self = [super init];
30 | if (self) {
31 | _block = [block copy];
32 | }
33 | return self;
34 | }
35 |
36 | - (void)invoke:(id)sender {
37 | if (_block) _block(sender);
38 | }
39 |
40 | @end
41 |
42 |
43 |
44 |
45 | @implementation UIGestureRecognizer (YYAdd)
46 |
47 | - (instancetype)initWithActionBlock:(void (^)(id sender))block {
48 | self = [self init];
49 | [self addActionBlock:block];
50 | return self;
51 | }
52 |
53 | - (void)addActionBlock:(void (^)(id sender))block {
54 | _YYUIGestureRecognizerBlockTarget *target = [[_YYUIGestureRecognizerBlockTarget alloc] initWithBlock:block];
55 | [self addTarget:target action:@selector(invoke:)];
56 | NSMutableArray *targets = [self _yy_allUIGestureRecognizerBlockTargets];
57 | [targets addObject:target];
58 | }
59 |
60 | - (void)removeAllActionBlocks{
61 | NSMutableArray *targets = [self _yy_allUIGestureRecognizerBlockTargets];
62 | [targets enumerateObjectsUsingBlock:^(id target, NSUInteger idx, BOOL *stop) {
63 | [self removeTarget:target action:@selector(invoke:)];
64 | }];
65 | [targets removeAllObjects];
66 | }
67 |
68 | - (NSMutableArray *)_yy_allUIGestureRecognizerBlockTargets {
69 | NSMutableArray *targets = objc_getAssociatedObject(self, &block_key);
70 | if (!targets) {
71 | targets = [NSMutableArray array];
72 | objc_setAssociatedObject(self, &block_key, targets, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
73 | }
74 | return targets;
75 | }
76 |
77 | @end
78 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/ViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.h
3 | // YYTextDemo
4 | //
5 | // Created by ibireme on 15/10/17.
6 | // Copyright © 2015年 ibireme. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface ViewController : UINavigationController
12 |
13 |
14 | @end
15 |
16 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/ViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.m
3 | // YYTextDemo
4 | //
5 | // Created by ibireme on 15/10/17.
6 | // Copyright © 2015年 ibireme. All rights reserved.
7 | //
8 |
9 | #import "ViewController.h"
10 | #import "YYTextExample.h"
11 | @interface ViewController ()
12 |
13 | @end
14 |
15 | @implementation ViewController
16 |
17 | - (void)viewDidLoad {
18 | [super viewDidLoad];
19 | YYTextExample *vc = [YYTextExample new];
20 | [self pushViewController:vc animated:NO];
21 | }
22 |
23 |
24 |
25 | @end
26 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYFPSLabel.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYFPSLabel.h
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/9/3.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | /**
12 | Show Screen FPS...
13 |
14 | The maximum fps in OSX/iOS Simulator is 60.00.
15 | The maximum fps on iPhone is 59.97.
16 | The maxmium fps on iPad is 60.0.
17 | */
18 | @interface YYFPSLabel : UILabel
19 |
20 | @end
21 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYFPSLabel.m:
--------------------------------------------------------------------------------
1 | //
2 | // YYFPSLabel.m
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/9/3.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import "YYFPSLabel.h"
10 | //#import
11 | #import "YYText.h"
12 | #import "YYWeakProxy.h"
13 |
14 | #define kSize CGSizeMake(55, 20)
15 |
16 | @implementation YYFPSLabel {
17 | CADisplayLink *_link;
18 | NSUInteger _count;
19 | NSTimeInterval _lastTime;
20 | UIFont *_font;
21 | UIFont *_subFont;
22 |
23 | NSTimeInterval _llll;
24 | }
25 |
26 | - (instancetype)initWithFrame:(CGRect)frame {
27 | if (frame.size.width == 0 && frame.size.height == 0) {
28 | frame.size = kSize;
29 | }
30 | self = [super initWithFrame:frame];
31 |
32 | self.layer.cornerRadius = 5;
33 | self.clipsToBounds = YES;
34 | self.textAlignment = NSTextAlignmentCenter;
35 | self.userInteractionEnabled = NO;
36 | self.backgroundColor = [UIColor colorWithWhite:0.000 alpha:0.700];
37 |
38 | _font = [UIFont fontWithName:@"Menlo" size:14];
39 | if (_font) {
40 | _subFont = [UIFont fontWithName:@"Menlo" size:4];
41 | } else {
42 | _font = [UIFont fontWithName:@"Courier" size:14];
43 | _subFont = [UIFont fontWithName:@"Courier" size:4];
44 | }
45 |
46 | _link = [CADisplayLink displayLinkWithTarget:[YYWeakProxy proxyWithTarget:self] selector:@selector(tick:)];
47 | [_link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
48 | return self;
49 | }
50 |
51 | - (void)dealloc {
52 | [_link invalidate];
53 | }
54 |
55 | - (CGSize)sizeThatFits:(CGSize)size {
56 | return kSize;
57 | }
58 |
59 | - (void)tick:(CADisplayLink *)link {
60 | if (_lastTime == 0) {
61 | _lastTime = link.timestamp;
62 | return;
63 | }
64 |
65 | _count++;
66 | NSTimeInterval delta = link.timestamp - _lastTime;
67 | if (delta < 1) return;
68 | _lastTime = link.timestamp;
69 | float fps = _count / delta;
70 | _count = 0;
71 |
72 | CGFloat progress = fps / 60.0;
73 | UIColor *color = [UIColor colorWithHue:0.27 * (progress - 0.2) saturation:1 brightness:0.9 alpha:1];
74 |
75 | NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%d FPS",(int)round(fps)]];
76 | [text yy_setColor:color range:NSMakeRange(0, text.length - 3)];
77 | [text yy_setColor:[UIColor whiteColor] range:NSMakeRange(text.length - 3, 3)];
78 | text.yy_font = _font;
79 | [text yy_setFont:_subFont range:NSMakeRange(text.length - 4, 1)];
80 |
81 | self.attributedText = text;
82 | }
83 |
84 | @end
85 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYGestureRecognizer.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYGestureRecognizer.h
3 | // YYKit
4 | //
5 | // Created by ibireme on 14/10/26.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | /// State of the gesture
15 | typedef NS_ENUM(NSUInteger, YYGestureRecognizerState) {
16 | YYGestureRecognizerStateBegan, ///< gesture start
17 | YYGestureRecognizerStateMoved, ///< gesture moved
18 | YYGestureRecognizerStateEnded, ///< gesture end
19 | YYGestureRecognizerStateCancelled, ///< gesture cancel
20 | };
21 |
22 | /**
23 | A simple UIGestureRecognizer subclass for receive touch events.
24 | */
25 | @interface YYGestureRecognizer : UIGestureRecognizer
26 |
27 | @property (nonatomic, readonly) CGPoint startPoint; ///< start point
28 | @property (nonatomic, readonly) CGPoint lastPoint; ///< last move point.
29 | @property (nonatomic, readonly) CGPoint currentPoint; ///< current move point.
30 |
31 | /// The action block invoked by every gesture event.
32 | @property (nonatomic, copy) void (^action)(YYGestureRecognizer *gesture, YYGestureRecognizerState state);
33 |
34 | /// Cancel the gesture for current touch.
35 | - (void)cancel;
36 |
37 | @end
38 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYGestureRecognizer.m:
--------------------------------------------------------------------------------
1 | //
2 | // YYGestureRecognizer.m
3 | // YYKit
4 | //
5 | // Created by ibireme on 14/10/26.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import "YYGestureRecognizer.h"
13 | #import
14 |
15 | @implementation YYGestureRecognizer
16 |
17 | - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
18 | self.state = UIGestureRecognizerStateBegan;
19 | _startPoint = [(UITouch *)[touches anyObject] locationInView:self.view];
20 | _lastPoint = _currentPoint;
21 | _currentPoint = _startPoint;
22 | if (_action) _action(self, YYGestureRecognizerStateBegan);
23 | }
24 |
25 | - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
26 | UITouch *touch = (UITouch *)[touches anyObject];
27 | CGPoint currentPoint = [touch locationInView:self.view];
28 | self.state = UIGestureRecognizerStateChanged;
29 | _currentPoint = currentPoint;
30 | if (_action) _action(self, YYGestureRecognizerStateMoved);
31 | _lastPoint = _currentPoint;
32 | }
33 |
34 | - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
35 | self.state = UIGestureRecognizerStateEnded;
36 | if (_action) _action(self, YYGestureRecognizerStateEnded);
37 | }
38 |
39 | - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
40 | self.state = UIGestureRecognizerStateCancelled;
41 | if (_action) _action(self, YYGestureRecognizerStateCancelled);
42 | }
43 |
44 | - (void)reset {
45 | self.state = UIGestureRecognizerStatePossible;
46 | }
47 |
48 | - (void)cancel {
49 | if (self.state == UIGestureRecognizerStateBegan || self.state == UIGestureRecognizerStateChanged) {
50 | self.state = UIGestureRecognizerStateCancelled;
51 | if (_action) _action(self, YYGestureRecognizerStateCancelled);
52 | }
53 | }
54 |
55 | @end
56 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYImage/Animated image support.txt:
--------------------------------------------------------------------------------
1 |
2 | You may import YYImage (https://github.com/ibireme/YYImage)
3 | to support animated image copy and paste.
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYImage/YYImage.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYImage.h
3 | // YYImage
4 | //
5 | // Created by ibireme on 14/10/20.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | #if __has_include()
15 | FOUNDATION_EXPORT double YYImageVersionNumber;
16 | FOUNDATION_EXPORT const unsigned char YYImageVersionString[];
17 | #import
18 | #import
19 | #import
20 | #import
21 | #elif __has_include()
22 | #import
23 | #import
24 | #import
25 | #import
26 | #else
27 | #import "YYFrameImage.h"
28 | #import "YYSpriteSheetImage.h"
29 | #import "YYImageCoder.h"
30 | #import "YYAnimatedImageView.h"
31 | #endif
32 |
33 | NS_ASSUME_NONNULL_BEGIN
34 |
35 |
36 | /**
37 | A YYImage object is a high-level way to display animated image data.
38 |
39 | @discussion It is a fully compatible `UIImage` subclass. It extends the UIImage
40 | to support animated WebP, APNG and GIF format image data decoding. It also
41 | support NSCoding protocol to archive and unarchive multi-frame image data.
42 |
43 | If the image is created from multi-frame image data, and you want to play the
44 | animation, try replace UIImageView with `YYAnimatedImageView`.
45 |
46 | Sample Code:
47 |
48 | // animation@3x.webp
49 | YYImage *image = [YYImage imageNamed:@"animation.webp"];
50 | YYAnimatedImageView *imageView = [YYAnimatedImageView alloc] initWithImage:image];
51 | [view addSubView:imageView];
52 |
53 | */
54 | @interface YYImage : UIImage
55 |
56 | + (nullable YYImage *)imageNamed:(NSString *)name; // no cache!
57 | + (nullable YYImage *)imageWithContentsOfFile:(NSString *)path;
58 | + (nullable YYImage *)imageWithData:(NSData *)data;
59 | + (nullable YYImage *)imageWithData:(NSData *)data scale:(CGFloat)scale;
60 |
61 | /**
62 | If the image is created from data or file, then the value indicates the data type.
63 | */
64 | @property (nonatomic, readonly) YYImageType animatedImageType;
65 |
66 | /**
67 | If the image is created from animated image data (multi-frame GIF/APNG/WebP),
68 | this property stores the original image data.
69 | */
70 | @property (nullable, nonatomic, readonly) NSData *animatedImageData;
71 |
72 | /**
73 | The total memory usage (in bytes) if all frame images was loaded into memory.
74 | The value is 0 if the image is not created from a multi-frame image data.
75 | */
76 | @property (nonatomic, readonly) NSUInteger animatedImageMemorySize;
77 |
78 | /**
79 | Preload all frame image to memory.
80 |
81 | @discussion Set this property to `YES` will block the calling thread to decode
82 | all animation frame image to memory, set to `NO` will release the preloaded frames.
83 | If the image is shared by lots of image views (such as emoticon), preload all
84 | frames will reduce the CPU cost.
85 |
86 | See `animatedImageMemorySize` for memory cost.
87 | */
88 | @property (nonatomic) BOOL preloadAllAnimatedImageFrames;
89 |
90 | @end
91 |
92 | NS_ASSUME_NONNULL_END
93 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYImage/YYSpriteSheetImage.m:
--------------------------------------------------------------------------------
1 | //
2 | // YYSpriteImage.m
3 | // YYImage
4 | //
5 | // Created by ibireme on 15/4/21.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import "YYSpriteSheetImage.h"
13 |
14 | @implementation YYSpriteSheetImage
15 |
16 | - (instancetype)initWithSpriteSheetImage:(UIImage *)image
17 | contentRects:(NSArray *)contentRects
18 | frameDurations:(NSArray *)frameDurations
19 | loopCount:(NSUInteger)loopCount {
20 | if (!image.CGImage) return nil;
21 | if (contentRects.count < 1 || frameDurations.count < 1) return nil;
22 | if (contentRects.count != frameDurations.count) return nil;
23 |
24 | self = [super initWithCGImage:image.CGImage scale:image.scale orientation:image.imageOrientation];
25 | if (!self) return nil;
26 |
27 | _contentRects = contentRects.copy;
28 | _frameDurations = frameDurations.copy;
29 | _loopCount = loopCount;
30 | return self;
31 | }
32 |
33 | - (CGRect)contentsRectForCALayerAtIndex:(NSUInteger)index {
34 | CGRect layerRect = CGRectMake(0, 0, 1, 1);
35 | if (index >= _contentRects.count) return layerRect;
36 |
37 | CGSize imageSize = self.size;
38 | CGRect rect = [self animatedImageContentsRectAtIndex:index];
39 | if (imageSize.width > 0.01 && imageSize.height > 0.01) {
40 | layerRect.origin.x = rect.origin.x / imageSize.width;
41 | layerRect.origin.y = rect.origin.y / imageSize.height;
42 | layerRect.size.width = rect.size.width / imageSize.width;
43 | layerRect.size.height = rect.size.height / imageSize.height;
44 | layerRect = CGRectIntersection(layerRect, CGRectMake(0, 0, 1, 1));
45 | if (CGRectIsNull(layerRect) || CGRectIsEmpty(layerRect)) {
46 | layerRect = CGRectMake(0, 0, 1, 1);
47 | }
48 | }
49 | return layerRect;
50 | }
51 |
52 | #pragma mark @protocol YYAnimatedImage
53 |
54 | - (NSUInteger)animatedImageFrameCount {
55 | return _contentRects.count;
56 | }
57 |
58 | - (NSUInteger)animatedImageLoopCount {
59 | return _loopCount;
60 | }
61 |
62 | - (NSUInteger)animatedImageBytesPerFrame {
63 | return 0;
64 | }
65 |
66 | - (UIImage *)animatedImageFrameAtIndex:(NSUInteger)index {
67 | return self;
68 | }
69 |
70 | - (NSTimeInterval)animatedImageDurationAtIndex:(NSUInteger)index {
71 | if (index >= _frameDurations.count) return 0;
72 | return ((NSNumber *)_frameDurations[index]).doubleValue;
73 | }
74 |
75 | - (CGRect)animatedImageContentsRectAtIndex:(NSUInteger)index {
76 | if (index >= _contentRects.count) return CGRectZero;
77 | return ((NSValue *)_contentRects[index]).CGRectValue;
78 | }
79 |
80 | @end
81 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextAsyncExample.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextAsyncExample.h
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/9/3.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface YYTextAsyncExample : UIViewController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextAttachmentExample.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextAttachmentExample.h
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/8/21.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface YYTextAttachmentExample : UIViewController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextAttributeExample.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextAttributeExample.h
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/8/19.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface YYTextAttributeExample : UIViewController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextBindingExample.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextBindingExample.h
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/9/3.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface YYTextBindingExample : UIViewController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextCopyPasteExample.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextCopyPasteExample.h
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/9/12.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface YYTextCopyPasteExample : UIViewController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextCopyPasteExample.m:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextCopyPasteExample.m
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/9/12.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import "YYTextCopyPasteExample.h"
10 | #import "YYText.h"
11 | #import "YYImage.h"
12 | #import "UIImage+YYWebImage.h"
13 | #import "UIView+YYAdd.h"
14 | #import "NSBundle+YYAdd.h"
15 | #import "NSString+YYAdd.h"
16 | #import "YYTextExampleHelper.h"
17 |
18 | @interface YYTextCopyPasteExample ()
19 | @property (nonatomic, assign) YYTextView *textView;
20 | @end
21 |
22 | @implementation YYTextCopyPasteExample
23 |
24 | - (void)viewDidLoad {
25 | [super viewDidLoad];
26 | self.view.backgroundColor = [UIColor whiteColor];
27 | if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) {
28 | self.automaticallyAdjustsScrollViewInsets = NO;
29 | }
30 |
31 |
32 | NSString *text = @"You can copy image from browser or photo album and paste it to here. It support animated GIF and APNG. \n\nYou can also copy attributed string from other YYTextView.\n";
33 |
34 | YYTextSimpleMarkdownParser *parser = [YYTextSimpleMarkdownParser new];
35 | [parser setColorWithDarkTheme];
36 |
37 | YYTextView *textView = [YYTextView new];
38 | textView.text = text;
39 | textView.font = [UIFont systemFontOfSize:17];
40 | textView.size = self.view.size;
41 | textView.textContainerInset = UIEdgeInsetsMake(10, 10, 10, 10);
42 | textView.delegate = self;
43 | textView.allowsPasteImage = YES; /// Pasts image
44 | textView.allowsPasteAttributedString = YES; /// Paste attributed string
45 | if (kiOS7Later) {
46 | textView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
47 | }
48 | textView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
49 | textView.scrollIndicatorInsets = textView.contentInset;
50 | [self.view addSubview:textView];
51 | self.textView = textView;
52 |
53 | textView.selectedRange = NSMakeRange(text.length, 0);
54 | [textView becomeFirstResponder];
55 | }
56 |
57 | - (void)edit:(UIBarButtonItem *)item {
58 | if (_textView.isFirstResponder) {
59 | [_textView resignFirstResponder];
60 | } else {
61 | [_textView becomeFirstResponder];
62 | }
63 | }
64 |
65 | - (void)textViewDidBeginEditing:(YYTextView *)textView {
66 | UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
67 | target:self
68 | action:@selector(edit:)];
69 | self.navigationItem.rightBarButtonItem = buttonItem;
70 | }
71 |
72 | - (void)textViewDidEndEditing:(YYTextView *)textView {
73 | self.navigationItem.rightBarButtonItem = nil;
74 | }
75 |
76 | @end
77 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextEditExample.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextEditExample.h
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/9/3.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface YYTextEditExample : UIViewController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextEmoticonExample.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextEmoticonExample.h
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/9/3.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface YYTextEmoticonExample : UIViewController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextExample.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextExample.h
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/7/18.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface YYTextExample : UITableViewController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextExample.m:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextExample.m
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/7/18.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import "YYTextExample.h"
10 | #import
11 | #import "YYText.h"
12 |
13 | @interface YYTextExample()
14 | @property (nonatomic, strong) NSMutableArray *titles;
15 | @property (nonatomic, strong) NSMutableArray *classNames;
16 | @end
17 |
18 | @implementation YYTextExample
19 |
20 | - (void)viewDidLoad {
21 | [super viewDidLoad];
22 | self.title = @"✎ YYText Demo ✎";
23 | self.titles = @[].mutableCopy;
24 | self.classNames = @[].mutableCopy;
25 | [self addCell:@"Text Attributes 1" class:@"YYTextAttributeExample"];
26 | [self addCell:@"Text Attributes 2" class:@"YYTextTagExample"];
27 | [self addCell:@"Text Attachments" class:@"YYTextAttachmentExample"];
28 | [self addCell:@"Text Edit" class:@"YYTextEditExample"];
29 | [self addCell:@"Text Parser (Markdown)" class:@"YYTextMarkdownExample"];
30 | [self addCell:@"Text Parser (Emoticon)" class:@"YYTextEmoticonExample"];
31 | [self addCell:@"Text Binding" class:@"YYTextBindingExample"];
32 | [self addCell:@"Copy and Paste" class:@"YYTextCopyPasteExample"];
33 | [self addCell:@"Undo and Redo" class:@"YYTextUndoRedoExample"];
34 | [self addCell:@"Ruby Annotation" class:@"YYTextRubyExample"];
35 | [self addCell:@"Async Display" class:@"YYTextAsyncExample"];
36 | [self.tableView reloadData];
37 | }
38 |
39 | - (void)addCell:(NSString *)title class:(NSString *)className {
40 | [self.titles addObject:title];
41 | [self.classNames addObject:className];
42 | }
43 |
44 | #pragma mark - Table view data source
45 |
46 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
47 | return _titles.count;
48 | }
49 |
50 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
51 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"YY"];
52 | if (!cell) {
53 | cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"YY"];
54 | }
55 | cell.textLabel.text = _titles[indexPath.row];
56 | return cell;
57 | }
58 |
59 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
60 | NSString *className = self.classNames[indexPath.row];
61 | Class class = NSClassFromString(className);
62 | if (class) {
63 | UIViewController *ctrl = class.new;
64 | ctrl.title = _titles[indexPath.row];
65 | [self.navigationController pushViewController:ctrl animated:YES];
66 | }
67 | [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
68 | }
69 |
70 | @end
71 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextExampleHelper.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextExampleHelper.h
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/9/3.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface YYTextExampleHelper : NSObject
12 |
13 | + (void)addDebugOptionToViewController:(UIViewController *)vc;
14 | + (void)setDebug:(BOOL)debug;
15 | + (BOOL)isDebug;
16 | @end
17 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextExampleHelper.m:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextExampleHelper.m
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/9/3.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import "YYTextExampleHelper.h"
10 | #import "YYText.h"
11 | #import "UIControl+YYAdd.h"
12 | #import "UIView+YYAdd.h"
13 |
14 | static BOOL DebugEnabled = NO;
15 |
16 | @implementation YYTextExampleHelper
17 |
18 | + (void)addDebugOptionToViewController:(UIViewController *)vc {
19 | UISwitch *switcher = [UISwitch new];
20 | [switcher.layer setValue:@(0.8) forKeyPath:@"transform.scale"];
21 |
22 | [switcher setOn:DebugEnabled];
23 | [switcher addBlockForControlEvents:UIControlEventValueChanged block:^(UISwitch *sender) {
24 | [self setDebug:sender.isOn];
25 | }];
26 |
27 | UIView *view = [UIView new];
28 | view.size = CGSizeMake(40, 44);
29 | [view addSubview:switcher];
30 | switcher.centerX = view.width / 2;
31 | switcher.centerY = view.height / 2;
32 |
33 | UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:view];
34 | vc.navigationItem.rightBarButtonItem = item;
35 | }
36 |
37 | + (void)setDebug:(BOOL)debug {
38 | YYTextDebugOption *debugOptions = [YYTextDebugOption new];
39 | if (debug) {
40 | debugOptions.baselineColor = [UIColor redColor];
41 | debugOptions.CTFrameBorderColor = [UIColor redColor];
42 | debugOptions.CTLineFillColor = [UIColor colorWithRed:0.000 green:0.463 blue:1.000 alpha:0.180];
43 | debugOptions.CGGlyphBorderColor = [UIColor colorWithRed:1.000 green:0.524 blue:0.000 alpha:0.200];
44 | } else {
45 | [debugOptions clear];
46 | }
47 | [YYTextDebugOption setSharedDebugOption:debugOptions];
48 | DebugEnabled = debug;
49 | }
50 |
51 | + (BOOL)isDebug {
52 | return DebugEnabled;
53 | }
54 |
55 | @end
56 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextMarkdownExample.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextMarkdownExample.h
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/9/3.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface YYTextMarkdownExample : UIViewController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextMarkdownExample.m:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextMarkdownExample.m
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/9/3.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import "YYTextMarkdownExample.h"
10 | #import "YYText.h"
11 | #import "YYImage.h"
12 | #import "UIImage+YYWebImage.h"
13 | #import "UIView+YYAdd.h"
14 | #import "NSBundle+YYAdd.h"
15 | #import "NSString+YYAdd.h"
16 | #import "YYTextExampleHelper.h"
17 |
18 | @interface YYTextMarkdownExample ()
19 | @property (nonatomic, assign) YYTextView *textView;
20 | @end
21 |
22 | @implementation YYTextMarkdownExample
23 |
24 | - (void)viewDidLoad {
25 | [super viewDidLoad];
26 | self.view.backgroundColor = [UIColor whiteColor];
27 | if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) {
28 | self.automaticallyAdjustsScrollViewInsets = NO;
29 | }
30 |
31 |
32 | NSString *text = @"#Markdown Editor\nThis is a simple markdown editor based on `YYTextView`.\n\n*********************************************\nIt\'s *italic* style.\n\nIt\'s also _italic_ style.\n\nIt\'s **bold** style.\n\nIt\'s ***italic and bold*** style.\n\nIt\'s __underline__ style.\n\nIt\'s ~~deleteline~~ style.\n\n\nHere is a link: [YYKit](https://github.com/ibireme/YYKit)\n\nHere is some code:\n\n\tif(a){\n\t\tif(b){\n\t\t\tif(c){\n\t\t\t\tprintf(\"haha\");\n\t\t\t}\n\t\t}\n\t}\n";
33 |
34 | YYTextSimpleMarkdownParser *parser = [YYTextSimpleMarkdownParser new];
35 | [parser setColorWithDarkTheme];
36 |
37 | YYTextView *textView = [YYTextView new];
38 | textView.text = text;
39 | textView.font = [UIFont systemFontOfSize:14];
40 | textView.textParser = parser;
41 | textView.size = self.view.size;
42 | textView.textContainerInset = UIEdgeInsetsMake(10, 10, 10, 10);
43 | textView.delegate = self;
44 | if (kiOS7Later) {
45 | textView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
46 | }
47 | textView.backgroundColor = [UIColor colorWithWhite:0.134 alpha:1.000];
48 | textView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
49 | textView.scrollIndicatorInsets = textView.contentInset;
50 | textView.selectedRange = NSMakeRange(text.length, 0);
51 | [self.view addSubview:textView];
52 | self.textView = textView;
53 | }
54 |
55 | - (void)edit:(UIBarButtonItem *)item {
56 | if (_textView.isFirstResponder) {
57 | [_textView resignFirstResponder];
58 | } else {
59 | [_textView becomeFirstResponder];
60 | }
61 | }
62 |
63 | - (void)textViewDidBeginEditing:(YYTextView *)textView {
64 | UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
65 | target:self
66 | action:@selector(edit:)];
67 | self.navigationItem.rightBarButtonItem = buttonItem;
68 | }
69 |
70 | - (void)textViewDidEndEditing:(YYTextView *)textView {
71 | self.navigationItem.rightBarButtonItem = nil;
72 | }
73 |
74 | @end
75 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextRubyExample.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextRubyExample.h
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/9/9.
6 | // Copyright (C) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface YYTextRubyExample : UIViewController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextTagExample.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextTagExample.h
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/8/19.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface YYTextTagExample : UIViewController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextUndoRedoExample.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextUndoRedoExample.h
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/9/12.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface YYTextUndoRedoExample : UIViewController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYTextUndoRedoExample.m:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextUndoRedoExample.m
3 | // YYKitExample
4 | //
5 | // Created by ibireme on 15/9/12.
6 | // Copyright (c) 2015 ibireme. All rights reserved.
7 | //
8 |
9 | #import "YYTextUndoRedoExample.h"
10 | #import "YYText.h"
11 | #import "YYImage.h"
12 | #import "UIImage+YYWebImage.h"
13 | #import "UIView+YYAdd.h"
14 | #import "NSBundle+YYAdd.h"
15 | #import "NSString+YYAdd.h"
16 | #import "YYTextExampleHelper.h"
17 |
18 | @interface YYTextUndoRedoExample ()
19 | @property (nonatomic, assign) YYTextView *textView;
20 | @end
21 |
22 | @implementation YYTextUndoRedoExample
23 |
24 | - (void)viewDidLoad {
25 | [super viewDidLoad];
26 | self.view.backgroundColor = [UIColor whiteColor];
27 | if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) {
28 | self.automaticallyAdjustsScrollViewInsets = NO;
29 | }
30 |
31 |
32 | NSString *text = @"You can shake the device to undo and redo.";
33 |
34 | YYTextView *textView = [YYTextView new];
35 | textView.text = text;
36 | textView.font = [UIFont systemFontOfSize:17];
37 | textView.size = self.view.size;
38 | textView.textContainerInset = UIEdgeInsetsMake(10, 10, 10, 10);
39 | textView.delegate = self;
40 | textView.allowsUndoAndRedo = YES; /// Undo and Redo
41 | textView.maximumUndoLevel = 10; /// Undo level
42 | if (kiOS7Later) {
43 | textView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
44 | }
45 | textView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
46 | textView.scrollIndicatorInsets = textView.contentInset;
47 | [self.view addSubview:textView];
48 | self.textView = textView;
49 |
50 | textView.selectedRange = NSMakeRange(text.length, 0);
51 | [textView becomeFirstResponder];
52 | }
53 |
54 |
55 | - (void)edit:(UIBarButtonItem *)item {
56 | if (_textView.isFirstResponder) {
57 | [_textView resignFirstResponder];
58 | } else {
59 | [_textView becomeFirstResponder];
60 | }
61 | }
62 |
63 | - (void)textViewDidBeginEditing:(YYTextView *)textView {
64 | UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
65 | target:self
66 | action:@selector(edit:)];
67 | self.navigationItem.rightBarButtonItem = buttonItem;
68 | }
69 |
70 | - (void)textViewDidEndEditing:(YYTextView *)textView {
71 | self.navigationItem.rightBarButtonItem = nil;
72 | }
73 |
74 | @end
75 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYWeakProxy.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYWeakProxy.h
3 | // YYKit
4 | //
5 | // Created by ibireme on 14/10/18.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | /**
15 | A proxy used to hold a weak object.
16 | It can be used to avoid retain cycles, such as the target in NSTimer or CADisplayLink.
17 |
18 | sample code:
19 |
20 | @implementation MyView {
21 | NSTimer *_timer;
22 | }
23 |
24 | - (void)initTimer {
25 | YYWeakProxy *proxy = [YYWeakProxy proxyWithTarget:self];
26 | _timer = [NSTimer timerWithTimeInterval:0.1 target:proxy selector:@selector(tick:) userInfo:nil repeats:YES];
27 | }
28 |
29 | - (void)tick:(NSTimer *)timer {...}
30 | @end
31 | */
32 | @interface YYWeakProxy : NSProxy
33 |
34 | /**
35 | The proxy target.
36 | */
37 | @property (nonatomic, weak, readonly) id target;
38 |
39 | /**
40 | Creates a new weak proxy for target.
41 |
42 | @param target Target object.
43 |
44 | @return A new proxy object.
45 | */
46 | - (instancetype)initWithTarget:(id)target;
47 |
48 | /**
49 | Creates a new weak proxy for target.
50 |
51 | @param target Target object.
52 |
53 | @return A new proxy object.
54 | */
55 | + (instancetype)proxyWithTarget:(id)target;
56 |
57 | @end
58 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/YYWeakProxy.m:
--------------------------------------------------------------------------------
1 | //
2 | // YYWeakProxy.m
3 | // YYKit
4 | //
5 | // Created by ibireme on 14/10/18.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import "YYWeakProxy.h"
13 |
14 |
15 | @implementation YYWeakProxy
16 |
17 | - (instancetype)initWithTarget:(id)target {
18 | _target = target;
19 | return self;
20 | }
21 |
22 | + (instancetype)proxyWithTarget:(id)target {
23 | return [[YYWeakProxy alloc] initWithTarget:target];
24 | }
25 |
26 | - (id)forwardingTargetForSelector:(SEL)selector {
27 | return _target;
28 | }
29 |
30 | - (void)forwardInvocation:(NSInvocation *)invocation {
31 | void *null = NULL;
32 | [invocation setReturnValue:&null];
33 | }
34 |
35 | - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
36 | return [NSObject instanceMethodSignatureForSelector:@selector(init)];
37 | }
38 |
39 | - (BOOL)respondsToSelector:(SEL)aSelector {
40 | return [_target respondsToSelector:aSelector];
41 | }
42 |
43 | - (BOOL)isEqual:(id)object {
44 | return [_target isEqual:object];
45 | }
46 |
47 | - (NSUInteger)hash {
48 | return [_target hash];
49 | }
50 |
51 | - (Class)superclass {
52 | return [_target superclass];
53 | }
54 |
55 | - (Class)class {
56 | return [_target class];
57 | }
58 |
59 | - (BOOL)isKindOfClass:(Class)aClass {
60 | return [_target isKindOfClass:aClass];
61 | }
62 |
63 | - (BOOL)isMemberOfClass:(Class)aClass {
64 | return [_target isMemberOfClass:aClass];
65 | }
66 |
67 | - (BOOL)conformsToProtocol:(Protocol *)aProtocol {
68 | return [_target conformsToProtocol:aProtocol];
69 | }
70 |
71 | - (BOOL)isProxy {
72 | return YES;
73 | }
74 |
75 | - (NSString *)description {
76 | return [_target description];
77 | }
78 |
79 | - (NSString *)debugDescription {
80 | return [_target debugDescription];
81 | }
82 |
83 | @end
84 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/dribbble256_imageio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/dribbble256_imageio.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/dribbble64_imageio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/dribbble64_imageio.png
--------------------------------------------------------------------------------
/Demo/YYTextDemo/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // YYTextDemo
4 | //
5 | // Created by ibireme on 15/10/17.
6 | // Copyright © 2015年 ibireme. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "AppDelegate.h"
11 |
12 | int main(int argc, char * argv[]) {
13 | @autoreleasepool {
14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Demo/YYTextDemo/pia@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ibireme/YYText/7bd2aa41414736f6451241725778509fe75860b5/Demo/YYTextDemo/pia@2x.png
--------------------------------------------------------------------------------
/Framework/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0.7
19 | CFBundleVersion
20 | $(CURRENT_PROJECT_VERSION)
21 | NSPrincipalClass
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Framework/YYText.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Framework/YYText.xcodeproj/xcshareddata/xcschemes/YYText.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
34 |
35 |
45 |
46 |
52 |
53 |
54 |
55 |
56 |
57 |
63 |
64 |
70 |
71 |
72 |
73 |
75 |
76 |
79 |
80 |
81 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 ibireme
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/YYText.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |s|
2 | s.name = 'YYText'
3 | s.summary = 'Powerful text framework for iOS to display and edit rich text.'
4 | s.version = '1.0.7'
5 | s.license = { :type => 'MIT', :file => 'LICENSE' }
6 | s.authors = { 'ibireme' => 'ibireme@gmail.com' }
7 | s.social_media_url = 'http://blog.ibireme.com'
8 | s.homepage = 'https://github.com/ibireme/YYText'
9 | s.platform = :ios, '6.0'
10 | s.ios.deployment_target = '6.0'
11 | s.source = { :git => 'https://github.com/ibireme/YYText.git', :tag => s.version.to_s }
12 |
13 | s.requires_arc = true
14 | s.source_files = 'YYText/**/*.{h,m}'
15 | s.public_header_files = 'YYText/**/*.{h}'
16 |
17 | s.frameworks = 'UIKit', 'CoreFoundation','CoreText', 'QuartzCore', 'Accelerate', 'MobileCoreServices'
18 |
19 | end
20 |
--------------------------------------------------------------------------------
/YYText/Component/YYTextContainerView.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextContainerView.h
3 | // YYText
4 | //
5 | // Created by ibireme on 15/4/21.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | #if __has_include()
15 | #import
16 | #else
17 | #import "YYTextLayout.h"
18 | #endif
19 |
20 | NS_ASSUME_NONNULL_BEGIN
21 |
22 | /**
23 | A simple view to diaplay `YYTextLayout`.
24 |
25 | @discussion This view can become first responder. If this view is first responder,
26 | all the action (such as UIMenu's action) would forward to the `hostView` property.
27 | Typically, you should not use this class directly.
28 |
29 | @warning All the methods in this class should be called on main thread.
30 | */
31 | @interface YYTextContainerView : UIView
32 |
33 | /// First responder's aciton will forward to this view.
34 | @property (nullable, nonatomic, weak) UIView *hostView;
35 |
36 | /// Debug option for layout debug. Set this property will let the view redraw it's contents.
37 | @property (nullable, nonatomic, copy) YYTextDebugOption *debugOption;
38 |
39 | /// Text vertical alignment.
40 | @property (nonatomic) YYTextVerticalAlignment textVerticalAlignment;
41 |
42 | /// Text layout. Set this property will let the view redraw it's contents.
43 | @property (nullable, nonatomic, strong) YYTextLayout *layout;
44 |
45 | /// The contents fade animation duration when the layout's contents changed. Default is 0 (no animation).
46 | @property (nonatomic) NSTimeInterval contentsFadeDuration;
47 |
48 | /// Convenience method to set `layout` and `contentsFadeDuration`.
49 | /// @param layout Same as `layout` property.
50 | /// @param fadeDuration Same as `contentsFadeDuration` property.
51 | - (void)setLayout:(nullable YYTextLayout *)layout withFadeDuration:(NSTimeInterval)fadeDuration;
52 |
53 | @end
54 |
55 | NS_ASSUME_NONNULL_END
56 |
--------------------------------------------------------------------------------
/YYText/Component/YYTextEffectWindow.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextEffectWindow.h
3 | // YYText
4 | //
5 | // Created by ibireme on 15/2/25.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | #if __has_include()
15 | #import
16 | #import
17 | #else
18 | #import "YYTextMagnifier.h"
19 | #import "YYTextSelectionView.h"
20 | #endif
21 |
22 | NS_ASSUME_NONNULL_BEGIN
23 |
24 | /**
25 | A window to display magnifier and extra contents for text view.
26 |
27 | @discussion Use `sharedWindow` to get the instance, don't create your own instance.
28 | Typically, you should not use this class directly.
29 | */
30 | @interface YYTextEffectWindow : UIWindow
31 |
32 | /// Returns the shared instance (returns nil in App Extension).
33 | + (nullable instancetype)sharedWindow;
34 |
35 | /// Show the magnifier in this window with a 'popup' animation. @param mag A magnifier.
36 | - (void)showMagnifier:(YYTextMagnifier *)mag;
37 | /// Update the magnifier content and position. @param mag A magnifier.
38 | - (void)moveMagnifier:(YYTextMagnifier *)mag;
39 | /// Remove the magnifier from this window with a 'shrink' animation. @param mag A magnifier.
40 | - (void)hideMagnifier:(YYTextMagnifier *)mag;
41 |
42 |
43 | /// Show the selection dot in this window if the dot is clipped by the selection view.
44 | /// @param selection A selection view.
45 | - (void)showSelectionDot:(YYTextSelectionView *)selection;
46 | /// Remove the selection dot from this window.
47 | /// @param selection A selection view.
48 | - (void)hideSelectionDot:(YYTextSelectionView *)selection;
49 |
50 | @end
51 |
52 | NS_ASSUME_NONNULL_END
53 |
--------------------------------------------------------------------------------
/YYText/Component/YYTextInput.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextInput.h
3 | // YYText
4 | //
5 | // Created by ibireme on 15/4/17.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | Text position affinity. For example, the offset appears after the last
18 | character on a line is backward affinity, before the first character on
19 | the following line is forward affinity.
20 | */
21 | typedef NS_ENUM(NSInteger, YYTextAffinity) {
22 | YYTextAffinityForward = 0, ///< offset appears before the character
23 | YYTextAffinityBackward = 1, ///< offset appears after the character
24 | };
25 |
26 |
27 | /**
28 | A YYTextPosition object represents a position in a text container; in other words,
29 | it is an index into the backing string in a text-displaying view.
30 |
31 | YYTextPosition has the same API as Apple's implementation in UITextView/UITextField,
32 | so you can alse use it to interact with UITextView/UITextField.
33 | */
34 | @interface YYTextPosition : UITextPosition
35 |
36 | @property (nonatomic, readonly) NSInteger offset;
37 | @property (nonatomic, readonly) YYTextAffinity affinity;
38 |
39 | + (instancetype)positionWithOffset:(NSInteger)offset;
40 | + (instancetype)positionWithOffset:(NSInteger)offset affinity:(YYTextAffinity) affinity;
41 |
42 | - (NSComparisonResult)compare:(id)otherPosition;
43 |
44 | @end
45 |
46 |
47 | /**
48 | A YYTextRange object represents a range of characters in a text container; in other words,
49 | it identifies a starting index and an ending index in string backing a text-displaying view.
50 |
51 | YYTextRange has the same API as Apple's implementation in UITextView/UITextField,
52 | so you can alse use it to interact with UITextView/UITextField.
53 | */
54 | @interface YYTextRange : UITextRange
55 |
56 | @property (nonatomic, readonly) YYTextPosition *start;
57 | @property (nonatomic, readonly) YYTextPosition *end;
58 | @property (nonatomic, readonly, getter=isEmpty) BOOL empty;
59 |
60 | + (instancetype)rangeWithRange:(NSRange)range;
61 | + (instancetype)rangeWithRange:(NSRange)range affinity:(YYTextAffinity) affinity;
62 | + (instancetype)rangeWithStart:(YYTextPosition *)start end:(YYTextPosition *)end;
63 | + (instancetype)defaultRange; ///< <{0,0} Forward>
64 |
65 | - (NSRange)asRange;
66 |
67 | @end
68 |
69 |
70 | /**
71 | A YYTextSelectionRect object encapsulates information about a selected range of
72 | text in a text-displaying view.
73 |
74 | YYTextSelectionRect has the same API as Apple's implementation in UITextView/UITextField,
75 | so you can alse use it to interact with UITextView/UITextField.
76 | */
77 | @interface YYTextSelectionRect : UITextSelectionRect
78 |
79 | @property (nonatomic, readwrite) CGRect rect;
80 | @property (nonatomic, readwrite) UITextWritingDirection writingDirection;
81 | @property (nonatomic, readwrite) BOOL containsStart;
82 | @property (nonatomic, readwrite) BOOL containsEnd;
83 | @property (nonatomic, readwrite) BOOL isVertical;
84 |
85 | @end
86 |
87 | NS_ASSUME_NONNULL_END
88 |
--------------------------------------------------------------------------------
/YYText/Component/YYTextKeyboardManager.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextKeyboardManager.h
3 | // YYText
4 | //
5 | // Created by ibireme on 15/6/3.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | System keyboard transition information.
18 | Use -[YYTextKeyboardManager convertRect:toView:] to convert frame to specified view.
19 | */
20 | typedef struct {
21 | BOOL fromVisible; ///< Keyboard visible before transition.
22 | BOOL toVisible; ///< Keyboard visible after transition.
23 | CGRect fromFrame; ///< Keyboard frame before transition.
24 | CGRect toFrame; ///< Keyboard frame after transition.
25 | NSTimeInterval animationDuration; ///< Keyboard transition animation duration.
26 | UIViewAnimationCurve animationCurve; ///< Keyboard transition animation curve.
27 | UIViewAnimationOptions animationOption; ///< Keybaord transition animation option.
28 | } YYTextKeyboardTransition;
29 |
30 |
31 | /**
32 | The YYTextKeyboardObserver protocol defines the method you can use
33 | to receive system keyboard change information.
34 | */
35 | @protocol YYTextKeyboardObserver
36 | @optional
37 | - (void)keyboardChangedWithTransition:(YYTextKeyboardTransition)transition;
38 | @end
39 |
40 |
41 | /**
42 | A YYTextKeyboardManager object lets you get the system keyboard information,
43 | and track the keyboard visible/frame/transition.
44 |
45 | @discussion You should access this class in main thread.
46 | Compatible: iPhone/iPad with iOS6/7/8/9.
47 | */
48 | @interface YYTextKeyboardManager : NSObject
49 |
50 | - (instancetype)init UNAVAILABLE_ATTRIBUTE;
51 | + (instancetype)new UNAVAILABLE_ATTRIBUTE;
52 |
53 | /// Get the default manager (returns nil in App Extension).
54 | + (nullable instancetype)defaultManager;
55 |
56 | /// Get the keyboard window. nil if there's no keyboard window.
57 | @property (nullable, nonatomic, readonly) UIWindow *keyboardWindow;
58 |
59 | /// Get the keyboard view. nil if there's no keyboard view.
60 | @property (nullable, nonatomic, readonly) UIView *keyboardView;
61 |
62 | /// Whether the keyboard is visible.
63 | @property (nonatomic, readonly, getter=isKeyboardVisible) BOOL keyboardVisible;
64 |
65 | /// Get the keyboard frame. CGRectNull if there's no keyboard view.
66 | /// Use convertRect:toView: to convert frame to specified view.
67 | @property (nonatomic, readonly) CGRect keyboardFrame;
68 |
69 |
70 | /**
71 | Add an observer to manager to get keyboard change information.
72 | This method makes a weak reference to the observer.
73 |
74 | @param observer An observer.
75 | This method will do nothing if the observer is nil, or already added.
76 | */
77 | - (void)addObserver:(id)observer;
78 |
79 | /**
80 | Remove an observer from manager.
81 |
82 | @param observer An observer.
83 | This method will do nothing if the observer is nil, or not in manager.
84 | */
85 | - (void)removeObserver:(id)observer;
86 |
87 | /**
88 | Convert rect to specified view or window.
89 |
90 | @param rect The frame rect.
91 | @param view A specified view or window (pass nil to convert for main window).
92 | @return The converted rect in specifeid view.
93 | */
94 | - (CGRect)convertRect:(CGRect)rect toView:(nullable UIView *)view;
95 |
96 | @end
97 |
98 | NS_ASSUME_NONNULL_END
99 |
--------------------------------------------------------------------------------
/YYText/Component/YYTextLine.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextLine.h
3 | // YYText
4 | //
5 | // Created by ibireme on 15/3/10.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 | #import
14 |
15 | #if __has_include()
16 | #import
17 | #else
18 | #import "YYTextAttribute.h"
19 | #endif
20 |
21 | @class YYTextRunGlyphRange;
22 |
23 | NS_ASSUME_NONNULL_BEGIN
24 |
25 | /**
26 | A text line object wrapped `CTLineRef`, see `YYTextLayout` for more.
27 | */
28 | @interface YYTextLine : NSObject
29 |
30 | + (instancetype)lineWithCTLine:(CTLineRef)CTLine position:(CGPoint)position vertical:(BOOL)isVertical;
31 |
32 | @property (nonatomic) NSUInteger index; ///< line index
33 | @property (nonatomic) NSUInteger row; ///< line row
34 | @property (nullable, nonatomic, strong) NSArray *> *verticalRotateRange; ///< Run rotate range
35 |
36 | @property (nonatomic, readonly) CTLineRef CTLine; ///< CoreText line
37 | @property (nonatomic, readonly) NSRange range; ///< string range
38 | @property (nonatomic, readonly) BOOL vertical; ///< vertical form
39 |
40 | @property (nonatomic, readonly) CGRect bounds; ///< bounds (ascent + descent)
41 | @property (nonatomic, readonly) CGSize size; ///< bounds.size
42 | @property (nonatomic, readonly) CGFloat width; ///< bounds.size.width
43 | @property (nonatomic, readonly) CGFloat height; ///< bounds.size.height
44 | @property (nonatomic, readonly) CGFloat top; ///< bounds.origin.y
45 | @property (nonatomic, readonly) CGFloat bottom; ///< bounds.origin.y + bounds.size.height
46 | @property (nonatomic, readonly) CGFloat left; ///< bounds.origin.x
47 | @property (nonatomic, readonly) CGFloat right; ///< bounds.origin.x + bounds.size.width
48 |
49 | @property (nonatomic) CGPoint position; ///< baseline position
50 | @property (nonatomic, readonly) CGFloat ascent; ///< line ascent
51 | @property (nonatomic, readonly) CGFloat descent; ///< line descent
52 | @property (nonatomic, readonly) CGFloat leading; ///< line leading
53 | @property (nonatomic, readonly) CGFloat lineWidth; ///< line width
54 | @property (nonatomic, readonly) CGFloat trailingWhitespaceWidth;
55 |
56 | @property (nullable, nonatomic, readonly) NSArray *attachments; ///< YYTextAttachment
57 | @property (nullable, nonatomic, readonly) NSArray *attachmentRanges; ///< NSRange(NSValue)
58 | @property (nullable, nonatomic, readonly) NSArray *attachmentRects; ///< CGRect(NSValue)
59 |
60 | @end
61 |
62 |
63 | typedef NS_ENUM(NSUInteger, YYTextRunGlyphDrawMode) {
64 | /// No rotate.
65 | YYTextRunGlyphDrawModeHorizontal = 0,
66 |
67 | /// Rotate vertical for single glyph.
68 | YYTextRunGlyphDrawModeVerticalRotate = 1,
69 |
70 | /// Rotate vertical for single glyph, and move the glyph to a better position,
71 | /// such as fullwidth punctuation.
72 | YYTextRunGlyphDrawModeVerticalRotateMove = 2,
73 | };
74 |
75 | /**
76 | A range in CTRun, used for vertical form.
77 | */
78 | @interface YYTextRunGlyphRange : NSObject
79 | @property (nonatomic) NSRange glyphRangeInRun;
80 | @property (nonatomic) YYTextRunGlyphDrawMode drawMode;
81 | + (instancetype)rangeWithRange:(NSRange)range drawMode:(YYTextRunGlyphDrawMode)mode;
82 | @end
83 |
84 | NS_ASSUME_NONNULL_END
85 |
--------------------------------------------------------------------------------
/YYText/Component/YYTextMagnifier.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextMagnifier.h
3 | // YYText
4 | //
5 | // Created by ibireme on 15/2/25.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | #if __has_include()
15 | #import
16 | #else
17 | #import "YYTextAttribute.h"
18 | #endif
19 |
20 | NS_ASSUME_NONNULL_BEGIN
21 |
22 | /// Magnifier type
23 | typedef NS_ENUM(NSInteger, YYTextMagnifierType) {
24 | YYTextMagnifierTypeCaret, ///< Circular magnifier
25 | YYTextMagnifierTypeRanged, ///< Round rectangle magnifier
26 | };
27 |
28 | /**
29 | A magnifier view which can be displayed in `YYTextEffectWindow`.
30 |
31 | @discussion Use `magnifierWithType:` to create instance.
32 | Typically, you should not use this class directly.
33 | */
34 | @interface YYTextMagnifier : UIView
35 |
36 | /// Create a mangifier with the specified type. @param type The magnifier type.
37 | + (id)magnifierWithType:(YYTextMagnifierType)type;
38 |
39 | @property (nonatomic, readonly) YYTextMagnifierType type; ///< Type of magnifier
40 | @property (nonatomic, readonly) CGSize fitSize; ///< The 'best' size for magnifier view.
41 | @property (nonatomic, readonly) CGSize snapshotSize; ///< The 'best' snapshot image size for magnifier.
42 | @property (nullable, nonatomic, strong) UIImage *snapshot; ///< The image in magnifier (readwrite).
43 |
44 | @property (nullable, nonatomic, weak) UIView *hostView; ///< The coordinate based view.
45 | @property (nonatomic) CGPoint hostCaptureCenter; ///< The snapshot capture center in `hostView`.
46 | @property (nonatomic) CGPoint hostPopoverCenter; ///< The popover center in `hostView`.
47 | @property (nonatomic) BOOL hostVerticalForm; ///< The host view is vertical form.
48 | @property (nonatomic) BOOL captureDisabled; ///< A hint for `YYTextEffectWindow` to disable capture.
49 | @property (nonatomic) BOOL captureFadeAnimation; ///< Show fade animation when the snapshot image changed.
50 | @end
51 |
52 | NS_ASSUME_NONNULL_END
53 |
--------------------------------------------------------------------------------
/YYText/Component/YYTextSelectionView.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextSelectionView.h
3 | // YYText
4 | //
5 | // Created by ibireme on 15/2/25.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | #if __has_include()
15 | #import
16 | #import
17 | #else
18 | #import "YYTextAttribute.h"
19 | #import "YYTextInput.h"
20 | #endif
21 |
22 | NS_ASSUME_NONNULL_BEGIN
23 |
24 | /**
25 | A single dot view. The frame should be foursquare.
26 | Change the background color for display.
27 |
28 | @discussion Typically, you should not use this class directly.
29 | */
30 | @interface YYSelectionGrabberDot : UIView
31 | /// Dont't access this property. It was used by `YYTextEffectWindow`.
32 | @property (nonatomic, strong) UIView *mirror;
33 | @end
34 |
35 |
36 | /**
37 | A grabber (stick with a dot).
38 |
39 | @discussion Typically, you should not use this class directly.
40 | */
41 | @interface YYSelectionGrabber : UIView
42 |
43 | @property (nonatomic, readonly) YYSelectionGrabberDot *dot; ///< the dot view
44 | @property (nonatomic) YYTextDirection dotDirection; ///< don't support composite direction
45 | @property (nullable, nonatomic, strong) UIColor *color; ///< tint color, default is nil
46 |
47 | @end
48 |
49 |
50 | /**
51 | The selection view for text edit and select.
52 |
53 | @discussion Typically, you should not use this class directly.
54 | */
55 | @interface YYTextSelectionView : UIView
56 |
57 | @property (nullable, nonatomic, weak) UIView *hostView; ///< the holder view
58 | @property (nullable, nonatomic, strong) UIColor *color; ///< the tint color
59 | @property (nonatomic, getter = isCaretBlinks) BOOL caretBlinks; ///< whether the caret is blinks
60 | @property (nonatomic, getter = isCaretVisible) BOOL caretVisible; ///< whether the caret is visible
61 | @property (nonatomic, getter = isVerticalForm) BOOL verticalForm; ///< weather the text view is vertical form
62 |
63 | @property (nonatomic) CGRect caretRect; ///< caret rect (width==0 or height==0)
64 | @property (nullable, nonatomic, copy) NSArray *selectionRects; ///< default is nil
65 |
66 | @property (nonatomic, readonly) UIView *caretView;
67 | @property (nonatomic, readonly) YYSelectionGrabber *startGrabber;
68 | @property (nonatomic, readonly) YYSelectionGrabber *endGrabber;
69 |
70 | - (BOOL)isGrabberContainsPoint:(CGPoint)point;
71 | - (BOOL)isStartGrabberContainsPoint:(CGPoint)point;
72 | - (BOOL)isEndGrabberContainsPoint:(CGPoint)point;
73 | - (BOOL)isCaretContainsPoint:(CGPoint)point;
74 | - (BOOL)isSelectionRectsContainsPoint:(CGPoint)point;
75 |
76 | @end
77 |
78 | NS_ASSUME_NONNULL_END
79 |
--------------------------------------------------------------------------------
/YYText/String/YYTextArchiver.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextArchiver.h
3 | // YYText
4 | //
5 | // Created by ibireme on 15/3/16.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | A subclass of `NSKeyedArchiver` which implement `NSKeyedArchiverDelegate` protocol.
18 |
19 | The archiver can encode the object which contains
20 | CGColor/CGImage/CTRunDelegateRef/.. (such as NSAttributedString).
21 | */
22 | @interface YYTextArchiver : NSKeyedArchiver
23 | @end
24 |
25 | /**
26 | A subclass of `NSKeyedUnarchiver` which implement `NSKeyedUnarchiverDelegate`
27 | protocol. The unarchiver can decode the data which is encoded by
28 | `YYTextArchiver` or `NSKeyedArchiver`.
29 | */
30 | @interface YYTextUnarchiver : NSKeyedUnarchiver
31 | @end
32 |
33 | NS_ASSUME_NONNULL_END
34 |
--------------------------------------------------------------------------------
/YYText/String/YYTextParser.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextParser.h
3 | // YYText
4 | //
5 | // Created by ibireme on 15/3/6.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | The YYTextParser protocol declares the required method for YYTextView and YYLabel
18 | to modify the text during editing.
19 |
20 | You can implement this protocol to add code highlighting or emoticon replacement for
21 | YYTextView and YYLabel. See `YYTextSimpleMarkdownParser` and `YYTextSimpleEmoticonParser` for example.
22 | */
23 | @protocol YYTextParser
24 | @required
25 | /**
26 | When text is changed in YYTextView or YYLabel, this method will be called.
27 |
28 | @param text The original attributed string. This method may parse the text and
29 | change the text attributes or content.
30 |
31 | @param selectedRange Current selected range in `text`.
32 | This method should correct the range if the text content is changed. If there's
33 | no selected range (such as YYLabel), this value is NULL.
34 |
35 | @return If the 'text' is modified in this method, returns `YES`, otherwise returns `NO`.
36 | */
37 | - (BOOL)parseText:(nullable NSMutableAttributedString *)text selectedRange:(nullable NSRangePointer)selectedRange;
38 | @end
39 |
40 |
41 |
42 | /**
43 | A simple markdown parser.
44 |
45 | It'a very simple markdown parser, you can use this parser to highlight some
46 | small piece of markdown text.
47 |
48 | This markdown parser use regular expression to parse text, slow and weak.
49 | If you want to write a better parser, try these projests:
50 | https://github.com/NimbusKit/markdown
51 | https://github.com/dreamwieber/AttributedMarkdown
52 | https://github.com/indragiek/CocoaMarkdown
53 |
54 | Or you can use lex/yacc to generate your custom parser.
55 | */
56 | @interface YYTextSimpleMarkdownParser : NSObject
57 | @property (nonatomic) CGFloat fontSize; ///< default is 14
58 | @property (nonatomic) CGFloat headerFontSize; ///< default is 20
59 |
60 | @property (nullable, nonatomic, strong) UIColor *textColor;
61 | @property (nullable, nonatomic, strong) UIColor *controlTextColor;
62 | @property (nullable, nonatomic, strong) UIColor *headerTextColor;
63 | @property (nullable, nonatomic, strong) UIColor *inlineTextColor;
64 | @property (nullable, nonatomic, strong) UIColor *codeTextColor;
65 | @property (nullable, nonatomic, strong) UIColor *linkTextColor;
66 |
67 | - (void)setColorWithBrightTheme; ///< reset the color properties to pre-defined value.
68 | - (void)setColorWithDarkTheme; ///< reset the color properties to pre-defined value.
69 | @end
70 |
71 |
72 |
73 | /**
74 | A simple emoticon parser.
75 |
76 | Use this parser to map some specified piece of string to image emoticon.
77 | Example: "Hello :smile:" -> "Hello 😀"
78 |
79 | It can also be used to extend the "unicode emoticon".
80 | */
81 | @interface YYTextSimpleEmoticonParser : NSObject
82 |
83 | /**
84 | The custom emoticon mapper.
85 | The key is a specified plain string, such as @":smile:".
86 | The value is a UIImage which will replace the specified plain string in text.
87 | */
88 | @property (nullable, copy) NSDictionary *emoticonMapper;
89 | @end
90 |
91 | NS_ASSUME_NONNULL_END
92 |
--------------------------------------------------------------------------------
/YYText/String/YYTextRubyAnnotation.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextRubyAnnotation.h
3 | // YYText
4 | //
5 | // Created by ibireme on 15/4/24.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 | #import
14 |
15 | NS_ASSUME_NONNULL_BEGIN
16 |
17 | /**
18 | Wrapper for CTRubyAnnotationRef.
19 |
20 | Example:
21 |
22 | YYTextRubyAnnotation *ruby = [YYTextRubyAnnotation new];
23 | ruby.textBefore = @"zhù yīn";
24 | CTRubyAnnotationRef ctRuby = ruby.CTRubyAnnotation;
25 | if (ctRuby) {
26 | /// add to attributed string
27 | CFRelease(ctRuby);
28 | }
29 |
30 | */
31 | @interface YYTextRubyAnnotation : NSObject
32 |
33 | /// Specifies how the ruby text and the base text should be aligned relative to each other.
34 | @property (nonatomic) CTRubyAlignment alignment;
35 |
36 | /// Specifies how the ruby text can overhang adjacent characters.
37 | @property (nonatomic) CTRubyOverhang overhang;
38 |
39 | /// Specifies the size of the annotation text as a percent of the size of the base text.
40 | @property (nonatomic) CGFloat sizeFactor;
41 |
42 |
43 | /// The ruby text is positioned before the base text;
44 | /// i.e. above horizontal text and to the right of vertical text.
45 | @property (nullable, nonatomic, copy) NSString *textBefore;
46 |
47 | /// The ruby text is positioned after the base text;
48 | /// i.e. below horizontal text and to the left of vertical text.
49 | @property (nullable, nonatomic, copy) NSString *textAfter;
50 |
51 | /// The ruby text is positioned to the right of the base text whether it is horizontal or vertical.
52 | /// This is the way that Bopomofo annotations are attached to Chinese text in Taiwan.
53 | @property (nullable, nonatomic, copy) NSString *textInterCharacter;
54 |
55 | /// The ruby text follows the base text with no special styling.
56 | @property (nullable, nonatomic, copy) NSString *textInline;
57 |
58 |
59 | /**
60 | Create a ruby object from CTRuby object.
61 |
62 | @param ctRuby A CTRuby object.
63 |
64 | @return A ruby object, or nil when an error occurs.
65 | */
66 | + (instancetype)rubyWithCTRubyRef:(CTRubyAnnotationRef)ctRuby NS_AVAILABLE_IOS(8_0);
67 |
68 | /**
69 | Create a CTRuby object from the instance.
70 |
71 | @return A new CTRuby object, or NULL when an error occurs.
72 | The returned value should be release after used.
73 | */
74 | - (nullable CTRubyAnnotationRef)CTRubyAnnotation CF_RETURNS_RETAINED NS_AVAILABLE_IOS(8_0);
75 |
76 | @end
77 |
78 | NS_ASSUME_NONNULL_END
79 |
--------------------------------------------------------------------------------
/YYText/String/YYTextRunDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextRunDelegate.h
3 | // YYText
4 | //
5 | // Created by ibireme on 14/10/14.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 | #import
14 |
15 | NS_ASSUME_NONNULL_BEGIN
16 |
17 | /**
18 | Wrapper for CTRunDelegateRef.
19 |
20 | Example:
21 |
22 | YYTextRunDelegate *delegate = [YYTextRunDelegate new];
23 | delegate.ascent = 20;
24 | delegate.descent = 4;
25 | delegate.width = 20;
26 | CTRunDelegateRef ctRunDelegate = delegate.CTRunDelegate;
27 | if (ctRunDelegate) {
28 | /// add to attributed string
29 | CFRelease(ctRunDelegate);
30 | }
31 |
32 | */
33 | @interface YYTextRunDelegate : NSObject
34 |
35 | /**
36 | Creates and returns the CTRunDelegate.
37 |
38 | @discussion You need call CFRelease() after used.
39 | The CTRunDelegateRef has a strong reference to this YYTextRunDelegate object.
40 | In CoreText, use CTRunDelegateGetRefCon() to get this YYTextRunDelegate object.
41 |
42 | @return The CTRunDelegate object.
43 | */
44 | - (nullable CTRunDelegateRef)CTRunDelegate CF_RETURNS_RETAINED;
45 |
46 | /**
47 | Additional information about the the run delegate.
48 | */
49 | @property (nullable, nonatomic, strong) NSDictionary *userInfo;
50 |
51 | /**
52 | The typographic ascent of glyphs in the run.
53 | */
54 | @property (nonatomic) CGFloat ascent;
55 |
56 | /**
57 | The typographic descent of glyphs in the run.
58 | */
59 | @property (nonatomic) CGFloat descent;
60 |
61 | /**
62 | The typographic width of glyphs in the run.
63 | */
64 | @property (nonatomic) CGFloat width;
65 |
66 | @end
67 |
68 | NS_ASSUME_NONNULL_END
69 |
--------------------------------------------------------------------------------
/YYText/String/YYTextRunDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextRunDelegate.m
3 | // YYText
4 | //
5 | // Created by ibireme on 14/10/14.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import "YYTextRunDelegate.h"
13 |
14 | static void DeallocCallback(void *ref) {
15 | YYTextRunDelegate *self = (__bridge_transfer YYTextRunDelegate *)(ref);
16 | self = nil; // release
17 | }
18 |
19 | static CGFloat GetAscentCallback(void *ref) {
20 | YYTextRunDelegate *self = (__bridge YYTextRunDelegate *)(ref);
21 | return self.ascent;
22 | }
23 |
24 | static CGFloat GetDecentCallback(void *ref) {
25 | YYTextRunDelegate *self = (__bridge YYTextRunDelegate *)(ref);
26 | return self.descent;
27 | }
28 |
29 | static CGFloat GetWidthCallback(void *ref) {
30 | YYTextRunDelegate *self = (__bridge YYTextRunDelegate *)(ref);
31 | return self.width;
32 | }
33 |
34 | @implementation YYTextRunDelegate
35 |
36 | - (CTRunDelegateRef)CTRunDelegate CF_RETURNS_RETAINED {
37 | CTRunDelegateCallbacks callbacks;
38 | callbacks.version = kCTRunDelegateCurrentVersion;
39 | callbacks.dealloc = DeallocCallback;
40 | callbacks.getAscent = GetAscentCallback;
41 | callbacks.getDescent = GetDecentCallback;
42 | callbacks.getWidth = GetWidthCallback;
43 | return CTRunDelegateCreate(&callbacks, (__bridge_retained void *)(self.copy));
44 | }
45 |
46 | - (void)encodeWithCoder:(NSCoder *)aCoder {
47 | [aCoder encodeObject:@(_ascent) forKey:@"ascent"];
48 | [aCoder encodeObject:@(_descent) forKey:@"descent"];
49 | [aCoder encodeObject:@(_width) forKey:@"width"];
50 | [aCoder encodeObject:_userInfo forKey:@"userInfo"];
51 | }
52 |
53 | - (id)initWithCoder:(NSCoder *)aDecoder {
54 | self = [super init];
55 | _ascent = ((NSNumber *)[aDecoder decodeObjectForKey:@"ascent"]).floatValue;
56 | _descent = ((NSNumber *)[aDecoder decodeObjectForKey:@"descent"]).floatValue;
57 | _width = ((NSNumber *)[aDecoder decodeObjectForKey:@"width"]).floatValue;
58 | _userInfo = [aDecoder decodeObjectForKey:@"userInfo"];
59 | return self;
60 | }
61 |
62 | - (id)copyWithZone:(NSZone *)zone {
63 | typeof(self) one = [self.class new];
64 | one.ascent = self.ascent;
65 | one.descent = self.descent;
66 | one.width = self.width;
67 | one.userInfo = self.userInfo;
68 | return one;
69 | }
70 |
71 | @end
72 |
--------------------------------------------------------------------------------
/YYText/Utility/NSParagraphStyle+YYText.h:
--------------------------------------------------------------------------------
1 | //
2 | // NSParagraphStyle+YYText.h
3 | // YYText
4 | //
5 | // Created by ibireme on 14/10/7.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | Provides extensions for `NSParagraphStyle` to work with CoreText.
18 | */
19 | @interface NSParagraphStyle (YYText)
20 |
21 | /**
22 | Creates a new NSParagraphStyle object from the CoreText Style.
23 |
24 | @param CTStyle CoreText Paragraph Style.
25 |
26 | @return a new NSParagraphStyle
27 | */
28 | + (nullable NSParagraphStyle *)yy_styleWithCTStyle:(CTParagraphStyleRef)CTStyle;
29 |
30 | /**
31 | Creates and returns a CoreText Paragraph Style. (need call CFRelease() after used)
32 | */
33 | - (nullable CTParagraphStyleRef)yy_CTStyle CF_RETURNS_RETAINED;
34 |
35 | @end
36 |
37 | NS_ASSUME_NONNULL_END
38 |
--------------------------------------------------------------------------------
/YYText/Utility/UIPasteboard+YYText.h:
--------------------------------------------------------------------------------
1 | //
2 | // UIPasteboard+YYText.h
3 | // YYText
4 | //
5 | // Created by ibireme on 15/4/2.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | Extend UIPasteboard to support image and attributed string.
18 | */
19 | @interface UIPasteboard (YYText)
20 |
21 | @property (nullable, nonatomic, copy) NSData *yy_PNGData; ///< PNG file data
22 | @property (nullable, nonatomic, copy) NSData *yy_JPEGData; ///< JPEG file data
23 | @property (nullable, nonatomic, copy) NSData *yy_GIFData; ///< GIF file data
24 | @property (nullable, nonatomic, copy) NSData *yy_WEBPData; ///< WebP file data
25 | @property (nullable, nonatomic, copy) NSData *yy_ImageData; ///< image file data
26 |
27 | /// Attributed string,
28 | /// Set this attributed will also set the string property which is copy from the attributed string.
29 | /// If the attributed string contains one or more image, it will also set the `images` property.
30 | @property (nullable, nonatomic, copy) NSAttributedString *yy_AttributedString;
31 |
32 | @end
33 |
34 |
35 | /// The name identifying the attributed string in pasteboard.
36 | UIKIT_EXTERN NSString *const YYTextPasteboardTypeAttributedString;
37 |
38 | /// The UTI Type identifying WebP data in pasteboard.
39 | UIKIT_EXTERN NSString *const YYTextUTTypeWEBP;
40 |
41 | NS_ASSUME_NONNULL_END
42 |
--------------------------------------------------------------------------------
/YYText/Utility/UIView+YYText.h:
--------------------------------------------------------------------------------
1 | //
2 | // UIView+YYText.h
3 | // YYText
4 | //
5 | // Created by ibireme on 13/4/3.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | Provides extensions for `UIView`.
18 | */
19 | @interface UIView (YYText)
20 |
21 | /**
22 | Returns the view's view controller (may be nil).
23 | */
24 | @property (nullable, nonatomic, readonly) UIViewController *yy_viewController;
25 |
26 | /**
27 | Returns the visible alpha on screen, taking into account superview and window.
28 | */
29 | @property (nonatomic, readonly) CGFloat yy_visibleAlpha;
30 |
31 | /**
32 | Converts a point from the receiver's coordinate system to that of the specified view or window.
33 |
34 | @param point A point specified in the local coordinate system (bounds) of the receiver.
35 | @param view The view or window into whose coordinate system point is to be converted.
36 | If view is nil, this method instead converts to window base coordinates.
37 | @return The point converted to the coordinate system of view.
38 | */
39 | - (CGPoint)yy_convertPoint:(CGPoint)point toViewOrWindow:(UIView *)view;
40 |
41 | /**
42 | Converts a point from the coordinate system of a given view or window to that of the receiver.
43 |
44 | @param point A point specified in the local coordinate system (bounds) of view.
45 | @param view The view or window with point in its coordinate system.
46 | If view is nil, this method instead converts from window base coordinates.
47 | @return The point converted to the local coordinate system (bounds) of the receiver.
48 | */
49 | - (CGPoint)yy_convertPoint:(CGPoint)point fromViewOrWindow:(UIView *)view;
50 |
51 | /**
52 | Converts a rectangle from the receiver's coordinate system to that of another view or window.
53 |
54 | @param rect A rectangle specified in the local coordinate system (bounds) of the receiver.
55 | @param view The view or window that is the target of the conversion operation. If view is nil, this method instead converts to window base coordinates.
56 | @return The converted rectangle.
57 | */
58 | - (CGRect)yy_convertRect:(CGRect)rect toViewOrWindow:(UIView *)view;
59 |
60 | /**
61 | Converts a rectangle from the coordinate system of another view or window to that of the receiver.
62 |
63 | @param rect A rectangle specified in the local coordinate system (bounds) of view.
64 | @param view The view or window with rect in its coordinate system.
65 | If view is nil, this method instead converts from window base coordinates.
66 | @return The converted rectangle.
67 | */
68 | - (CGRect)yy_convertRect:(CGRect)rect fromViewOrWindow:(UIView *)view;
69 |
70 | @end
71 |
72 | NS_ASSUME_NONNULL_END
73 |
--------------------------------------------------------------------------------
/YYText/Utility/YYTextAsyncLayer.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextAsyncLayer.h
3 | // YYText
4 | //
5 | // Created by ibireme on 15/4/11.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 | #import
14 |
15 | @class YYTextAsyncLayerDisplayTask;
16 |
17 | NS_ASSUME_NONNULL_BEGIN
18 |
19 | /**
20 | The YYTextAsyncLayer class is a subclass of CALayer used for render contents asynchronously.
21 |
22 | @discussion When the layer need update it's contents, it will ask the delegate
23 | for a async display task to render the contents in a background queue.
24 | */
25 | @interface YYTextAsyncLayer : CALayer
26 | /// Whether the render code is executed in background. Default is YES.
27 | @property BOOL displaysAsynchronously;
28 | @end
29 |
30 |
31 | /**
32 | The YYTextAsyncLayer's delegate protocol. The delegate of the YYTextAsyncLayer (typically a UIView)
33 | must implements the method in this protocol.
34 | */
35 | @protocol YYTextAsyncLayerDelegate
36 | @required
37 | /// This method is called to return a new display task when the layer's contents need update.
38 | - (YYTextAsyncLayerDisplayTask *)newAsyncDisplayTask;
39 | @end
40 |
41 |
42 | /**
43 | A display task used by YYTextAsyncLayer to render the contents in background queue.
44 | */
45 | @interface YYTextAsyncLayerDisplayTask : NSObject
46 |
47 | /**
48 | This block will be called before the asynchronous drawing begins.
49 | It will be called on the main thread.
50 |
51 | block param layer: The layer.
52 | */
53 | @property (nullable, nonatomic, copy) void (^willDisplay)(CALayer *layer);
54 |
55 | /**
56 | This block is called to draw the layer's contents.
57 |
58 | @discussion This block may be called on main thread or background thread,
59 | so is should be thread-safe.
60 |
61 | block param context: A new bitmap content created by layer.
62 | block param size: The content size (typically same as layer's bound size).
63 | block param isCancelled: If this block returns `YES`, the method should cancel the
64 | drawing process and return as quickly as possible.
65 | */
66 | @property (nullable, nonatomic, copy) void (^display)(CGContextRef context, CGSize size, BOOL(^isCancelled)(void));
67 |
68 | /**
69 | This block will be called after the asynchronous drawing finished.
70 | It will be called on the main thread.
71 |
72 | block param layer: The layer.
73 | block param finished: If the draw process is cancelled, it's `NO`, otherwise it's `YES`;
74 | */
75 | @property (nullable, nonatomic, copy) void (^didDisplay)(CALayer *layer, BOOL finished);
76 |
77 | @end
78 |
79 | NS_ASSUME_NONNULL_END
80 |
--------------------------------------------------------------------------------
/YYText/Utility/YYTextTransaction.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextTransaction.h
3 | // YYText
4 | //
5 | // Created by ibireme on 15/4/18.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | YYTextTransaction let you perform a selector once before current runloop sleep.
18 | */
19 | @interface YYTextTransaction : NSObject
20 |
21 | /**
22 | Creates and returns a transaction with a specified target and selector.
23 |
24 | @param target A specified target, the target is retained until runloop end.
25 | @param selector A selector for target.
26 |
27 | @return A new transaction, or nil if an error occurs.
28 | */
29 | + (YYTextTransaction *)transactionWithTarget:(id)target selector:(SEL)selector;
30 |
31 | /**
32 | Commit the trancaction to main runloop.
33 |
34 | @discussion It will perform the selector on the target once before main runloop's
35 | current loop sleep. If the same transaction (same target and same selector) has
36 | already commit to runloop in this loop, this method do nothing.
37 | */
38 | - (void)commit;
39 |
40 | @end
41 |
42 | NS_ASSUME_NONNULL_END
43 |
--------------------------------------------------------------------------------
/YYText/Utility/YYTextTransaction.m:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextTransaction.m
3 | // YYText
4 | //
5 | // Created by ibireme on 15/4/18.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import "YYTextTransaction.h"
13 |
14 |
15 | @interface YYTextTransaction()
16 | @property (nonatomic, strong) id target;
17 | @property (nonatomic, assign) SEL selector;
18 | @end
19 |
20 | static NSMutableSet *transactionSet = nil;
21 |
22 | static void YYRunLoopObserverCallBack(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info) {
23 | if (transactionSet.count == 0) return;
24 | NSSet *currentSet = transactionSet;
25 | transactionSet = [NSMutableSet new];
26 | [currentSet enumerateObjectsUsingBlock:^(YYTextTransaction *transaction, BOOL *stop) {
27 | #pragma clang diagnostic push
28 | #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
29 | [transaction.target performSelector:transaction.selector];
30 | #pragma clang diagnostic pop
31 | }];
32 | }
33 |
34 | static void YYTextTransactionSetup() {
35 | static dispatch_once_t onceToken;
36 | dispatch_once(&onceToken, ^{
37 | transactionSet = [NSMutableSet new];
38 | CFRunLoopRef runloop = CFRunLoopGetMain();
39 | CFRunLoopObserverRef observer;
40 |
41 | observer = CFRunLoopObserverCreate(CFAllocatorGetDefault(),
42 | kCFRunLoopBeforeWaiting | kCFRunLoopExit,
43 | true, // repeat
44 | 0xFFFFFF, // after CATransaction(2000000)
45 | YYRunLoopObserverCallBack, NULL);
46 | CFRunLoopAddObserver(runloop, observer, kCFRunLoopCommonModes);
47 | CFRelease(observer);
48 | });
49 | }
50 |
51 |
52 | @implementation YYTextTransaction
53 |
54 | + (YYTextTransaction *)transactionWithTarget:(id)target selector:(SEL)selector{
55 | if (!target || !selector) return nil;
56 | YYTextTransaction *t = [YYTextTransaction new];
57 | t.target = target;
58 | t.selector = selector;
59 | return t;
60 | }
61 |
62 | - (void)commit {
63 | if (!_target || !_selector) return;
64 | YYTextTransactionSetup();
65 | [transactionSet addObject:self];
66 | }
67 |
68 | - (NSUInteger)hash {
69 | long v1 = (long)((void *)_selector);
70 | long v2 = (long)_target;
71 | return v1 ^ v2;
72 | }
73 |
74 | - (BOOL)isEqual:(id)object {
75 | if (self == object) return YES;
76 | if (![object isMemberOfClass:self.class]) return NO;
77 | YYTextTransaction *other = object;
78 | return other.selector == _selector && other.target == _target;
79 | }
80 |
81 | @end
82 |
--------------------------------------------------------------------------------
/YYText/Utility/YYTextWeakProxy.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextWeakProxy.h
3 | // YYText
4 | //
5 | // Created by ibireme on 14/10/18.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | A proxy used to hold a weak object.
18 | It can be used to avoid retain cycles, such as the target in NSTimer or CADisplayLink.
19 |
20 | sample code:
21 |
22 | @implementation MyView {
23 | NSTimer *_timer;
24 | }
25 |
26 | - (void)initTimer {
27 | YYTextWeakProxy *proxy = [YYTextWeakProxy proxyWithTarget:self];
28 | _timer = [NSTimer timerWithTimeInterval:0.1 target:proxy selector:@selector(tick:) userInfo:nil repeats:YES];
29 | }
30 |
31 | - (void)tick:(NSTimer *)timer {...}
32 | @end
33 | */
34 | @interface YYTextWeakProxy : NSProxy
35 |
36 | /**
37 | The proxy target.
38 | */
39 | @property (nullable, nonatomic, weak, readonly) id target;
40 |
41 | /**
42 | Creates a new weak proxy for target.
43 |
44 | @param target Target object.
45 |
46 | @return A new proxy object.
47 | */
48 | - (instancetype)initWithTarget:(id)target;
49 |
50 | /**
51 | Creates a new weak proxy for target.
52 |
53 | @param target Target object.
54 |
55 | @return A new proxy object.
56 | */
57 | + (instancetype)proxyWithTarget:(id)target;
58 |
59 | @end
60 |
61 | NS_ASSUME_NONNULL_END
62 |
--------------------------------------------------------------------------------
/YYText/Utility/YYTextWeakProxy.m:
--------------------------------------------------------------------------------
1 | //
2 | // YYTextWeakProxy.m
3 | // YYText
4 | //
5 | // Created by ibireme on 14/10/18.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import "YYTextWeakProxy.h"
13 |
14 |
15 | @implementation YYTextWeakProxy
16 |
17 | - (instancetype)initWithTarget:(id)target {
18 | _target = target;
19 | return self;
20 | }
21 |
22 | + (instancetype)proxyWithTarget:(id)target {
23 | return [[YYTextWeakProxy alloc] initWithTarget:target];
24 | }
25 |
26 | - (id)forwardingTargetForSelector:(SEL)selector {
27 | return _target;
28 | }
29 |
30 | - (void)forwardInvocation:(NSInvocation *)invocation {
31 | void *null = NULL;
32 | [invocation setReturnValue:&null];
33 | }
34 |
35 | - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
36 | return [NSObject instanceMethodSignatureForSelector:@selector(init)];
37 | }
38 |
39 | - (BOOL)respondsToSelector:(SEL)aSelector {
40 | return [_target respondsToSelector:aSelector];
41 | }
42 |
43 | - (BOOL)isEqual:(id)object {
44 | return [_target isEqual:object];
45 | }
46 |
47 | - (NSUInteger)hash {
48 | return [_target hash];
49 | }
50 |
51 | - (Class)superclass {
52 | return [_target superclass];
53 | }
54 |
55 | - (Class)class {
56 | return [_target class];
57 | }
58 |
59 | - (BOOL)isKindOfClass:(Class)aClass {
60 | return [_target isKindOfClass:aClass];
61 | }
62 |
63 | - (BOOL)isMemberOfClass:(Class)aClass {
64 | return [_target isMemberOfClass:aClass];
65 | }
66 |
67 | - (BOOL)conformsToProtocol:(Protocol *)aProtocol {
68 | return [_target conformsToProtocol:aProtocol];
69 | }
70 |
71 | - (BOOL)isProxy {
72 | return YES;
73 | }
74 |
75 | - (NSString *)description {
76 | return [_target description];
77 | }
78 |
79 | - (NSString *)debugDescription {
80 | return [_target debugDescription];
81 | }
82 |
83 | @end
84 |
--------------------------------------------------------------------------------
/YYText/YYText.h:
--------------------------------------------------------------------------------
1 | //
2 | // YYText.h
3 | // YYText
4 | //
5 | // Created by ibireme on 15/2/25.
6 | // Copyright (c) 2015 ibireme.
7 | //
8 | // This source code is licensed under the MIT-style license found in the
9 | // LICENSE file in the root directory of this source tree.
10 | //
11 |
12 | #import
13 |
14 | #if __has_include()
15 | FOUNDATION_EXPORT double YYTextVersionNumber;
16 | FOUNDATION_EXPORT const unsigned char YYTextVersionString[];
17 | #import
18 | #import
19 | #import
20 | #import
21 | #import
22 | #import
23 | #import
24 | #import
25 | #import
26 | #import
27 | #import
28 | #import
29 | #import
30 | #import
31 | #import
32 | #import
33 | #else
34 | #import "YYLabel.h"
35 | #import "YYTextView.h"
36 | #import "YYTextAttribute.h"
37 | #import "YYTextArchiver.h"
38 | #import "YYTextParser.h"
39 | #import "YYTextRunDelegate.h"
40 | #import "YYTextRubyAnnotation.h"
41 | #import "YYTextLayout.h"
42 | #import "YYTextLine.h"
43 | #import "YYTextInput.h"
44 | #import "YYTextDebugOption.h"
45 | #import "YYTextKeyboardManager.h"
46 | #import "YYTextUtilities.h"
47 | #import "NSAttributedString+YYText.h"
48 | #import "NSParagraphStyle+YYText.h"
49 | #import "UIPasteboard+YYText.h"
50 | #endif
51 |
--------------------------------------------------------------------------------