├── .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 | --------------------------------------------------------------------------------