Showing preview only (8,917K chars total). Download the full file or copy to clipboard to get everything.
Repository: ibireme/YYKit
Branch: master
Commit: 4e1bd1cfcdb3
Files: 310
Total size: 8.5 MB
Directory structure:
gitextract_y7dx7jou/
├── .gitignore
├── .travis.yml
├── Demo/
│ ├── YYKitDemo/
│ │ ├── Base.lproj/
│ │ │ └── LaunchScreen.xib
│ │ ├── Compare/
│ │ │ ├── ermilio_lossless.bpg
│ │ │ ├── ermilio_q15.bpg
│ │ │ └── ermilio_q20.bpg
│ │ ├── EmoticonQQ.bundle/
│ │ │ └── info.plist
│ │ ├── EmoticonWeibo.bundle/
│ │ │ ├── additional/
│ │ │ │ ├── DisplayOnly/
│ │ │ │ │ ├── com.sina.emotions2015-04/
│ │ │ │ │ │ └── info.json
│ │ │ │ │ ├── com.sina.emotions2015-05/
│ │ │ │ │ │ └── info.json
│ │ │ │ │ ├── com.sina.emotions2015-06/
│ │ │ │ │ │ └── info.json
│ │ │ │ │ ├── com.sina.emotions2015-07/
│ │ │ │ │ │ └── info.json
│ │ │ │ │ └── com.sina.emotions2015-08/
│ │ │ │ │ └── info.json
│ │ │ │ └── com.sina.default/
│ │ │ │ └── info.json
│ │ │ ├── com.apple.emoji/
│ │ │ │ └── info.plist
│ │ │ ├── com.sina.default/
│ │ │ │ └── info.plist
│ │ │ ├── com.sina.lxh/
│ │ │ │ └── info.plist
│ │ │ └── emoticons.plist
│ │ ├── Info.plist
│ │ ├── T1Helper.h
│ │ ├── T1Helper.m
│ │ ├── T1HomeTimelineItemsViewController.h
│ │ ├── T1HomeTimelineItemsViewController.m
│ │ ├── T1Model.h
│ │ ├── T1Model.m
│ │ ├── T1StatusCell.h
│ │ ├── T1StatusCell.m
│ │ ├── T1StatusLayout.h
│ │ ├── T1StatusLayout.m
│ │ ├── WBEmoticonInputView.h
│ │ ├── WBEmoticonInputView.m
│ │ ├── WBModel.h
│ │ ├── WBModel.m
│ │ ├── WBStatusCell.h
│ │ ├── WBStatusCell.m
│ │ ├── WBStatusComposeTextParser.h
│ │ ├── WBStatusComposeTextParser.m
│ │ ├── WBStatusComposeViewController.h
│ │ ├── WBStatusComposeViewController.m
│ │ ├── WBStatusHelper.h
│ │ ├── WBStatusHelper.m
│ │ ├── WBStatusLayout.h
│ │ ├── WBStatusLayout.m
│ │ ├── WBStatusTimelineViewController.h
│ │ ├── WBStatusTimelineViewController.m
│ │ ├── YYAppDelegate.h
│ │ ├── YYAppDelegate.m
│ │ ├── YYBPGCoder.h
│ │ ├── YYBPGCoder.m
│ │ ├── YYControl.h
│ │ ├── YYControl.m
│ │ ├── YYFPSLabel.h
│ │ ├── YYFPSLabel.m
│ │ ├── YYFeedListExample.h
│ │ ├── YYFeedListExample.m
│ │ ├── YYImageBenchmark.h
│ │ ├── YYImageBenchmark.m
│ │ ├── YYImageDisplayExample.h
│ │ ├── YYImageDisplayExample.m
│ │ ├── YYImageExample.h
│ │ ├── YYImageExample.m
│ │ ├── YYImageExampleHelper.h
│ │ ├── YYImageExampleHelper.m
│ │ ├── YYImageProgressiveExample.h
│ │ ├── YYImageProgressiveExample.m
│ │ ├── YYKeychainExample.h
│ │ ├── YYKeychainExample.m
│ │ ├── YYModelExample.h
│ │ ├── YYModelExample.m
│ │ ├── YYPhotoGroupView.h
│ │ ├── YYPhotoGroupView.m
│ │ ├── YYRootViewController.h
│ │ ├── YYRootViewController.m
│ │ ├── YYSimpleWebViewController.h
│ │ ├── YYSimpleWebViewController.m
│ │ ├── YYTableView.h
│ │ ├── YYTableView.m
│ │ ├── YYTableViewCell.h
│ │ ├── YYTableViewCell.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
│ │ ├── YYUtilityExample.h
│ │ ├── YYUtilityExample.m
│ │ ├── YYWebImageExample.h
│ │ ├── YYWebImageExample.m
│ │ ├── main.m
│ │ ├── twitter_0.json
│ │ ├── twitter_1.json
│ │ ├── twitter_2.json
│ │ ├── twitter_3.json
│ │ ├── weibo_0.json
│ │ ├── weibo_1.json
│ │ ├── weibo_2.json
│ │ ├── weibo_3.json
│ │ ├── weibo_4.json
│ │ ├── weibo_5.json
│ │ ├── weibo_6.json
│ │ ├── weibo_7.json
│ │ └── zh-Hans.lproj/
│ │ └── LaunchScreen.xib
│ └── YYKitDemo.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── WorkspaceSettings.xcsettings
│ └── xcshareddata/
│ └── xcschemes/
│ └── YYKitExample.xcscheme
├── Framework/
│ ├── Info.plist
│ └── YYKit.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ └── contents.xcworkspacedata
│ └── xcshareddata/
│ └── xcschemes/
│ └── YYKit.xcscheme
├── LICENSE
├── README.md
├── Vendor/
│ ├── WebP.framework/
│ │ ├── Headers/
│ │ │ ├── config.h
│ │ │ ├── decode.h
│ │ │ ├── demux.h
│ │ │ ├── encode.h
│ │ │ ├── extras.h
│ │ │ ├── format_constants.h
│ │ │ ├── mux.h
│ │ │ ├── mux_types.h
│ │ │ └── types.h
│ │ └── WebP
│ ├── WebP.sh
│ └── bpg.framework/
│ ├── Headers/
│ │ └── libbpg.h
│ └── bpg
├── YYKit/
│ ├── Base/
│ │ ├── Foundation/
│ │ │ ├── NSArray+YYAdd.h
│ │ │ ├── NSArray+YYAdd.m
│ │ │ ├── NSBundle+YYAdd.h
│ │ │ ├── NSBundle+YYAdd.m
│ │ │ ├── NSData+YYAdd.h
│ │ │ ├── NSData+YYAdd.m
│ │ │ ├── NSDate+YYAdd.h
│ │ │ ├── NSDate+YYAdd.m
│ │ │ ├── NSDictionary+YYAdd.h
│ │ │ ├── NSDictionary+YYAdd.m
│ │ │ ├── NSKeyedUnarchiver+YYAdd.h
│ │ │ ├── NSKeyedUnarchiver+YYAdd.m
│ │ │ ├── NSNotificationCenter+YYAdd.h
│ │ │ ├── NSNotificationCenter+YYAdd.m
│ │ │ ├── NSNumber+YYAdd.h
│ │ │ ├── NSNumber+YYAdd.m
│ │ │ ├── NSObject+YYAdd.h
│ │ │ ├── NSObject+YYAdd.m
│ │ │ ├── NSObject+YYAddForARC.h
│ │ │ ├── NSObject+YYAddForARC.m
│ │ │ ├── NSObject+YYAddForKVO.h
│ │ │ ├── NSObject+YYAddForKVO.m
│ │ │ ├── NSString+YYAdd.h
│ │ │ ├── NSString+YYAdd.m
│ │ │ ├── NSThread+YYAdd.h
│ │ │ ├── NSThread+YYAdd.m
│ │ │ ├── NSTimer+YYAdd.h
│ │ │ └── NSTimer+YYAdd.m
│ │ ├── Quartz/
│ │ │ ├── CALayer+YYAdd.h
│ │ │ ├── CALayer+YYAdd.m
│ │ │ ├── YYCGUtilities.h
│ │ │ └── YYCGUtilities.m
│ │ ├── UIKit/
│ │ │ ├── UIApplication+YYAdd.h
│ │ │ ├── UIApplication+YYAdd.m
│ │ │ ├── UIBarButtonItem+YYAdd.h
│ │ │ ├── UIBarButtonItem+YYAdd.m
│ │ │ ├── UIBezierPath+YYAdd.h
│ │ │ ├── UIBezierPath+YYAdd.m
│ │ │ ├── UIColor+YYAdd.h
│ │ │ ├── UIColor+YYAdd.m
│ │ │ ├── UIControl+YYAdd.h
│ │ │ ├── UIControl+YYAdd.m
│ │ │ ├── UIDevice+YYAdd.h
│ │ │ ├── UIDevice+YYAdd.m
│ │ │ ├── UIFont+YYAdd.h
│ │ │ ├── UIFont+YYAdd.m
│ │ │ ├── UIGestureRecognizer+YYAdd.h
│ │ │ ├── UIGestureRecognizer+YYAdd.m
│ │ │ ├── UIImage+YYAdd.h
│ │ │ ├── UIImage+YYAdd.m
│ │ │ ├── UIScreen+YYAdd.h
│ │ │ ├── UIScreen+YYAdd.m
│ │ │ ├── UIScrollView+YYAdd.h
│ │ │ ├── UIScrollView+YYAdd.m
│ │ │ ├── UITableView+YYAdd.h
│ │ │ ├── UITableView+YYAdd.m
│ │ │ ├── UITextField+YYAdd.h
│ │ │ ├── UITextField+YYAdd.m
│ │ │ ├── UIView+YYAdd.h
│ │ │ └── UIView+YYAdd.m
│ │ └── YYKitMacro.h
│ ├── Cache/
│ │ ├── YYCache.h
│ │ ├── YYCache.m
│ │ ├── YYDiskCache.h
│ │ ├── YYDiskCache.m
│ │ ├── YYKVStorage.h
│ │ ├── YYKVStorage.m
│ │ ├── YYMemoryCache.h
│ │ └── YYMemoryCache.m
│ ├── Image/
│ │ ├── Categories/
│ │ │ ├── CALayer+YYWebImage.h
│ │ │ ├── CALayer+YYWebImage.m
│ │ │ ├── MKAnnotationView+YYWebImage.h
│ │ │ ├── MKAnnotationView+YYWebImage.m
│ │ │ ├── UIButton+YYWebImage.h
│ │ │ ├── UIButton+YYWebImage.m
│ │ │ ├── UIImageView+YYWebImage.h
│ │ │ ├── UIImageView+YYWebImage.m
│ │ │ ├── _YYWebImageSetter.h
│ │ │ └── _YYWebImageSetter.m
│ │ ├── YYAnimatedImageView.h
│ │ ├── YYAnimatedImageView.m
│ │ ├── YYFrameImage.h
│ │ ├── YYFrameImage.m
│ │ ├── YYImage.h
│ │ ├── YYImage.m
│ │ ├── YYImageCache.h
│ │ ├── YYImageCache.m
│ │ ├── YYImageCoder.h
│ │ ├── YYImageCoder.m
│ │ ├── YYSpriteSheetImage.h
│ │ ├── YYSpriteSheetImage.m
│ │ ├── YYWebImageManager.h
│ │ ├── YYWebImageManager.m
│ │ ├── YYWebImageOperation.h
│ │ └── YYWebImageOperation.m
│ ├── Model/
│ │ ├── NSObject+YYModel.h
│ │ ├── NSObject+YYModel.m
│ │ ├── YYClassInfo.h
│ │ └── YYClassInfo.m
│ ├── Text/
│ │ ├── 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/
│ │ │ ├── NSAttributedString+YYText.h
│ │ │ ├── NSAttributedString+YYText.m
│ │ │ ├── NSParagraphStyle+YYText.h
│ │ │ ├── NSParagraphStyle+YYText.m
│ │ │ ├── UIPasteboard+YYText.h
│ │ │ ├── UIPasteboard+YYText.m
│ │ │ ├── YYTextArchiver.h
│ │ │ ├── YYTextArchiver.m
│ │ │ ├── YYTextAttribute.h
│ │ │ ├── YYTextAttribute.m
│ │ │ ├── YYTextParser.h
│ │ │ ├── YYTextParser.m
│ │ │ ├── YYTextRubyAnnotation.h
│ │ │ ├── YYTextRubyAnnotation.m
│ │ │ ├── YYTextRunDelegate.h
│ │ │ ├── YYTextRunDelegate.m
│ │ │ ├── YYTextUtilities.h
│ │ │ └── YYTextUtilities.m
│ │ ├── YYLabel.h
│ │ ├── YYLabel.m
│ │ ├── YYTextView.h
│ │ └── YYTextView.m
│ ├── Utility/
│ │ ├── YYAsyncLayer.h
│ │ ├── YYAsyncLayer.m
│ │ ├── YYDispatchQueuePool.h
│ │ ├── YYDispatchQueuePool.m
│ │ ├── YYFileHash.h
│ │ ├── YYFileHash.m
│ │ ├── YYGestureRecognizer.h
│ │ ├── YYGestureRecognizer.m
│ │ ├── YYKeychain.h
│ │ ├── YYKeychain.m
│ │ ├── YYReachability.h
│ │ ├── YYReachability.m
│ │ ├── YYSentinel.h
│ │ ├── YYSentinel.m
│ │ ├── YYThreadSafeArray.h
│ │ ├── YYThreadSafeArray.m
│ │ ├── YYThreadSafeDictionary.h
│ │ ├── YYThreadSafeDictionary.m
│ │ ├── YYTimer.h
│ │ ├── YYTimer.m
│ │ ├── YYTransaction.h
│ │ ├── YYTransaction.m
│ │ ├── YYWeakProxy.h
│ │ └── YYWeakProxy.m
│ └── YYKit.h
└── YYKit.podspec
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# OS X
.DS_Store
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## Build generated
build/
DerivedData/
## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata/
## Other
*.moved-aside
*.xccheckout
*.xcuserstate
*.xcscmblueprint
## Obj-C/Swift specific
*.hmap
*.ipa
*.dSYM.zip
*.dSYM
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build
# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
# Code Injection
#
# After new code Injection tools there's a generated folder /iOSInjectionProject
# https://github.com/johnno1962/injectionforxcode
iOSInjectionProject/
================================================
FILE: .travis.yml
================================================
language: objective-c
osx_image: xcode8
xcode_project: Framework/YYKit.xcodeproj
xcode_scheme: YYKit
before_install:
- env
- xcodebuild -version
- xcodebuild -showsdks
- xcpretty --version
script:
- set -o pipefail
- xcodebuild clean build -project "$TRAVIS_XCODE_PROJECT" -scheme "$TRAVIS_XCODE_SCHEME" | xcpretty
================================================
FILE: Demo/YYKitDemo/Base.lproj/LaunchScreen.xib
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" variant="6xAndEarlier" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="iN0-l3-epB">
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" animating="YES" style="whiteLarge" translatesAutoresizingMaskIntoConstraints="NO" id="e62-yO-4HG">
<rect key="frame" x="222" y="221" width="37" height="37"/>
</activityIndicatorView>
</subviews>
<color key="backgroundColor" red="0.90196079015731812" green="0.90196079015731812" blue="0.90196079015731812" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="centerX" secondItem="e62-yO-4HG" secondAttribute="centerX" id="004-zQ-pzd"/>
<constraint firstAttribute="centerX" secondItem="e62-yO-4HG" secondAttribute="centerX" id="BbW-h6-OjI"/>
<constraint firstAttribute="centerY" secondItem="e62-yO-4HG" secondAttribute="centerY" id="L9p-NC-dp8"/>
<constraint firstAttribute="centerY" secondItem="e62-yO-4HG" secondAttribute="centerY" id="rpr-JB-3Dc"/>
</constraints>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="548" y="455"/>
</view>
</objects>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
<simulatedScreenMetrics key="destination" type="retina4"/>
</simulatedMetricsContainer>
</document>
================================================
FILE: Demo/YYKitDemo/EmoticonQQ.bundle/info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<dict>
<key>/微笑</key>
<string>024</string>
</dict>
<dict>
<key>/撇嘴</key>
<string>041</string>
</dict>
<dict>
<key>/色</key>
<string>020</string>
</dict>
<dict>
<key>/发呆</key>
<string>044</string>
</dict>
<dict>
<key>/得意</key>
<string>022</string>
</dict>
<dict>
<key>/流泪</key>
<string>010</string>
</dict>
<dict>
<key>/害羞</key>
<string>021</string>
</dict>
<dict>
<key>/闭嘴</key>
<string>105</string>
</dict>
<dict>
<key>/睡</key>
<string>036</string>
</dict>
<dict>
<key>/大哭</key>
<string>011</string>
</dict>
<dict>
<key>/尴尬</key>
<string>026</string>
</dict>
<dict>
<key>/发怒</key>
<string>025</string>
</dict>
<dict>
<key>/调皮</key>
<string>002</string>
</dict>
<dict>
<key>/呲牙</key>
<string>001</string>
</dict>
<dict>
<key>/惊讶</key>
<string>034</string>
</dict>
<dict>
<key>/难过</key>
<string>033</string>
</dict>
<dict>
<key>/酷</key>
<string>013</string>
</dict>
<dict>
<key>/冷汗</key>
<string>028</string>
</dict>
<dict>
<key>/抓狂</key>
<string>014</string>
</dict>
<dict>
<key>/吐</key>
<string>023</string>
</dict>
<dict>
<key>/偷笑</key>
<string>004</string>
</dict>
<dict>
<key>/可爱</key>
<string>019</string>
</dict>
<dict>
<key>/白眼</key>
<string>031</string>
</dict>
<dict>
<key>/傲慢</key>
<string>032</string>
</dict>
<dict>
<key>/饥饿</key>
<string>080</string>
</dict>
<dict>
<key>/困</key>
<string>081</string>
</dict>
<dict>
<key>/惊恐</key>
<string>027</string>
</dict>
<dict>
<key>/流汗</key>
<string>003</string>
</dict>
<dict>
<key>/憨笑</key>
<string>038</string>
</dict>
<dict>
<key>/大兵</key>
<string>051</string>
</dict>
<dict>
<key>/奋斗</key>
<string>043</string>
</dict>
<dict>
<key>/咒骂</key>
<string>082</string>
</dict>
<dict>
<key>/疑问</key>
<string>035</string>
</dict>
<dict>
<key>/嘘</key>
<string>012</string>
</dict>
<dict>
<key>/晕</key>
<string>050</string>
</dict>
<dict>
<key>/折磨</key>
<string>014</string>
</dict>
<dict>
<key>/衰</key>
<string>040</string>
</dict>
<dict>
<key>/骷髅</key>
<string>077</string>
</dict>
<dict>
<key>/敲打</key>
<string>006</string>
</dict>
<dict>
<key>/再见</key>
<string>005</string>
</dict>
<dict>
<key>/擦汗</key>
<string>007</string>
</dict>
<dict>
<key>/抠鼻</key>
<string>084</string>
</dict>
<dict>
<key>/鼓掌</key>
<string>085</string>
</dict>
<dict>
<key>/糗大了</key>
<string>086</string>
</dict>
<dict>
<key>/坏笑</key>
<string>047</string>
</dict>
<dict>
<key>/左哼哼</key>
<string>087</string>
</dict>
<dict>
<key>/右哼哼</key>
<string>045</string>
</dict>
<dict>
<key>/哈欠</key>
<string>088</string>
</dict>
<dict>
<key>/鄙视</key>
<string>049</string>
</dict>
<dict>
<key>/委屈</key>
<string>015</string>
</dict>
<dict>
<key>/快哭了</key>
<string>089</string>
</dict>
<dict>
<key>/阴险</key>
<string>042</string>
</dict>
<dict>
<key>/亲亲</key>
<string>037</string>
</dict>
<dict>
<key>/吓</key>
<string>090</string>
</dict>
<dict>
<key>/可怜</key>
<string>052</string>
</dict>
<dict>
<key>/菜刀</key>
<string>018</string>
</dict>
<dict>
<key>/西瓜</key>
<string>061</string>
</dict>
<dict>
<key>/啤酒</key>
<string>062</string>
</dict>
<dict>
<key>/篮球</key>
<string>091</string>
</dict>
<dict>
<key>/乒乓</key>
<string>092</string>
</dict>
<dict>
<key>/咖啡</key>
<string>067</string>
</dict>
<dict>
<key>/饭</key>
<string>059</string>
</dict>
<dict>
<key>/猪头</key>
<string>008</string>
</dict>
<dict>
<key>/玫瑰</key>
<string>009</string>
</dict>
<dict>
<key>/凋谢</key>
<string>061</string>
</dict>
<dict>
<key>/示爱</key>
<string>030</string>
</dict>
<dict>
<key>/爱心</key>
<string>029</string>
</dict>
<dict>
<key>/心碎</key>
<string>073</string>
</dict>
<dict>
<key>/蛋糕</key>
<string>060</string>
</dict>
<dict>
<key>/闪电</key>
<string>079</string>
</dict>
<dict>
<key>/炸弹</key>
<string>017</string>
</dict>
<dict>
<key>/刀</key>
<string>069</string>
</dict>
<dict>
<key>/足球</key>
<string>076</string>
</dict>
<dict>
<key>/瓢虫</key>
<string>063</string>
</dict>
<dict>
<key>/便便</key>
<string>016</string>
</dict>
<dict>
<key>/月亮</key>
<string>068</string>
</dict>
<dict>
<key>/太阳</key>
<string>074</string>
</dict>
<dict>
<key>/礼物</key>
<string>075</string>
</dict>
<dict>
<key>/拥抱</key>
<string>046</string>
</dict>
<dict>
<key>/强</key>
<string>053</string>
</dict>
<dict>
<key>/弱</key>
<string>054</string>
</dict>
<dict>
<key>/握手</key>
<string>055</string>
</dict>
<dict>
<key>/胜利</key>
<string>056</string>
</dict>
<dict>
<key>/抱拳</key>
<string>057</string>
</dict>
<dict>
<key>/勾引</key>
<string>064</string>
</dict>
<dict>
<key>/拳头</key>
<string>072</string>
</dict>
<dict>
<key>/差劲</key>
<string>071</string>
</dict>
<dict>
<key>/爱你</key>
<string>066</string>
</dict>
<dict>
<key>/NO</key>
<string>093</string>
</dict>
<dict>
<key>/OK</key>
<string>065</string>
</dict>
<dict>
<key>/爱情</key>
<string>039</string>
</dict>
<dict>
<key>/飞吻</key>
<string>048</string>
</dict>
<dict>
<key>/跳跳</key>
<string>094</string>
</dict>
<dict>
<key>/发抖</key>
<string>070</string>
</dict>
<dict>
<key>/怄火</key>
<string>095</string>
</dict>
<dict>
<key>/转圈</key>
<string>096</string>
</dict>
<dict>
<key>/磕头</key>
<string>097</string>
</dict>
<dict>
<key>/回头</key>
<string>098</string>
</dict>
<dict>
<key>/跳绳</key>
<string>099</string>
</dict>
<dict>
<key>/挥手</key>
<string>078</string>
</dict>
<dict>
<key>/激动</key>
<string>100</string>
</dict>
<dict>
<key>/街舞</key>
<string>101</string>
</dict>
<dict>
<key>/献吻</key>
<string>102</string>
</dict>
<dict>
<key>/左太极</key>
<string>103</string>
</dict>
<dict>
<key>/右太极</key>
<string>104</string>
</dict>
<dict>
<key>/双喜</key>
<string>107</string>
</dict>
<dict>
<key>/鞭炮</key>
<string>108</string>
</dict>
<dict>
<key>/灯笼</key>
<string>109</string>
</dict>
<dict>
<key>/发财</key>
<string>110</string>
</dict>
<dict>
<key>/K歌</key>
<string>111</string>
</dict>
<dict>
<key>/购物</key>
<string>112</string>
</dict>
<dict>
<key>/邮件</key>
<string>113</string>
</dict>
<dict>
<key>/帅</key>
<string>114</string>
</dict>
<dict>
<key>/喝彩</key>
<string>115</string>
</dict>
<dict>
<key>/祈祷</key>
<string>116</string>
</dict>
<dict>
<key>/爆筋</key>
<string>117</string>
</dict>
<dict>
<key>/棒棒糖</key>
<string>118</string>
</dict>
<dict>
<key>/喝奶</key>
<string>119</string>
</dict>
<dict>
<key>下面</key>
<string>120</string>
</dict>
<dict>
<key>/香蕉</key>
<string>121</string>
</dict>
<dict>
<key>/飞机</key>
<string>112</string>
</dict>
<dict>
<key>/开车</key>
<string>123</string>
</dict>
<dict>
<key>/左车头</key>
<string>124</string>
</dict>
<dict>
<key>/车厢</key>
<string>125</string>
</dict>
<dict>
<key>/右车头</key>
<string>126</string>
</dict>
<dict>
<key>/多云</key>
<string>127</string>
</dict>
<dict>
<key>/下雨</key>
<string>128</string>
</dict>
<dict>
<key>/钞票</key>
<string>129</string>
</dict>
<dict>
<key>/熊猫</key>
<string>130</string>
</dict>
<dict>
<key>/灯泡</key>
<string>131</string>
</dict>
<dict>
<key>/风车</key>
<string>132</string>
</dict>
<dict>
<key>/闹钟</key>
<string>133</string>
</dict>
<dict>
<key>/打伞</key>
<string>134</string>
</dict>
<dict>
<key>/彩球</key>
<string>135</string>
</dict>
<dict>
<key>/钻戒</key>
<string>136</string>
</dict>
<dict>
<key>/沙发</key>
<string>137</string>
</dict>
<dict>
<key>/纸巾</key>
<string>138</string>
</dict>
<dict>
<key>/药</key>
<string>139</string>
</dict>
<dict>
<key>/手枪</key>
<string>140</string>
</dict>
<dict>
<key>/青蛙</key>
<string>141</string>
</dict>
</array>
</plist>
================================================
FILE: Demo/YYKitDemo/EmoticonWeibo.bundle/additional/DisplayOnly/com.sina.emotions2015-04/info.json
================================================
{"id":"com.sina.emotions2015-04","version":8,"display_only":1,"emoticons":[{"chs":"[\u7f8a\u5e74\u5927\u5409]","cht":"[\u7f8a\u5e74\u5927\u5409]","en":"[]","png":"yangniandaji_mobile.png","type":0},{"chs":"[\u70b8\u9e21\u5564\u9152]","cht":"[\u70b8\u96de\u5564\u9152]","en":"[]","png":"zhajibeer_mobile.png","type":0},{"chs":"[\u6316\u9f3b]","cht":"[\u6316\u9f3b]","en":"[]","png":"wabi_mobile.png","type":0},{"chs":"[\u53d1\u7ea2\u5305]","cht":"[\u53d1\u7ea2\u5305]","en":"[]","png":"fahongbao_mobile.png","type":0},{"chs":"[\u8272]","cht":"[\u8272]","en":"[]","png":"huanglianse_mobile.png","type":0},{"chs":"[\u7761]","cht":"[\u7761]","en":"[]","png":"huanglianshuijiao_mobile.png","type":0},{"chs":"[\u767d\u773c]","cht":"[\u767d\u773c]","en":"[]","png":"landelini_mobile.png","type":0},{"chs":"[\u9a6c\u5230\u6210\u529f]","cht":"[\u99ac\u5230\u6210\u529f]","en":"[]","png":"madaochenggong_mobile.png","type":0},{"chs":"[\u5e26\u7740\u5fae\u535a\u53bb\u65c5\u884c]","cht":"[\u5e26\u7740\u5fae\u535a\u53bb\u65c5\u884c]","en":"[]","png":"eventtravel_mobile.png","type":0},{"chs":"[\u7231\u7ea2\u5305]","cht":"[\u611b\u7d05\u5305]","en":"[]","png":"aihongbao_mobile.png","type":0},{"chs":"[\u5fae\u7b11]","cht":"[\u5fae\u7b11]","en":"[]","png":"huanglianweixiao_mobile.png","type":0},{"chs":"[\u7ed9\u529b]","cht":"[\u7ed9\u529b]","en":"[]","png":"geiliv2_mobile.png","type":0},{"chs":"[\u54c8\u6b20]","cht":"[\u54c8\u6b20]","en":"[]","png":"haqianv2_mobile.png","type":0},{"chs":"[\u8721\u70db]","cht":"[\u8721\u70db]","en":"[]","png":"lazhuv2_mobile.png","type":0},{"chs":"[\u56f0]","cht":"[\u56f0]","en":"[]","png":"kunv2_mobile.png","type":0},{"chs":"[\u8bdd\u7b52]","cht":"[\u8a71\u7b52]","en":"[]","png":"huatongv2_mobile.png","type":0},{"chs":"[\u6012\u9a82]","cht":"[\u6012\u99e1]","en":"[]","png":"numav2_mobile.png","type":0},{"chs":"[\u86cb\u7cd5]","cht":"[\u86cb\u7cd5]","en":"[]","png":"cakev2_mobile.png","type":0},{"chs":"[NO]","cht":"[NO]","en":"[]","png":"buyao_mobile.png","type":0},{"chs":"[\u62cd\u7167]","cht":"[\u62cd\u7167]","en":"[]","png":"lxhpz_mobile.png","type":0}]}
================================================
FILE: Demo/YYKitDemo/EmoticonWeibo.bundle/additional/DisplayOnly/com.sina.emotions2015-05/info.json
================================================
{"id":"com.sina.emotions2015-05","version":5,"display_only":1,"emoticons":[{"chs":"[\u7f9e\u7f9e\u54d2\u751c\u99a8]","cht":"[\u7f9e\u7f9e\u54d2\u751c\u99a8]","en":"[]","png":"bbhltianxinxxd_mobile.png","type":0},{"chs":"[\u840c\u795e\u5965\u8389]","cht":"[\u840c\u795e\u5965\u8389]","en":"[]","png":"bbhlaolims_mobile.png","type":0},{"chs":"[\u6211\u60f3\u9759\u9759]","cht":"[\u6211\u60f3\u9759\u9759]","en":"[]","png":"bbhlwoxiangjingjing_mobile.png","type":0},{"chs":"[\u54c6\u5566A\u68a6\u5fae\u7b11]","cht":"[\u54c6\u5566A\u68a6\u5fae\u7b11]","en":"[]","png":"jqmweixiao_mobile.png","type":0},{"chs":"[\u4f34\u6211\u540c\u884c]","cht":"[\u4f34\u6211\u540c\u884c]","en":"[]","png":"jqmbwtxing_mobile.png","type":0},{"chs":"[\u751c\u99a8\u5403\u8d27]","cht":"[\u751c\u99a8\u5403\u8d27]","en":"[]","png":"bbhlchihuo_mobile.png","type":0}]}
================================================
FILE: Demo/YYKitDemo/EmoticonWeibo.bundle/additional/DisplayOnly/com.sina.emotions2015-06/info.json
================================================
{"id":"com.sina.emotions2015-06","version":13,"display_only":1,"emoticons":[{"chs":"[\u9759\u9999\u5fae\u7b11]","cht":"[\u9759\u9999\u5fae\u7b11]","en":"[]","png":"jiqimaojingxiang_mobile.png","type":0},{"chs":"[\u5927\u96c4\u5fae\u7b11]","cht":"[\u5927\u96c4\u5fae\u7b11]","en":"[]","png":"jiqimaodaxiong_mobile.png","type":0},{"chs":"[\u80d6\u864e\u5fae\u7b11]","cht":"[\u80d6\u864e\u5fae\u7b11]","en":"[]","png":"jiqimaopanghu_mobile.png","type":0},{"chs":"[\u5c0f\u592b\u5fae\u7b11]","cht":"[\u5c0f\u592b\u5fae\u7b11]","en":"[]","png":"jiqimaoxiaofu_mobile.png","type":0},{"chs":"[\u751c\u99a8\u4e0d\u60f3\u957f\u5927]","cht":"[\u751c\u99a8\u4e0d\u60f3\u957f\u5927]","en":"[]","png":"bbhltianxinbuxiangzhangda_mobile.png","type":0},{"chs":"[\u6c42\u62b1\u62b1]","cht":"[\u6c42\u62b1\u62b1]","en":"[]","png":"bbhlqiubaobao_mobile.png","type":0},{"chs":"[\u54c6\u5566A\u68a6\u6c57]","cht":"[\u54c6\u5566A\u5922\u6c57]","en":"[]","png":"dorahan_mobile.png","type":0},{"chs":"[\u54c6\u5566A\u68a6\u82b1\u5fc3]","cht":"[\u54c6\u5566A\u5922\u82b1\u5fc3]","en":"[]","png":"dorahaose_mobile.png","type":0},{"chs":"[\u54c6\u5566A\u68a6\u5403\u60ca]","cht":"[\u54c6\u5566A\u5922\u5403\u9a5a]","en":"[]","png":"dorachijing_mobile.png","type":0},{"chs":"[\u54c6\u5566A\u68a6\u5bb3\u6015]","cht":"[\u54c6\u5566A\u5922\u5bb3\u6015]","en":"[]","png":"dorahaipa_mobile.png","type":0},{"chs":"[\u770b\u8dcc]","cht":"[\u770b\u8dcc]","en":"[]","png":"kandiev2_mobile.png","type":0},{"chs":"[\u770b\u6da8]","cht":"[\u770b\u6f32]","en":"[]","png":"kanzhangv2_mobile.png","type":0},{"chs":"[\u7236\u4eb2\u8282]","cht":"[\u7236\u89aa\u7bc0]","en":"[]","png":"fuqinjie2015_mobile.png","type":0},{"chs":"[\u751c\u99a8\u54ed\u54ed]","cht":"[\u751c\u99a8\u54ed\u54ed]","en":"[]","png":"bbhltianxinkk_mobile.png","type":0},{"chs":"[\u5c0a\u4e0a\u4e48\u4e48\u54d2]","cht":"[\u5c0a\u4e0a\u4e48\u4e48\u54d2]","en":"[]","png":"hqgzunshangv1_mobile.png","type":0},{"chs":"[\u751c\u99a8\u7231\u4f60\u54df]","cht":"[\u751c\u99a8\u7231\u4f60\u54df]","en":"[]","png":"bbhltianxinlove_mobile.png","type":0}]}
================================================
FILE: Demo/YYKitDemo/EmoticonWeibo.bundle/additional/DisplayOnly/com.sina.emotions2015-07/info.json
================================================
{"id":"com.sina.emotions2015-07","version":10,"display_only":1,"emoticons":[{"chs":"[\u751c\u99a8\u70ed\u70ed]","cht":"[\u751c\u99a8\u71b1\u71b1]","en":"[]","png":"bbhltianxinhot_mobile.png","type":0},{"chs":"[\u6700\u7f8e\u6740\u9621\u964c]","cht":"[\u6700\u7f8e\u6bba\u9621\u964c]","en":"[]","png":"huaqiangusqm_mobile.png","type":0},{"chs":"[\u751c\u99a8\u5c34\u5c2c]","cht":"[\u751c\u99a8\u5c37\u5c2c]","en":"[]","png":"bbhltianxingg_mobile.png","type":0},{"chs":"[\u8bfa\u4e00\u7c97\u6765\u55e8]","cht":"[\u8bfa\u4e00\u7c97\u6765\u55e8]","en":"[]","png":"bbqnchulaihai_mobile.png","type":0},{"chs":"[\u751c\u99a8\u989c\u503c\u9ad8]","cht":"[\u751c\u99a8\u989c\u503c\u9ad8]","en":"[]","png":"bbhlyanzhigao_mobile.png","type":0},{"chs":"[\u5eb7\u5eb7\u4fdd\u4f51]","cht":"[\u5eb7\u5eb7\u4fdd\u4f51]","en":"[]","png":"bbqnkkbaoyou_mobile.png","type":0},{"chs":"[\u5c0f\u9aa8\u6700\u840c\u4e86]","cht":"[\u5c0f\u9aa8\u6700\u840c\u4e86]","en":"[]","png":"huaqianguxiaogu_mobile.png","type":0},{"chs":"[\u751c\u99a8\u7ffb\u767d\u773c]","cht":"[\u751c\u99a8\u7ffb\u767d\u773c]","en":"[]","png":"bbhltxfanbaiyan_mobile.png","type":0},{"chs":"[\u840c\u5a03\u5927\u7ae3]","cht":"[\u840c\u5a03\u5927\u7ae3]","en":"[]","png":"bbqnmengwadajun_mobile.png","type":0},{"chs":"[\u771f\u5fc3\u82f1\u96c4\u5f20\u6770]","cht":"[\u771f\u5fc3\u82f1\u96c4\u5f35\u5091]","en":"[]","png":"zxyxwanzi_mobile.png","type":0},{"chs":"[\u7cd6\u5b9d\u60ca\u5446\u4e86]","cht":"[\u7cd6\u5bf6\u9a5a\u5446\u4e86]","en":"[]","png":"hqgtangbao_mobile.png","type":0},{"chs":"[\u590f\u5929\u516c\u4e3b]","cht":"[\u590f\u5929\u516c\u4e3b]","en":"[]","png":"bbqnxiatian_mobile.png","type":0},{"chs":"[\u751c\u99a8\u5f97\u745f]","cht":"[\u751c\u99a8\u5f97\u745f]","en":"[]","png":"bbhltianxindese_mobile.png","type":0}]}
================================================
FILE: Demo/YYKitDemo/EmoticonWeibo.bundle/additional/DisplayOnly/com.sina.emotions2015-08/info.json
================================================
{"id":"com.sina.emotions2015-08","version":5,"display_only":1,"emoticons":[{"chs":"[\u771f\u5fc3\u82f1\u96c4\u9648\u5b66\u51ac]","cht":"[\u771f\u5fc3\u82f1\u96c4\u9673\u5b78\u51ac]","en":"[]","png":"zxyxchenxuedong_mobile.png","type":0},{"chs":"[\u75f4\u60c5\u8f69\u8f69]","cht":"[\u75f4\u60c5\u8f69\u8f69]","en":"[]","png":"bbqnxuanxuan_mobile.png","type":0},{"chs":"[\u4e03\u5915\u5feb\u4e50]","cht":"[\u4e03\u5915\u5feb\u6a02]","en":"[]","png":"qixi2015_mobile.png","type":0},{"chs":"[\u771f\u5fc3\u82f1\u96c4\u4f5f\u5927\u4e3a]","cht":"[\u771f\u5fc3\u82f1\u96c4\u4f5f\u5927\u70ba]","en":"[]","png":"zxyxtongdawei_mobile.png","type":0},{"chs":"[\u4f60\u7684\u5bab\u94c3]","cht":"[\u4f60\u7684\u5bae\u9234]","en":"[hqggongling02_mobile]","png":"hqggongling02_mobile.png","type":0}]}
================================================
FILE: Demo/YYKitDemo/EmoticonWeibo.bundle/additional/com.sina.default/info.json
================================================
{"id":"com.sina.default","version":44,"display_only":0,"group_type":0,"group_name":"","group_name_cn":"","group_name_en":"","group_name_tw":"","emoticons":[{"chs":"[\u5e26\u7740\u5fae\u535a\u53bb\u65c5\u884c]","cht":"[\u5e26\u7740\u5fae\u535a\u53bb\u65c5\u884c]","en":"[]","png":"eventtravel_mobile.png","type":0},{"chs":"[\u771f\u5fc3\u82f1\u96c4\u6731\u4e9a\u6587]","cht":"[\u771f\u5fc3\u82f1\u96c4\u6731\u4e9a\u6587]","en":"[]","png":"zxyxzhuyaowen_mobile.png","type":0},{"chs":"[\u706b\u534e\u793e\u957f\u7f8e\u7537\u5b50]","cht":"[\u706b\u534e\u793e\u957f\u7f8e\u7537\u5b50]","en":"[]","png":"bbqnshezhang_mobile.png","type":0},{"chs":"[\u5343\u9aa8\u82b1]","cht":"[\u5343\u9aa8\u82b1]","en":"[]","png":"hqgqianguhua_mobile.png","type":0},{"chs":"[\u9646\u6bc5]","cht":"[\u9646\u6bc5]","en":"[]","png":"lggluyiv2_mobile.png","type":0},{"chs":"[\u54c6\u5566A\u68a6\u5fae\u7b11]","cht":"[\u54c6\u5566A\u68a6\u5fae\u7b11]","en":"[]","png":"jqmweixiao_mobile.png","type":0}]}
================================================
FILE: Demo/YYKitDemo/EmoticonWeibo.bundle/com.apple.emoji/info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>id</key>
<string>com.apple.emoji</string>
<key>version</key>
<real>2</real>
<key>group_name_cn</key>
<string>Emoji</string>
<key>group_name_en</key>
<string>Emoji</string>
<key>group_name_tw</key>
<string>Emoji</string>
<key>display_only</key>
<integer>0</integer>
<key>group_type</key>
<integer>0</integer>
<key>emoticons</key>
<array>
<dict>
<key>code</key>
<string>0x1f603</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f60d</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f612</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f633</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f601</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f618</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f609</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f620</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f61e</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f625</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f62d</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f61d</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f621</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f623</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f614</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f604</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f637</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f61a</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f613</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f602</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f60a</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f622</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f61c</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f628</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f630</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f632</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f60f</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f631</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f62a</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f616</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f60c</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f47f</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f47b</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f385</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f467</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f466</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f469</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f468</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f436</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f431</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f44d</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f44e</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f44a</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x270a</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x270c</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f4aa</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f44f</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f448</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f446</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f449</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f447</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f44c</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x2764</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f494</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f64f</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x2600</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f319</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f31f</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x26a1</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x2601</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x2614</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f341</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f33b</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f343</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f457</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f380</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f444</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f339</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x2615</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f382</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f559</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f37a</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f50d</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f4f1</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f3e0</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f697</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f381</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x26bd</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f4a3</string>
<key>type</key>
<string>1</string>
</dict>
<dict>
<key>code</key>
<string>0x1f48e</string>
<key>type</key>
<string>1</string>
</dict>
</array>
</dict>
</plist>
================================================
FILE: Demo/YYKitDemo/EmoticonWeibo.bundle/com.sina.default/info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>id</key>
<string>com.sina.default</string>
<key>version</key>
<real>2</real>
<key>group_name_tw</key>
<string>默認</string>
<key>group_name_cn</key>
<string>默认</string>
<key>group_name_en</key>
<string>Default</string>
<key>display_only</key>
<integer>0</integer>
<key>group_type</key>
<integer>0</integer>
<key>emoticons</key>
<array>
<dict>
<key>chs</key>
<string>[最右]</string>
<key>cht</key>
<string>[最右]</string>
<key>gif</key>
<string></string>
<key>png</key>
<string>d_zuiyou.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[微笑]</string>
<key>cht</key>
<string>[微笑]</string>
<key>gif</key>
<string>d_hehe.gif</string>
<key>png</key>
<string>d_hehe.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[嘻嘻]</string>
<key>cht</key>
<string>[嘻嘻]</string>
<key>gif</key>
<string>d_xixi.gif</string>
<key>png</key>
<string>d_xixi.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[哈哈]</string>
<key>cht</key>
<string>[哈哈]</string>
<key>gif</key>
<string>d_haha.gif</string>
<key>png</key>
<string>d_haha.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[爱你]</string>
<key>cht</key>
<string>[愛你]</string>
<key>gif</key>
<string>d_aini.gif</string>
<key>png</key>
<string>d_aini.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[挖鼻]</string>
<key>cht</key>
<string>[挖鼻]</string>
<key>gif</key>
<string>d_wabishi.gif</string>
<key>png</key>
<string>d_wabishi.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[吃惊]</string>
<key>cht</key>
<string>[吃驚]</string>
<key>gif</key>
<string>d_chijing.gif</string>
<key>png</key>
<string>d_chijing.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[晕]</string>
<key>cht</key>
<string>[暈]</string>
<key>gif</key>
<string>d_yun.gif</string>
<key>png</key>
<string>d_yun.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[泪]</string>
<key>cht</key>
<string>[淚]</string>
<key>gif</key>
<string>d_lei.gif</string>
<key>png</key>
<string>d_lei.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[馋嘴]</string>
<key>cht</key>
<string>[饞嘴]</string>
<key>gif</key>
<string>d_chanzui.gif</string>
<key>png</key>
<string>d_chanzui.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[抓狂]</string>
<key>cht</key>
<string>[抓狂]</string>
<key>gif</key>
<string>d_zhuakuang.gif</string>
<key>png</key>
<string>d_zhuakuang.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[哼]</string>
<key>cht</key>
<string>[哼]</string>
<key>gif</key>
<string>d_heng.gif</string>
<key>png</key>
<string>d_heng.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[可爱]</string>
<key>cht</key>
<string>[可愛]</string>
<key>gif</key>
<string>d_keai.gif</string>
<key>png</key>
<string>d_keai.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[怒]</string>
<key>cht</key>
<string>[怒]</string>
<key>gif</key>
<string>d_nu.gif</string>
<key>png</key>
<string>d_nu.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[汗]</string>
<key>cht</key>
<string>[汗]</string>
<key>gif</key>
<string>d_han.gif</string>
<key>png</key>
<string>d_han.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[害羞]</string>
<key>cht</key>
<string>[害羞]</string>
<key>gif</key>
<string>d_haixiu.gif</string>
<key>png</key>
<string>d_haixiu.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[睡]</string>
<key>cht</key>
<string>[睡]</string>
<key>gif</key>
<string>d_shuijiao.gif</string>
<key>png</key>
<string>d_shuijiao.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[钱]</string>
<key>cht</key>
<string>[錢]</string>
<key>gif</key>
<string>d_qian.gif</string>
<key>png</key>
<string>d_qian.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[偷笑]</string>
<key>cht</key>
<string>[偷笑]</string>
<key>gif</key>
<string>d_touxiao.gif</string>
<key>png</key>
<string>d_touxiao.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[笑cry]</string>
<key>cht</key>
<string>[笑cry]</string>
<key>gif</key>
<string></string>
<key>png</key>
<string>d_xiaoku.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[doge]</string>
<key>cht</key>
<string>[doge]</string>
<key>gif</key>
<string></string>
<key>png</key>
<string>d_doge.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[喵喵]</string>
<key>cht</key>
<string>[喵喵]</string>
<key>gif</key>
<string></string>
<key>png</key>
<string>d_miao.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[酷]</string>
<key>cht</key>
<string>[酷]</string>
<key>gif</key>
<string>d_ku.gif</string>
<key>png</key>
<string>d_ku.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[衰]</string>
<key>cht</key>
<string>[衰]</string>
<key>gif</key>
<string>d_shuai.gif</string>
<key>png</key>
<string>d_shuai.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[闭嘴]</string>
<key>cht</key>
<string>[閉嘴]</string>
<key>gif</key>
<string>d_bizui.gif</string>
<key>png</key>
<string>d_bizui.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[鄙视]</string>
<key>cht</key>
<string>[鄙視]</string>
<key>gif</key>
<string>d_bishi.gif</string>
<key>png</key>
<string>d_bishi.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[色]</string>
<key>cht</key>
<string>[色]</string>
<key>gif</key>
<string>d_huaxin.gif</string>
<key>png</key>
<string>d_huaxin.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[鼓掌]</string>
<key>cht</key>
<string>[鼓掌]</string>
<key>gif</key>
<string>d_guzhang.gif</string>
<key>png</key>
<string>d_guzhang.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[悲伤]</string>
<key>cht</key>
<string>[悲傷]</string>
<key>gif</key>
<string>d_beishang.gif</string>
<key>png</key>
<string>d_beishang.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[思考]</string>
<key>cht</key>
<string>[思考]</string>
<key>gif</key>
<string>d_sikao.gif</string>
<key>png</key>
<string>d_sikao.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[生病]</string>
<key>cht</key>
<string>[生病]</string>
<key>gif</key>
<string>d_shengbing.gif</string>
<key>png</key>
<string>d_shengbing.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[亲亲]</string>
<key>cht</key>
<string>[親親]</string>
<key>gif</key>
<string>d_qinqin.gif</string>
<key>png</key>
<string>d_qinqin.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[怒骂]</string>
<key>cht</key>
<string>[怒罵]</string>
<key>gif</key>
<string>d_numa.gif</string>
<key>png</key>
<string>d_numa.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[太开心]</string>
<key>cht</key>
<string>[太開心]</string>
<key>gif</key>
<string>d_taikaixin.gif</string>
<key>png</key>
<string>d_taikaixin.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[白眼]</string>
<key>cht</key>
<string>[白眼]</string>
<key>gif</key>
<string>d_landelini.gif</string>
<key>png</key>
<string>d_landelini.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[右哼哼]</string>
<key>cht</key>
<string>[右哼哼]</string>
<key>gif</key>
<string>d_youhengheng.gif</string>
<key>png</key>
<string>d_youhengheng.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[左哼哼]</string>
<key>cht</key>
<string>[左哼哼]</string>
<key>gif</key>
<string>d_zuohengheng.gif</string>
<key>png</key>
<string>d_zuohengheng.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[嘘]</string>
<key>cht</key>
<string>[嘘]</string>
<key>gif</key>
<string>d_xu.gif</string>
<key>png</key>
<string>d_xu.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[委屈]</string>
<key>cht</key>
<string>[委屈]</string>
<key>gif</key>
<string>d_weiqu.gif</string>
<key>png</key>
<string>d_weiqu.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[吐]</string>
<key>cht</key>
<string>[吐]</string>
<key>gif</key>
<string>d_tu.gif</string>
<key>png</key>
<string>d_tu.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[可怜]</string>
<key>cht</key>
<string>[可憐]</string>
<key>gif</key>
<string>d_kelian.gif</string>
<key>png</key>
<string>d_kelian.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[哈欠]</string>
<key>cht</key>
<string>[哈欠]</string>
<key>gif</key>
<string>d_dahaqi.gif</string>
<key>png</key>
<string>d_dahaqi.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[挤眼]</string>
<key>cht</key>
<string>[擠眼]</string>
<key>gif</key>
<string>d_jiyan.gif</string>
<key>png</key>
<string>d_jiyan.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[失望]</string>
<key>cht</key>
<string>[失望]</string>
<key>gif</key>
<string>d_shiwang.gif</string>
<key>png</key>
<string>d_shiwang.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[顶]</string>
<key>cht</key>
<string>[頂]</string>
<key>gif</key>
<string>d_ding.gif</string>
<key>png</key>
<string>d_ding.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[疑问]</string>
<key>cht</key>
<string>[疑問]</string>
<key>gif</key>
<string>d_yiwen.gif</string>
<key>png</key>
<string>d_yiwen.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[困]</string>
<key>cht</key>
<string>[困]</string>
<key>gif</key>
<string>d_kun.gif</string>
<key>png</key>
<string>d_kun.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[感冒]</string>
<key>cht</key>
<string>[感冒]</string>
<key>gif</key>
<string>d_ganmao.gif</string>
<key>png</key>
<string>d_ganmao.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[拜拜]</string>
<key>cht</key>
<string>[拜拜]</string>
<key>gif</key>
<string>d_baibai.gif</string>
<key>png</key>
<string>d_baibai.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[黑线]</string>
<key>cht</key>
<string>[黑線]</string>
<key>gif</key>
<string>d_heixian.gif</string>
<key>png</key>
<string>d_heixian.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[阴险]</string>
<key>cht</key>
<string>[阴险]</string>
<key>gif</key>
<string>d_yinxian.gif</string>
<key>png</key>
<string>d_yinxian.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[打脸]</string>
<key>cht</key>
<string>[打臉]</string>
<key>gif</key>
<string>d_dalian.gif</string>
<key>png</key>
<string>d_dalian.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[傻眼]</string>
<key>cht</key>
<string>[傻眼]</string>
<key>gif</key>
<string>d_shayan.gif</string>
<key>png</key>
<string>d_shayan.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[互粉]</string>
<key>cht</key>
<string>[互粉]</string>
<key>gif</key>
<string>f_hufen.gif</string>
<key>png</key>
<string>f_hufen.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[心]</string>
<key>cht</key>
<string>[心]</string>
<key>gif</key>
<string>l_xin.gif</string>
<key>png</key>
<string>l_xin.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[伤心]</string>
<key>cht</key>
<string>[傷心]</string>
<key>gif</key>
<string>l_shangxin.gif</string>
<key>png</key>
<string>l_shangxin.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[猪头]</string>
<key>cht</key>
<string>[豬頭]</string>
<key>gif</key>
<string>d_zhutou.gif</string>
<key>png</key>
<string>d_zhutou.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[熊猫]</string>
<key>cht</key>
<string>[熊貓]</string>
<key>gif</key>
<string>d_xiongmao.gif</string>
<key>png</key>
<string>d_xiongmao.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[兔子]</string>
<key>cht</key>
<string>[兔子]</string>
<key>gif</key>
<string>d_tuzi.gif</string>
<key>png</key>
<string>d_tuzi.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[握手]</string>
<key>cht</key>
<string>[握手]</string>
<key>gif</key>
<string></string>
<key>png</key>
<string>h_woshou.png</string>
<key>type</key>
<string></string>
</dict>
<dict>
<key>chs</key>
<string>[作揖]</string>
<key>cht</key>
<string>[作揖]</string>
<key>gif</key>
<string></string>
<key>png</key>
<string>h_zuoyi.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[赞]</string>
<key>cht</key>
<string>[贊]</string>
<key>gif</key>
<string></string>
<key>png</key>
<string>h_zan.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[耶]</string>
<key>cht</key>
<string>[耶]</string>
<key>gif</key>
<string>h_ye.gif</string>
<key>png</key>
<string>h_ye.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[good]</string>
<key>cht</key>
<string>[good]</string>
<key>gif</key>
<string>h_good.gif</string>
<key>png</key>
<string>h_good.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[弱]</string>
<key>cht</key>
<string>[弱]</string>
<key>gif</key>
<string>h_ruo.gif</string>
<key>png</key>
<string>h_ruo.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[NO]</string>
<key>cht</key>
<string>[NO]</string>
<key>gif</key>
<string>h_buyao.gif</string>
<key>png</key>
<string>h_buyao.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[ok]</string>
<key>cht</key>
<string>[ok]</string>
<key>gif</key>
<string>h_ok.gif</string>
<key>png</key>
<string>h_ok.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[haha]</string>
<key>cht</key>
<string>[haha]</string>
<key>gif</key>
<string>h_haha.gif</string>
<key>png</key>
<string>h_haha.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[来]</string>
<key>cht</key>
<string>[來]</string>
<key>gif</key>
<string>h_lai.gif</string>
<key>png</key>
<string>h_lai.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[拳头]</string>
<key>cht</key>
<string>[拳頭]</string>
<key>gif</key>
<string></string>
<key>png</key>
<string>h_quantou.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[威武]</string>
<key>cht</key>
<string>[威武]</string>
<key>gif</key>
<string>f_v5.gif</string>
<key>png</key>
<string>f_v5.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[鲜花]</string>
<key>cht</key>
<string>[鮮花]</string>
<key>gif</key>
<string>w_xianhua.gif</string>
<key>png</key>
<string>w_xianhua.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[钟]</string>
<key>cht</key>
<string>[鐘]</string>
<key>gif</key>
<string>o_zhong.gif</string>
<key>png</key>
<string>o_zhong.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[浮云]</string>
<key>cht</key>
<string>[浮雲]</string>
<key>gif</key>
<string>w_fuyun.gif</string>
<key>png</key>
<string>w_fuyun.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[飞机]</string>
<key>cht</key>
<string>[飛機]</string>
<key>gif</key>
<string>o_feiji.gif</string>
<key>png</key>
<string>o_feiji.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[月亮]</string>
<key>cht</key>
<string>[月亮]</string>
<key>gif</key>
<string>w_yueliang.gif</string>
<key>png</key>
<string>w_yueliang.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[太阳]</string>
<key>cht</key>
<string>[太陽]</string>
<key>gif</key>
<string>w_taiyang.gif</string>
<key>png</key>
<string>w_taiyang.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[微风]</string>
<key>cht</key>
<string>[微風]</string>
<key>gif</key>
<string>w_weifeng.gif</string>
<key>png</key>
<string>w_weifeng.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[下雨]</string>
<key>cht</key>
<string>[下雨]</string>
<key>gif</key>
<string>w_xiayu.gif</string>
<key>png</key>
<string>w_xiayu.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[给力]</string>
<key>cht</key>
<string>[給力]</string>
<key>gif</key>
<string>f_geili.gif</string>
<key>png</key>
<string>f_geili.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[神马]</string>
<key>cht</key>
<string>[神馬]</string>
<key>gif</key>
<string>f_shenma.gif</string>
<key>png</key>
<string>f_shenma.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[围观]</string>
<key>cht</key>
<string>[圍觀]</string>
<key>gif</key>
<string>o_weiguan.gif</string>
<key>png</key>
<string>o_weiguan.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[话筒]</string>
<key>cht</key>
<string>[話筒]</string>
<key>gif</key>
<string>o_huatong.gif</string>
<key>png</key>
<string>o_huatong.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[奥特曼]</string>
<key>cht</key>
<string>[奥特曼]</string>
<key>gif</key>
<string>d_aoteman.gif</string>
<key>png</key>
<string>d_aoteman.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[草泥马]</string>
<key>cht</key>
<string>[草泥馬]</string>
<key>gif</key>
<string>shenshou_thumb.gif</string>
<key>png</key>
<string>d_shenshou.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[萌]</string>
<key>cht</key>
<string>[萌]</string>
<key>gif</key>
<string>f_meng.gif</string>
<key>png</key>
<string>f_meng.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[囧]</string>
<key>cht</key>
<string>[囧]</string>
<key>gif</key>
<string>f_jiong.gif</string>
<key>png</key>
<string>f_jiong.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[织]</string>
<key>cht</key>
<string>[織]</string>
<key>gif</key>
<string>f_zhi.gif</string>
<key>png</key>
<string>f_zhi.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[礼物]</string>
<key>cht</key>
<string>[禮物]</string>
<key>gif</key>
<string>o_liwu.gif</string>
<key>png</key>
<string>o_liwu.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[喜]</string>
<key>cht</key>
<string>[喜]</string>
<key>gif</key>
<string>f_xi.gif</string>
<key>png</key>
<string>f_xi.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[围脖]</string>
<key>cht</key>
<string>[圍脖]</string>
<key>gif</key>
<string>o_weibo.gif</string>
<key>png</key>
<string>o_weibo.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[音乐]</string>
<key>cht</key>
<string>[音樂]</string>
<key>gif</key>
<string>o_yinyue.gif</string>
<key>png</key>
<string>o_yinyue.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[绿丝带]</string>
<key>cht</key>
<string>[綠絲帶]</string>
<key>gif</key>
<string>o_lvsidai.gif</string>
<key>png</key>
<string>o_lvsidai.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[蛋糕]</string>
<key>cht</key>
<string>[蛋糕]</string>
<key>gif</key>
<string>o_dangao.gif</string>
<key>png</key>
<string>o_dangao.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[蜡烛]</string>
<key>cht</key>
<string>[蠟燭]</string>
<key>gif</key>
<string>o_lazhu.gif</string>
<key>png</key>
<string>o_lazhu.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[干杯]</string>
<key>cht</key>
<string>[乾杯]</string>
<key>gif</key>
<string>o_ganbei.gif</string>
<key>png</key>
<string>o_ganbei.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[男孩儿]</string>
<key>cht</key>
<string>[男孩儿]</string>
<key>gif</key>
<string>d_nanhaier.gif</string>
<key>png</key>
<string>d_nanhaier.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[女孩儿]</string>
<key>cht</key>
<string>[女孩儿]</string>
<key>gif</key>
<string>d_nvhaier.gif</string>
<key>png</key>
<string>d_nvhaier.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[肥皂]</string>
<key>cht</key>
<string>[肥皂]</string>
<key>gif</key>
<string>d_feizao.gif</string>
<key>png</key>
<string>d_feizao.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[照相机]</string>
<key>cht</key>
<string>[照相机]</string>
<key>gif</key>
<string></string>
<key>png</key>
<string>o_zhaoxiangji.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[浪]</string>
<key>cht</key>
<string>[浪]</string>
<key>gif</key>
<string></string>
<key>png</key>
<string>d_lang.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[沙尘暴]</string>
<key>cht</key>
<string>[沙塵暴]</string>
<key>gif</key>
<string>w_shachenbao.gif</string>
<key>png</key>
<string>w_shachenbao.png</string>
<key>type</key>
<string>0</string>
</dict>
</array>
</dict>
</plist>
================================================
FILE: Demo/YYKitDemo/EmoticonWeibo.bundle/com.sina.lxh/info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>id</key>
<string>com.sina.lxh</string>
<key>version</key>
<integer>2</integer>
<key>group_name_cn</key>
<string>浪小花</string>
<key>group_name_tw</key>
<string>浪小花</string>
<key>group_name_en</key>
<string>Huahua</string>
<key>display_only</key>
<integer>0</integer>
<key>group_type</key>
<integer>0</integer>
<key>emoticons</key>
<array>
<dict>
<key>chs</key>
<string>[笑哈哈]</string>
<key>cht</key>
<string>[笑哈哈]</string>
<key>gif</key>
<string>lxh_xiaohaha.gif</string>
<key>png</key>
<string>lxh_xiaohaha.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[好爱哦]</string>
<key>cht</key>
<string>[好愛哦]</string>
<key>gif</key>
<string>lxh_haoaio.gif</string>
<key>png</key>
<string>lxh_haoaio.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[噢耶]</string>
<key>cht</key>
<string>[噢耶]</string>
<key>gif</key>
<string>lxh_oye.gif</string>
<key>png</key>
<string>lxh_oye.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[偷乐]</string>
<key>cht</key>
<string>[偷樂]</string>
<key>gif</key>
<string>lxh_toule.gif</string>
<key>png</key>
<string>lxh_toule.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[泪流满面]</string>
<key>cht</key>
<string>[淚流滿面]</string>
<key>gif</key>
<string>lxh_leiliumanmian.gif</string>
<key>png</key>
<string>lxh_leiliumanmian.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[巨汗]</string>
<key>cht</key>
<string>[巨汗]</string>
<key>gif</key>
<string>lxh_juhan.gif</string>
<key>png</key>
<string>lxh_juhan.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[抠鼻屎]</string>
<key>cht</key>
<string>[摳鼻屎]</string>
<key>gif</key>
<string>lxh_koubishi.gif</string>
<key>png</key>
<string>lxh_koubishi.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[求关注]</string>
<key>cht</key>
<string>[求關注]</string>
<key>gif</key>
<string>lxh_qiuguanzhu.gif</string>
<key>png</key>
<string>lxh_qiuguanzhu.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[好喜欢]</string>
<key>cht</key>
<string>[好喜歡]</string>
<key>gif</key>
<string>lxh_haoxihuan.gif</string>
<key>png</key>
<string>lxh_haoxihuan.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[崩溃]</string>
<key>cht</key>
<string>[崩潰]</string>
<key>gif</key>
<string>lxh_bengkui.gif</string>
<key>png</key>
<string>lxh_bengkui.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[好囧]</string>
<key>cht</key>
<string>[好冏]</string>
<key>gif</key>
<string>lxh_haojiong.gif</string>
<key>png</key>
<string>lxh_haojiong.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[震惊]</string>
<key>cht</key>
<string>[震驚]</string>
<key>gif</key>
<string>lxh_zhenjing.gif</string>
<key>png</key>
<string>lxh_zhenjing.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[别烦我]</string>
<key>cht</key>
<string>[別煩我]</string>
<key>gif</key>
<string>lxh_biefanwo.gif</string>
<key>png</key>
<string>lxh_biefanwo.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[不好意思]</string>
<key>cht</key>
<string>[不好意思]</string>
<key>gif</key>
<string>lxh_buhaoyisi.gif</string>
<key>png</key>
<string>lxh_buhaoyisi.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[羞嗒嗒]</string>
<key>cht</key>
<string>[羞嗒嗒]</string>
<key>gif</key>
<string>lxh_xiudada.gif</string>
<key>png</key>
<string>lxh_xiudada.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[得意地笑]</string>
<key>cht</key>
<string>[得意地笑]</string>
<key>gif</key>
<string>lxh_deyidexiao.gif</string>
<key>png</key>
<string>lxh_deyidexiao.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[纠结]</string>
<key>cht</key>
<string>[糾結]</string>
<key>gif</key>
<string>lxh_jiujie.gif</string>
<key>png</key>
<string>lxh_jiujie.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[给劲]</string>
<key>cht</key>
<string>[給勁]</string>
<key>gif</key>
<string>lxh_geijin.gif</string>
<key>png</key>
<string>lxh_geijin.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[悲催]</string>
<key>cht</key>
<string>[悲催]</string>
<key>gif</key>
<string>lxh_beicui.gif</string>
<key>png</key>
<string>lxh_beicui.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[甩甩手]</string>
<key>cht</key>
<string>[甩甩手]</string>
<key>gif</key>
<string>lxh_shuaishuaishou.gif</string>
<key>png</key>
<string>lxh_shuaishuaishou.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[好棒]</string>
<key>cht</key>
<string>[好棒]</string>
<key>gif</key>
<string>lxh_haobang.gif</string>
<key>png</key>
<string>lxh_haobang.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[瞧瞧]</string>
<key>cht</key>
<string>[瞧瞧]</string>
<key>gif</key>
<string>lxh_qiaoqiao.gif</string>
<key>png</key>
<string>lxh_qiaoqiao.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[不想上班]</string>
<key>cht</key>
<string>[不想上班]</string>
<key>gif</key>
<string>lxh_buxiangshangban.gif</string>
<key>png</key>
<string>lxh_buxiangshangban.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[困死了]</string>
<key>cht</key>
<string>[困死了]</string>
<key>gif</key>
<string>lxh_kunsile.gif</string>
<key>png</key>
<string>lxh_kunsile.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[许愿]</string>
<key>cht</key>
<string>[許願]</string>
<key>gif</key>
<string>lxh_xuyuan.gif</string>
<key>png</key>
<string>lxh_xuyuan.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[丘比特]</string>
<key>cht</key>
<string>[丘比特]</string>
<key>gif</key>
<string>lxh_qiubite.gif</string>
<key>png</key>
<string>lxh_qiubite.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[有鸭梨]</string>
<key>cht</key>
<string>[有鴨梨]</string>
<key>gif</key>
<string>lxh_youyali.gif</string>
<key>png</key>
<string>lxh_youyali.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[想一想]</string>
<key>cht</key>
<string>[想一想]</string>
<key>gif</key>
<string>lxh_xiangyixiang.gif</string>
<key>png</key>
<string>lxh_xiangyixiang.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[躁狂症]</string>
<key>cht</key>
<string>[躁狂症]</string>
<key>gif</key>
<string>lxh_zaokuangzheng.gif</string>
<key>png</key>
<string>lxh_zaokuangzheng.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[转发]</string>
<key>cht</key>
<string>[轉發]</string>
<key>gif</key>
<string>lxh_zhuanfa.gif</string>
<key>png</key>
<string>lxh_zhuanfa.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[互相膜拜]</string>
<key>cht</key>
<string>[互相膜拜]</string>
<key>gif</key>
<string>lxh_xianghumobai.gif</string>
<key>png</key>
<string>lxh_xianghumobai.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[雷锋]</string>
<key>cht</key>
<string>[雷鋒]</string>
<key>gif</key>
<string>lxh_leifeng.gif</string>
<key>png</key>
<string>lxh_leifeng.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[杰克逊]</string>
<key>cht</key>
<string>[傑克遜]</string>
<key>gif</key>
<string>lxh_jiekexun.gif</string>
<key>png</key>
<string>lxh_jiekexun.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[玫瑰]</string>
<key>cht</key>
<string>[玫瑰]</string>
<key>gif</key>
<string>lxh_meigui.gif</string>
<key>png</key>
<string>lxh_meigui.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[hold住]</string>
<key>cht</key>
<string>[hold住]</string>
<key>gif</key>
<string>lxh_holdzhu.gif</string>
<key>png</key>
<string>lxh_holdzhu.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[群体围观]</string>
<key>cht</key>
<string>[群體圍觀]</string>
<key>gif</key>
<string>lxh_quntiweiguan.gif</string>
<key>png</key>
<string>lxh_quntiweiguan.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[推荐]</string>
<key>cht</key>
<string>[推薦]</string>
<key>gif</key>
<string>lxh_tuijian.gif</string>
<key>png</key>
<string>lxh_tuijian.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[赞啊]</string>
<key>cht</key>
<string>[贊啊]</string>
<key>gif</key>
<string>lxh_zana.gif</string>
<key>png</key>
<string>lxh_zana.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[被电]</string>
<key>cht</key>
<string>[被電]</string>
<key>gif</key>
<string>lxh_beidian.gif</string>
<key>png</key>
<string>lxh_beidian.png</string>
<key>type</key>
<string>0</string>
</dict>
<dict>
<key>chs</key>
<string>[霹雳]</string>
<key>cht</key>
<string>[霹靂]</string>
<key>gif</key>
<string>lxh_pili.gif</string>
<key>png</key>
<string>lxh_pili.png</string>
<key>type</key>
<string>0</string>
</dict>
</array>
</dict>
</plist>
================================================
FILE: Demo/YYKitDemo/EmoticonWeibo.bundle/emoticons.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>version</key>
<real>1</real>
<key>packages</key>
<array>
<dict>
<key>id</key>
<string>com.sina.default</string>
<key>version</key>
<integer>0</integer>
<key>display_only</key>
<integer>0</integer>
</dict>
<dict>
<key>id</key>
<string>com.apple.emoji</string>
<key>version</key>
<integer>0</integer>
<key>display_only</key>
<integer>0</integer>
</dict>
<dict>
<key>id</key>
<string>com.sina.lxh</string>
<key>version</key>
<integer>0</integer>
<key>display_only</key>
<integer>0</integer>
</dict>
</array>
</dict>
</plist>
================================================
FILE: Demo/YYKitDemo/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>zh</string>
<string>zh_TW</string>
<string>fr</string>
<string>de</string>
<string>it</string>
<string>ja</string>
<string>ko</string>
</array>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UIRequiresFullScreen</key>
<true/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleDefault</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist>
================================================
FILE: Demo/YYKitDemo/T1Helper.h
================================================
//
// T1Helper.h
// YYKitExample
//
// Created by ibireme on 15/10/10.
// Copyright (C) 2015 ibireme. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "YYKit.h"
@interface T1Helper : NSObject
/// Image resource bundle
+ (NSBundle *)bundle;
/// Image cache
+ (YYMemoryCache *)imageCache;
/// Get image from bundle with cache.
+ (UIImage *)imageNamed:(NSString *)name;
/// Convert date to friendly description.
+ (NSString *)stringWithTimelineDate:(NSDate *)date;
/// Convert number to friendly description.
+ (NSString *)shortedNumberDesc:(NSUInteger)number;
@end
================================================
FILE: Demo/YYKitDemo/T1Helper.m
================================================
//
// T1Helper.m
// YYKitExample
//
// Created by ibireme on 15/10/10.
// Copyright (C) 2015 ibireme. All rights reserved.
//
#import "T1Helper.h"
@implementation T1Helper
+ (NSBundle *)bundle {
static NSBundle *bundle;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSString *path = [[NSBundle mainBundle] pathForResource:@"ResourceTwitter" ofType:@"bundle"];
bundle = [NSBundle bundleWithPath:path];
});
return bundle;
}
+ (YYMemoryCache *)imageCache {
static YYMemoryCache *cache;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
cache = [YYMemoryCache new];
cache.shouldRemoveAllObjectsOnMemoryWarning = NO;
cache.shouldRemoveAllObjectsWhenEnteringBackground = NO;
cache.name = @"TwitterImageCache";
});
return cache;
}
+ (UIImage *)imageNamed:(NSString *)name {
if (!name) return nil;
UIImage *image = [[self imageCache] objectForKey:name];
if (image) return image;
NSString *ext = name.pathExtension;
if (ext.length == 0) ext = @"png";
NSString *path = [[self bundle] pathForScaledResource:name ofType:ext];
if (!path) return nil;
image = [UIImage imageWithContentsOfFile:path];
image = [image imageByDecoded];
if (!image) return nil;
[[self imageCache] setObject:image forKey:name];
return image;
}
+ (NSString *)stringWithTimelineDate:(NSDate *)date {
if (!date) return @"";
static NSDateFormatter *formatterFullDate;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
formatterFullDate = [[NSDateFormatter alloc] init];
[formatterFullDate setDateFormat:@"M/d/yy"];
[formatterFullDate setLocale:[NSLocale currentLocale]];
});
NSDate *now = [NSDate new];
NSTimeInterval delta = now.timeIntervalSince1970 - date.timeIntervalSince1970;
if (delta < -60 * 10) { // local time error
return [formatterFullDate stringFromDate:date];
} else if (delta < 60) {
return [NSString stringWithFormat:@"%ds",(int)(delta)];
} else if (delta < 60 * 60) {
return [NSString stringWithFormat:@"%dm", (int)(delta / 60.0)];
} else if (delta < 60 * 60 * 24) {
return [NSString stringWithFormat:@"%dh", (int)(delta / 60.0 / 60.0)];
} else if (delta < 60 * 60 * 24 * 7) {
return [NSString stringWithFormat:@"%dd", (int)(delta / 60.0 / 60.0 / 24.0)];
} else {
return [formatterFullDate stringFromDate:date];
}
}
+ (NSString *)shortedNumberDesc:(NSUInteger)number {
if (number <= 999) return [NSString stringWithFormat:@"%d",(int)number];
if (number <= 9999) return [NSString stringWithFormat:@"%d,%3.3d",(int)(number / 1000), (int)(number % 1000)];
if (number < 1000 * 1000) return [NSString stringWithFormat:@"%.1fK", number / 1000.0];
if (number < 1000 * 1000 * 1000) return [NSString stringWithFormat:@"%.1fM", number / 1000.0 / 1000.0];
return [NSString stringWithFormat:@"%.1fB", number / 1000.0 / 1000.0 / 1000.0];
}
@end
================================================
FILE: Demo/YYKitDemo/T1HomeTimelineItemsViewController.h
================================================
//
// T1HomeTimelineItemsViewController.h
// YYKitExample
//
// Created by ibireme on 15/10/9.
// Copyright (C) 2015 ibireme. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface T1HomeTimelineItemsViewController : UIViewController
@end
================================================
FILE: Demo/YYKitDemo/T1HomeTimelineItemsViewController.m
================================================
//
// T1HomeTimelineItemsViewController.m
// YYKitExample
//
// Created by ibireme on 15/10/9.
// Copyright (C) 2015 ibireme. All rights reserved.
//
#import "T1HomeTimelineItemsViewController.h"
#import "T1StatusLayout.h"
#import "T1StatusCell.h"
#import "YYTableView.h"
#import "YYFPSLabel.h"
#import "YYPhotoGroupView.h"
#import "YYSimpleWebViewController.h"
@interface T1HomeTimelineItemsViewController() <UITableViewDelegate, UITableViewDataSource, T1StatusCellDelegate>
@property (nonatomic, strong) NSMutableArray *layouts;
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) YYFPSLabel *fpsLabel;
@end
@implementation T1HomeTimelineItemsViewController
- (instancetype)init {
self = [super init];
_tableView = [YYTableView new];
_tableView.delegate = self;
_tableView.dataSource = self;
return self;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.view.backgroundColor = [UIColor whiteColor];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor colorWithWhite:1.000 alpha:0.919];
if ([self respondsToSelector:@selector( setAutomaticallyAdjustsScrollViewInsets:)]) {
self.automaticallyAdjustsScrollViewInsets = NO;
}
_tableView.frame = self.view.bounds;
_tableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
_tableView.scrollIndicatorInsets = _tableView.contentInset;
_tableView.backgroundColor = [UIColor clearColor];
_tableView.backgroundView.backgroundColor = [UIColor clearColor];
[self.view addSubview:_tableView];
_fpsLabel = [YYFPSLabel new];
[_fpsLabel sizeToFit];
_fpsLabel.bottom = self.view.height - kT1CellPadding;
_fpsLabel.left = kT1CellPadding;
_fpsLabel.alpha = 0;
[self.view addSubview:_fpsLabel];
if (kSystemVersion < 7) {
_fpsLabel.top -= 44;
_tableView.top -= 64;
_tableView.height += 20;
}
self.navigationController.view.userInteractionEnabled = NO;
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
indicator.size = CGSizeMake(80, 80);
indicator.center = CGPointMake(self.view.width / 2, self.view.height / 2);
indicator.backgroundColor = [UIColor colorWithWhite:0.000 alpha:0.670];
indicator.clipsToBounds = YES;
indicator.layer.cornerRadius = 6;
[indicator startAnimating];
[self.view addSubview:indicator];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSMutableArray *layouts = [NSMutableArray new];
for (int i = 0; i <= 3; i++) {
NSData *data = [NSData dataNamed:[NSString stringWithFormat:@"twitter_%d.json",i]];
T1APIRespose *response = [T1APIRespose modelWithJSON:data];
for (id item in response.timelineItmes) {
if ([item isKindOfClass:[T1Tweet class]]) {
T1Tweet *tweet = item;
T1StatusLayout *layout = [T1StatusLayout new];
layout.tweet = tweet;
[layouts addObject:layout];
} else if ([item isKindOfClass:[T1Conversation class]]) {
T1Conversation *conv = item;
NSMutableArray *convLayouts = [NSMutableArray new];
for (T1Tweet *tweet in conv.tweets) {
T1StatusLayout *layout = [T1StatusLayout new];
layout.conversation = conv;
layout.tweet = tweet;
[convLayouts addObject:layout];
}
if (conv.targetCount > 0 && convLayouts.count >= 2) {
T1StatusLayout *split = [T1StatusLayout new];
split.conversation = conv;
[split layout];
[convLayouts insertObject:split atIndex:1];
}
[layouts addObjectsFromArray:convLayouts];
}
}
}
dispatch_async(dispatch_get_main_queue(), ^{
self.title = [NSString stringWithFormat:@"Twitter (loaded:%d)", (int)layouts.count];
[indicator removeFromSuperview];
self.navigationController.view.userInteractionEnabled = YES;
self.layouts = layouts;
[_tableView reloadData];
});
});
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
if (_fpsLabel.alpha == 0) {
[UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
_fpsLabel.alpha = 1;
} completion:NULL];
}
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
if (!decelerate) {
if (_fpsLabel.alpha != 0) {
[UIView animateWithDuration:1 delay:2 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
_fpsLabel.alpha = 0;
} completion:NULL];
}
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
if (_fpsLabel.alpha != 0) {
[UIView animateWithDuration:1 delay:2 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
_fpsLabel.alpha = 0;
} completion:NULL];
}
}
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView {
if (_fpsLabel.alpha == 0) {
[UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
_fpsLabel.alpha = 1;
} completion:^(BOOL finished) {
}];
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return _layouts.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *cellID = @"cell";
T1StatusCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (!cell) {
cell = [[T1StatusCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
cell.delegate = self;
}
[cell setLayout:_layouts[indexPath.row]];
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return ((T1StatusLayout *)_layouts[indexPath.row]).height;
}
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
return NO;
}
#pragma mark - T1StatusCellDelegate
- (void)cell:(T1StatusCell *)cell didClickInLabel:(YYLabel *)label textRange:(NSRange)textRange {
YYTextHighlight *highlight = [label.textLayout.text attribute:YYTextHighlightAttributeName atIndex:textRange.location];
NSDictionary *info = highlight.userInfo;
NSURL *link = nil;
NSString *linkTitle = nil;
if (info[@"T1URL"]) {
T1URL *url = info[@"T1URL"];
if (url.expandedURL.length) {
link = [NSURL URLWithString:url.expandedURL];
linkTitle = url.displayURL;
}
} else if (info[@"T1Media"]) {
T1Media *media = info[@"T1Media"];
if (media.expandedURL.length) {
link = [NSURL URLWithString:media.expandedURL];
linkTitle = media.displayURL;
}
}
if (link) {
YYSimpleWebViewController *vc = [[YYSimpleWebViewController alloc] initWithURL:link];
vc.title = linkTitle;
[self.navigationController pushViewController:vc animated:YES];
}
}
- (void)cell:(T1StatusCell *)cell didClickImageAtIndex:(NSUInteger)index withLongPress:(BOOL)longPress {
if (longPress) {
// show alert
return;
}
UIImageView *fromView = nil;
NSMutableArray *items = [NSMutableArray new];
NSArray<T1Media *> *images = cell.layout.images;
for (NSUInteger i = 0, max = images.count; i < max; i++) {
UIImageView *imgView = cell.statusView.mediaView.imageViews[i];
T1Media *img = images[i];
YYPhotoGroupItem *item = [YYPhotoGroupItem new];
item.thumbView = imgView;
item.largeImageURL = img.mediaLarge.url;
item.largeImageSize = img.mediaLarge.size;
[items addObject:item];
if (i == index) {
fromView = imgView;
}
}
YYPhotoGroupView *v = [[YYPhotoGroupView alloc] initWithGroupItems:items];
[v presentFromImageView:fromView toContainer:self.navigationController.view animated:YES completion:nil];
}
- (void)cell:(T1StatusCell *)cell didClickQuoteWithLongPress:(BOOL)longPress {
}
- (void)cell:(T1StatusCell *)cell didClickAvatarWithLongPress:(BOOL)longPress {
}
- (void)cell:(T1StatusCell *)cell didClickContentWithLongPress:(BOOL)longPress {
}
- (void)cellDidClickReply:(T1StatusCell *)cell {
}
- (void)cellDidClickRetweet:(T1StatusCell *)cell {
T1StatusLayout *layout = cell.layout;
T1Tweet *tweet = layout.displayedTweet;
if (tweet.retweeted) {
tweet.retweeted = NO;
if (tweet.retweetCount > 0) tweet.retweetCount--;
layout.retweetCountTextLayout = [layout retweetCountTextLayoutForTweet:tweet];
} else {
tweet.retweeted = YES;
tweet.retweetCount++;
layout.retweetCountTextLayout = [layout retweetCountTextLayoutForTweet:tweet];
}
[cell.statusView.inlineActionsView updateRetweetWithAnimation];
}
- (void)cellDidClickFavorite:(T1StatusCell *)cell {
T1StatusLayout *layout = cell.layout;
T1Tweet *tweet = layout.displayedTweet;
if (tweet.favorited) {
tweet.favorited = NO;
if (tweet.favoriteCount > 0) tweet.favoriteCount--;
layout.favoriteCountTextLayout = [layout favoriteCountTextLayoutForTweet:tweet];
} else {
tweet.favorited = YES;
tweet.favoriteCount++;
layout.favoriteCountTextLayout = [layout favoriteCountTextLayoutForTweet:tweet];
}
[cell.statusView.inlineActionsView updateFavouriteWithAnimation];
}
- (void)cellDidClickFollow:(T1StatusCell *)cell {
T1StatusLayout *layout = cell.layout;
T1Tweet *tweet = layout.displayedTweet;
tweet.user.following = !tweet.user.following;
[cell.statusView.inlineActionsView updateFollowWithAnimation];
}
@end
================================================
FILE: Demo/YYKitDemo/T1Model.h
================================================
//
// T1Model.h
// YYKitExample
//
// Created by ibireme on 15/10/9.
// Copyright (C) 2015 ibireme. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "YYKit.h"
@class T1User;
@interface T1UserMention : NSObject
@property (nonatomic, assign) uint32_t uid;
@property (nonatomic, strong) NSString *uidStr;
@property (nonatomic, strong) NSString *name; // e.g. "Nick Lockwood"
@property (nonatomic, strong) NSString *screenName; // e.g. "nicklockwood"
@property (nonatomic, strong) NSArray<NSNumber *> *indices; // Array<NSNumber> from, to
@property (nonatomic, assign) NSRange range; // range from indices
@property (nonatomic, strong) NSArray<NSValue *> *ranges; // Array<NSValue(NSRange)> nil if range is less than or equal to one.
@property (nonatomic, strong) T1User *user; // reference
@end
@interface T1URL : NSObject
@property (nonatomic, strong) NSString *url; // e.g. "http://t.co/YuvsPou0rj"
@property (nonatomic, strong) NSString *displayURL; // e.g. "apple.com/tv/compare/"
@property (nonatomic, strong) NSString *expandedURL; // e.g. "http://www.apple.com/tv/compare/"
@property (nonatomic, strong) NSArray<NSNumber *> *indices; // Array<NSNumber> from, to
@property (nonatomic, assign) NSRange range; // range from indices
@property (nonatomic, strong) NSArray<NSValue *> *ranges; // Array<NSValue(NSRange)> nil if range is less than or equal to one.
@end
@interface T1HashTag : NSObject
@property (nonatomic, strong) NSString *text;
@property (nonatomic, strong) NSArray<NSNumber *> *indices; // Array<NSNumber> from, to
@property (nonatomic, assign) NSRange range; // range from indices
@property (nonatomic, strong) NSArray<NSValue *> *ranges; // Array<NSValue(NSRange)> nil if range is less than or equal to one.
@end
@interface T1MediaMeta : NSObject
@property (nonatomic, assign) int width;
@property (nonatomic, assign) int height;
@property (nonatomic, assign) CGSize size;
@property (nonatomic, strong) NSString *resize; // fit, crop
@property (nonatomic, assign) BOOL isCrop; // resize is "crop"
@property (nonatomic, strong) NSArray<NSValue *> *faces; // Array<NSValue(CGRect)>
@property (nonatomic, strong) NSURL *url; // add
@end
@interface T1Media : NSObject
@property (nonatomic, assign) uint64_t mid;
@property (nonatomic, strong) NSString *midStr;
@property (nonatomic, strong) NSString *type; // photo/..
@property (nonatomic, strong) NSString *url; // e.g. "http://t.co/X4kGxbKcBu"
@property (nonatomic, strong) NSString *displayURL; // e.g. "pic.twitter.com/X4kGxbKcBu"
@property (nonatomic, strong) NSString *expandedURL; // e.g. "http://twitter.com/edelwax/status/652117831883034624/photo/1"
@property (nonatomic, strong) NSString *mediaURL; // e.g. "http://pbs.twimg.com/media/CQzJtkbXAAAO2v3.png"
@property (nonatomic, strong) NSString *mediaURLHttps; // e.g. "https://pbs.twimg.com/media/CQzJtkbXAAAO2v3.png"
@property (nonatomic, strong) NSArray<NSNumber *> *indices; // Array<NSNumber> from, to
@property (nonatomic, assign) NSRange range; // range from indices
@property (nonatomic, strong) NSArray<NSValue *> *ranges; // Array<NSValue(NSRange)> nil if range is less than or equal to one.
@property (nonatomic, strong) T1MediaMeta *mediaThumb;
@property (nonatomic, strong) T1MediaMeta *mediaSmall;
@property (nonatomic, strong) T1MediaMeta *mediaMedium;
@property (nonatomic, strong) T1MediaMeta *mediaLarge;
@property (nonatomic, strong) T1MediaMeta *mediaOrig;
@end
@interface T1Place : NSObject
@property (nonatomic, strong) NSString *pid;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *fullName;
@property (nonatomic, strong) NSString *placeType;
@property (nonatomic, strong) NSString *country;
@property (nonatomic, strong) NSString *countryCode;
@property (nonatomic, strong) NSArray *containedWithin;
@property (nonatomic, strong) NSDictionary *boundingBox;
@property (nonatomic, strong) NSDictionary *attributes;
@end
@interface T1Card : NSObject
@property (nonatomic, strong) NSDictionary *users; // <NSString(uid), T1User>
@property (nonatomic, strong) NSString *cardTypeURL;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *url;
@property (nonatomic, strong) NSDictionary *bindingValues;
@end
@interface T1User : NSObject
@property (nonatomic, assign) uint64_t uid;
@property (nonatomic, strong) NSString *uidStr;
@property (nonatomic, strong) NSString *name; // e.g. "Nick Lockwood"
@property (nonatomic, strong) NSString *screenName; // e.g. "nicklockwood"
@property (nonatomic, strong) NSString *url;
@property (nonatomic, strong) NSString *desc;
@property (nonatomic, strong) NSString *location;
@property (nonatomic, strong) NSDate *createdAt;
@property (nonatomic, assign) uint32_t listedCount;
@property (nonatomic, assign) uint32_t statusesCount;
@property (nonatomic, assign) uint32_t favouritesCount;
@property (nonatomic, assign) uint32_t friendsCount;
// http://pbs.twimg.com/profile_images/558109954561679360/j1f9DiJi_normal.jpeg original
// http://pbs.twimg.com/profile_images/558109954561679360/j1f9DiJi_reasonably_small.jpeg replaced
@property (nonatomic, strong) NSURL *profileImageURL;
@property (nonatomic, strong) NSURL *profileImageURLReasonablySmall; // replaced
@property (nonatomic, strong) NSURL *profileImageURLHttps;
@property (nonatomic, strong) NSURL *profileBackgroundImageURL;
@property (nonatomic, strong) NSURL *profileBackgroundImageURLHttps;
@property (nonatomic, strong) NSString *profileBackgroundColor;
@property (nonatomic, strong) NSString *profileTextColor;
@property (nonatomic, strong) NSString *profileSidebarFillColor;
@property (nonatomic, strong) NSString *profileSidebarBorderColor;
@property (nonatomic, strong) NSString *profileLinkColor;
@property (nonatomic, strong) NSDictionary *entities;
@property (nonatomic, strong) NSDictionary *counts;
@property (nonatomic, assign) BOOL verified;
@property (nonatomic, assign) BOOL following;
@property (nonatomic, assign) BOOL followRequestSent;
@property (nonatomic, assign) BOOL defaultProfile;
@property (nonatomic, assign) BOOL defaultProfileImage;
@property (nonatomic, assign) BOOL profileBackgroundTile;
@property (nonatomic, assign) BOOL profileUseBackgroundImage;
@property (nonatomic, assign) BOOL isProtected;
@property (nonatomic, assign) BOOL isTranslator;
@property (nonatomic, assign) BOOL notifications;
@property (nonatomic, assign) BOOL geoEnabled;
@property (nonatomic, assign) BOOL contributorsEnabled;
@property (nonatomic, assign) BOOL isTranslationEnabled;
@property (nonatomic, assign) BOOL hasExtendedProfile;
@property (nonatomic, strong) NSString *lang;
@property (nonatomic, strong) NSString *timeZone;
@property (nonatomic, assign) int32_t utcOffset;
@end
@interface T1Tweet : NSObject
@property (nonatomic, assign) uint64_t tid;
@property (nonatomic, strong) NSString *tidStr;
@property (nonatomic, strong) T1User *user;
@property (nonatomic, strong) T1Place *place;
@property (nonatomic, strong) T1Card *card;
@property (nonatomic, strong) T1Tweet *retweetedStatus;
@property (nonatomic, strong) T1Tweet *quotedStatus;
@property (nonatomic, strong) NSString *text;
@property (nonatomic, strong) NSString *source;
@property (nonatomic, strong) NSArray<T1Media *> *medias;
@property (nonatomic, strong) NSArray<T1Media *> *extendedMedias;
@property (nonatomic, strong) NSArray<T1UserMention *> *userMentions;
@property (nonatomic, strong) NSArray<T1URL *> *urls;
@property (nonatomic, strong) NSArray<T1HashTag *> *hashTags;
@property (nonatomic, strong) NSDate *createdAt;
@property (nonatomic, assign) BOOL truncated;
@property (nonatomic, assign) BOOL favorited;
@property (nonatomic, assign) BOOL retweeted;
@property (nonatomic, assign) BOOL isQuoteStatus;
@property (nonatomic, assign) uint32_t favoriteCount;
@property (nonatomic, assign) uint32_t retweetCount;
@property (nonatomic, assign) uint64_t conversationID;
@property (nonatomic, assign) uint32_t inReplyToUserId;
@property (nonatomic, strong) NSArray *contributors;
@property (nonatomic, assign) uint64_t inReplyToStatusID;
@property (nonatomic, strong) NSString *inReplyToStatusIDStr;
@property (nonatomic, strong) NSString *inReplyToUserIDStr;
@property (nonatomic, strong) NSString *inReplyToScreenName;
@property (nonatomic, strong) NSString *lang;
@property (nonatomic, strong) NSDictionary *geo;
@property (nonatomic, strong) NSString *supplementalLanguage;
@property (nonatomic, strong) NSArray *coordinates;
@end
@interface T1Conversation : NSObject
@property (nonatomic, strong) NSString *targetTweetID;
@property (nonatomic, strong) NSArray *participantIDs;
@property (nonatomic, assign) uint32_t participantsCount;
@property (nonatomic, assign) uint32_t targetCount; // 0 if no target items
@property (nonatomic, strong) NSString *rootUserID;
@property (nonatomic, strong) NSArray *contextIDs; //<
@property (nonatomic, strong) NSArray *entityIDs;
@property (nonatomic, strong) NSArray *tweets; // Array<T1Tweet>
@end
@interface T1APIRespose : NSObject
@property (nonatomic, strong) NSDictionary *moments; ///< empty
@property (nonatomic, strong) NSDictionary<NSString *, T1User *> *users; ///< <UID(NSString), T1User>
@property (nonatomic, strong) NSDictionary<NSString *, T1Tweet *> *tweets; ///< <TID(NSString), T1Tweet>
@property (nonatomic, strong) NSArray *timelineItmes; ///< Array<T1Tweet/T1Conversation>
@property (nonatomic, strong) NSArray *timeline; ///< Array<Dictionary>
@property (nonatomic, strong) NSString *cursorTop;
@property (nonatomic, strong) NSString *cursorBottom;
@property (nonatomic, strong) NSArray *cursorGaps;
@end
================================================
FILE: Demo/YYKitDemo/T1Model.m
================================================
//
// T1Model.m
// YYKitExample
//
// Created by ibireme on 15/10/9.
// Copyright (C) 2015 ibireme. All rights reserved.
//
#import "T1Model.h"
@implementation T1UserMention
+ (NSDictionary *)modelCustomPropertyMapper {
return @{
@"screenName" : @"screen_name",
@"uidStr" : @"id_str",
@"uid" : @"id",
};
}
+ (NSDictionary *)modelContainerPropertyGenericClass {
return @{ @"indices" : [NSNumber class] };
}
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {
int rangeCount = (int)_indices.count / 2;
NSMutableArray *ranges = nil;
for (int i = 0; i < rangeCount; i++) {
int from = ((NSNumber *)_indices[i * 2]).intValue;
int to = ((NSNumber *)_indices[i * 2 + 1]).intValue;
NSRange range = NSMakeRange(from, to >= from ? (to - from) : 0);
if (i == 0) {
_range = range;
}
if (rangeCount > 1) {
[ranges addObject:[NSValue valueWithRange:range]];
}
}
_ranges = ranges;
return YES;
}
@end
@implementation T1URL
+ (NSDictionary *)modelCustomPropertyMapper {
return @{ @"screenName" : @"screen_name",
@"idStr" : @"id_str",
@"displayURL" : @"display_url",
@"expandedURL" : @"expanded_url"};
}
+ (NSDictionary *)modelContainerPropertyGenericClass {
return @{ @"indices" : [NSNumber class] };
}
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {
int rangeCount = (int)_indices.count / 2;
NSMutableArray *ranges = nil;
for (int i = 0; i < rangeCount; i++) {
int from = ((NSNumber *)_indices[i * 2]).intValue;
int to = ((NSNumber *)_indices[i * 2 + 1]).intValue;
NSRange range = NSMakeRange(from, to >= from ? (to - from) : 0);
if (i == 0) {
_range = range;
}
if (rangeCount > 1) {
[ranges addObject:[NSValue valueWithRange:range]];
}
}
_ranges = ranges;
return YES;
}
@end
@implementation T1HashTag
+ (NSDictionary *)modelContainerPropertyGenericClass {
return @{ @"indices" : [NSNumber class] };
}
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {
int rangeCount = (int)_indices.count / 2;
NSMutableArray *ranges = nil;
for (int i = 0; i < rangeCount; i++) {
int from = ((NSNumber *)_indices[i * 2]).intValue;
int to = ((NSNumber *)_indices[i * 2 + 1]).intValue;
NSRange range = NSMakeRange(from, to >= from ? (to - from) : 0);
if (i == 0) {
_range = range;
}
if (rangeCount > 1) {
[ranges addObject:[NSValue valueWithRange:range]];
}
}
_ranges = ranges;
return YES;
}
@end
@implementation T1MediaMeta
+ (NSDictionary *)modelContainerPropertyGenericClass {
return @{ @"faces" : [NSValue class] };
}
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {
_size = CGSizeMake(_width, _height);
_isCrop = [_resize isEqualToString:@"crop"];
_faces = nil;
NSArray *faceDics = dic[@"faces"];
if ([faceDics isKindOfClass:[NSArray class]] && faceDics.count > 0) {
NSMutableArray *faces = [NSMutableArray new];
for (NSDictionary *faceDic in faceDics) {
if ([faceDic isKindOfClass:[NSDictionary class]]) {
int x = [faceDic intValueForKey:@"x" default:0];
int y = [faceDic intValueForKey:@"y" default:0];
int w = [faceDic intValueForKey:@"w" default:0];
int h = [faceDic intValueForKey:@"h" default:0];
[faces addObject:[NSValue valueWithCGRect:CGRectMake(x, y, w, h)]];
}
}
_faces = faces;
}
return YES;
}
@end
@implementation T1Media
+ (NSDictionary *)modelCustomPropertyMapper {
return @{
@"idStr" : @"id_str",
@"mediaURLHttps" : @"media_url_https",
@"mediaURL" : @"media_url",
@"expandedURL" : @"expanded_url",
@"displayURL" : @"display_url",
@"mid" : @"id",
@"midStr" : @"id_str",
@"mediaThumb" : @"sizes.thumb",
@"mediaSmall" : @"sizes.small",
@"mediaMedium" : @"sizes.medium",
@"mediaLarge" : @"sizes.large",
@"mediaOrig" : @"sizes.orig"
};
}
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {
int rangeCount = (int)_indices.count / 2;
NSMutableArray *ranges = nil;
for (int i = 0; i < rangeCount; i++) {
int from = ((NSNumber *)_indices[i * 2]).intValue;
int to = ((NSNumber *)_indices[i * 2 + 1]).intValue;
NSRange range = NSMakeRange(from, to >= from ? (to - from) : 0);
if (i == 0) {
_range = range;
}
if (rangeCount > 1) {
[ranges addObject:[NSValue valueWithRange:range]];
}
}
_ranges = ranges;
NSDictionary *featureDics = dic[@"features"];
if ([featureDics isKindOfClass:[NSDictionary class]]) {
[_mediaThumb modelSetWithDictionary:featureDics[@"thumb"]];
[_mediaSmall modelSetWithDictionary:featureDics[@"small"]];
[_mediaMedium modelSetWithDictionary:featureDics[@"medium"]];
[_mediaLarge modelSetWithDictionary:featureDics[@"large"]];
[_mediaOrig modelSetWithDictionary:featureDics[@"orig"]];
NSString *url;
url = [_mediaURL stringByAppendingString:@":thumb"];
_mediaThumb.url = url ? [NSURL URLWithString:url] : nil;
url = [_mediaURL stringByAppendingString:@":small"];
_mediaSmall.url = url ? [NSURL URLWithString:url] : nil;
url = [_mediaURL stringByAppendingString:@":medium"];
_mediaMedium.url = url ? [NSURL URLWithString:url] : nil;
url = [_mediaURL stringByAppendingString:@":large"];
_mediaLarge.url = url ? [NSURL URLWithString:url] : nil;
url = [_mediaURL stringByAppendingString:@":orig"];
_mediaOrig.url = url ? [NSURL URLWithString:url] : nil;
}
return YES;
}
@end
@implementation T1Place
+ (NSDictionary *)modelCustomPropertyMapper {
return @{
@"fullName" : @"full_name",
@"placeType" : @"place_type",
@"countryCode" : @"country_code",
@"pid" : @"id",
@"boundingBox" : @"bounding_box",
@"containedWithin" : @"contained_within"
};
}
@end
@implementation T1Card
+ (NSDictionary *)modelContainerPropertyGenericClass {
return @{ @"users" : [T1User class] };
}
+ (NSDictionary *)modelCustomPropertyMapper {
return @{ @"cardTypeURL" : @"card_type_url", @"bindingValues" : @"binding_values" };
}
@end
@implementation T1User
+ (NSDictionary *)modelCustomPropertyMapper {
return @{
@"isProtected" : @"protected",
@"isTranslator" : @"is_translator",
@"profileImageURL" : @"profile_image_url",
@"createdAt" : @"created_at",
@"uid" : @"id",
@"defaultProfileImage" : @"default_profile_image",
@"listedCount" : @"listed_count",
@"profileBackgroundColor" : @"profile_background_color",
@"followRequestSent" : @"follow_request_sent",
@"desc" : @"description",
@"geoEnabled" : @"geo_enabled",
@"profileTextColor" : @"profile_text_color",
@"statusesCount" : @"statuses_count",
@"profileBackgroundTile" : @"profile_background_tile",
@"profileUseBackgroundImage" : @"profile_use_background_image",
@"uidStr" : @"id_str",
@"profileImageURLHttps" : @"profile_image_url_https",
@"profileSidebarFillColor" : @"profile_sidebar_fill_color",
@"profileSidebarBorderColor" : @"profile_sidebar_border_color",
@"contributorsEnabled" : @"contributors_enabled",
@"defaultProfile" : @"default_profile",
@"screenName" : @"screen_name",
@"timeZone" : @"time_zone",
@"profileBackgroundImageURL" : @"profile_background_image_url",
@"profileBackgroundImageURLHttps" : @"profile_background_image_url_https",
@"profileLinkColor" : @"profile_link_color",
@"favouritesCount" : @"favourites_count",
@"isTranslationEnabled" : @"is_translation_enabled",
@"utcOffset" : @"utc_offset",
@"friendsCount" : @"friends_count",
@"hasExtendedProfile" : @"has_extended_profile"
};
}
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {
if (_profileImageURL) {
NSMutableString *url = _profileImageURL.absoluteString.mutableCopy;
NSString *ext = [url pathExtension];
if (ext.length && url.length > ext.length + 2 + 7) {
NSRange range = NSMakeRange(url.length - ext.length - 1 - 7, 7);
if ([[url substringWithRange:range] isEqualToString:@"_normal"]) {
[url replaceCharactersInRange:range withString:@"_reasonably_small"];
_profileImageURLReasonablySmall = [NSURL URLWithString:url];
}
}
}
return YES;
}
@end
@implementation T1Tweet
+ (NSDictionary *)modelContainerPropertyGenericClass {
return @{
@"medias" : [T1Media class],
@"extendedMedias" : [T1Media class],
@"userMentions" : [T1UserMention class],
@"urls" : [T1URL class],
@"hashTags" : [T1HashTag class]
};
}
+ (NSDictionary *)modelCustomPropertyMapper {
return @{
@"isQuoteStatus" : @"is_quote_status",
@"favoriteCount" : @"favorite_count",
@"conversationID" : @"conversation_id",
@"inReplyToScreenName" : @"in_reply_to_screen_name",
@"retweetCount" : @"retweet_count",
@"tid" : @"id",
@"inReplyToUserId" : @"in_reply_to_user_id",
@"supplementalLanguage" : @"supplemental_language",
@"createdAt" : @"created_at",
@"inReplyToStatusIDStr" : @"in_reply_to_status_id_str",
@"inReplyToStatusID" : @"in_reply_to_status_id",
@"inReplyToUserIDStr" : @"in_reply_to_user_id_str",
@"tidStr" : @"id_str",
@"retweetedStatus" : @"retweeted_status",
@"quotedStatus" : @"quoted_status",
@"medias" : @"emtities.media",
@"extendedMedias" : @"extended_entities.media",
@"userMentions" : @"entities.userMentions",
@"urls" : @"entities.urls",
@"hashTags" : @"entities.hashtags"
};
}
@end
@implementation T1Conversation
+ (NSDictionary *)modelContainerPropertyGenericClass {
return @{
@"participantIDs" : [NSString class],
@"contextIDs" : [NSString class],
};
}
+ (NSDictionary *)modelCustomPropertyMapper {
return @{
@"targetTweetID" : @"context.target_tweet_id",
@"participantIDs" : @"context.participant_ids",
@"participantsCount" : @"context.participants_count",
@"targetCount" : @"context.target_count",
@"rootUserID" : @"ccontext.root_user_id",
@"contextIDs" : @"ids"
};
}
@end
@implementation T1APIRespose
+ (NSDictionary *)modelContainerPropertyGenericClass {
return @{
@"users" : [T1User class],
@"tweets" : [T1Tweet class],
@"timeline" : [NSDictionary class],
@"hashTags" : [T1HashTag class]
};
}
+ (NSDictionary *)modelCustomPropertyMapper {
return @{
@"users" : @"twitter_objects.users",
@"tweets" : @"twitter_objects.tweets",
@"timeline" : @"response.timeline",
@"cursorTop" : @"response.cursor.top",
@"cursorBottom" : @"response.cursor.bottom",
@"cursorGaps" : @"response.cursor.gaps"
};
}
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {
NSMutableArray *timelineItems = [NSMutableArray new];
for (NSDictionary *dic in _timeline) {
NSDictionary *tDic = dic[@"tweet"];
if ([tDic isKindOfClass:[NSDictionary class]]) {
NSString *tid = tDic[@"id"];
if ([tid isKindOfClass:[NSString class]]) {
T1Tweet *tweet = _tweets[tid];
if (tweet) [timelineItems addObject:tweet];
}
} else {
NSDictionary *cDic = dic[@"conversation"];
if ([cDic isKindOfClass:[NSDictionary class]]) {
T1Conversation *conversation = [T1Conversation modelWithDictionary:cDic];
NSDictionary *entityID = dic[@"entity_id"];
if ([entityID isKindOfClass:[NSDictionary class]]) {
NSArray *ids = entityID[@"ids"];
if ([ids isKindOfClass:[NSArray class]]) {
conversation.entityIDs = ids;
}
}
NSMutableArray *tweets = [NSMutableArray new];
for (NSString *tid in conversation.contextIDs) {
T1Tweet *tweet = _tweets[tid];
if (tweet) [tweets addObject:tweet];
}
if (tweets.count > 1) {
conversation.tweets = tweets;
[timelineItems addObject:conversation];
}
}
}
}
_timelineItmes = timelineItems;
for (id item in _timelineItmes) {
if ([item isKindOfClass:[T1Tweet class]]) {
[self _updateTweetReference:item];
} else if ([item isKindOfClass:[T1Conversation class]]) {
for (T1Tweet *tweet in ((T1Conversation *)item).tweets) {
[self _updateTweetReference:tweet];
}
}
}
return YES;
}
- (void)_updateTweetReference:(T1Tweet *)tweet {
if (!tweet) return;
T1User *user;
for (T1UserMention *mention in tweet.userMentions) {
user = mention.uidStr ? _users[mention.uidStr] : nil;
mention.user = user;
}
for (T1UserMention *mention in tweet.retweetedStatus.userMentions) {
user = mention.uidStr ? _users[mention.uidStr] : nil;
mention.user = user;
}
user = tweet.user;
user = user.uidStr ? _users[user.uidStr] : nil;
tweet.user = user;
user = tweet.retweetedStatus.user;
user = user.uidStr ? _users[user.uidStr] : nil;
tweet.retweetedStatus.user = user;
user = tweet.quotedStatus.user;
user = user.uidStr ? _users[user.uidStr] : nil;
tweet.quotedStatus.user = user;
}
@end
================================================
FILE: Demo/YYKitDemo/T1StatusCell.h
================================================
//
// T1StatusCell.h
// YYKitExample
//
// Created by ibireme on 15/10/9.
// Copyright (C) 2015 ibireme. All rights reserved.
//
#import "YYTableViewCell.h"
#import "YYKit.h"
#import "T1StatusLayout.h"
#import "YYControl.h"
@class T1StatusCell;
@interface T1StatusMediaView : YYControl
@property (nonatomic, strong) NSArray<UIImageView *> *imageViews;
@property (nonatomic, weak) T1StatusCell *cell;
@end
@interface T1StatusQuoteView : YYControl
@property (nonatomic, strong) YYLabel *nameLabel;
@property (nonatomic, strong) YYLabel *textLabel;
@property (nonatomic, weak) T1StatusCell *cell;
@end
@interface T1StatusInlineActionsView : UIView
@property (nonatomic, strong) UIButton *replyButton;
@property (nonatomic, strong) UIButton *retweetButton;
@property (nonatomic, strong) UIImageView *retweetImageView;
@property (nonatomic, strong) YYLabel *retweetLabel;
@property (nonatomic, strong) UIButton *favoriteButton;
@property (nonatomic, strong) YYAnimatedImageView *favoriteImageView;
@property (nonatomic, strong) YYLabel *favoriteLabel;
@property (nonatomic, strong) UIButton *followButton;
@property (nonatomic, weak) T1StatusCell *cell;
- (void)updateRetweetWithAnimation;
- (void)updateFavouriteWithAnimation;
- (void)updateFollowWithAnimation;
@end
@interface T1StatusView : YYControl
@property (nonatomic, strong) UIView *topLine;
@property (nonatomic, strong) UIImageView *socialIconView;
@property (nonatomic, strong) YYLabel *socialLabel;
@property (nonatomic, strong) YYControl *avatarView;
@property (nonatomic, strong) UIView *conversationTopJoin;
@property (nonatomic, strong) UIView *conversationBottomJoin;
@property (nonatomic, strong) YYLabel *nameLabel;
@property (nonatomic, strong) YYLabel *dateLabel;
@property (nonatomic, strong) YYLabel *textLabel;
@property (nonatomic, strong) T1StatusMediaView *mediaView;
@property (nonatomic, strong) T1StatusQuoteView *quoteView;
@property (nonatomic, strong) T1StatusInlineActionsView *inlineActionsView;
@property (nonatomic, weak) T1StatusCell *cell;
@end
@protocol T1StatusCellDelegate <NSObject>
@optional
- (void)cell:(T1StatusCell *)cell didClickInLabel:(YYLabel *)label textRange:(NSRange)textRange;
- (void)cell:(T1StatusCell *)cell didClickImageAtIndex:(NSUInteger)index withLongPress:(BOOL)longPress;
- (void)cell:(T1StatusCell *)cell didClickQuoteWithLongPress:(BOOL)longPress;
- (void)cell:(T1StatusCell *)cell didClickAvatarWithLongPress:(BOOL)longPress;
- (void)cell:(T1StatusCell *)cell didClickContentWithLongPress:(BOOL)longPress;
- (void)cellDidClickReply:(T1StatusCell *)cell;
- (void)cellDidClickRetweet:(T1StatusCell *)cell;
- (void)cellDidClickFavorite:(T1StatusCell *)cell;
- (void)cellDidClickFollow:(T1StatusCell *)cell;
@end
@interface T1StatusCell : YYTableViewCell
@property (nonatomic, strong) T1StatusView *statusView;
@property (nonatomic, strong) T1StatusLayout *layout;
@property (nonatomic, weak) id<T1StatusCellDelegate> delegate;
@end
================================================
FILE: Demo/YYKitDemo/T1StatusCell.m
================================================
//
// T1StatusCell.m
// YYKitExample
//
// Created by ibireme on 15/10/9.
// Copyright (C) 2015 ibireme. All rights reserved.
//
#import "T1StatusCell.h"
#import "T1Helper.h"
#define kCornerRaadius 4
@implementation T1StatusMediaView
- (instancetype)init {
self = [super init];
self.width = kT1ContentWidth;
self.clipsToBounds = YES;
self.layer.cornerRadius = kCornerRaadius;
self.layer.borderColor = [UIColor colorWithWhite:0.865 alpha:1.000].CGColor;
self.layer.borderWidth = CGFloatFromPixel(1);
NSMutableArray *imageViews = [NSMutableArray new];
for (int i = 0; i < 4; i++) {
UIImageView *imageView = [UIImageView new];
imageView.backgroundColor = [UIColor colorWithWhite:0.958 alpha:1.000];
imageView.clipsToBounds = YES;
imageView.contentMode = UIViewContentModeScaleAspectFill;
imageView.layer.borderColor = self.layer.borderColor;
imageView.layer.borderWidth = self.layer.borderWidth;
[self addSubview:imageView];
[imageViews addObject:imageView];
}
_imageViews = imageViews;
@weakify(self);
self.touchBlock = ^(YYControl *view, YYGestureRecognizerState state, NSSet *touches, UIEvent *event) {
@strongify(self);
if (!self) return;
if (state != YYGestureRecognizerStateEnded) return;
UITouch *touch = touches.anyObject;
CGPoint point = [touch locationInView:self];
NSUInteger index = [self imageIndexForPoint:point];
if (index != NSNotFound) {
if ([self.cell.delegate respondsToSelector:@selector(cell:didClickImageAtIndex:withLongPress:)]) {
[self.cell.delegate cell:self.cell didClickImageAtIndex:index withLongPress:NO];
}
}
};
self.longPressBlock = ^(YYControl *view, CGPoint point) {
@strongify(self);
if (!self) return;
NSUInteger index = [self imageIndexForPoint:point];
if (index != NSNotFound) {
if ([self.cell.delegate respondsToSelector:@selector(cell:didClickImageAtIndex:withLongPress:)]) {
[self.cell.delegate cell:self.cell didClickImageAtIndex:index withLongPress:YES];
}
}
};
return self;
}
- (NSUInteger)imageIndexForPoint:(CGPoint)point {
for (int i = 0; i < 4; i++) {
UIImageView *view = self.imageViews[i];
if (!view.hidden && CGRectContainsPoint(view.frame, point)) {
return i;
}
}
return NSNotFound;
}
- (void)setWithMedias:(NSArray<T1Media *> *)medias {
for (int i = 0; i < 4; i++) {
UIImageView *view = _imageViews[i];
if (i >= medias.count) {
view.hidden = YES;
[view cancelCurrentImageRequest];
} else {
view.hidden = NO;
T1Media *media = medias[i];
[view setImageWithURL:media.mediaSmall.url
placeholder:nil
options:YYWebImageOptionSetImageWithFadeAnimation
completion:nil];
}
}
switch (medias.count) {
case 1: {
UIImageView *view = _imageViews.firstObject;
view.frame = self.bounds;
} break;
case 2: {
UIImageView *view0 = _imageViews[0];
view0.origin = CGPointZero;
view0.height = self.height;
view0.width = (self.width - kT1ImagePadding) / 2;
UIImageView *view1 = _imageViews[1];
view1.top = 0;
view1.size = view0.size;
view1.right = self.width;
} break;
case 3: {
UIImageView *view0 = _imageViews[0];
view0.origin = CGPointZero;
view0.height = self.height;
view0.width = (self.width - kT1ImagePadding) / 2;
UIImageView *view1 = _imageViews[1];
view1.top = 0;
view1.width = view0.width;
view1.right = self.width;
view1.height = (self.height - kT1ImagePadding) / 2;
UIImageView *view2 = _imageViews[2];
view2.size = view1.size;
view2.right = self.width;
view2.bottom = self.height;
} break;
case 4: {
UIImageView *view0 = _imageViews[0];
view0.origin = CGPointZero;
view0.width = (self.width - kT1ImagePadding) / 2;
view0.height = (self.height - kT1ImagePadding) / 2;
UIImageView *view1 = _imageViews[1];
view1.size = view0.size;
view1.top = 0;
view1.right = self.width;
UIImageView *view2 = _imageViews[2];
view2.size = view0.size;
view2.left = 0;
view2.bottom = self.height;
UIImageView *view3 = _imageViews[3];
view3.size = view0.size;
view3.right = self.width;
view3.bottom = self.height;
} break;
default: break;
}
}
@end
@implementation T1StatusQuoteView
- (instancetype)init {
self = [super init];
self.width = kT1ContentWidth;
self.clipsToBounds = YES;
self.layer.cornerRadius = kCornerRaadius;
self.layer.borderWidth = CGFloatFromPixel(1);
self.layer.borderColor = [UIColor colorWithWhite:0.000 alpha:0.108].CGColor;
self.exclusiveTouch = YES;
_nameLabel = [YYLabel new];
_nameLabel.textVerticalAlignment = YYTextVerticalAlignmentCenter;
_nameLabel.displaysAsynchronously = YES;
_nameLabel.ignoreCommonProperties = YES;
_nameLabel.fadeOnHighlight = NO;
_nameLabel.fadeOnAsynchronouslyDisplay = NO;
_nameLabel.width = kT1QuoteContentWidth;
_nameLabel.left = kT1CellPadding;
[self addSubview:_nameLabel];
_textLabel = [YYLabel new];
_textLabel.textVerticalAlignment = YYTextVerticalAlignmentCenter;
_textLabel.displaysAsynchronously = YES;
_textLabel.ignoreCommonProperties = YES;
_textLabel.fadeOnHighlight = NO;
_textLabel.fadeOnAsynchronouslyDisplay = NO;
_textLabel.width = kT1QuoteContentWidth;
_textLabel.left = kT1CellPadding;
[self addSubview:_textLabel];
@weakify(self);
self.touchBlock = ^(YYControl *view, YYGestureRecognizerState state, NSSet *touches, UIEvent *event) {
@strongify(self);
if (!self) return;
if (state == YYGestureRecognizerStateBegan) {
self.backgroundColor = kT1CellBGHighlightColor;
} else if (state != YYGestureRecognizerStateMoved) {
self.backgroundColor = [UIColor clearColor];
}
if (state == YYGestureRecognizerStateEnded) {
UITouch *t = touches.anyObject;
CGPoint p = [t locationInView:self];
if (CGRectContainsPoint(self.bounds, p)) {
if ([self.cell.delegate respondsToSelector:@selector(cell:didClickQuoteWithLongPress:)]) {
[self.cell.delegate cell:self.cell didClickQuoteWithLongPress:NO];
}
}
}
};
return self;
}
- (void)setWithLayout:(T1StatusLayout *)layout {
_nameLabel.height = kT1UserNameFontSize * 2;
_nameLabel.centerY = kT1CellPadding + kT1UserNameFontSize / 2;
_nameLabel.textLayout = layout.quotedNameTextLayout;
_textLabel.height = CGRectGetMaxY(layout.quotedTextLayout.textBoundingRect);
_textLabel.top = kT1CellPadding + kT1UserNameFontSize + kT1CellInnerPadding;
_textLabel.textLayout = layout.quotedTextLayout;
}
@end
@implementation T1StatusInlineActionsView
- (instancetype)init {
self = [super init];
self.width = kT1ContentWidth;
self.height = 32;
__weak typeof(self) _self = self;
_replyButton = [UIButton buttonWithType:UIButtonTypeCustom];
_replyButton.size = CGSizeMake(32, 32);
_replyButton.centerY = self.height / 2;
_replyButton.centerX = 6;
_replyButton.adjustsImageWhenHighlighted = NO;
_replyButton.exclusiveTouch = YES;
[_replyButton setImage:[T1Helper imageNamed:@"icn_tweet_action_inline_reply_off"] forState:UIControlStateNormal];
[_replyButton addBlockForControlEvents:UIControlEventTouchDown | UIControlEventTouchDragEnter
block:^(UIButton *sender) {
sender.alpha = 0.6;
}];
[_replyButton addBlockForControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside |
UIControlEventTouchCancel | UIControlEventTouchDragExit
block:^(UIButton *sender) {
sender.alpha = 1;
}];
[_replyButton addBlockForControlEvents:UIControlEventTouchUpInside block:^(id sender) {
if ([_self.cell.delegate respondsToSelector:@selector(cellDidClickReply:)]) {
[_self.cell.delegate cellDidClickReply:_self.cell];
}
}];
[self addSubview:_replyButton];
_retweetButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self addSubview:_retweetButton];
_retweetImageView = [UIImageView new];
[self addSubview:_retweetImageView];
_retweetLabel = [YYLabel new];
[self addSubview:_retweetLabel];
_retweetButton.size = CGSizeMake(32, 32);
_retweetButton.centerY = self.height / 2;
_retweetButton.left = kT1ContentWidth * 0.28 + _replyButton.left;
_retweetImageView.size = CGSizeMake(32, 32);
_retweetImageView.contentMode = UIViewContentModeCenter;
_retweetImageView.center = _retweetButton.center;
_retweetImageView.image = [T1Helper imageNamed:@"icn_tweet_action_inline_retweet_off"];
_retweetLabel.height = _retweetButton.height;
_retweetLabel.left = _retweetImageView.right - 3;
_retweetLabel.userInteractionEnabled = NO;
_replyButton.exclusiveTouch = YES;
[_retweetButton addBlockForControlEvents:UIControlEventTouchDown | UIControlEventTouchDragEnter
block:^(UIButton *sender) {
_self.retweetImageView.alpha = 0.6;
_self.retweetLabel.alpha = 0.6;
}];
[_retweetButton addBlockForControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside |
UIControlEventTouchCancel | UIControlEventTouchDragExit
block:^(UIButton *sender) {
_self.retweetImageView.alpha = 1;
_self.retweetLabel.alpha = 1;
}];
[_retweetButton addBlockForControlEvents:UIControlEventTouchUpInside block:^(id sender) {
if ([_self.cell.delegate respondsToSelector:@selector(cellDidClickRetweet:)]) {
[_self.cell.delegate cellDidClickRetweet:_self.cell];
}
}];
_favoriteButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self addSubview:_favoriteButton];
_favoriteImageView = [YYAnimatedImageView new];
[self addSubview:_favoriteImageView];
_favoriteLabel = [YYLabel new];
[self addSubview:_favoriteLabel];
_favoriteButton.size = CGSizeMake(32, 32);
_favoriteButton.centerY = self.height / 2;
_favoriteButton.left = kT1ContentWidth * 0.28 + _retweetButton.left;
_favoriteImageView.size = CGSizeMake(32, 32);
_favoriteImageView.contentMode = UIViewContentModeCenter;
_favoriteImageView.center = _favoriteButton.center;
_favoriteImageView.image = [T1Helper imageNamed:@"icn_tweet_action_inline_favorite_off"];
_favoriteLabel.height = _favoriteButton.height;
_favoriteLabel.left = _favoriteImageView.right - 4;
_favoriteLabel.userInteractionEnabled = NO;
_favoriteLabel.exclusiveTouch = YES;
[_favoriteButton addBlockForControlEvents:UIControlEventTouchDown | UIControlEventTouchDragEnter
block:^(UIButton *sender) {
_self.favoriteImageView.alpha = 0.6;
_self.favoriteLabel.alpha = 0.6;
}];
[_favoriteButton addBlockForControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside |
UIControlEventTouchCancel | UIControlEventTouchDragExit
block:^(UIButton *sender) {
_self.favoriteImageView.alpha = 1;
_self.favoriteLabel.alpha = 1;
}];
[_favoriteButton addBlockForControlEvents:UIControlEventTouchUpInside block:^(id sender) {
if ([_self.cell.delegate respondsToSelector:@selector(cellDidClickFavorite:)]) {
[_self.cell.delegate cellDidClickFavorite:_self.cell];
}
}];
_followButton = [UIButton buttonWithType:UIButtonTypeCustom];
_followButton.size = CGSizeMake(32, 32);
_followButton.centerY = self.height / 2;
_followButton.right = self.width - 3;
_followButton.adjustsImageWhenHighlighted = NO;
_followButton.exclusiveTouch = YES;
[_followButton setImage:[T1Helper imageNamed:@"icn_tweet_action_inline_follow_off_ipad_experiment"] forState:UIControlStateNormal];
[_followButton addBlockForControlEvents:UIControlEventTouchDown | UIControlEventTouchDragEnter
block:^(UIButton *sender) {
sender.alpha = 0.6;
}];
[_followButton addBlockForControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside |
UIControlEventTouchCancel | UIControlEventTouchDragExit
block:^(UIButton *sender) {
sender.alpha = 1;
}];
[_followButton addBlockForControlEvents:UIControlEventTouchUpInside block:^(id sender) {
if ([_self.cell.delegate respondsToSelector:@selector(cellDidClickFollow:)]) {
[_self.cell.delegate cellDidClickFollow:_self.cell];
}
}];
[self addSubview:_followButton];
return self;
}
- (void)setWithLayout:(T1StatusLayout *)layout {
T1Tweet *tweet = layout.displayedTweet;
if (tweet.retweeted) {
_retweetImageView.image = [T1Helper imageNamed:@"icn_tweet_action_inline_retweet_on_white"];
} else {
_retweetImageView.image = [T1Helper imageNamed:@"icn_tweet_action_inline_retweet_off"];
}
if (tweet.favorited) {
_favoriteImageView.image = [T1Helper imageNamed:@"icn_tweet_action_inline_favorite_on_white"];
} else {
_favoriteImageView.image = [T1Helper imageNamed:@"icn_tweet_action_inline_favorite_off"];
}
if (layout.retweetCountTextLayout) {
_retweetLabel.hidden = NO;
_retweetLabel.width = layout.retweetCountTextLayout.textBoundingSize.width + 5;
_retweetLabel.textLayout = layout.retweetCountTextLayout;
_retweetButton.width = _retweetLabel.right - _retweetButton.left;
} else {
_retweetLabel.hidden = YES;
_retweetButton.width = _retweetButton.height;
}
if (layout.favoriteCountTextLayout) {
_favoriteLabel.hidden = NO;
_favoriteLabel.width = layout.favoriteCountTextLayout.textBoundingSize.width + 5;
_favoriteLabel.textLayout = layout.favoriteCountTextLayout;
_favoriteButton.width = _favoriteLabel.right - _favoriteButton.left;
} else {
_favoriteLabel.hidden = YES;
_favoriteButton.width = _favoriteButton.height;
}
if (tweet.user.following) {
_followButton.hidden = YES;
} else {
_followButton.hidden = NO;
[_followButton setImage:[T1Helper imageNamed:@"icn_tweet_action_inline_follow_off_ipad_experiment"] forState:UIControlStateNormal];
}
}
- (void)updateRetweetWithAnimation {
T1StatusLayout *layout = self.cell.layout;
T1Tweet *tweet = layout.displayedTweet;
if (tweet.retweeted) {
_retweetImageView.image = [T1Helper imageNamed:@"icn_tweet_action_inline_retweet_on_white"];
} else {
_retweetImageView.image = [T1Helper imageNamed:@"icn_tweet_action_inline_retweet_off"];
}
[UIView animateWithDuration:0.1 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
_retweetImageView.layer.transformScale = 1.5;
} completion:^(BOOL finished) {
[UIView animateWithDuration:0.1 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
_retweetImageView.layer.transformScale = 1;
} completion:^(BOOL finished) {
}];
}];
if (layout.retweetCountTextLayout) {
_retweetLabel.hidden = NO;
_retweetLabel.width = layout.retweetCountTextLayout.textBoundingSize.width + 5;
_retweetLabel.textLayout = layout.retweetCountTextLayout;
_retweetButton.width = _retweetLabel.right - _retweetButton.left;
} else {
_retweetLabel.hidden = YES;
_retweetButton.width = _retweetButton.height;
}
}
- (void)updateFavouriteWithAnimation {
T1StatusLayout *layout = self.cell.layout;
T1Tweet *tweet = layout.displayedTweet;
if (tweet.favorited) {
UIImage *img = [T1Helper imageNamed:@"fav02c-sheet"];
NSMutableArray *contentRects = [NSMutableArray new];
NSMutableArray *durations = [NSMutableArray new];
for (int j = 0; j < 12; j++) {
for (int i = 0; i < 8; i++) {
CGRect rect;
rect.size = CGSizeMake(img.size.width / 8, img.size.height / 12);
rect.origin.x = img.size.width / 8 * i;
rect.origin.y = img.size.height / 12 * j;
[contentRects addObject:[NSValue valueWithCGRect:rect]];
[durations addObject:@(1 / 60.0)];
}
}
YYSpriteSheetImage *sprite = [[YYSpriteSheetImage alloc] initWithSpriteSheetImage:img contentRects:contentRects frameDurations:durations loopCount:1];
_favoriteImageView.image = sprite;
} else {
_favoriteImageView.image = [T1Helper imageNamed:@"icn_tweet_action_inline_favorite_off"];
[UIView animateWithDuration:0.1 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
_favoriteImageView.layer.transformScale = 1.5;
} completion:^(BOOL finished) {
[UIView animateWithDuration:0.1 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
_favoriteImageView.layer.transformScale = 1;
} completion:^(BOOL finished) {
}];
}];
}
if (layout.favoriteCountTextLayout) {
_favoriteLabel.hidden = NO;
_favoriteLabel.width = layout.favoriteCountTextLayout.textBoundingSize.width + 5;
_favoriteLabel.textLayout = layout.favoriteCountTextLayout;
_favoriteButton.width = _favoriteLabel.right - _favoriteButton.left;
} else {
_favoriteLabel.hidden = YES;
_favoriteButton.width = _favoriteButton.height;
}
}
- (void)updateFollowWithAnimation {
T1StatusLayout *layout = self.cell.layout;
T1Tweet *tweet = layout.displayedTweet;
if (tweet.user.following) {
[_followButton setImage:[T1Helper imageNamed:@"icn_tweet_action_inline_follow_on_ipad_experiment"] forState:UIControlStateNormal];
} else {
[_followButton setImage:[T1Helper imageNamed:@"icn_tweet_action_inline_follow_off_ipad_experiment"] forState:UIControlStateNormal];
}
}
@end
@implementation T1StatusView
- (instancetype)init {
self = [super init];
self.width = kScreenWidth;
self.backgroundColor = [UIColor whiteColor];
self.exclusiveTouch = YES;
self.clipsToBounds = YES;
_socialLabel = [YYLabel new];
_socialLabel.textVerticalAlignment = YYTextVerticalAlignmentCenter;
_socialLabel.displaysAsynchronously = YES;
_socialLabel.ignoreCommonProperties = YES;
_socialLabel.fadeOnHighlight = NO;
_socialLabel.fadeOnAsynchronouslyDisplay = NO;
_socialLabel.size = CGSizeMake(kT1ContentWidth, kT1UserNameSubFontSize * 2);
_socialLabel.left = kT1ContentLeft;
_socialLabel.centerY = kT1CellPadding + kT1UserNameSubFontSize / 2;
_socialLabel.userInteractionEnabled = NO;
[self addSubview:_socialLabel];
_socialIconView = [UIImageView new];
_socialIconView.size = CGSizeMake(16, 16);
_socialIconView.centerY = _socialLabel.centerY - 1;
_socialIconView.right = kT1CellPadding + kT1AvatarSize;
_socialIconView.contentMode = UIViewContentModeScaleAspectFit;
_socialIconView.userInteractionEnabled = NO;
[self addSubview:_socialIconView];
_avatarView = [YYControl new];
_avatarView.clipsToBounds = YES;
_avatarView.layer.cornerRadius = 4;
_avatarView.layer.borderWidth = CGFloatFromPixel(1);
_avatarView.layer.borderColor = [UIColor colorWithWhite:0.000 alpha:0.118].CGColor;
_avatarView.backgroundColor = [UIColor colorWithWhite:0.908 alpha:1.000];
_avatarView.contentMode = UIViewContentModeScaleAspectFill;
_avatarView.left = kT1CellPadding;
_avatarView.size = CGSizeMake(kT1AvatarSize, kT1AvatarSize);
_avatarView.exclusiveTouch = YES;
[self addSubview:_avatarView];
_conversationTopJoin = [UIView new];
_conversationTopJoin.userInteractionEnabled = NO;
_conversationTopJoin.hidden = YES;
_conversationTopJoin.width = 3;
_conversationTopJoin.backgroundColor = UIColorHex(e1e8ed);
_conversationTopJoin.clipsToBounds = YES;
_conversationTopJoin.layer.cornerRadius = _conversationTopJoin.width / 2;
_conversationTopJoin.centerX = _avatarView.centerX;
[self addSubview:_conversationTopJoin];
_conversationBottomJoin = [UIView new];
_conversationBottomJoin.userInteractionEnabled = NO;
_conversationBottomJoin.hidden = YES;
_conversationBottomJoin.width = 3;
_conversationBottomJoin.backgroundColor = _conversationTopJoin.backgroundColor;
_conversationBottomJoin.clipsToBounds = YES;
_conversationBottomJoin.layer.cornerRadius = _conversationTopJoin.width / 2;
_conversationBottomJoin.centerX = _avatarView.centerX;
[self addSubview:_conversationBottomJoin];
_nameLabel = [YYLabel new];
_nameLabel.textVerticalAlignment = YYTextVerticalAlignmentCenter;
_nameLabel.displaysAsynchronously = YES;
_nameLabel.ignoreCommonProperties = YES;
_nameLabel.fadeOnHighlight = NO;
_nameLabel.fadeOnAsynchronouslyDisplay = NO;
_nameLabel.left = kT1ContentLeft;
_nameLabel.width = kT1ContentWidth;
_nameLabel.height = kT1UserNameFontSize * 2;
_nameLabel.userInteractionEnabled = NO;
_nameLabel.exclusiveTouch = YES;
[self addSubview:_nameLabel];
_dateLabel = [YYLabel new];
_dateLabel.textVerticalAlignment = YYTextVerticalAlignmentCenter;
_dateLabel.displaysAsynchronously = YES;
_dateLabel.ignoreCommonProperties = YES;
_dateLabel.fadeOnHighlight = NO;
_dateLabel.fadeOnAsynchronouslyDisplay = NO;
_dateLabel.frame = _nameLabel.frame;
_dateLabel.userInteractionEnabled = NO;
[self addSubview:_dateLabel];
_textLabel = [YYLabel new];
_textLabel.textVerticalAlignment = YYTextVerticalAlignmentCenter;
_textLabel.displaysAsynchronously = YES;
_textLabel.ignoreCommonProperties = YES;
_textLabel.fadeOnHighlight = NO;
_textLabel.fadeOnAsynchronouslyDisplay = NO;
_textLabel.left = kT1ContentLeft;
_textLabel.width = kT1ContentWidth;
_textLabel.width += kT1TextContainerInset * 2;
_textLabel.left -= kT1TextContainerInset;
__weak typeof(self) _self = self;
_textLabel.highlightTapAction = ^(UIView *containerView, NSAttributedString *text, NSRange range, CGRect rect) {
if ([_self.cell.delegate respondsToSelector:@selector(cell:didClickInLabel:textRange:)]) {
[_self.cell.delegate cell:_self.cell didClickInLabel:(YYLabel *)containerView textRange:range];
}
};
[self addSubview:_textLabel];
_mediaView = [T1StatusMediaView new];
_mediaView.left = kT1ContentLeft;
[self addSubview:_mediaView];
_quoteView = [T1StatusQuoteView new];
_quoteView.left = kT1ContentLeft;
[self addSubview:_quoteView];
_inlineActionsView = [T1StatusInlineActionsView new];
_inlineActionsView.left = kT1ContentLeft;
[self addSubview:_inlineActionsView];
_topLine = [UIView new];
_topLine.width = kScreenWidth;
_topLine.height = CGFloatFromPixel(1);
_topLine.backgroundColor = [UIColor colorWithWhite:0.823 alpha:1.000];
[self addSubview:_topLine];
@weakify(self);
self.touchBlock = ^(YYControl *view, YYGestureRecognizerState state, NSSet *touches, UIEvent *event) {
@strongify(self);
if (!self) return;
if (state == YYGestureRecognizerStateBegan) {
self.backgroundColor = kT1CellBGHighlightColor;
} else if (state != YYGestureRecognizerStateMoved) {
self.backgroundColor = [UIColor clearColor];
}
if (state == YYGestureRecognizerStateEnded) {
UITouch *t = touches.anyObject;
CGPoint p = [t locationInView:self];
if (CGRectContainsPoint(self.bounds, p)) {
if ([self.cell.delegate respondsToSelector:@selector(cell:didClickContentWithLongPress:)]) {
[self.cell.delegate cell:self.cell didClickContentWithLongPress:NO];
}
}
}
};
_avatarView.touchBlock = ^(YYControl *view, YYGestureRecognizerState state, NSSet *touches, UIEvent *event) {
@strongify(self);
if (!self) return;
if (state == YYGestureRecognizerStateBegan) {
self.avatarView.alpha = 0.7;
} else if (state != YYGestureRecognizerStateMoved) {
self.avatarView.alpha = 1;
}
if (state == YYGestureRecognizerStateEnded) {
UITouch *t = touches.anyObject;
CGPoint p = [t locationInView:self];
if (CGRectContainsPoint(self.bounds, p)) {
if ([self.cell.delegate respondsToSelector:@selector(cell:didClickAvatarWithLongPress:)]) {
[self.cell.delegate cell:self.cell didClickAvatarWithLongPress:NO];
}
}
}
};
return self;
}
- (void)setWithLayout:(T1StatusLayout *)layout {
self.height = layout.height;
self.topLine.hidden = !layout.showTopLine;
if (layout.isConversationSplit) {
_conversationTopJoin.hidden = NO;
_conversationTopJoin.top = 3;
_conversationTopJoin.height = self.height - 6;
_avatarView.hidden = YES;
_nameLabel.hidden = YES;
_dateLabel.hidden = YES;
_socialLabel.hidden = YES;
_socialIconView.hidden = YES;
_inlineActionsView.hidden = YES;
return;
} else {
if (_avatarView.hidden) {
_avatarView.hidden = NO;
_nameLabel.hidden = NO;
_dateLabel.hidden = NO;
_socialLabel.hidden = NO;
_socialIconView.hidden = NO;
_inlineActionsView.hidden = NO;
}
}
T1Tweet *tweet = layout.displayedTweet;
_avatarView.top = layout.paddingTop;
[_avatarView.layer setImageWithURL:tweet.user.profileImageURLReasonablySmall options:YYWebImageOptionSetImageWithFadeAnimation];
if (layout.socialTextLayout) {
_socialLabel.hidden = NO;
_socialIconView.hidden = NO;
_socialLabel.textLayout = layout.socialTextLayout;
if (layout.tweet.retweetedStatus) {
_socialIconView.hidden = NO;
_socialIconView.image = [T1Helper imageNamed:@"icn_social_proof_conversation_default"];
} else if (layout.tweet.inReplyToScreenName) {
_socialIconView.hidden = NO;
_socialIconView.image = [T1Helper imageNamed:@"icn_activity_rt_tweet"];
} else {
_socialIconView.image = nil;
}
} else {
_socialLabel.hidden = YES;
_socialIconView.hidden = YES;
}
_nameLabel.centerY = layout.paddingTop + kT1TextFontSize / 2;
_nameLabel.textLayout = layout.nameTextLayout;
_dateLabel.centerY = _nameLabel.centerY;
_dateLabel.textLayout = layout.dateTextLayout;
if (layout.textLayout) {
_textLabel.hidden = NO;
_textLabel.top = layout.textTop;
_textLabel.height = layout.textHeight;
_textLabel.textLayout = layout.textLayout;
} else {
_textLabel.hidden = YES;
}
if (layout.images) {
_mediaView.hidden = NO;
_mediaView.top = layout.imagesTop;
_mediaView.height = layout.imagesHeight;
[_mediaView setWithMedias:layout.images];
} else {
_mediaView.hidden = YES;
[_mediaView setWithMedias:nil];
}
if (layout.quoteHeight > 0) {
_quoteView.hidden = NO;
_quoteView.top = layout.quoteTop;
_quoteView.height = layout.quoteHeight;
[_quoteView setWithLayout:layout];
} else {
_quoteView.hidden = YES;
}
_inlineActionsView.centerY = self.height - 19;
[_inlineActionsView setWithLayout:layout];
self.conversationTopJoin.hidden = !layout.showConversationTopJoin;
self.conversationBottomJoin.hidden = !layout.showConversationBottomJoin;
if (layout.showConversationTopJoin) {
_conversationTopJoin.top = - 5;
_conversationTopJoin.height = _avatarView.top - _conversationTopJoin.top - 3;
}
if (layout.showConversationBottomJoin) {
_conversationBottomJoin.top = _avatarView.bottom + 3;
_conversationBottomJoin.height = self.height - _conversationBottomJoin.top + 5;
}
}
- (void)setCell:(T1StatusCell *)cell {
_cell = cell;
_mediaView.cell = cell;
_quoteView.cell = cell;
_inlineActionsView.cell = cell;
}
@end
@implementation T1StatusCell
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (!self) return nil;
_statusView = [T1StatusView new];
_statusView.cell = self;
[self.contentView addSubview:_statusView];
self.contentView.backgroundColor = [UIColor clearColor];
self.backgroundView.backgroundColor = [UIColor clearColor];
return self;
}
- (void)setLayout:(T1StatusLayout *)layout {
_layout = layout;
self.contentView.height = layout.height;
_statusView.height = layout.height;
[_statusView setWithLayout:layout];
}
@end
================================================
FILE: Demo/YYKitDemo/T1StatusLayout.h
================================================
//
// T1StatusLayout.h
// YYKitExample
//
// Created by guoyaoyuan on 15/10/10.
// Copyright (C) 2015 ibireme. All rights reserved.
//
#import "YYKit.h"
#import "T1Model.h"
#define kT1CellPadding 12
#define kT1CellInnerPadding 6
#define kT1CellExtendedPadding 30
#define kT1AvatarSize 48
#define kT1ImagePadding 4
#define kT1ConversationSplitHeight 25
#define kT1ContentLeft (kT1CellPadding + kT1AvatarSize + kT1CellInnerPadding)
#define kT1ContentWidth (kScreenWidth - 2 * kT1CellPadding - kT1AvatarSize - kT1CellInnerPadding)
#define kT1QuoteContentWidth (kT1ContentWidth - 2 * kT1CellPadding)
#define kT1ActionsHeight 6
#define kT1TextContainerInset 4
#define kT1UserNameFontSize 14
#define kT1UserNameSubFontSize 12
#define kT1TextFontSize 14
#define kT1ActionFontSize 12
#define kT1UserNameColor UIColorHex(292F33)
#define kT1UserNameSubColor UIColorHex(8899A6)
#define kT1CellBGHighlightColor [UIColor colorWithWhite:0.000 alpha:0.041]
#define kT1TextColor UIColorHex(292F33)
#define kT1TextHighlightedColor UIColorHex(1A91DA)
#define kT1TextActionsColor UIColorHex(8899A6)
#define kT1TextHighlightedBackgroundColor UIColorHex(ebeef0)
#define kT1TextActionRetweetColor UIColorHex(19CF86)
#define kT1TextActionFavoriteColor UIColorHex(FAB81E)
@interface T1StatusLayout : NSObject
@property (nonatomic, strong) T1Tweet *tweet;
@property (nonatomic, strong) T1Conversation *conversation;
- (void)layout;
@property (nonatomic, assign) CGFloat height;
@property (nonatomic, assign) CGFloat paddingTop;
@property (nonatomic, assign) CGFloat textTop;
@property (nonatomic, assign) CGFloat textHeight;
@property (nonatomic, assign) CGFloat imagesTop;
@property (nonatomic, assign) CGFloat imagesHeight;
@property (nonatomic, assign) CGFloat quoteTop;
@property (nonatomic, assign) CGFloat quoteHeight;
@property (nonatomic, assign) BOOL showTopLine;
@property (nonatomic, assign) BOOL isConversationSplit;
@property (nonatomic, assign) BOOL showConversationTopJoin;
@property (nonatomic, assign) BOOL showConversationBottomJoin;
@property (nonatomic, strong) YYTextLayout *socialTextLayout;
@property (nonatomic, strong) YYTextLayout *nameTextLayout;
@property (nonatomic, strong) YYTextLayout *dateTextLayout;
@property (nonatomic, strong) YYTextLayout *textLayout;
@property (nonatomic, strong) YYTextLayout *quotedNameTextLayout;
@property (nonatomic, strong) YYTextLayout *quotedTextLayout;
@property (nonatomic, strong) YYTextLayout *retweetCountTextLayout;
@property (nonatomic, strong) YYTextLayout *favoriteCountTextLayout;
@property (nonatomic, strong) NSArray<T1Media *> *images;
@property (nonatomic, readonly) T1Tweet *displayedTweet;
- (YYTextLayout *)retweetCountTextLayoutForTweet:(T1Tweet *)tweet;
- (YYTextLayout *)favoriteCountTextLayoutForTweet:(T1Tweet *)tweet;
@end
================================================
FILE: Demo/YYKitDemo/T1StatusLayout.m
================================================
//
// T1StatusLayout.m
// YYKitExample
//
// Created by guoyaoyuan on 15/10/10.
// Copyright (C) 2015 ibireme. All rights reserved.
//
#import "T1StatusLayout.h"
#import "T1Helper.h"
@implementation T1StatusLayout
- (void)setTweet:(T1Tweet *)tweet {
if (_tweet != tweet) {
_tweet = tweet;
[self layout];
}
}
- (void)layout {
[self reset];
if (!_tweet) {
if (_conversation) {
_isConversationSplit = YES;
_height = kT1ConversationSplitHeight;
return;
} else {
return;
}
}
if (_conversation) {
BOOL isTop = NO, isBottom = NO;
if (_tweet.tidStr) {
NSUInteger index = [_conversation.contextIDs indexOfObject:_tweet.tidStr];
if (index == 0) {
isTop = YES;
} else if (index + 1 == _conversation.contextIDs.count) {
isBottom = YES;
}
}
if (isTop) {
_showTopLine = YES;
_showConversationBottomJoin = YES;
} else if (isBottom) {
_showConversationTopJoin = YES;
} else {
_showConversationTopJoin = YES;
_showConversationBottomJoin = YES;
}
} else {
_showTopLine = YES;
}
T1Tweet *tweet = self.displayedTweet;
UIFont *nameSubFont = [UIFont systemFontOfSize:kT1UserNameSubFontSize];
NSMutableAttributedString *dateText = [[NSMutableAttributedString alloc] initWithString:[T1Helper stringWithTimelineDate:tweet.createdAt]];
if (tweet.card) {
UIImage *iconImage = [T1Helper imageNamed:@"ic_tweet_attr_summary_default"];
NSAttributedString *icon = [NSAttributedString attachmentStringWithContent:iconImage contentMode:UIViewContentModeCenter attachmentSize:iconImage.size alignToFont:nameSubFont alignment:YYTextVerticalAlignmentCenter];
[dateText insertString:@" " atIndex:0];
[dateText insertAttributedString:icon atIndex:0];
}
dateText.font = nameSubFont;
dateText.color = kT1UserNameSubColor;
dateText.alignment = NSTextAlignmentRight;
_dateTextLayout = [YYTextLayout layoutWithContainerSize:CGSizeMake(kT1ContentWidth, kT1UserNameSubFontSize * 2) text:dateText];
UIFont *nameFont = [UIFont systemFontOfSize:kT1UserNameFontSize];
NSMutableAttributedString *nameText = [[NSMutableAttributedString alloc] initWithString:(tweet.user.name ? tweet.user.name : @"")];
nameText.font = nameFont;
nameText.color = kT1UserNameColor;
if (tweet.user.screenName) {
NSMutableAttributedString *screenNameText = [[NSMutableAttributedString alloc] initWithString:tweet.user.screenName];
[screenNameText insertString:@" @" atIndex:0];
screenNameText.font = nameSubFont;
screenNameText.color = kT1UserNameSubColor;
[nameText appendAttributedString:screenNameText];
}
nameText.lineBreakMode = NSLineBreakByCharWrapping;
YYTextContainer *nameContainer = [YYTextContainer containerWithSize:CGSizeMake(kT1ContentWidth - _dateTextLayout.textBoundingRect.size.width - 5, kT1UserNameFontSize * 2)];
nameContainer.maximumNumberOfRows = 1;
_nameTextLayout = [YYTextLayout layoutWithContainer:nameContainer text:nameText];
NSString *socialString = nil;
if (_tweet.retweetedStatus) {
if (_tweet.user.name) {
socialString = [NSString stringWithFormat:@"%@ Retweeted",_tweet.user.name];
}
} else if (tweet.inReplyToScreenName) {
socialString = [NSString stringWithFormat:@"in reply to @%@",tweet.inReplyToScreenName];
}
if (socialString) {
NSMutableAttributedString *socialText = [[NSMutableAttributedString alloc] initWithString:socialString];
socialText.font = nameSubFont;
socialText.color = kT1UserNameSubColor;
socialText.lineBreakMode = NSLineBreakByCharWrapping;
YYTextContainer *socialContainer = [YYTextContainer containerWithSize:CGSizeMake(kT1ContentWidth, kT1UserNameFontSize * 2)];
socialContainer.maximumNumberOfRows = 1;
_socialTextLayout = [YYTextLayout layoutWithContainer:socialContainer text:socialText];
}
YYTextContainer *textContainer = [YYTextContainer containerWithSize:CGSizeMake(kT1ContentWidth + 2 * kT1TextContainerInset, CGFLOAT_MAX)];
textContainer.insets = UIEdgeInsetsMake(0, kT1TextContainerInset, 0, kT1TextContainerInset);
_textLayout = [YYTextLayout layoutWithContainer:textContainer text:[self textForTweet:tweet]];
if (tweet.medias.count || tweet.extendedMedias.count) {
NSMutableArray *images = [NSMutableArray new];
NSMutableSet *imageIDs = [NSMutableSet new];
for (T1Media *media in tweet.medias) {
if ([media.type isEqualToString:@"photo"]) {
if (media.mediaSmall && media.mediaLarge) {
if (media.midStr && ![imageIDs containsObject:media.midStr]) {
[images addObject:media];
[imageIDs addObject:media.midStr];
}
}
}
}
for (T1Media *media in tweet.extendedMedias) {
if ([media.type isEqualToString:@"photo"]) {
if (media.mediaSmall && media.mediaLarge) {
if (media.midStr && ![imageIDs containsObject:media.midStr]) {
[images addObject:media];
[imageIDs addObject:media.midStr];
}
}
}
}
while (images.count > 4) {
[images removeLastObject];
}
if (images.count > 0) {
_images = images;
}
}
if (!_images && !_tweet.retweetedStatus && _tweet.quotedStatus) {
T1Tweet *quote = _tweet.quotedStatus;
NSMutableAttributedString *nameText = [[NSMutableAttributedString alloc] initWithString:(quote.user.name ? quote.user.name : @"")];
nameText.font = nameFont;
nameText.color = kT1UserNameColor;
if (quote.user.screenName) {
NSMutableAttributedString *screenNameText = [[NSMutableAttributedString alloc] initWithString:quote.user.screenName];
[screenNameText insertString:@" @" atIndex:0];
screenNameText.font = nameSubFont;
screenNameText.color = kT1UserNameSubColor;
[nameText appendAttributedString:screenNameText];
}
nameText.lineBreakMode = NSLineBreakByCharWrapping;
YYTextContainer *nameContainer = [YYTextContainer containerWithSize:CGSizeMake(kT1QuoteContentWidth, kT1UserNameFontSize * 2)];
nameContainer.maximumNumberOfRows = 1;
_quotedNameTextLayout = [YYTextLayout layoutWithContainer:nameContainer text:nameText];
NSAttributedString *quoteText = [self textForTweet:quote];
_quotedTextLayout = [YYTextLayout layoutWithContainerSize:CGSizeMake(kT1QuoteContentWidth, CGFLOAT_MAX) text:quoteText];
}
_retweetCountTextLayout = [self retweetCountTextLayoutForTweet:tweet];
_favoriteCountTextLayout = [self favoriteCountTextLayoutForTweet:tweet];
if (_socialTextLayout) {
_paddingTop = kT1CellExtendedPadding;
} else {
_paddingTop = kT1CellPadding;
}
_textTop = _paddingTop + kT1UserNameFontSize + kT1CellInnerPadding;
_textHeight = _textLayout ? (CGRectGetMaxY(_textLayout.textBoundingRect)) : 0;
_imagesTop = _quoteTop = _textTop + _textHeight + kT1CellInnerPadding;
if (_images) {
_imagesHeight = kT1ContentWidth * (9.0 / 16.0);
} else if (_quotedTextLayout) {
_quoteHeight = 2 * kT1CellPadding + kT1UserNameFontSize + CGRectGetMaxY(_quotedTextLayout.textBoundingRect);
}
CGFloat height = 0;
if (_imagesHeight > 0) {
height = _imagesTop + _imagesHeight;
} else if (_quoteHeight > 0) {
height = _quoteTop + _quoteHeight;
} else {
height = _textTop + _textHeight;
}
height += kT1ActionsHeight;
if (height < _paddingTop + kT1AvatarSize) {
height = _paddingTop + kT1AvatarSize;
}
height += kT1CellExtendedPadding;
_height = height;
}
- (void)reset {
_height = 0;
_paddingTop = 0;
_textTop = 0;
_textHeight = 0;
_imagesTop = 0;
_imagesHeight = 0;
_quoteTop = 0;
_quoteHeight = 0;
_showTopLine = NO;
_isConversationSplit = NO;
_showConversationTopJoin = NO;
_showConversationBottomJoin = NO;
_socialTextLayout = nil;
_nameTextLayout = nil;
_dateTextLayout = nil;
_textLayout = nil;
_quotedNameTextLayout = nil;
_quotedTextLayout = nil;
_retweetCountTextLayout = nil;
_favoriteCountTextLayout = nil;
_images = nil;
}
- (NSAttributedString *)textForTweet:(T1Tweet *)tweet{
if (tweet.text.length == 0) return nil;
NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:tweet.text];
text.font = [UIFont systemFontOfSize:kT1TextFontSize];
text.color = kT1TextColor;
for (T1URL *url in tweet.urls) {
if (url.ranges) {
for (NSValue *value in url.ranges) {
[self setHighlightInfo:@{@"T1URL" : url} withRange:value.rangeValue toText:text];
}
} else {
[self setHighlightInfo:@{@"T1URL" : url} withRange:url.range toText:text];
}
}
for (T1Media *media in tweet.medias) {
if (media.ranges) {
for (NSValue *value in media.ranges) {
[self setHighlightInfo:@{@"T1Media" : media} withRange:value.rangeValue toText:text];
}
} else {
[self setHighlightInfo:@{@"T1Media" : media} withRange:media.range toText:text];
}
}
for (T1Media *media in tweet.extendedMedias) {
if (media.ranges) {
for (NSValue *value in media.ranges) {
[self setHighlightInfo:@{@"T1Media" : media} withRange:value.rangeValue toText:text];
}
} else {
[self setHighlightInfo:@{@"T1Media" : media} withRange:media.range toText:text];
}
}
return text;
}
- (void)setHighlightInfo:(NSDictionary*)info withRange:(NSRange)range toText:(NSMutableAttributedString *)text {
if (range.length == 0 || text.length == 0) return;
{
NSString *str = text.string;
unichar *chars = malloc(str.length * sizeof(unichar));
if (!chars) return;
[str getCharacters:chars range:NSMakeRange(0, str.length)];
NSUInteger start = range.location, end = range.location + range.length;
for (int i = 0; i < str.length; i++) {
unichar c = chars[i];
if (0xD800 <= c && c <= 0xDBFF) { // UTF16 lead surrogates
if (start > i) start++;
if (end > i) end++;
}
}
free(chars);
if (end <= start) return;
range = NSMakeRange(start, end - start);
}
if (range.location >= text.length) return;
if (range.location + range.length > text.length) return;
YYTextBorder *border = [YYTextBorder new];
border.cornerRadius = 3;
border.insets = UIEdgeInsetsMake(-2, -2, -2, -2);
border.fillColor = kT1TextHighlightedBackgroundColor;
YYTextHighlight *highlight = [YYTextHighlight new];
[highlight setBackgroundBorder:border];
highlight.userInfo = info;
[text setTextHighlight:highlight range:range];
[text setColor:kT1TextHighlightedColor range:range];
}
- (T1Tweet *)displayedTweet {
return _tweet.retweetedStatus ? _tweet.retweetedStatus : _tweet;
}
- (YYTextLayout *)retweetCountTextLayoutForTweet:(T1Tweet *)tweet {
if (tweet.retweetCount > 0) {
NSMutableAttributedString *retweet = [[NSMutableAttributedString alloc] initWithString:[T1Helper shortedNumberDesc:tweet.retweetCount]];
retweet.font = [UIFont systemFontOfSize:kT1ActionFontSize];
retweet.color = tweet.retweeted ? kT1TextActionRetweetColor : kT1TextActionsColor;
return [YYTextLayout layoutWithContainerSize:CGSizeMake(100, kT1ActionFontSize * 2) text:retweet];
}
return nil;
}
- (YYTextLayout *)favoriteCountTextLayoutForTweet:(T1Tweet *)tweet {
if (tweet.favoriteCount > 0) {
NSMutableAttributedString *favourite = [[NSMutableAttributedString alloc] initWithString:[T1Helper shortedNumberDesc:tweet.favoriteCount]];
favourite.font = [UIFont systemFontOfSize:kT1ActionFontSize];
favourite.color = tweet.favorited ? kT1TextActionFavoriteColor : kT1TextActionsColor;
return [YYTextLayout layoutWithContainerSize:CGSizeMake(100, kT1ActionFontSize * 2) text:favourite];
}
return nil;
}
@end
================================================
FILE: Demo/YYKitDemo/WBEmoticonInputView.h
================================================
//
// WBStatusComposeEmoticonView.h
// YYKitExample
//
// Created by ibireme on 15/9/6.
// Copyright (C) 2015 ibireme. All rights reserved.
//
#import <UIKit/UIKit.h>
@protocol WBStatusComposeEmoticonViewDelegate <NSObject>
@optional
- (void)emoticonInputDidTapText:(NSString *)text;
- (void)emoticonInputDidTapBackspace;
@end
/// 表情输入键盘
@interface WBEmoticonInputView : UIView
@property (nonatomic, weak) id<WBStatusComposeEmoticonViewDelegate> delegate;
+ (instancetype)sharedView;
@end
================================================
FILE: Demo/YYKitDemo/WBEmoticonInputView.m
================================================
//
// WBStatusComposeEmoticonView.m
// YYKitExample
//
// Created by ibireme on 15/9/6.
// Copyright (C) 2015 ibireme. All rights reserved.
//
#import "WBEmoticonInputView.h"
#import "WBStatusHelper.h"
#import "WBModel.h"
#import "YYKit.h"
#define kViewHeight 216
#define kToolbarHeight 37
#define kOneEmoticonHeight 50
#define kOnePageCount 20
@interface WBEmoticonCell : UICollectionViewCell
@property (nonatomic, strong) WBEmoticon *emoticon;
@property (nonatomic, assign) BOOL isDelete;
@property (nonatomic, strong) UIImageView *imageView;
@end
@implementation WBEmoticonCell
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
_imageView = [UIImageView new];
_imageView.size = CGSizeMake(32, 32);
_imageView.contentMode = UIViewContentModeScaleAspectFit;
[self.contentView addSubview:_imageView];
return self;
}
- (void)setEmoticon:(WBEmoticon *)emoticon {
if (_emoticon == emoticon) return;
_emoticon = emoticon;
[self updateContent];
}
- (void)setIsDelete:(BOOL)isDelete {
if (_isDelete == isDelete) return;
_isDelete = isDelete;
[self updateContent];
}
- (void)layoutSubviews {
[super layoutSubviews];
[self updateLayout];
}
- (void)updateContent {
[_imageView cancelCurrentImageRequest];
_imageView.image = nil;
if (_isDelete) {
_imageView.image = [WBStatusHelper imageNamed:@"compose_emotion_delete"];
} else if (_emoticon) {
if (_emoticon.type == WBEmoticonTypeEmoji) {
NSNumber *num = [NSNumber numberWithString:_emoticon.code];
NSString *str = [NSString stringWithUTF32Char:num.unsignedIntValue];
if (str) {
UIImage *img = [UIImage imageWithEmoji:str size:_imageView.width];
_imageView.image = img;
}
} else if (_emoticon.group.groupID && _emoticon.png){
NSString *pngPath = [[WBStatusHelper emoticonBundle] pathForScaledResource:_emoticon.png ofType:nil inDirectory:_emoticon.group.groupID];
if (!pngPath) {
NSString *addBundlePath = [[WBStatusHelper emoticonBundle].bundlePath stringByAppendingPathComponent:@"additional"];
NSBundle *addBundle = [NSBundle bundleWithPath:addBundlePath];
pngPath = [addBundle pathForScaledResource:_emoticon.png ofType:nil inDirectory:_emoticon.group.groupID];
}
if (pngPath) {
[_imageView setImageWithURL:[NSURL fileURLWithPath:pngPath] options:YYWebImageOptionIgnoreDiskCache];
}
}
}
}
- (void)updateLayout {
_imageView.center = CGPointMake(self.width / 2, self.height / 2);
}
@end
@protocol WBEmoticonScrollViewDelegate <UICollectionViewDelegate>
- (void)emoticonScrollViewDidTapCell:(WBEmoticonCell *)cell;
@end
@interface WBEmoticonScrollView : UICollectionView
@end
@implementation WBEmoticonScrollView {
NSTimeInterval *_touchBeganTime;
BOOL _touchMoved;
UIImageView *_magnifier;
UIImageView *_magnifierContent;
__weak WBEmoticonCell *_currentMagnifierCell;
NSTimer *_backspaceTimer;
}
- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout {
self = [super initWithFrame:frame collectionViewLayout:layout];
self.backgroundColor = [UIColor clearColor];
self.backgroundView = [UIView new];
self.pagingEnabled = YES;
self.showsHorizontalScrollIndicator = NO;
self.clipsToBounds = NO;
self.canCancelContentTouches = NO;
self.multipleTouchEnabled = NO;
_magnifier = [[UIImageView alloc] initWithImage:[WBStatusHelper imageNamed:@"emoticon_keyboard_magnifier"]];
_magnifierContent = [UIImageView new];
_magnifierContent.size = CGSizeMake(40, 40);
_magnifierContent.centerX = _magnifier.width / 2;
[_magnifier addSubview:_magnifierContent];
_magnifier.hidden = YES;
[self addSubview:_magnifier];
return self;
}
- (void)dealloc {
[self endBackspaceTimer];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
_touchMoved = NO;
WBEmoticonCell *cell = [self cellForTouches:touches];
_currentMagnifierCell = cell;
[self showMagnifierForCell:_currentMagnifierCell];
if (cell.imageView.image && !cell.isDelete) {
[[UIDevice currentDevice] playInputClick];
}
if (cell.isDelete) {
[self endBackspaceTimer];
[self performSelector:@selector(startBackspaceTimer) afterDelay:0.5];
}
}
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
_touchMoved = YES;
if (_currentMagnifierCell && _currentMagnifierCell.isDelete) return;
WBEmoticonCell *cell = [self cellForTouches:touches];
if (cell != _currentMagnifierCell) {
if (!_currentMagnifierCell.isDelete && !cell.isDelete) {
_currentMagnifierCell = cell;
}
[self showMagnifierForCell:cell];
}
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
WBEmoticonCell *cell = [self cellForTouches:touches];
if ((!_currentMagnifierCell.isDelete && cell.emoticon) || (!_touchMoved && cell.isDelete)) {
if ([self.delegate respondsToSelector:@selector(emoticonScrollViewDidTapCell:)]) {
[((id<WBEmoticonScrollViewDelegate>) self.delegate) emoticonScrollViewDidTapCell:cell];
}
}
[self hideMagnifier];
[self endBackspaceTimer];
}
- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self hideMagnifier];
[self endBackspaceTimer];
}
- (WBEmoticonCell *)cellForTouches:(NSSet<UITouch *> *)touches {
UITouch *touch = touches.anyObject;
CGPoint point = [touch locationInView:self];
NSIndexPath *indexPath = [self indexPathForItemAtPoint:point];
if (indexPath) {
WBEmoticonCell *cell = (id)[self cellForItemAtIndexPath:indexPath];
return cell;
}
return nil;
}
- (void)showMagnifierForCell:(WBEmoticonCell *)cell {
if (cell.isDelete || !cell.imageView.image) {
[self hideMagnifier];
return;
}
CGRect rect = [cell convertRect:cell.bounds toView:self];
_magnifier.centerX = CGRectGetMidX(rect);
_magnifier.bottom = CGRectGetMaxY(rect) - 9;
_magnifier.hidden = NO;
_magnifierContent.image = cell.imageView.image;
_magnifierContent.top = 20;
[_magnifierContent.layer removeAllAnimations];
NSTimeInterval dur = 0.1;
[UIView animateWithDuration:dur delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
_magnifierContent.top = 3;
} completion:^(BOOL finished) {
[UIView animateWithDuration:dur delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
_magnifierContent.top = 6;
} completion:^(BOOL finished) {
[UIView animateWithDuration:dur delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
_magnifierContent.top = 5;
} completion:^(BOOL finished) {
}];
}];
}];
}
- (void)hideMagnifier {
_magnifier.hidden = YES;
}
- (void)startBackspaceTimer {
[self endBackspaceTimer];
@weakify(self);
_backspaceTimer = [NSTimer timerWithTimeInterval:0.1 block:^(NSTimer *timer) {
@strongify(self);
if (!self) return;
WBEmoticonCell *cell = self->_currentMagnifierCell;
if (cell.isDelete) {
if ([self.delegate respondsToSelector:@selector(emoticonScrollViewDidTapCell:)]) {
[[UIDevice currentDevice] playInputClick];
[((id<WBEmoticonScrollViewDelegate>) self.delegate) emoticonScrollViewDidTapCell:cell];
}
}
} repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:_backspaceTimer forMode:NSRunLoopCommonModes];
}
- (void)endBackspaceTimer {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(startBackspaceTimer) object:nil];
[_backspaceTimer invalidate];
_backspaceTimer = nil;
}
@end
@interface WBEmoticonInputView () <UICollectionViewDelegate, UICollectionViewDataSource, UIInputViewAudioFeedback,WBEmoticonScrollViewDelegate>
@property (nonatomic, strong) NSArray<UIButton *> *toolbarButtons;
@property (nonatomic, strong) UICollectionView *collectionView;
@property (nonatomic, strong) UIView *pageControl;
@property (nonatomic, strong) NSArray<WBEmoticonGroup *> *emoticonGroups;
@property (nonatomic, strong) NSArray<NSNumber *> *emoticonGroupPageIndexs;
@property (nonatomic, strong) NSArray<NSNumber *> *emoticonGroupPageCounts;
@property (nonatomic, assign) NSInteger emoticonGroupTotalPageCount;
@property (nonatomic, assign) NSInteger currentPageIndex;
@end
@implementation WBEmoticonInputView
+ (instancetype)sharedView {
static WBEmoticonInputView *v;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
v = [self new];
});
return v;
}
- (instancetype)init {
self = [super init];
self.frame = CGRectMake(0, 0, kScreenWidth, kViewHeight);
self.backgroundColor = UIColorHex(f9f9f9);
[self _initGroups];
[self _initTopLine];
[self _initCollectionView];
[self _initToolbar];
_currentPageIndex = NSNotFound;
[self _toolbarBtnDidTapped:_toolbarButtons.firstObject];
return self;
}
- (void)_initGroups {
_emoticonGroups = [WBStatusHelper emoticonGroups];
NSMutableArray *indexs = [NSMutableArray new];
NSUInteger index = 0;
for (WBEmoticonGroup *group in _emoticonGroups) {
[indexs addObject:@(index)];
NSUInteger count = ceil(group.emoticons.count / (float)kOnePageCount);
if (count == 0) count = 1;
index += count;
}
_emoticonGroupPageIndexs = indexs;
NSMutableArray *pageCounts = [NSMutableArray new];
_emoticonGroupTotalPageCount = 0;
for (WBEmoticonGroup *group in _emoticonGroups) {
NSUInteger pageCount = ceil(group.emoticons.count / (float)kOnePageCount);
if (pageCount == 0) pageCount = 1;
[pageCounts addObject:@(pageCount)];
_emoticonGroupTotalPageCount += pageCount;
}
_emoticonGroupPageCounts = pageCounts;
}
- (void)_initTopLine {
UIView *line = [UIView new];
line.width = self.width;
line.height = CGFloatFromPixel(1);
line.backgroundColor = UIColorHex(bfbfbf);
line.autoresizingMask = UIViewAutoresizingFlexibleWidth;
[self addSubview:line];
}
- (void)_initCollectionView {
CGFloat itemWidth = (kScreenWidth - 10 * 2) / 7.0;
itemWidth = CGFloatPixelRound(itemWidth);
CGFloat padding = (kScreenWidth - 7 * itemWidth) / 2.0;
CGFloat paddingLeft = CGFloatPixelRound(padding);
CGFloat paddingRight = kScreenWidth - paddingLeft - itemWidth * 7;
UICollectionViewFlowLayout *layout = [UICollectionViewFlowLayout new];
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
layout.itemSize = CGSizeMake(itemWidth, kOneEmoticonHeight);
layout.minimumLineSpacing = 0;
layout.minimumInteritemSpacing = 0;
layout.sectionInset = UIEdgeInsetsMake(0, paddingLeft, 0, paddingRight);
_collectionView = [[WBEmoticonScrollView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kOneEmoticonHeight * 3) collectionViewLayout:layout];
[_collectionView registerClass:[WBEmoticonCell class] forCellWithReuseIdentifier:@"cell"];
_collectionView.delegate = self;
_collectionView.dataSource = self;
_collectionView.top = 5;
[self addSubview:_collectionView];
_pageControl = [UIView new];
_pageControl.size = CGSizeMake(kScreenWidth, 20);
_pageControl.top = _collectionView.bottom - 5;
_pageControl.userInteractionEnabled = NO;
[self addSubview:_pageControl];
}
- (void)_initToolbar {
UIView *toolbar = [UIView new];
toolbar.size = CGSizeMake(kScreenWidth, kToolbarHeight);
UIImageView *bg = [[UIImageView alloc] initWithImage:[WBStatusHelper imageNamed:@"compose_emotion_table_right_normal"]];
bg.size = toolbar.size;
[toolbar addSubview:bg];
UIScrollView *scroll = [UIScrollView new];
scroll.showsHorizontalScrollIndicator = NO;
scroll.alwaysBounceHorizontal = YES;
scroll.size = toolbar.size;
scroll.contentSize = toolbar.size;
[toolbar addSubview:scroll];
NSMutableArray *btns = [NSMutableArray new];
UIButton *btn;
for (NSUInteger i = 0; i < _emoticonGroups.count; i++) {
WBEmoticonGroup *group = _emoticonGroups[i];
btn = [self _createToolbarButton];
[btn setTitle:group.nameCN forState:UIControlStateNormal];
btn.left = kScreenWidth / (float)_emoticonGroups.count * i;
btn.tag = i;
[scroll addSubview:btn];
[btns addObject:btn];
}
toolbar.bottom = self.height;
[self addSubview:toolbar];
_toolbarButtons = btns;
}
- (UIButton *)_createToolbarButton {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.exclusiveTouch = YES;
btn.size = CGSizeMake(kScreenWidth / _emoticonGroups.count, kToolbarHeight);
btn.titleLabel.font = [UIFont systemFontOfSize:14];
[btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[btn setTitleColor:UIColorHex(5D5C5A) forState:UIControlStateSelected];
UIImage *img;
img = [WBStatusHelper imageNamed:@"compose_emotion_table_left_normal"];
img = [img resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, img.size.width - 1) resizingMode:UIImageResizingModeStretch];
[btn setBackgroundImage:img forState:UIControlStateNormal];
img = [WBStatusHelper imageNamed:@"compose_emotion_table_left_selected"];
img = [img resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, img.size.width - 1) resizingMode:UIImageResizingModeStretch];
[btn setBackgroundImage:img forState:UIControlStateSelected];
[btn addTarget:self action:@selector(_toolbarBtnDidTapped:) forControlEvents:UIControlEventTouchUpInside];
return btn;
}
- (void)_toolbarBtnDidTapped:(UIButton *)btn {
NSInteger groupIndex = btn.tag;
NSInteger page = ((NSNumber *)_emoticonGroupPageIndexs[groupIndex]).integerValue;
CGRect rect = CGRectMake(page * _collectionView.width, 0, _collectionView.width, _collectionView.height);
[_collectionView scrollRectToVisible:rect animated:NO];
[self scrollViewDidScroll:_collectionView];
}
- (WBEmoticon *)_emoticonForIndexPath:(NSIndexPath *)indexPath {
NSUInteger section = indexPath.section;
for (NSInteger i = _emoticonGroupPageIndexs.count - 1; i >= 0; i--) {
NSNumber *pageIndex = _emoticonGroupPageIndexs[i];
if (section >= pageIndex.unsignedIntegerValue) {
WBEmoticonGroup *group = _emoticonGroups[i];
NSUInteger page = section - pageIndex.unsignedIntegerValue;
NSUInteger index = page * kOnePageCount + indexPath.row;
// transpose line/row
NSUInteger ip = index / kOnePageCount;
NSUInteger ii = index % kOnePageCount;
NSUInteger reIndex = (ii % 3) * 7 + (ii / 3);
index = reIndex + ip * kOnePageCount;
if (index < group.emoticons.count) {
return group.emoticons[index];
} else {
return nil;
}
}
}
return nil;
}
#pragma mark WBEmoticonScrollViewDelegate
- (void)emoticonScrollViewDidTapCell:(WBEmoticonCell *)cell {
if (!cell) return;
if (cell.isDelete) {
if ([self.delegate respondsToSelector:@selector(emoticonInputDidTapBackspace)]) {
[[UIDevice currentDevice] playInputClick];
[self.delegate emoticonInputDidTapBackspace];
}
} else if (cell.emoticon) {
NSString *text = nil;
switch (cell.emoticon.type) {
case WBEmoticonTypeImage: {
text = cell.emoticon.chs;
} break;
case WBEmoticonTypeEmoji: {
NSNumber *num = [NSNumber numberWithString:cell.emoticon.code];
text = [NSString stringWithUTF32Char:num.unsignedIntValue];
} break;
default:break;
}
if (text && [self.delegate respondsToSelector:@selector(emoticonInputDidTapText:)]) {
[self.delegate emoticonInputDidTapText:text];
}
}
}
#pragma mark UICollectionViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSInteger page = round(scrollView.contentOffset.x / scrollView.width);
if (page < 0) page = 0;
else if (page >= _emoticonGroupTotalPageCount) page = _emoticonGroupTotalPageCount - 1;
if (page == _currentPageIndex) return;
_currentPageIndex = page;
NSInteger curGroupIndex = 0, curGroupPageIndex = 0, curGroupPageCount = 0;
for (NSInteger i = _emoticonGroupPageIndexs.count - 1; i >= 0; i--) {
NSNumber *pageIndex = _emoticonGroupPageIndexs[i];
if (page >= pageIndex.unsignedIntegerValue) {
curGroupIndex = i;
curGroupPageIndex = ((NSNumber *)_emoticonGroupPageIndexs[i]).integerValue;
curGroupPageCount = ((NSNumber *)_emoticonGroupPageCounts[i]).integerValue;
break;
}
}
[_pageControl.layer removeAllSublayers];
CGFloat padding = 5, width = 6, height = 2;
CGFloat pageControlWidth = (width + 2 * padding) * curGroupPageCount;
for (NSInteger i = 0; i < curGroupPageCount; i++) {
CALayer *layer = [CALayer layer];
layer.size = CGSizeMake(width, height);
layer.cornerRadius = 1;
if (page - curGroupPageIndex == i) {
layer.backgroundColor = UIColorHex(fd8225).CGColor;
} else {
layer.backgroundColor = UIColorHex(dedede).CGColor;
}
layer.centerY = _pageControl.height / 2;
layer.left = (_pageControl.width - pageControlWidth) / 2 + i * (width + 2 * padding) + padding;
[_pageControl.layer addSublayer:layer];
}
[_toolbarButtons enumerateObjectsUsingBlock:^(UIButton *btn, NSUInteger idx, BOOL *stop) {
btn.selected = (idx == curGroupIndex);
}];
}
- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath {
return NO;
}
- (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath {
return NO;
}
#pragma mark UICollectionViewDataSource
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
return _emoticonGroupTotalPageCount;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return kOnePageCount + 1;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
WBEmoticonCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
if (indexPath.row == kOnePageCount) {
cell.isDelete = YES;
cell.emoticon = nil;
} else {
cell.isDelete = NO;
cell.emoticon = [self _emoticonForIndexPath:indexPath];
}
return cell;
}
#pragma mark - UIInputViewAudioFeedback
- (BOOL)enableInputClicksWhenVisible {
return YES;
}
@end
================================================
FILE: Demo/YYKitDemo/WBModel.h
================================================
//
// WBModel.h
// YYKitExample
//
// Created by ibireme on 15/9/4.
// Copyright (c) 2015 ibireme. All rights reserved.
//
#import <Foundation/Foundation.h>
/// 认证方式
typedef NS_ENUM(NSUInteger, WBUserVerifyType){
WBUserVerifyTypeNone = 0, ///< 没有认证
WBUserVerifyTypeStandard, ///< 个人认证,黄V
WBUserVerifyTypeOrganization, ///< 官方认证,蓝V
WBUserVerifyTypeClub, ///< 达人认证,红星
};
/// 图片标记
typedef NS_ENUM(NSUInteger, WBPictureBadgeType) {
WBPictureBadgeTypeNone = 0, ///< 正常图片
WBPictureBadgeTypeLong, ///< 长图
WBPictureBadgeTypeGIF, ///< GIF
};
/**
一个图片的元数据
*/
@interface WBPictureMetadata : NSObject
@property (nonatomic, strong) NSURL *url; ///< Full image url
@property (nonatomic, assign) int width; ///< pixel width
@property (nonatomic, assign) int height; ///< pixel height
@property (nonatomic, strong) NSString *type; ///< "WEBP" "JPEG" "GIF"
@property (nonatomic, assign) int cutType; ///< Default:1
@property (nonatomic, assign) WBPictureBadgeType badgeType;
@end
/**
图片
*/
@interface WBPicture : NSObject
@property (nonatomic, strong) NSString *picID;
@property (nonatomic, strong) NSString *objectID;
@property (nonatomic, assign) int photoTag;
@property (nonatomic, assign) BOOL keepSize; ///< YES:固定为方形 NO:原始宽高比
@property (nonatomic, strong) WBPictureMetadata *thumbnail; ///< w:180
@property (nonatomic, strong) WBPictureMetadata *bmiddle; ///< w:360 (列表中的缩略图)
@property (nonatomic, strong) WBPictureMetadata *middlePlus; ///< w:480
@property (nonatomic, strong) WBPictureMetadata *large; ///< w:720 (放大查看)
@property (nonatomic, strong) WBPictureMetadata *largest; ///< (查看原图)
@property (nonatomic, strong) WBPictureMetadata *original; ///<
@property (nonatomic, assign) WBPictureBadgeType badgeType;
@end
/**
链接
*/
@interface WBURL : NSObject
@property (nonatomic, assign) BOOL result;
@property (nonatomic, strong) NSString *shortURL; ///< 短域名 (原文)
@property (nonatomic, strong) NSString *oriURL; ///< 原始链接
@property (nonatomic, strong) NSString *urlTitle; ///< 显示文本,例如"网页链接",可能需要裁剪(24)
@property (nonatomic, strong) NSString *urlTypePic; ///< 链接类型的图片URL
@property (nonatomic, assign) int32_t urlType; ///< 0:一般链接 36地点 39视频/图片
@property (nonatomic, strong) NSString *log;
@property (nonatomic, strong) NSDictionary *actionLog;
@property (nonatomic, strong) NSString *pageID; ///< 对应着 WBPageInfo
@property (nonatomic, strong) NSString *storageType;
//如果是图片,则会有下面这些,可以直接点开看
@property (nonatomic, strong) NSArray<NSString *> *picIds;
@property (nonatomic, strong) NSDictionary<NSString *, WBPicture *> *picInfos;
@property (nonatomic, strong) NSArray<WBPicture *> *pics;
@end
/**
话题
*/
@interface WBTopic : NSObject
@property (nonatomic, strong) NSString *topicTitle; ///< 话题标题
@property (nonatomic, strong) NSString *topicURL; ///< 话题链接 sinaweibo://
@end
/**
标签
*/
@interface WBTag : NSObject
@property (nonatomic, strong) NSString *tagName; ///< 标签名字,例如"上海·上海文庙"
@property (nonatomic, strong) NSString *tagScheme; ///< 链接 sinaweibo://...
@property (nonatomic, assign) int32_t tagType; ///< 1 地点 2其他
@property (nonatomic, assign) int32_t tagHidden;
@property (nonatomic, strong) NSURL *urlTypePic; ///< 需要加 _default
@end
/**
按钮
*/
@interface WBButtonLink : NSObject
@property (nonatomic, strong) NSURL *pic; ///< 按钮图片URL (需要加_default)
@property (nonatomic, strong) NSString *name; ///< 按钮文本,例如"点评"
@property (nonatomic, strong) NSString *type;
@property (nonatomic, strong) NSDictionary *params;
@end
/**
卡片 (样式有多种,最常见的是下方这样)
-----------------------------
title
pic title button
tips
-----------------------------
*/
@interface WBPageInfo : NSObject
@property (nonatomic, strong) NSString *pageTitle; ///< 页面标题,例如"上海·上海文庙"
@property (nonatomic, strong) NSString *pageID;
@property (nonatomic, strong) NSString *pageDesc; ///< 页面描述,例如"上海市黄浦区文庙路215号"
@property (nonatomic, strong) NSString *content1;
@property (nonatomic, strong) NSString *content2;
@property (nonatomic, strong) NSString *content3;
@property (nonatomic, strong) NSString *content4;
@property (nonatomic, strong) NSString *tips; ///< 提示,例如"4222条微博"
@property (nonatomic, strong) NSString *objectType; ///< 类型,例如"place" "video"
@property (nonatomic, strong) NSString *objectID;
@property (nonatomic, strong) NSString *scheme; ///< 真实链接,例如 http://v.qq.com/xxx
@property (nonatomic, strong) NSArray<WBButtonLink *> *buttons;
@property (nonatomic, assign) int32_t isAsyn;
@property (nonatomic, assign) int32_t type;
@property (nonatomic, strong) NSString *pageURL; ///< 链接 sinaweibo://...
@property (nonatomic, strong) NSURL *pagePic; ///< 图片URL,不需要加(_default) 通常是左侧的方形图片
@property (nonatomic, strong) NSURL *typeIcon; ///< Badge 图片URL,不需要加(_default) 通常放在最左上角角落里
@property (nonatomic, assign) int32_t actStatus;
@property (nonatomic, strong) NSDictionary *actionlog;
@property (nonatomic, strong) NSDictionary *mediaInfo;
@end
/**
微博标题
*/
@interface WBStatusTitle : NSObject
@property (nonatomic, assign) int32_t baseColor;
@property (nonatomic, strong) NSString *text; ///< 文本,例如"仅自己可见"
@property (nonatomic, strong) NSString *iconURL; ///< 图标URL,需要加Default
@end
/**
用户
*/
@interface WBUser : NSObject
@property (nonatomic, assign) uint64_t userID; ///< id (int)
@property (nonatomic, strong) NSString *idString; ///< id (string)
@property (nonatomic, assign) int32_t gender; /// 0:none 1:男 2:女
@property (nonatomic, strong) NSString *genderString; /// "m":男 "f":女 "n"未知
@property (nonatomic, strong) NSString *desc; ///< 个人简介
@property (nonatomic, strong) NSString *domain; ///< 个性域名
@property (nonatomic, strong) NSString *name; ///< 昵称
@property (nonatomic, strong) NSString *screenName; ///< 友好昵称
@property (nonatomic, strong) NSString *remark; ///< 备注
@property (nonatomic, assign) int32_t followersCount; ///< 粉丝数
@property (nonatomic, assign) int32_t friendsCount; ///< 关注数
@property (nonatomic, assign) int32_t biFollowersCount; ///< 好友数 (双向关注)
@property (nonatomic, assign) int32_t favouritesCount; ///< 收藏数
@property (nonatomic, assign) int32_t statusesCount; ///< 微博数
@property (nonatomic, assign) int32_t topicsCount; ///< 话题数
@property (nonatomic, assign) int32_t blockedCount; ///< 屏蔽数
@property (nonatomic, assign) int32_t pagefriendsCount;
@property (nonatomic, assign) BOOL followMe;
@property (nonatomic, assign) BOOL following;
@property (nonatomic, strong) NSString *province; ///< 省
@property (nonatomic, strong) NSString *city; ///< 市
@property (nonatomic, strong) NSString *url; ///< 博客地址
@property (nonatomic, strong) NSURL *profileImageURL; ///< 头像 50x50 (FeedList)
@property (nonatomic, strong) NSURL *avatarLarge; ///< 头像 180*180
@property (nonatomic, strong) NSURL *avatarHD; ///< 头像 原图
@property (nonatomic, strong) NSURL *coverImage; ///< 封面图 920x300
@property (nonatomic, strong) NSURL *coverImagePhone;
@property (nonatomic, strong) NSString *profileURL;
@property (nonatomic, assign) int32_t type;
@property (nonatomic, assign) int32_t ptype;
@property (nonatomic, assign) int32_t mbtype;
@property (nonatomic, assign) int32_t urank; ///< 微博等级 (LV)
@property (nonatomic, assign) int32_t uclass;
@property (nonatomic, assign) int32_t ulevel;
@property (nonatomic, assign) int32_t mbrank; ///< 会员等级 (橙名 VIP)
@property (nonatomic, assign) int32_t star;
@property (nonatomic, assign) int32_t level;
@property (nonatomic, strong) NSDate *createdAt; ///< 注册时间
@property (nonatomic, assign) BOOL allowAllActMsg;
@property (nonatomic, assign) BOOL allowAllComment;
@property (nonatomic, assign) BOOL geoEnabled;
@property (nonatomic, assign) int32_t onlineStatus;
@property (nonatomic, strong) NSString *location; ///< 所在地
@property (nonatomic, strong) NSArray<NSDictionary<NSString *, NSString *> *> *icons;
@property (nonatomic, strong) NSString *weihao;
@property (nonatomic, strong) NSString *badgeTop;
@property (nonatomic, assign) int32_t blockWord;
@property (nonatomic, assign) int32_t blockApp;
@property (nonatomic, assign) int32_t hasAbilityTag;
@property (nonatomic, assign) int32_t creditScore; ///< 信用积分
@property (nonatomic, strong) NSDictionary<NSString *, NSNumber *> *badge; ///< 勋章
@property (nonatomic, strong) NSString *lang;
@property (nonatomic, assign) int32_t userAbility;
@property (nonatomic, strong) NSDictionary *extend;
@property (nonatomic, assign) BOOL verified; ///< 微博认证 (大V)
@property (nonatomic, assign) int32_t verifiedType;
@property (nonatomic, assign) int32_t verifiedLevel;
@property (nonatomic, assign) int32_t verifiedState;
@property (nonatomic, strong) NSString *verifiedContactEmail;
@property (nonatomic, strong) NSString *verifiedContactMobile;
@property (nonatomic, strong) NSString *verifiedTrade;
@property (nonatomic, strong) NSString *verifiedContactName;
@property (nonatomic, strong) NSString *verifiedSource;
@property (nonatomic, strong) NSString *verifiedSourceURL;
@property (nonatomic, strong) NSString *verifiedReason; ///< 微博认证描述
@property (nonatomic, strong) NSString *verifiedReasonURL;
@property (nonatomic, strong) NSString *verifiedReasonModified;
@property (nonatomic, assign) WBUserVerifyType userVerifyType;
@end
/**
微博
*/
@interface WBStatus : NSObject
@property (nonatomic, assign) uint64_t statusID; ///< id (number)
@property (nonatomic, strong) NSString *idstr; ///< id (string)
@property (nonatomic, strong) NSString *mid;
@property (nonatomic, strong) NSString *rid;
@property (nonatomic, strong) NSDate *createdAt; ///< 发布时间
@property (nonatomic, strong) WBUser *user;
@property (nonatomic, assign) int32_t userType;
@property (nonatomic, strong) WBStatusTitle *title; ///< 标题栏 (通常为nil)
@property (nonatomic, strong) NSString *picBg; ///< 微博VIP背景图,需要替换 "os7"
@property (nonatomic, strong) NSString *text; ///< 正文
@property (nonatomic, strong) NSURL *thumbnailPic; ///< 缩略图
@property (nonatomic, strong) NSURL *bmiddlePic; ///< 中图
@property (nonatomic, strong) NSURL *originalPic; ///< 大图
@property (nonatomic, strong) WBStatus *retweetedStatus; ///转发微博
@property (nonatomic, strong) NSArray<NSString *> *picIds;
@property (nonatomic, strong) NSDictionary<NSString *, WBPicture *> *picInfos;
@property (nonatomic, strong) NSArray<WBPicture *> *pics;
@property (nonatomic, strong) NSArray<WBURL *> *urlStruct;
@property (nonatomic, strong) NSArray<WBTopic *> *topicStruct;
@property (nonatomic, strong) NSArray<WBTag *> *tagStruct;
@property (nonatomic, strong) WBPageInfo *pageInfo;
@property (nonatomic, assign) BOOL favorited; ///< 是否收藏
@property (nonatomic, assign) BOOL truncated; ///< 是否截断
@property (nonatomic, assign) int32_t repostsCount; ///< 转发数
@property (nonatomic, assign) int32_t commentsCount; ///< 评论数
@property (nonatomic, assign) int32_t attitudesCount; ///< 赞数
@property (nonatomic, assign) int32_t attitudesStatus; ///< 是否已赞 0:没有
@property (nonatomic, assign) int32_t recomState;
@property (nonatomic, strong) NSString *inReplyToScreenName;
@property (nonatomic, strong) NSString *inReplyToStatusId;
@property (nonatomic, strong) NSString *inReplyToUserId;
@property (nonatomic, strong) NSString *source; ///< 来自 XXX
@property (nonatomic, assign) int32_t sourceType;
@property (nonatomic, assign) int32_t sourceAllowClick; ///< 来源是否允许点击
@property (nonatomic, strong) NSDictionary *geo;
@property (nonatomic, strong) NSArray *annotations; ///< 地理位置
@property (nonatomic, assign) int32_t bizFeature;
@property (nonatomic, assign) int32_t mlevel;
@property (nonatomic, strong) NSString *mblogid;
@property (nonatomic, strong) NSString *mblogTypeName;
@property (nonatomic, strong) NSString *scheme;
@property (nonatomic, strong) NSDictionary *visible;
@property (nonatomic, strong) NSArray *darwinTags;
@end
/**
一次API请求的数据
*/
@interface WBTimelineItem : NSObject
@property (nonatomic, strong) NSArray *ad;
@property (nonatomic, strong) NSArray *advertises;
@property (nonatomic, strong) NSString *gsid;
@property (nonatomic, assign) int32_t interval;
@property (nonatomic, assign) int32_t uveBlank;
@property (nonatomic, assign) int32_t hasUnread;
@property (nonatomic, assign) int32_t totalNumber;
@property (nonatomic, strong) NSString *sinceID;
@property (nonatomic, strong) NSString *maxID;
@property (nonatomic, strong) NSString *previousCursor;
@property (nonatomic, strong) NSString *nextCursor;
@property (nonatomic, strong) NSArray<WBStatus *> *statuses;
/*
groupInfo
trends
*/
@end
@class WBEmoticonGroup;
typedef NS_ENUM(NSUInteger, WBEmoticonType) {
WBEmoticonTypeImage = 0, ///< 图片表情
WBEmoticonTypeEmoji = 1, ///< Emoji表情
};
@interface WBEmoticon : NSObject
@property (nonatomic, strong) NSString *chs; ///< 例如 [吃惊]
@property (nonatomic, strong) NSString *cht; ///< 例如 [吃驚]
@property (nonatomic, strong) NSString *gif; ///< 例如 d_chijing.gif
@property (nonatomic, strong) NSString *png; ///< 例如 d_chijing.png
@property (nonatomic, strong) NSString *code; ///< 例如 0x1f60d
@property (nonatomic, assign) WBEmoticonType type;
@property (nonatomic, weak) WBEmoticonGroup *group;
@end
@interface WBEmoticonGroup : NSObject
@property (nonatomic, strong) NSString *groupID; ///< 例如 com.sina.default
@property (nonatomic, assign) NSInteger version;
@property (nonatomic, strong) NSString *nameCN; ///< 例如 浪小花
@property (nonatomic, strong) NSString *nameEN;
@property (nonatomic, strong) NSString *nameTW;
@property (nonatomic, assign) NSInteger displayOnly;
@property (nonatomic, assign) NSInteger groupType;
@property (nonatomic, strong) NSArray<WBEmoticon *> *emoticons;
@end
================================================
FILE: Demo/YYKitDemo/WBModel.m
================================================
//
// WBModel.m
// YYKitExample
//
// Created by ibireme on 15/9/4.
// Copyright (c) 2015 ibireme. All rights reserved.
//
#import "WBModel.h"
@implementation WBPictureMetadata
+ (NSDictionary *)modelCustomPropertyMapper {
return @{@"cutType" : @"cut_type"};
}
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {
if ([_type isEqualToString:@"GIF"]) {
_badgeType = WBPictureBadgeTypeGIF;
} else {
if (_width > 0 && (float)_height / _width > 3) {
_badgeType = WBPictureBadgeTypeLong;
}
}
return YES;
}
@end
@implementation WBPicture
+ (NSDictionary *)modelCustomPropertyMapper {
return @{@"picID" : @"pic_id",
@"keepSize" : @"keep_size",
@"photoTag" : @"photo_tag",
@"objectID" : @"object_id",
@"middlePlus" : @"middleplus"};
}
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {
WBPictureMetadata *meta = _large ? _large : _largest ? _largest : _original;
_badgeType = meta.badgeType;
return YES;
}
@end
@implementation WBURL
+ (NSDictionary *)modelCustomPropertyMapper {
return @{@"oriURL" : @"ori_url",
@"urlTitle" : @"url_title",
@"urlTypePic" : @"url_type_pic",
@"urlType" : @"url_type",
@"shortURL" : @"short_url",
@"actionLog" : @"actionlog",
@"pageID" : @"page_id",
@"storageType" : @"storage_type",
@"picIds" : @"pic_ids",
@"picInfos" : @"pic_infos"};
}
+ (NSDictionary *)modelContainerPropertyGenericClass {
return @{@"picIds" : [NSString class],
@"picInfos" : [WBPicture class]};
}
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {
// 自动 model-mapper 不能完成的,这里可以进行额外处理
_pics = nil;
if (_picIds.count != 0) {
NSMutableArray *pics = [NSMutableArray new];
for (NSString *picId in _picIds) {
WBPicture *pic = _picInfos[picId];
if (pic) {
[pics addObject:pic];
}
}
_pics = pics;
}
return YES;
}
@end
@implementation WBTopic
+ (NSDictionary *)modelCustomPropertyMapper {
return @{@"topicTitle" : @"topic_title",
@"topicURL" : @"topic_url"};
}
@end
@implementation WBTag
+ (NSDictionary *)modelCustomPropertyMapper {
return @{@"tagHidden" : @"tag_hidden",
@"tagName" : @"tag_name",
@"tagScheme" : @"tag_scheme",
@"tagType" : @"tag_type",
@"urlTypePic" : @"url_type_pic"};
}
@end
@implementation WBButtonLink
@end
@implementation WBPageInfo
+ (NSDictionary *)modelCustomPropertyMapper {
return @{@"pageTitle" : @"page_title",
@"pageID" : @"page_id",
@"pageDesc" : @"page_desc",
@"objectType" : @"object_type",
@"objectID" : @"object_id",
@"isAsyn" : @"is_asyn",
@"pageURL" : @"page_url",
@"pagePic" : @"page_pic",
@"actStatus" : @"act_status",
@"mediaInfo" : @"media_info",
@"typeIcon" : @"type_icon"};
}
+ (NSDictionary *)modelContainerPropertyGenericClass {
return @{@"buttons" : [WBButtonLink class]};
}
@end
@implementation WBStatusTitle
+ (NSDictionary *)modelCustomPropertyMapper {
return @{@"baseColor" : @"base_color",
@"iconURL" : @"icon_url"};
}
@end
@implementation WBUser
+ (NSDictionary *)modelCustomPropertyMapper {
return @{@"userID" : @"id",
@"idString" : @"idstr",
@"genderString" : @"gender",
@"biFollowersCount" : @"bi_followers_count",
@"profileImageURL" : @"profile_image_url",
@"uclass" : @"class",
@"verifiedContactEmail" : @"verified_contact_email",
@"statusesCount" : @"statuses_count",
@"geoEnabled" : @"geo_enabled",
@"topicsCount" : @"topics_count",
@"blockedCount" : @"blocked_count",
@"followMe" : @"follow_me",
@"coverImagePhone" : @"cover_image_phone",
@"desc" : @"description",
@"followersCount" : @"followers_count",
@"verifiedContactMobile" : @"verified_contact_mobile",
@"avatarLarge" : @"avatar_large",
@"verifiedTrade" : @"verified_trade",
@"profileURL" : @"profile_url",
@"coverImage" : @"cover_image",
@"onlineStatus" : @"online_status",
@"badgeTop" : @"badge_top",
@"verifiedContactName" : @"verified_contact_name",
@"screenName" : @"screen_name",
@"verifiedSourceURL" : @"verified_source_url",
@"pagefriendsCount" : @"pagefriends_count",
@"verifiedReason" : @"verified_reason",
@"friendsCount" : @"friends_count",
@"blockApp" : @"block_app",
@"hasAbilityTag" : @"has_ability_tag",
@"avatarHD" : @"avatar_hd",
@"creditScore" : @"credit_score",
@"createdAt" : @"created_at",
@"blockWord" : @"block_word",
@"allowAllActMsg" : @"allow_all_act_msg",
@"verified
gitextract_y7dx7jou/ ├── .gitignore ├── .travis.yml ├── Demo/ │ ├── YYKitDemo/ │ │ ├── Base.lproj/ │ │ │ └── LaunchScreen.xib │ │ ├── Compare/ │ │ │ ├── ermilio_lossless.bpg │ │ │ ├── ermilio_q15.bpg │ │ │ └── ermilio_q20.bpg │ │ ├── EmoticonQQ.bundle/ │ │ │ └── info.plist │ │ ├── EmoticonWeibo.bundle/ │ │ │ ├── additional/ │ │ │ │ ├── DisplayOnly/ │ │ │ │ │ ├── com.sina.emotions2015-04/ │ │ │ │ │ │ └── info.json │ │ │ │ │ ├── com.sina.emotions2015-05/ │ │ │ │ │ │ └── info.json │ │ │ │ │ ├── com.sina.emotions2015-06/ │ │ │ │ │ │ └── info.json │ │ │ │ │ ├── com.sina.emotions2015-07/ │ │ │ │ │ │ └── info.json │ │ │ │ │ └── com.sina.emotions2015-08/ │ │ │ │ │ └── info.json │ │ │ │ └── com.sina.default/ │ │ │ │ └── info.json │ │ │ ├── com.apple.emoji/ │ │ │ │ └── info.plist │ │ │ ├── com.sina.default/ │ │ │ │ └── info.plist │ │ │ ├── com.sina.lxh/ │ │ │ │ └── info.plist │ │ │ └── emoticons.plist │ │ ├── Info.plist │ │ ├── T1Helper.h │ │ ├── T1Helper.m │ │ ├── T1HomeTimelineItemsViewController.h │ │ ├── T1HomeTimelineItemsViewController.m │ │ ├── T1Model.h │ │ ├── T1Model.m │ │ ├── T1StatusCell.h │ │ ├── T1StatusCell.m │ │ ├── T1StatusLayout.h │ │ ├── T1StatusLayout.m │ │ ├── WBEmoticonInputView.h │ │ ├── WBEmoticonInputView.m │ │ ├── WBModel.h │ │ ├── WBModel.m │ │ ├── WBStatusCell.h │ │ ├── WBStatusCell.m │ │ ├── WBStatusComposeTextParser.h │ │ ├── WBStatusComposeTextParser.m │ │ ├── WBStatusComposeViewController.h │ │ ├── WBStatusComposeViewController.m │ │ ├── WBStatusHelper.h │ │ ├── WBStatusHelper.m │ │ ├── WBStatusLayout.h │ │ ├── WBStatusLayout.m │ │ ├── WBStatusTimelineViewController.h │ │ ├── WBStatusTimelineViewController.m │ │ ├── YYAppDelegate.h │ │ ├── YYAppDelegate.m │ │ ├── YYBPGCoder.h │ │ ├── YYBPGCoder.m │ │ ├── YYControl.h │ │ ├── YYControl.m │ │ ├── YYFPSLabel.h │ │ ├── YYFPSLabel.m │ │ ├── YYFeedListExample.h │ │ ├── YYFeedListExample.m │ │ ├── YYImageBenchmark.h │ │ ├── YYImageBenchmark.m │ │ ├── YYImageDisplayExample.h │ │ ├── YYImageDisplayExample.m │ │ ├── YYImageExample.h │ │ ├── YYImageExample.m │ │ ├── YYImageExampleHelper.h │ │ ├── YYImageExampleHelper.m │ │ ├── YYImageProgressiveExample.h │ │ ├── YYImageProgressiveExample.m │ │ ├── YYKeychainExample.h │ │ ├── YYKeychainExample.m │ │ ├── YYModelExample.h │ │ ├── YYModelExample.m │ │ ├── YYPhotoGroupView.h │ │ ├── YYPhotoGroupView.m │ │ ├── YYRootViewController.h │ │ ├── YYRootViewController.m │ │ ├── YYSimpleWebViewController.h │ │ ├── YYSimpleWebViewController.m │ │ ├── YYTableView.h │ │ ├── YYTableView.m │ │ ├── YYTableViewCell.h │ │ ├── YYTableViewCell.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 │ │ ├── YYUtilityExample.h │ │ ├── YYUtilityExample.m │ │ ├── YYWebImageExample.h │ │ ├── YYWebImageExample.m │ │ ├── main.m │ │ ├── twitter_0.json │ │ ├── twitter_1.json │ │ ├── twitter_2.json │ │ ├── twitter_3.json │ │ ├── weibo_0.json │ │ ├── weibo_1.json │ │ ├── weibo_2.json │ │ ├── weibo_3.json │ │ ├── weibo_4.json │ │ ├── weibo_5.json │ │ ├── weibo_6.json │ │ ├── weibo_7.json │ │ └── zh-Hans.lproj/ │ │ └── LaunchScreen.xib │ └── YYKitDemo.xcodeproj/ │ ├── project.pbxproj │ ├── project.xcworkspace/ │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata/ │ └── xcschemes/ │ └── YYKitExample.xcscheme ├── Framework/ │ ├── Info.plist │ └── YYKit.xcodeproj/ │ ├── project.pbxproj │ ├── project.xcworkspace/ │ │ └── contents.xcworkspacedata │ └── xcshareddata/ │ └── xcschemes/ │ └── YYKit.xcscheme ├── LICENSE ├── README.md ├── Vendor/ │ ├── WebP.framework/ │ │ ├── Headers/ │ │ │ ├── config.h │ │ │ ├── decode.h │ │ │ ├── demux.h │ │ │ ├── encode.h │ │ │ ├── extras.h │ │ │ ├── format_constants.h │ │ │ ├── mux.h │ │ │ ├── mux_types.h │ │ │ └── types.h │ │ └── WebP │ ├── WebP.sh │ └── bpg.framework/ │ ├── Headers/ │ │ └── libbpg.h │ └── bpg ├── YYKit/ │ ├── Base/ │ │ ├── Foundation/ │ │ │ ├── NSArray+YYAdd.h │ │ │ ├── NSArray+YYAdd.m │ │ │ ├── NSBundle+YYAdd.h │ │ │ ├── NSBundle+YYAdd.m │ │ │ ├── NSData+YYAdd.h │ │ │ ├── NSData+YYAdd.m │ │ │ ├── NSDate+YYAdd.h │ │ │ ├── NSDate+YYAdd.m │ │ │ ├── NSDictionary+YYAdd.h │ │ │ ├── NSDictionary+YYAdd.m │ │ │ ├── NSKeyedUnarchiver+YYAdd.h │ │ │ ├── NSKeyedUnarchiver+YYAdd.m │ │ │ ├── NSNotificationCenter+YYAdd.h │ │ │ ├── NSNotificationCenter+YYAdd.m │ │ │ ├── NSNumber+YYAdd.h │ │ │ ├── NSNumber+YYAdd.m │ │ │ ├── NSObject+YYAdd.h │ │ │ ├── NSObject+YYAdd.m │ │ │ ├── NSObject+YYAddForARC.h │ │ │ ├── NSObject+YYAddForARC.m │ │ │ ├── NSObject+YYAddForKVO.h │ │ │ ├── NSObject+YYAddForKVO.m │ │ │ ├── NSString+YYAdd.h │ │ │ ├── NSString+YYAdd.m │ │ │ ├── NSThread+YYAdd.h │ │ │ ├── NSThread+YYAdd.m │ │ │ ├── NSTimer+YYAdd.h │ │ │ └── NSTimer+YYAdd.m │ │ ├── Quartz/ │ │ │ ├── CALayer+YYAdd.h │ │ │ ├── CALayer+YYAdd.m │ │ │ ├── YYCGUtilities.h │ │ │ └── YYCGUtilities.m │ │ ├── UIKit/ │ │ │ ├── UIApplication+YYAdd.h │ │ │ ├── UIApplication+YYAdd.m │ │ │ ├── UIBarButtonItem+YYAdd.h │ │ │ ├── UIBarButtonItem+YYAdd.m │ │ │ ├── UIBezierPath+YYAdd.h │ │ │ ├── UIBezierPath+YYAdd.m │ │ │ ├── UIColor+YYAdd.h │ │ │ ├── UIColor+YYAdd.m │ │ │ ├── UIControl+YYAdd.h │ │ │ ├── UIControl+YYAdd.m │ │ │ ├── UIDevice+YYAdd.h │ │ │ ├── UIDevice+YYAdd.m │ │ │ ├── UIFont+YYAdd.h │ │ │ ├── UIFont+YYAdd.m │ │ │ ├── UIGestureRecognizer+YYAdd.h │ │ │ ├── UIGestureRecognizer+YYAdd.m │ │ │ ├── UIImage+YYAdd.h │ │ │ ├── UIImage+YYAdd.m │ │ │ ├── UIScreen+YYAdd.h │ │ │ ├── UIScreen+YYAdd.m │ │ │ ├── UIScrollView+YYAdd.h │ │ │ ├── UIScrollView+YYAdd.m │ │ │ ├── UITableView+YYAdd.h │ │ │ ├── UITableView+YYAdd.m │ │ │ ├── UITextField+YYAdd.h │ │ │ ├── UITextField+YYAdd.m │ │ │ ├── UIView+YYAdd.h │ │ │ └── UIView+YYAdd.m │ │ └── YYKitMacro.h │ ├── Cache/ │ │ ├── YYCache.h │ │ ├── YYCache.m │ │ ├── YYDiskCache.h │ │ ├── YYDiskCache.m │ │ ├── YYKVStorage.h │ │ ├── YYKVStorage.m │ │ ├── YYMemoryCache.h │ │ └── YYMemoryCache.m │ ├── Image/ │ │ ├── Categories/ │ │ │ ├── CALayer+YYWebImage.h │ │ │ ├── CALayer+YYWebImage.m │ │ │ ├── MKAnnotationView+YYWebImage.h │ │ │ ├── MKAnnotationView+YYWebImage.m │ │ │ ├── UIButton+YYWebImage.h │ │ │ ├── UIButton+YYWebImage.m │ │ │ ├── UIImageView+YYWebImage.h │ │ │ ├── UIImageView+YYWebImage.m │ │ │ ├── _YYWebImageSetter.h │ │ │ └── _YYWebImageSetter.m │ │ ├── YYAnimatedImageView.h │ │ ├── YYAnimatedImageView.m │ │ ├── YYFrameImage.h │ │ ├── YYFrameImage.m │ │ ├── YYImage.h │ │ ├── YYImage.m │ │ ├── YYImageCache.h │ │ ├── YYImageCache.m │ │ ├── YYImageCoder.h │ │ ├── YYImageCoder.m │ │ ├── YYSpriteSheetImage.h │ │ ├── YYSpriteSheetImage.m │ │ ├── YYWebImageManager.h │ │ ├── YYWebImageManager.m │ │ ├── YYWebImageOperation.h │ │ └── YYWebImageOperation.m │ ├── Model/ │ │ ├── NSObject+YYModel.h │ │ ├── NSObject+YYModel.m │ │ ├── YYClassInfo.h │ │ └── YYClassInfo.m │ ├── Text/ │ │ ├── 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/ │ │ │ ├── NSAttributedString+YYText.h │ │ │ ├── NSAttributedString+YYText.m │ │ │ ├── NSParagraphStyle+YYText.h │ │ │ ├── NSParagraphStyle+YYText.m │ │ │ ├── UIPasteboard+YYText.h │ │ │ ├── UIPasteboard+YYText.m │ │ │ ├── YYTextArchiver.h │ │ │ ├── YYTextArchiver.m │ │ │ ├── YYTextAttribute.h │ │ │ ├── YYTextAttribute.m │ │ │ ├── YYTextParser.h │ │ │ ├── YYTextParser.m │ │ │ ├── YYTextRubyAnnotation.h │ │ │ ├── YYTextRubyAnnotation.m │ │ │ ├── YYTextRunDelegate.h │ │ │ ├── YYTextRunDelegate.m │ │ │ ├── YYTextUtilities.h │ │ │ └── YYTextUtilities.m │ │ ├── YYLabel.h │ │ ├── YYLabel.m │ │ ├── YYTextView.h │ │ └── YYTextView.m │ ├── Utility/ │ │ ├── YYAsyncLayer.h │ │ ├── YYAsyncLayer.m │ │ ├── YYDispatchQueuePool.h │ │ ├── YYDispatchQueuePool.m │ │ ├── YYFileHash.h │ │ ├── YYFileHash.m │ │ ├── YYGestureRecognizer.h │ │ ├── YYGestureRecognizer.m │ │ ├── YYKeychain.h │ │ ├── YYKeychain.m │ │ ├── YYReachability.h │ │ ├── YYReachability.m │ │ ├── YYSentinel.h │ │ ├── YYSentinel.m │ │ ├── YYThreadSafeArray.h │ │ ├── YYThreadSafeArray.m │ │ ├── YYThreadSafeDictionary.h │ │ ├── YYThreadSafeDictionary.m │ │ ├── YYTimer.h │ │ ├── YYTimer.m │ │ ├── YYTransaction.h │ │ ├── YYTransaction.m │ │ ├── YYWeakProxy.h │ │ └── YYWeakProxy.m │ └── YYKit.h └── YYKit.podspec
SYMBOL INDEX (150 symbols across 14 files)
FILE: Demo/YYKitDemo/WBStatusComposeViewController.h
type WBStatusComposeViewTypeStatus (line 11) | typedef NS_ENUM(NSUInteger, WBStatusComposeViewType) {
FILE: Vendor/WebP.framework/Headers/decode.h
type WebPRGBABuffer (line 29) | typedef struct WebPRGBABuffer WebPRGBABuffer;
type WebPYUVABuffer (line 30) | typedef struct WebPYUVABuffer WebPYUVABuffer;
type WebPDecBuffer (line 31) | typedef struct WebPDecBuffer WebPDecBuffer;
type WebPIDecoder (line 32) | typedef struct WebPIDecoder WebPIDecoder;
type WebPBitstreamFeatures (line 33) | typedef struct WebPBitstreamFeatures WebPBitstreamFeatures;
type WebPDecoderOptions (line 34) | typedef struct WebPDecoderOptions WebPDecoderOptions;
type WebPDecoderConfig (line 35) | typedef struct WebPDecoderConfig WebPDecoderConfig;
type WEBP_CSP_MODE (line 146) | typedef enum WEBP_CSP_MODE {
function WEBP_INLINE (line 162) | static WEBP_INLINE int WebPIsPremultipliedMode(WEBP_CSP_MODE mode) {
function WEBP_INLINE (line 167) | static WEBP_INLINE int WebPIsAlphaMode(WEBP_CSP_MODE mode) {
function WEBP_INLINE (line 173) | static WEBP_INLINE int WebPIsRGBMode(WEBP_CSP_MODE mode) {
type WebPRGBABuffer (line 180) | struct WebPRGBABuffer { // view as RGBA
type WebPYUVABuffer (line 186) | struct WebPYUVABuffer { // view as YUVA
type WebPDecBuffer (line 197) | struct WebPDecBuffer {
function WEBP_INLINE (line 217) | static WEBP_INLINE int WebPInitDecBuffer(WebPDecBuffer* buffer) {
type VP8StatusCode (line 228) | typedef enum VP8StatusCode {
function WEBP_INLINE (line 355) | static WEBP_INLINE uint8_t* WebPIDecGetYUV(
type WebPBitstreamFeatures (line 405) | struct WebPBitstreamFeatures {
function WEBP_INLINE (line 424) | static WEBP_INLINE VP8StatusCode WebPGetFeatures(
type WebPDecoderOptions (line 432) | struct WebPDecoderOptions {
type WebPDecoderConfig (line 450) | struct WebPDecoderConfig {
function WEBP_INLINE (line 462) | static WEBP_INLINE int WebPInitDecoderConfig(WebPDecoderConfig* config) {
FILE: Vendor/WebP.framework/Headers/demux.h
type WebPDemuxer (line 64) | typedef struct WebPDemuxer WebPDemuxer;
type WebPIterator (line 65) | typedef struct WebPIterator WebPIterator;
type WebPChunkIterator (line 66) | typedef struct WebPChunkIterator WebPChunkIterator;
type WebPAnimInfo (line 67) | typedef struct WebPAnimInfo WebPAnimInfo;
type WebPAnimDecoderOptions (line 68) | typedef struct WebPAnimDecoderOptions WebPAnimDecoderOptions;
type WebPDemuxState (line 79) | typedef enum WebPDemuxState {
function WEBP_INLINE (line 94) | static WEBP_INLINE WebPDemuxer* WebPDemux(const WebPData* data) {
function WEBP_INLINE (line 106) | static WEBP_INLINE WebPDemuxer* WebPDemuxPartial(
type WebPFormatFeature (line 117) | typedef enum WebPFormatFeature {
type WebPIterator (line 138) | struct WebPIterator {
type WebPChunkIterator (line 180) | struct WebPChunkIterator {
type WebPAnimDecoder (line 243) | typedef struct WebPAnimDecoder WebPAnimDecoder;
type WebPAnimDecoderOptions (line 246) | struct WebPAnimDecoderOptions {
function WEBP_INLINE (line 262) | static WEBP_INLINE int WebPAnimDecoderOptionsInit(
function WEBP_INLINE (line 282) | static WEBP_INLINE WebPAnimDecoder* WebPAnimDecoderNew(
type WebPAnimInfo (line 289) | struct WebPAnimInfo {
FILE: Vendor/WebP.framework/Headers/encode.h
type WebPConfig (line 31) | typedef struct WebPConfig WebPConfig;
type WebPPicture (line 32) | typedef struct WebPPicture WebPPicture;
type WebPAuxStats (line 33) | typedef struct WebPAuxStats WebPAuxStats;
type WebPMemoryWriter (line 34) | typedef struct WebPMemoryWriter WebPMemoryWriter;
type WebPImageHint (line 85) | typedef enum WebPImageHint {
type WebPConfig (line 94) | struct WebPConfig {
type WebPPreset (line 154) | typedef enum WebPPreset {
function WEBP_INLINE (line 170) | static WEBP_INLINE int WebPConfigInit(WebPConfig* config) {
function WEBP_INLINE (line 179) | static WEBP_INLINE int WebPConfigPreset(WebPConfig* config,
type WebPAuxStats (line 201) | struct WebPAuxStats {
type WebPMemoryWriter (line 239) | struct WebPMemoryWriter {
type WebPEncCSP (line 264) | typedef enum WebPEncCSP {
type WebPEncodingError (line 273) | typedef enum WebPEncodingError {
type WebPPicture (line 292) | struct WebPPicture {
function WEBP_INLINE (line 365) | static WEBP_INLINE int WebPPictureInit(WebPPicture* picture) {
FILE: Vendor/WebP.framework/Headers/format_constants.h
type VP8LImageTransformType (line 55) | typedef enum {
FILE: Vendor/WebP.framework/Headers/mux.h
type WebPMux (line 67) | typedef struct WebPMux WebPMux;
type WebPMuxFrameInfo (line 68) | typedef struct WebPMuxFrameInfo WebPMuxFrameInfo;
type WebPMuxAnimParams (line 69) | typedef struct WebPMuxAnimParams WebPMuxAnimParams;
type WebPAnimEncoderOptions (line 70) | typedef struct WebPAnimEncoderOptions WebPAnimEncoderOptions;
type WebPMuxError (line 73) | typedef enum WebPMuxError {
type WebPChunkId (line 83) | typedef enum WebPChunkId {
function WEBP_INLINE (line 113) | static WEBP_INLINE WebPMux* WebPMuxNew(void) {
function WEBP_INLINE (line 136) | static WEBP_INLINE WebPMux* WebPMuxCreate(const WebPData* bitstream,
type WebPMuxFrameInfo (line 199) | struct WebPMuxFrameInfo {
type WebPMuxAnimParams (line 282) | struct WebPMuxAnimParams {
type WebPAnimEncoder (line 418) | typedef struct WebPAnimEncoder WebPAnimEncoder;
type WebPPicture (line 421) | struct WebPPicture
type WebPConfig (line 422) | struct WebPConfig
type WebPAnimEncoderOptions (line 425) | struct WebPAnimEncoderOptions {
function WEBP_INLINE (line 452) | static WEBP_INLINE int WebPAnimEncoderOptionsInit(
function WEBP_INLINE (line 469) | static WEBP_INLINE WebPAnimEncoder* WebPAnimEncoderNew(
type WebPPicture (line 494) | struct WebPPicture
type WebPConfig (line 495) | struct WebPConfig
FILE: Vendor/WebP.framework/Headers/mux_types.h
type WebPData (line 30) | typedef struct WebPData WebPData;
type WebPFeatureFlags (line 33) | typedef enum WebPFeatureFlags {
type WebPMuxAnimDispose (line 44) | typedef enum WebPMuxAnimDispose {
type WebPMuxAnimBlend (line 51) | typedef enum WebPMuxAnimBlend {
type WebPData (line 58) | struct WebPData {
function WEBP_INLINE (line 64) | static WEBP_INLINE void WebPDataInit(WebPData* webp_data) {
function WEBP_INLINE (line 72) | static WEBP_INLINE void WebPDataClear(WebPData* webp_data) {
function WEBP_INLINE (line 81) | static WEBP_INLINE int WebPDataCopy(const WebPData* src, WebPData* dst) {
FILE: Vendor/bpg.framework/Headers/libbpg.h
type BPGDecoderContext (line 27) | typedef struct BPGDecoderContext BPGDecoderContext;
type BPGImageFormatEnum (line 29) | typedef enum {
type BPGColorSpaceEnum (line 38) | typedef enum {
type BPGImageInfo (line 48) | typedef struct {
type BPGExtensionTagEnum (line 62) | typedef enum {
type BPGExtensionData (line 70) | typedef struct BPGExtensionData {
type BPGDecoderOutputFormat (line 77) | typedef enum {
FILE: YYKit/Base/Quartz/YYCGUtilities.h
function CGFloat (line 44) | static inline CGFloat DegreesToRadians(CGFloat degrees) {
function CGFloat (line 49) | static inline CGFloat RadiansToDegrees(CGFloat radians) {
function CGFloat (line 57) | static inline CGFloat CGAffineTransformGetRotation(CGAffineTransform tra...
function CGFloat (line 62) | static inline CGFloat CGAffineTransformGetScaleX(CGAffineTransform trans...
function CGFloat (line 67) | static inline CGFloat CGAffineTransformGetScaleY(CGAffineTransform trans...
function CGFloat (line 72) | static inline CGFloat CGAffineTransformGetTranslateX(CGAffineTransform t...
function CGFloat (line 77) | static inline CGFloat CGAffineTransformGetTranslateY(CGAffineTransform t...
function CGAffineTransform (line 96) | static inline CGAffineTransform CGAffineTransformMakeSkew(CGFloat x, CGF...
function UIEdgeInsets (line 104) | static inline UIEdgeInsets UIEdgeInsetsInvert(UIEdgeInsets insets) {
function CGPoint (line 128) | static inline CGPoint CGRectGetCenter(CGRect rect) {
function CGFloat (line 133) | static inline CGFloat CGRectGetArea(CGRect rect) {
function CGFloat (line 140) | static inline CGFloat CGPointGetDistanceToPoint(CGPoint p1, CGPoint p2) {
function CGFloat (line 145) | static inline CGFloat CGPointGetDistanceToRect(CGPoint p, CGRect r) {
function CGFloat (line 165) | static inline CGFloat CGFloatToPixel(CGFloat value) {
function CGFloat (line 170) | static inline CGFloat CGFloatFromPixel(CGFloat value) {
function CGFloat (line 177) | static inline CGFloat CGFloatPixelFloor(CGFloat value) {
function CGFloat (line 183) | static inline CGFloat CGFloatPixelRound(CGFloat value) {
function CGFloat (line 189) | static inline CGFloat CGFloatPixelCeil(CGFloat value) {
function CGFloat (line 195) | static inline CGFloat CGFloatPixelHalf(CGFloat value) {
function CGPoint (line 203) | static inline CGPoint CGPointPixelFloor(CGPoint point) {
function CGPoint (line 210) | static inline CGPoint CGPointPixelRound(CGPoint point) {
function CGPoint (line 217) | static inline CGPoint CGPointPixelCeil(CGPoint point) {
function CGPoint (line 224) | static inline CGPoint CGPointPixelHalf(CGPoint point) {
function CGSize (line 233) | static inline CGSize CGSizePixelFloor(CGSize size) {
function CGSize (line 240) | static inline CGSize CGSizePixelRound(CGSize size) {
function CGSize (line 247) | static inline CGSize CGSizePixelCeil(CGSize size) {
function CGSize (line 254) | static inline CGSize CGSizePixelHalf(CGSize size) {
function CGRect (line 263) | static inline CGRect CGRectPixelFloor(CGRect rect) {
function CGRect (line 274) | static inline CGRect CGRectPixelRound(CGRect rect) {
function CGRect (line 282) | static inline CGRect CGRectPixelCeil(CGRect rect) {
function CGRect (line 290) | static inline CGRect CGRectPixelHalf(CGRect rect) {
function UIEdgeInsets (line 300) | static inline UIEdgeInsets UIEdgeInsetPixelFloor(UIEdgeInsets insets) {
function UIEdgeInsets (line 309) | static inline UIEdgeInsets UIEdgeInsetPixelCeil(UIEdgeInsets insets) {
FILE: YYKit/Base/YYKitMacro.h
function NSRange (line 176) | static inline NSRange YYNSRangeFromCFRange(CFRange range) {
function CFRange (line 184) | static inline CFRange YYCFRangeFromNSRange(NSRange range) {
function CFTypeRef (line 192) | static inline CFTypeRef YYCFAutorelease(CFTypeRef CF_RELEASES_ARGUMENT a...
function YYBenchmark (line 214) | static inline void YYBenchmark(void (^block)(void), void (^complete)(dou...
function NSDate (line 235) | static inline NSDate *_YYCompileTime(const char *data, const char *time) {
function dispatch_time_t (line 256) | static inline dispatch_time_t dispatch_time_delay(NSTimeInterval second) {
function dispatch_time_t (line 263) | static inline dispatch_time_t dispatch_walltime_delay(NSTimeInterval sec...
function dispatch_time_t (line 270) | static inline dispatch_time_t dispatch_walltime_date(NSDate *date) {
function dispatch_is_main_queue (line 287) | static inline bool dispatch_is_main_queue() {
function dispatch_async_on_main_queue (line 294) | static inline void dispatch_async_on_main_queue(void (^block)()) {
function dispatch_sync_on_main_queue (line 305) | static inline void dispatch_sync_on_main_queue(void (^block)()) {
function pthread_mutex_init_recursive (line 316) | static inline void pthread_mutex_init_recursive(pthread_mutex_t *mutex, ...
FILE: YYKit/Image/YYWebImageManager.h
type UIImage (line 142) | typedef UIImage * _Nullable (^YYWebImageTransformBlock)(UIImage *image, ...
FILE: YYKit/Text/Component/YYTextKeyboardManager.h
function NS_ASSUME_NONNULL_BEGIN (line 14) | NS_ASSUME_NONNULL_BEGIN
FILE: YYKit/Text/String/YYTextUtilities.h
function BOOL (line 34) | static inline BOOL YYTextIsLinebreakChar(unichar c) {
function BOOL (line 57) | static inline BOOL YYTextIsLinebreakString(NSString * _Nullable str) {
function NSUInteger (line 73) | static inline NSUInteger YYTextLinebreakTailLength(NSString * _Nullable ...
function NSTextCheckingType (line 96) | static inline NSTextCheckingType NSTextCheckingTypeFromUIDataDetectorTyp...
function BOOL (line 111) | static inline BOOL UIFontIsEmoji(UIFont *font) {
function BOOL (line 121) | static inline BOOL CTFontIsEmoji(CTFontRef font) {
function BOOL (line 135) | static inline BOOL CGFontIsEmoji(CGFontRef font) {
function BOOL (line 150) | static inline BOOL CTFontContainsColorBitmapGlyphs(CTFontRef font) {
function BOOL (line 161) | static inline BOOL CGGlyphIsBitmap(CTFontRef font, CGGlyph glyph) {
function CGFloat (line 179) | static inline CGFloat YYEmojiGetAscentWithFontSize(CGFloat fontSize) {
function CGFloat (line 196) | static inline CGFloat YYEmojiGetDescentWithFontSize(CGFloat fontSize) {
function CGRect (line 214) | static inline CGRect YYEmojiGetGlyphBoundingRectWithFontSize(CGFloat fon...
function UTF32CharToUTF16SurrogatePair (line 234) | static inline void UTF32CharToUTF16SurrogatePair(UTF32Char char32, UTF16...
function UTF32Char (line 246) | static inline UTF32Char UTF16SurrogatePairToUTF32Char(UTF16Char char16[_...
FILE: YYKit/Utility/YYReachability.h
type sockaddr (line 56) | struct sockaddr
Condensed preview — 310 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (9,557K chars).
[
{
"path": ".gitignore",
"chars": 1430,
"preview": "# OS X\n.DS_Store\n\n# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore &"
},
{
"path": ".travis.yml",
"chars": 318,
"preview": "language: objective-c\nosx_image: xcode8\nxcode_project: Framework/YYKit.xcodeproj\nxcode_scheme: YYKit\n\nbefore_install:\n- "
},
{
"path": "Demo/YYKitDemo/Base.lproj/LaunchScreen.xib",
"chars": 2498,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" versi"
},
{
"path": "Demo/YYKitDemo/EmoticonQQ.bundle/info.plist",
"chars": 8163,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Demo/YYKitDemo/EmoticonWeibo.bundle/additional/DisplayOnly/com.sina.emotions2015-04/info.json",
"chars": 2095,
"preview": "{\"id\":\"com.sina.emotions2015-04\",\"version\":8,\"display_only\":1,\"emoticons\":[{\"chs\":\"[\\u7f8a\\u5e74\\u5927\\u5409]\",\"cht\":\"[\\"
},
{
"path": "Demo/YYKitDemo/EmoticonWeibo.bundle/additional/DisplayOnly/com.sina.emotions2015-05/info.json",
"chars": 841,
"preview": "{\"id\":\"com.sina.emotions2015-05\",\"version\":5,\"display_only\":1,\"emoticons\":[{\"chs\":\"[\\u7f9e\\u7f9e\\u54d2\\u751c\\u99a8]\",\"ch"
},
{
"path": "Demo/YYKitDemo/EmoticonWeibo.bundle/additional/DisplayOnly/com.sina.emotions2015-06/info.json",
"chars": 2074,
"preview": "{\"id\":\"com.sina.emotions2015-06\",\"version\":13,\"display_only\":1,\"emoticons\":[{\"chs\":\"[\\u9759\\u9999\\u5fae\\u7b11]\",\"cht\":\"["
},
{
"path": "Demo/YYKitDemo/EmoticonWeibo.bundle/additional/DisplayOnly/com.sina.emotions2015-07/info.json",
"chars": 1783,
"preview": "{\"id\":\"com.sina.emotions2015-07\",\"version\":10,\"display_only\":1,\"emoticons\":[{\"chs\":\"[\\u751c\\u99a8\\u70ed\\u70ed]\",\"cht\":\"["
},
{
"path": "Demo/YYKitDemo/EmoticonWeibo.bundle/additional/DisplayOnly/com.sina.emotions2015-08/info.json",
"chars": 784,
"preview": "{\"id\":\"com.sina.emotions2015-08\",\"version\":5,\"display_only\":1,\"emoticons\":[{\"chs\":\"[\\u771f\\u5fc3\\u82f1\\u96c4\\u9648\\u5b66"
},
{
"path": "Demo/YYKitDemo/EmoticonWeibo.bundle/additional/com.sina.default/info.json",
"chars": 976,
"preview": "{\"id\":\"com.sina.default\",\"version\":44,\"display_only\":0,\"group_type\":0,\"group_name\":\"\",\"group_name_cn\":\"\",\"group_name_en\""
},
{
"path": "Demo/YYKitDemo/EmoticonWeibo.bundle/com.apple.emoji/info.plist",
"chars": 9107,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Demo/YYKitDemo/EmoticonWeibo.bundle/com.sina.default/info.plist",
"chars": 25624,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Demo/YYKitDemo/EmoticonWeibo.bundle/com.sina.lxh/info.plist",
"chars": 10852,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Demo/YYKitDemo/EmoticonWeibo.bundle/emoticons.plist",
"chars": 769,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Demo/YYKitDemo/Info.plist",
"chars": 1804,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Demo/YYKitDemo/T1Helper.h",
"chars": 592,
"preview": "//\n// T1Helper.h\n// YYKitExample\n//\n// Created by ibireme on 15/10/10.\n// Copyright (C) 2015 ibireme. All rights res"
},
{
"path": "Demo/YYKitDemo/T1Helper.m",
"chars": 3056,
"preview": "//\n// T1Helper.m\n// YYKitExample\n//\n// Created by ibireme on 15/10/10.\n// Copyright (C) 2015 ibireme. All rights res"
},
{
"path": "Demo/YYKitDemo/T1HomeTimelineItemsViewController.h",
"chars": 250,
"preview": "//\n// T1HomeTimelineItemsViewController.h\n// YYKitExample\n//\n// Created by ibireme on 15/10/9.\n// Copyright (C) 2015"
},
{
"path": "Demo/YYKitDemo/T1HomeTimelineItemsViewController.m",
"chars": 10328,
"preview": "//\n// T1HomeTimelineItemsViewController.m\n// YYKitExample\n//\n// Created by ibireme on 15/10/9.\n// Copyright (C) 2015"
},
{
"path": "Demo/YYKitDemo/T1Model.h",
"chars": 9779,
"preview": "//\n// T1Model.h\n// YYKitExample\n//\n// Created by ibireme on 15/10/9.\n// Copyright (C) 2015 ibireme. All rights reser"
},
{
"path": "Demo/YYKitDemo/T1Model.m",
"chars": 14228,
"preview": "//\n// T1Model.m\n// YYKitExample\n//\n// Created by ibireme on 15/10/9.\n// Copyright (C) 2015 ibireme. All rights reser"
},
{
"path": "Demo/YYKitDemo/T1StatusCell.h",
"chars": 2973,
"preview": "//\n// T1StatusCell.h\n// YYKitExample\n//\n// Created by ibireme on 15/10/9.\n// Copyright (C) 2015 ibireme. All rights "
},
{
"path": "Demo/YYKitDemo/T1StatusCell.m",
"chars": 31085,
"preview": "//\n// T1StatusCell.m\n// YYKitExample\n//\n// Created by ibireme on 15/10/9.\n// Copyright (C) 2015 ibireme. All rights "
},
{
"path": "Demo/YYKitDemo/T1StatusLayout.h",
"chars": 2805,
"preview": "//\n// T1StatusLayout.h\n// YYKitExample\n//\n// Created by guoyaoyuan on 15/10/10.\n// Copyright (C) 2015 ibireme. All r"
},
{
"path": "Demo/YYKitDemo/T1StatusLayout.m",
"chars": 12850,
"preview": "//\n// T1StatusLayout.m\n// YYKitExample\n//\n// Created by guoyaoyuan on 15/10/10.\n// Copyright (C) 2015 ibireme. All r"
},
{
"path": "Demo/YYKitDemo/WBEmoticonInputView.h",
"chars": 496,
"preview": "//\n// WBStatusComposeEmoticonView.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/6.\n// Copyright (C) 2015 ibirem"
},
{
"path": "Demo/YYKitDemo/WBEmoticonInputView.m",
"chars": 19295,
"preview": "//\n// WBStatusComposeEmoticonView.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/6.\n// Copyright (C) 2015 ibirem"
},
{
"path": "Demo/YYKitDemo/WBModel.h",
"chars": 13496,
"preview": "//\n// WBModel.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/4.\n// Copyright (c) 2015 ibireme. All rights reserv"
},
{
"path": "Demo/YYKitDemo/WBModel.m",
"chars": 9968,
"preview": "//\n// WBModel.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/4.\n// Copyright (c) 2015 ibireme. All rights reserv"
},
{
"path": "Demo/YYKitDemo/WBStatusCell.h",
"chars": 4704,
"preview": "//\n// WBFeedCell.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/5.\n// Copyright (c) 2015 ibireme. All rights res"
},
{
"path": "Demo/YYKitDemo/WBStatusCell.m",
"chars": 40027,
"preview": "//\n// WBFeedCell.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/5.\n// Copyright (c) 2015 ibireme. All rights res"
},
{
"path": "Demo/YYKitDemo/WBStatusComposeTextParser.h",
"chars": 420,
"preview": "//\n// WBStatusComposeTextParser.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/5.\n// Copyright (C) 2015 ibireme."
},
{
"path": "Demo/YYKitDemo/WBStatusComposeTextParser.m",
"chars": 10417,
"preview": "//\n// WBStatusComposeTextParser.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/5.\n// Copyright (C) 2015 ibireme."
},
{
"path": "Demo/YYKitDemo/WBStatusComposeViewController.h",
"chars": 555,
"preview": "//\n// WBStatusComposeViewController.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/8.\n// Copyright (c) 2015 ibir"
},
{
"path": "Demo/YYKitDemo/WBStatusComposeViewController.m",
"chars": 12896,
"preview": "//\n// WBStatusComposeViewController.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/8.\n// Copyright (c) 2015 ibir"
},
{
"path": "Demo/YYKitDemo/WBStatusHelper.h",
"chars": 1143,
"preview": "//\n// WBFeedHelper.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/5.\n// Copyright (c) 2015 ibireme. All rights r"
},
{
"path": "Demo/YYKitDemo/WBStatusHelper.m",
"chars": 12780,
"preview": "//\n// WBFeedHelper.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/5.\n// Copyright (c) 2015 ibireme. All rights r"
},
{
"path": "Demo/YYKitDemo/WBStatusLayout.h",
"chars": 7114,
"preview": "//\n// WBFeedLayout.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/5.\n// Copyright (c) 2015 ibireme. All rights r"
},
{
"path": "Demo/YYKitDemo/WBStatusLayout.m",
"chars": 35668,
"preview": "//\n// WBFeedLayout.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/5.\n// Copyright (c) 2015 ibireme. All rights r"
},
{
"path": "Demo/YYKitDemo/WBStatusTimelineViewController.h",
"chars": 247,
"preview": "//\n// YYWeiboFeedListController.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/4.\n// Copyright (c) 2015 ibireme."
},
{
"path": "Demo/YYKitDemo/WBStatusTimelineViewController.m",
"chars": 13090,
"preview": "//\n// YYWeiboFeedListController.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/4.\n// Copyright (c) 2015 ibireme."
},
{
"path": "Demo/YYKitDemo/YYAppDelegate.h",
"chars": 382,
"preview": "//\n// AppDelegate.h\n// YYKitExample\n//\n// Created by ibireme on 14-9-18.\n// Copyright (c) 2014 ibireme. All rights r"
},
{
"path": "Demo/YYKitDemo/YYAppDelegate.m",
"chars": 2101,
"preview": "//\n// AppDelegate.m\n// YYKitExample\n//\n// Created by ibireme on 14-9-18.\n// Copyright (c) 2014 ibireme. All rights r"
},
{
"path": "Demo/YYKitDemo/YYBPGCoder.h",
"chars": 1073,
"preview": "//\n// YYBPGCoder.h\n// YYKitExample\n//\n// Created by ibireme on 15/8/13.\n// Copyright (c) 2015 ibireme. All rights re"
},
{
"path": "Demo/YYKitDemo/YYBPGCoder.m",
"chars": 9726,
"preview": "//\n// YYBPGCoder.m\n// YYKitExample\n//\n// Created by ibireme on 15/8/13.\n// Copyright (c) 2015 ibireme. All rights re"
},
{
"path": "Demo/YYKitDemo/YYControl.h",
"chars": 468,
"preview": "//\n// YYControl.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/14.\n// Copyright (c) 2015 ibireme. All rights res"
},
{
"path": "Demo/YYKitDemo/YYControl.m",
"chars": 2402,
"preview": "//\n// YYControl.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/14.\n// Copyright (c) 2015 ibireme. All rights res"
},
{
"path": "Demo/YYKitDemo/YYFPSLabel.h",
"chars": 343,
"preview": "//\n// YYFPSLabel.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/3.\n// Copyright (c) 2015 ibireme. All rights res"
},
{
"path": "Demo/YYKitDemo/YYFPSLabel.m",
"chars": 2259,
"preview": "//\n// YYFPSLabel.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/3.\n// Copyright (c) 2015 ibireme. All rights res"
},
{
"path": "Demo/YYKitDemo/YYFeedListExample.h",
"chars": 222,
"preview": "//\n// YYFeedListExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/3.\n// Copyright (c) 2015 ibireme. All rig"
},
{
"path": "Demo/YYKitDemo/YYFeedListExample.m",
"chars": 2625,
"preview": "//\n// YYFeedListExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/3.\n// Copyright (c) 2015 ibireme. All rig"
},
{
"path": "Demo/YYKitDemo/YYImageBenchmark.h",
"chars": 226,
"preview": "//\n// YYImageProfileExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/8/10.\n// Copyright (c) 2015 ibireme. Al"
},
{
"path": "Demo/YYKitDemo/YYImageBenchmark.m",
"chars": 34325,
"preview": "//\n// YYImageProfileExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/8/10.\n// Copyright (c) 2015 ibireme. Al"
},
{
"path": "Demo/YYKitDemo/YYImageDisplayExample.h",
"chars": 225,
"preview": "//\n// YYImageDisplayExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/8/9.\n// Copyright (c) 2015 ibireme. All"
},
{
"path": "Demo/YYKitDemo/YYImageDisplayExample.m",
"chars": 5213,
"preview": "//\n// YYImageDisplayExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/8/9.\n// Copyright (c) 2015 ibireme. All"
},
{
"path": "Demo/YYKitDemo/YYImageExample.h",
"chars": 217,
"preview": "//\n// YYImageExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/7/18.\n// Copyright (c) 2015 ibireme. All right"
},
{
"path": "Demo/YYKitDemo/YYImageExample.m",
"chars": 1985,
"preview": "//\n// YYImageExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/7/18.\n// Copyright (c) 2015 ibireme. All right"
},
{
"path": "Demo/YYKitDemo/YYImageExampleHelper.h",
"chars": 436,
"preview": "//\n// YYImageExampleUtils.h\n// YYKitExample\n//\n// Created by ibireme on 15/7/20.\n// Copyright (c) 2015 ibireme. All "
},
{
"path": "Demo/YYKitDemo/YYImageExampleHelper.m",
"chars": 2675,
"preview": "//\n// YYImageExampleUtils.m\n// YYKitExample\n//\n// Created by ibireme on 15/7/20.\n// Copyright (c) 2015 ibireme. All "
},
{
"path": "Demo/YYKitDemo/YYImageProgressiveExample.h",
"chars": 234,
"preview": "//\n// YYImageProgressiveExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/8/24.\n// Copyright (c) 2015 ibireme"
},
{
"path": "Demo/YYKitDemo/YYImageProgressiveExample.m",
"chars": 3742,
"preview": "//\n// YYImageProgressiveExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/8/24.\n// Copyright (c) 2015 ibireme"
},
{
"path": "Demo/YYKitDemo/YYKeychainExample.h",
"chars": 212,
"preview": "//\n// YYKeychainExample.h\n// YYKitDemo\n//\n// Created by ibireme on 16/2/24.\n// Copyright 2016 ibireme. All rights r"
},
{
"path": "Demo/YYKitDemo/YYKeychainExample.m",
"chars": 8171,
"preview": "//\n// YYKeychainExample.m\n// YYKitDemo\n//\n// Created by ibireme on 16/2/24.\n// Copyright 2016 ibireme. All rights r"
},
{
"path": "Demo/YYKitDemo/YYModelExample.h",
"chars": 212,
"preview": "//\n// YYModelExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/7/18.\n// Copyright (c) 2015 ibireme. All right"
},
{
"path": "Demo/YYKitDemo/YYModelExample.m",
"chars": 6752,
"preview": "//\n// YYModelExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/7/18.\n// Copyright (c) 2015 ibireme. All right"
},
{
"path": "Demo/YYKitDemo/YYPhotoGroupView.h",
"chars": 1246,
"preview": "//\n// YYPhotoGroupView.h\n//\n// Created by ibireme on 14/3/9.\n// Copyright (C) 2014 ibireme. All rights reserved.\n//\n\n"
},
{
"path": "Demo/YYKitDemo/YYPhotoGroupView.m",
"chars": 31656,
"preview": "//\n// YYPhotoGroupView.m\n//\n// Created by ibireme on 14/3/9.\n// Copyright (C) 2014 ibireme. All rights reserved.\n//\n\n"
},
{
"path": "Demo/YYKitDemo/YYRootViewController.h",
"chars": 230,
"preview": "//\n// YERootViewController.h\n// YYKitExample\n//\n// Created by ibireme on 14-10-13.\n// Copyright (c) 2014 ibireme. Al"
},
{
"path": "Demo/YYKitDemo/YYRootViewController.m",
"chars": 2792,
"preview": "//\n// YERootViewController.m\n// YYKitExample\n//\n// Created by ibireme on 14-10-13.\n// Copyright (c) 2014 ibireme. Al"
},
{
"path": "Demo/YYKitDemo/YYSimpleWebViewController.h",
"chars": 277,
"preview": "//\n// YYSimpleWebViewController.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/11.\n// Copyright (c) 2015 ibireme"
},
{
"path": "Demo/YYKitDemo/YYSimpleWebViewController.m",
"chars": 962,
"preview": "//\n// YYSimpleWebViewController.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/11.\n// Copyright (c) 2015 ibireme"
},
{
"path": "Demo/YYKitDemo/YYTableView.h",
"chars": 200,
"preview": "//\n// YYTableView.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/7.\n// Copyright (c) 2015 ibireme. All rights re"
},
{
"path": "Demo/YYKitDemo/YYTableView.m",
"chars": 1168,
"preview": "//\n// YYTableView.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/7.\n// Copyright (c) 2015 ibireme. All rights re"
},
{
"path": "Demo/YYKitDemo/YYTableViewCell.h",
"chars": 213,
"preview": "//\n// YYTableViewCell.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/10.\n// Copyright (c) 2015 ibireme. All righ"
},
{
"path": "Demo/YYKitDemo/YYTableViewCell.m",
"chars": 862,
"preview": "//\n// YYTableViewCell.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/10.\n// Copyright (c) 2015 ibireme. All righ"
},
{
"path": "Demo/YYKitDemo/YYTextAsyncExample.h",
"chars": 219,
"preview": "//\n// YYTextAsyncExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/3.\n// Copyright (c) 2015 ibireme. All ri"
},
{
"path": "Demo/YYKitDemo/YYTextAsyncExample.m",
"chars": 6045,
"preview": "//\n// YYTextAsyncExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/3.\n// Copyright (c) 2015 ibireme. All ri"
},
{
"path": "Demo/YYKitDemo/YYTextAttachmentExample.h",
"chars": 230,
"preview": "//\n// YYTextAttachmentExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/8/21.\n// Copyright (c) 2015 ibireme. "
},
{
"path": "Demo/YYKitDemo/YYTextAttachmentExample.m",
"chars": 7174,
"preview": "//\n// YYTextAttachmentExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/8/21.\n// Copyright (c) 2015 ibireme. "
},
{
"path": "Demo/YYKitDemo/YYTextAttributeExample.h",
"chars": 228,
"preview": "//\n// YYTextAttributeExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/8/19.\n// Copyright (c) 2015 ibireme. A"
},
{
"path": "Demo/YYKitDemo/YYTextAttributeExample.m",
"chars": 11660,
"preview": "//\n// YYTextAttributeExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/8/19.\n// Copyright (c) 2015 ibireme. A"
},
{
"path": "Demo/YYKitDemo/YYTextBindingExample.h",
"chars": 223,
"preview": "//\n// YYTextBindingExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/3.\n// Copyright (c) 2015 ibireme. All "
},
{
"path": "Demo/YYKitDemo/YYTextBindingExample.m",
"chars": 3816,
"preview": "//\n// YYTextBindingExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/3.\n// Copyright (c) 2015 ibireme. All "
},
{
"path": "Demo/YYKitDemo/YYTextCopyPasteExample.h",
"chars": 228,
"preview": "//\n// YYTextCopyPasteExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/12.\n// Copyright (c) 2015 ibireme. A"
},
{
"path": "Demo/YYKitDemo/YYTextCopyPasteExample.m",
"chars": 2454,
"preview": "//\n// YYTextCopyPasteExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/12.\n// Copyright (c) 2015 ibireme. A"
},
{
"path": "Demo/YYKitDemo/YYTextEditExample.h",
"chars": 217,
"preview": "//\n// YYTextEditExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/3.\n// Copyright (c) 2015 ibireme. All rig"
},
{
"path": "Demo/YYKitDemo/YYTextEditExample.m",
"chars": 8508,
"preview": "//\n// YYTextEditExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/3.\n// Copyright (c) 2015 ibireme. All rig"
},
{
"path": "Demo/YYKitDemo/YYTextEmoticonExample.h",
"chars": 225,
"preview": "//\n// YYTextEmoticonExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/3.\n// Copyright (c) 2015 ibireme. All"
},
{
"path": "Demo/YYKitDemo/YYTextEmoticonExample.m",
"chars": 3345,
"preview": "//\n// YYTextEmoticonExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/3.\n// Copyright (c) 2015 ibireme. All"
},
{
"path": "Demo/YYKitDemo/YYTextExample.h",
"chars": 215,
"preview": "//\n// YYTextExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/7/18.\n// Copyright (c) 2015 ibireme. All rights"
},
{
"path": "Demo/YYKitDemo/YYTextExample.m",
"chars": 2443,
"preview": "//\n// YYTextExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/7/18.\n// Copyright (c) 2015 ibireme. All rights"
},
{
"path": "Demo/YYKitDemo/YYTextExampleHelper.h",
"chars": 323,
"preview": "//\n// YYTextExampleHelper.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/3.\n// Copyright (c) 2015 ibireme. All r"
},
{
"path": "Demo/YYKitDemo/YYTextExampleHelper.m",
"chars": 1535,
"preview": "//\n// YYTextExampleHelper.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/3.\n// Copyright (c) 2015 ibireme. All r"
},
{
"path": "Demo/YYKitDemo/YYTextMarkdownExample.h",
"chars": 225,
"preview": "//\n// YYTextMarkdownExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/3.\n// Copyright (c) 2015 ibireme. All"
},
{
"path": "Demo/YYKitDemo/YYTextMarkdownExample.m",
"chars": 2695,
"preview": "//\n// YYTextMarkdownExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/3.\n// Copyright (c) 2015 ibireme. All"
},
{
"path": "Demo/YYKitDemo/YYTextRubyExample.h",
"chars": 217,
"preview": "//\n// YYTextRubyExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/9.\n// Copyright (C) 2015 ibireme. All rig"
},
{
"path": "Demo/YYKitDemo/YYTextRubyExample.m",
"chars": 3557,
"preview": "//\n// YYTextRubyExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/9.\n// Copyright (C) 2015 ibireme. All rig"
},
{
"path": "Demo/YYKitDemo/YYTextTagExample.h",
"chars": 216,
"preview": "//\n// YYTextTagExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/8/19.\n// Copyright (c) 2015 ibireme. All rig"
},
{
"path": "Demo/YYKitDemo/YYTextTagExample.m",
"chars": 4080,
"preview": "//\n// YYTextTagExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/8/19.\n// Copyright (c) 2015 ibireme. All rig"
},
{
"path": "Demo/YYKitDemo/YYTextUndoRedoExample.h",
"chars": 226,
"preview": "//\n// YYTextUndoRedoExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/9/12.\n// Copyright (c) 2015 ibireme. Al"
},
{
"path": "Demo/YYKitDemo/YYTextUndoRedoExample.m",
"chars": 2190,
"preview": "//\n// YYTextUndoRedoExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/9/12.\n// Copyright (c) 2015 ibireme. Al"
},
{
"path": "Demo/YYKitDemo/YYUtilityExample.h",
"chars": 215,
"preview": "//\n// YYUtilityExample.h\n// YYKitDemo\n//\n// Created by ibireme on 16/2/24.\n// Copyright 2016 ibireme. All rights re"
},
{
"path": "Demo/YYKitDemo/YYUtilityExample.m",
"chars": 1734,
"preview": "//\n// YYUtilityExample.m\n// YYKitDemo\n//\n// Created by ibireme on 16/2/24.\n// Copyright 2016 ibireme. All rights re"
},
{
"path": "Demo/YYKitDemo/YYWebImageExample.h",
"chars": 223,
"preview": "//\n// YYWebImageExample.h\n// YYKitExample\n//\n// Created by ibireme on 15/7/19.\n// Copyright (c) 2015 ibireme. All ri"
},
{
"path": "Demo/YYKitDemo/YYWebImageExample.m",
"chars": 10421,
"preview": "//\n// YYWebImageExample.m\n// YYKitExample\n//\n// Created by ibireme on 15/7/19.\n// Copyright (c) 2015 ibireme. All ri"
},
{
"path": "Demo/YYKitDemo/main.m",
"chars": 337,
"preview": "//\n// main.m\n// YYKitExample\n//\n// Created by ibireme on 14-9-18.\n// Copyright (c) 2014 ibireme. All rights reserved"
},
{
"path": "Demo/YYKitDemo/twitter_0.json",
"chars": 843496,
"preview": "{\n \"twitter_objects\" : {\n \"moments\" : {\n\n },\n \"users\" : {\n \"2543588034\" : {\n \"protected\" : false,\n"
},
{
"path": "Demo/YYKitDemo/twitter_1.json",
"chars": 942427,
"preview": "{\n \"twitter_objects\" : {\n \"moments\" : {\n\n },\n \"users\" : {\n \"17973325\" : {\n \"protected\" : false,\n "
},
{
"path": "Demo/YYKitDemo/twitter_2.json",
"chars": 1079874,
"preview": "{\n \"twitter_objects\" : {\n \"moments\" : {\n\n },\n \"users\" : {\n \"50393960\" : {\n \"protected\" : false,\n "
},
{
"path": "Demo/YYKitDemo/twitter_3.json",
"chars": 914511,
"preview": "{\n \"twitter_objects\" : {\n \"moments\" : {\n\n },\n \"users\" : {\n \"17973325\" : {\n \"protected\" : false,\n "
},
{
"path": "Demo/YYKitDemo/weibo_0.json",
"chars": 263759,
"preview": "{\n \"ad\" : [\n {\n \"id\" : 3885102175687341,\n \"mark\" : \"15_CC3C310E5EB69E6400C5CEAB62B2BC8CCEFF8D30E96071DD514"
},
{
"path": "Demo/YYKitDemo/weibo_1.json",
"chars": 299081,
"preview": "{\n \"ad\" : [\n {\n \"id\" : 3885567932745962,\n \"mark\" : \"15_3DF24D8F6B82CF893E4414690988BF5DF2E861833E861BE09DB"
},
{
"path": "Demo/YYKitDemo/weibo_2.json",
"chars": 305442,
"preview": "{\n \"ad\" : [\n {\n \"id\" : 3882645555122490,\n \"mark\" : \"3_3833C2DFB7537B58C1AAC9E94FC0A4D970A3E1E5F921E456A25B"
},
{
"path": "Demo/YYKitDemo/weibo_3.json",
"chars": 470403,
"preview": "{\n \"ad\" : [\n\n ],\n \"hasvisible\" : false,\n \"groupInfo\" : {\n \"total_number\" : 19,\n \"users\" : [\n {\n \"a"
},
{
"path": "Demo/YYKitDemo/weibo_4.json",
"chars": 262268,
"preview": "{\n \"ad\" : [\n\n ],\n \"hasvisible\" : false,\n \"groupInfo\" : {\n \"total_number\" : 83,\n \"users\" : [\n {\n \"a"
},
{
"path": "Demo/YYKitDemo/weibo_5.json",
"chars": 227963,
"preview": "{\n \"ad\" : [\n\n ],\n \"hasvisible\" : false,\n \"groupInfo\" : {\n \"total_number\" : 20,\n \"users\" : [\n {\n \"i"
},
{
"path": "Demo/YYKitDemo/weibo_6.json",
"chars": 261338,
"preview": "{\n \"ad\" : [\n\n ],\n \"hasvisible\" : false,\n \"gsid\" : \"_2A2547b_JDeTxGeRK7FUZ8y_FwziIHXVZurQBrDV6PUJbrdAKLVDakWpbb9CCfPU"
},
{
"path": "Demo/YYKitDemo/weibo_7.json",
"chars": 333592,
"preview": "{\n \"ad\" : [\n {\n \"id\" : 3879677603310768,\n \"mark\" : \"3_F580DF69DE99F02E3BF7CAFD5CB981710975AE5754B1D96B8FE2"
},
{
"path": "Demo/YYKitDemo/zh-Hans.lproj/LaunchScreen.xib",
"chars": 1949,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" versi"
},
{
"path": "Demo/YYKitDemo.xcodeproj/project.pbxproj",
"chars": 131884,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 48;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Demo/YYKitDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 201,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:/Users/ibireme/"
},
{
"path": "Demo/YYKitDemo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
"chars": 264,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Demo/YYKitDemo.xcodeproj/xcshareddata/xcschemes/YYKitExample.xcscheme",
"chars": 3329,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"0830\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "Framework/Info.plist",
"chars": 776,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Framework/YYKit.xcodeproj/project.pbxproj",
"chars": 97108,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 48;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Framework/YYKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 150,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:YYKit.xcodeproj"
},
{
"path": "Framework/YYKit.xcodeproj/xcshareddata/xcschemes/YYKit.xcscheme",
"chars": 2832,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"0830\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "LICENSE",
"chars": 1095,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2015 ibireme <ibireme@gmail.com>\n\nPermission is hereby granted, free of charge, to "
},
{
"path": "README.md",
"chars": 6368,
"preview": "YYKit\n==============\n\n[](https://raw.github"
},
{
"path": "Vendor/WebP.framework/Headers/config.h",
"chars": 4077,
"preview": "/* src/webp/config.h. Generated from config.h.in by configure. */\n/* src/webp/config.h.in. Generated from configure.a"
},
{
"path": "Vendor/WebP.framework/Headers/decode.h",
"chars": 22526,
"preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Use of this source code is governed by a BSD-style license\n// t"
},
{
"path": "Vendor/WebP.framework/Headers/demux.h",
"chars": 15235,
"preview": "// Copyright 2012 Google Inc. All Rights Reserved.\n//\n// Use of this source code is governed by a BSD-style license\n// t"
},
{
"path": "Vendor/WebP.framework/Headers/encode.h",
"chars": 26298,
"preview": "// Copyright 2011 Google Inc. All Rights Reserved.\n//\n// Use of this source code is governed by a BSD-style license\n// t"
},
{
"path": "Vendor/WebP.framework/Headers/extras.h",
"chars": 1874,
"preview": "// Copyright 2015 Google Inc. All Rights Reserved.\n//\n// Use of this source code is governed by a BSD-style license\n// t"
},
{
"path": "Vendor/WebP.framework/Headers/format_constants.h",
"chars": 3930,
"preview": "// Copyright 2012 Google Inc. All Rights Reserved.\n//\n// Use of this source code is governed by a BSD-style license\n// t"
},
{
"path": "Vendor/WebP.framework/Headers/mux.h",
"chars": 22885,
"preview": "// Copyright 2011 Google Inc. All Rights Reserved.\n//\n// Use of this source code is governed by a BSD-style license\n// t"
},
{
"path": "Vendor/WebP.framework/Headers/mux_types.h",
"chars": 3149,
"preview": "// Copyright 2012 Google Inc. All Rights Reserved.\n//\n// Use of this source code is governed by a BSD-style license\n// t"
},
{
"path": "Vendor/WebP.framework/Headers/types.h",
"chars": 1687,
"preview": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Use of this source code is governed by a BSD-style license\n// t"
},
{
"path": "Vendor/WebP.sh",
"chars": 3707,
"preview": "#!/bin/bash\n#\n# This script generates 'WebP.framework' (static library).\n# An iOS app can decode WebP images by includin"
},
{
"path": "Vendor/bpg.framework/Headers/libbpg.h",
"chars": 5126,
"preview": "/*\n * BPG decoder\n * \n * Copyright (c) 2014 Fabrice Bellard\n *\n * Permission is hereby granted, free of charge, to any p"
},
{
"path": "YYKit/Base/Foundation/NSArray+YYAdd.h",
"chars": 5629,
"preview": "//\n// NSArray+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/4.\n// Copyright ("
},
{
"path": "YYKit/Base/Foundation/NSArray+YYAdd.m",
"chars": 4576,
"preview": "//\n// NSArray+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/4.\n// Copyright ("
},
{
"path": "YYKit/Base/Foundation/NSBundle+YYAdd.h",
"chars": 3590,
"preview": "//\n// NSBundle+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/10/20.\n// Copyrigh"
},
{
"path": "YYKit/Base/Foundation/NSBundle+YYAdd.m",
"chars": 2879,
"preview": "//\n// NSBundle+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/10/20.\n// Copyrigh"
},
{
"path": "YYKit/Base/Foundation/NSData+YYAdd.h",
"chars": 6997,
"preview": "//\n// NSData+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/4.\n// Copyright (c"
},
{
"path": "YYKit/Base/Foundation/NSData+YYAdd.m",
"chars": 21782,
"preview": "//\n// NSData+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/4.\n// Copyright (c"
},
{
"path": "YYKit/Base/Foundation/NSDate+YYAdd.h",
"chars": 6917,
"preview": "//\n// NSDate+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/11.\n// Copyright ("
},
{
"path": "YYKit/Base/Foundation/NSDate+YYAdd.m",
"chars": 6515,
"preview": "//\n// NSDate+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/11.\n// Copyright ("
},
{
"path": "YYKit/Base/Foundation/NSDictionary+YYAdd.h",
"chars": 6450,
"preview": "//\n// NSDictionary+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/4.\n// Copyri"
},
{
"path": "YYKit/Base/Foundation/NSDictionary+YYAdd.m",
"chars": 12602,
"preview": "//\n// NSDictionary+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/4.\n// Copyri"
},
{
"path": "YYKit/Base/Foundation/NSKeyedUnarchiver+YYAdd.h",
"chars": 1305,
"preview": "//\n// NSKeyedUnarchiver+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/8/4.\n// C"
},
{
"path": "YYKit/Base/Foundation/NSKeyedUnarchiver+YYAdd.m",
"chars": 1110,
"preview": "//\n// NSKeyedUnarchiver+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/8/4.\n// C"
},
{
"path": "YYKit/Base/Foundation/NSNotificationCenter+YYAdd.h",
"chars": 3483,
"preview": "//\n// NSNotificationCenter+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/8/24.\n/"
},
{
"path": "YYKit/Base/Foundation/NSNotificationCenter+YYAdd.m",
"chars": 2651,
"preview": "//\n// NSNotificationCenter+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/8/24.\n/"
},
{
"path": "YYKit/Base/Foundation/NSNumber+YYAdd.h",
"chars": 762,
"preview": "//\n// NSNumber+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/8/24.\n// Copyright"
},
{
"path": "YYKit/Base/Foundation/NSNumber+YYAdd.m",
"chars": 1711,
"preview": "//\n// NSNumber+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/8/24.\n// Copyright"
},
{
"path": "YYKit/Base/Foundation/NSObject+YYAdd.h",
"chars": 11776,
"preview": "//\n// NSObject+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/10/8.\n// Copyright"
},
{
"path": "YYKit/Base/Foundation/NSObject+YYAdd.m",
"chars": 14237,
"preview": "//\n// NSObject+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/10/8.\n// Copyright"
},
{
"path": "YYKit/Base/Foundation/NSObject+YYAddForARC.h",
"chars": 648,
"preview": "//\n// NSObject+YYAddForARC.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/12/15.\n// Co"
},
{
"path": "YYKit/Base/Foundation/NSObject+YYAddForARC.m",
"chars": 846,
"preview": "//\n// NSObject+YYAddForARC.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/12/15.\n// Co"
},
{
"path": "YYKit/Base/Foundation/NSObject+YYAddForKVO.h",
"chars": 1592,
"preview": "//\n// NSObject+YYAddForKVO.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/10/15.\n// Co"
},
{
"path": "YYKit/Base/Foundation/NSObject+YYAddForKVO.m",
"chars": 3347,
"preview": "//\n// NSObject+YYAddForKVO.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/10/15.\n// Co"
},
{
"path": "YYKit/Base/Foundation/NSString+YYAdd.h",
"chars": 12587,
"preview": "//\n// NSString+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/3.\n// Copyright "
},
{
"path": "YYKit/Base/Foundation/NSString+YYAdd.m",
"chars": 15462,
"preview": "//\n// NSString+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/3.\n// Copyright "
},
{
"path": "YYKit/Base/Foundation/NSThread+YYAdd.h",
"chars": 705,
"preview": "//\n// NSThread+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 15/7/3.\n// Copyright "
},
{
"path": "YYKit/Base/Foundation/NSThread+YYAdd.m",
"chars": 3991,
"preview": "//\n// NSThread+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 15/7/3.\n// Copyright "
},
{
"path": "YYKit/Base/Foundation/NSTimer+YYAdd.h",
"chars": 2584,
"preview": "//\n// NSTimer+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/15/11.\n// Copyright"
},
{
"path": "YYKit/Base/Foundation/NSTimer+YYAdd.m",
"chars": 1129,
"preview": "//\n// NSTimer+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/15/11.\n// Copyright"
},
{
"path": "YYKit/Base/Quartz/CALayer+YYAdd.h",
"chars": 3473,
"preview": "//\n// CALayer+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/5/10.\n// Copyright "
},
{
"path": "YYKit/Base/Quartz/CALayer+YYAdd.m",
"chars": 8270,
"preview": "//\n// CALayer+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/5/10.\n// Copyright "
},
{
"path": "YYKit/Base/Quartz/YYCGUtilities.h",
"chars": 11262,
"preview": "//\n// YYCGUtilities.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 15/2/28.\n// Copyright "
},
{
"path": "YYKit/Base/Quartz/YYCGUtilities.m",
"chars": 10761,
"preview": "//\n// YYCGUtilities.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 15/2/28.\n// Copyright "
},
{
"path": "YYKit/Base/UIKit/UIApplication+YYAdd.h",
"chars": 2602,
"preview": "//\n// UIApplication+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/4.\n// Copyr"
},
{
"path": "YYKit/Base/UIKit/UIApplication+YYAdd.m",
"chars": 7517,
"preview": "//\n// UIApplication+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/4.\n// Copyr"
},
{
"path": "YYKit/Base/UIKit/UIBarButtonItem+YYAdd.h",
"chars": 791,
"preview": "//\n// UIBarButtonItem+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/10/15.\n// C"
},
{
"path": "YYKit/Base/UIKit/UIBarButtonItem+YYAdd.m",
"chars": 1425,
"preview": "//\n// UIBarButtonItem+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/10/15.\n// C"
},
{
"path": "YYKit/Base/UIKit/UIBezierPath+YYAdd.h",
"chars": 960,
"preview": "//\n// UIBezierPath+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/10/30.\n// Copy"
},
{
"path": "YYKit/Base/UIKit/UIBezierPath+YYAdd.m",
"chars": 2370,
"preview": "//\n// UIBezierPath+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/10/30.\n// Copy"
},
{
"path": "YYKit/Base/UIKit/UIColor+YYAdd.h",
"chars": 11894,
"preview": "//\n// UIColor+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/4.\n// Copyright ("
},
{
"path": "YYKit/Base/UIKit/UIColor+YYAdd.m",
"chars": 14442,
"preview": "//\n// UIColor+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/4.\n// Copyright ("
},
{
"path": "YYKit/Base/UIKit/UIControl+YYAdd.h",
"chars": 2590,
"preview": "//\n// UIControl+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/5.\n// Copyright"
},
{
"path": "YYKit/Base/UIKit/UIControl+YYAdd.m",
"chars": 3911,
"preview": "//\n// UIControl+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/5.\n// Copyright"
},
{
"path": "YYKit/Base/UIKit/UIDevice+YYAdd.h",
"chars": 6106,
"preview": "//\n// UIDevice+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/3.\n// Copyright "
},
{
"path": "YYKit/Base/UIKit/UIDevice+YYAdd.m",
"chars": 18065,
"preview": "//\n// UIDevice+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/3.\n// Copyright "
},
{
"path": "YYKit/Base/UIKit/UIFont+YYAdd.h",
"chars": 4350,
"preview": "//\n// UIFont+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/5/11.\n// Copyright ("
},
{
"path": "YYKit/Base/UIKit/UIFont+YYAdd.m",
"chars": 9163,
"preview": "//\n// UIFont+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/5/11.\n// Copyright ("
},
{
"path": "YYKit/Base/UIKit/UIGestureRecognizer+YYAdd.h",
"chars": 1215,
"preview": "//\n// UIGestureRecognizer+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/10/13.\n/"
},
{
"path": "YYKit/Base/UIKit/UIGestureRecognizer+YYAdd.m",
"chars": 2013,
"preview": "//\n// UIGestureRecognizer+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/10/13.\n/"
},
{
"path": "YYKit/Base/UIKit/UIImage+YYAdd.h",
"chars": 12324,
"preview": "//\n// UIImage+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/4.\n// Copyright ("
},
{
"path": "YYKit/Base/UIKit/UIImage+YYAdd.m",
"chars": 31050,
"preview": "//\n// UIImage+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/4.\n// Copyright ("
},
{
"path": "YYKit/Base/UIKit/UIScreen+YYAdd.h",
"chars": 1525,
"preview": "//\n// UIScreen+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/5.\n// Copyright "
},
{
"path": "YYKit/Base/UIKit/UIScreen+YYAdd.m",
"chars": 6334,
"preview": "//\n// UIScreen+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/5.\n// Copyright "
},
{
"path": "YYKit/Base/UIKit/UIScrollView+YYAdd.h",
"chars": 1191,
"preview": "//\n// UIScrollView+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/5.\n// Copyri"
},
{
"path": "YYKit/Base/UIKit/UIScrollView+YYAdd.m",
"chars": 1489,
"preview": "//\n// UIScrollView+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/5.\n// Copyri"
},
{
"path": "YYKit/Base/UIKit/UITableView+YYAdd.h",
"chars": 7879,
"preview": "//\n// UITableView+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/5/12.\n// Copyri"
},
{
"path": "YYKit/Base/UIKit/UITableView+YYAdd.m",
"chars": 3213,
"preview": "//\n// UITableView+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/5/12.\n// Copyri"
},
{
"path": "YYKit/Base/UIKit/UITextField+YYAdd.h",
"chars": 635,
"preview": "//\n// UITextField+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/5/12.\n// Copyri"
},
{
"path": "YYKit/Base/UIKit/UITextField+YYAdd.m",
"chars": 1043,
"preview": "//\n// UITextField+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 14/5/12.\n// Copyri"
},
{
"path": "YYKit/Base/UIKit/UIView+YYAdd.h",
"chars": 4280,
"preview": "//\n// UIView+YYAdd.h\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/3.\n// Copyright (c"
},
{
"path": "YYKit/Base/UIKit/UIView+YYAdd.m",
"chars": 7846,
"preview": "//\n// UIView+YYAdd.m\n// YYKit <https://github.com/ibireme/YYKit>\n//\n// Created by ibireme on 13/4/3.\n// Copyright (c"
}
]
// ... and 110 more files (download for full content)
About this extraction
This page contains the full source code of the ibireme/YYKit GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 310 files (8.5 MB), approximately 2.2M tokens, and a symbol index with 150 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.