appjam 0.1.8.8 → 0.1.8.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. data/README.md +22 -62
  2. data/lib/appjam/generators/gist.yml +1 -1
  3. data/lib/appjam/generators/templates/blank/EiffelApplication.xcodeproj/project.pbxproj +1166 -482
  4. data/lib/appjam/generators/templates/blank/EiffelApplication.xcodeproj/project.xcworkspace/xcuserdata/eiffel.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  5. data/lib/appjam/generators/templates/blank/EiffelApplication/EiffelApplication-Prefix.pch.tt +26 -0
  6. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/AwesomeMenu.h +52 -0
  7. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/AwesomeMenu.m +412 -0
  8. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/AwesomeMenuItem.h +44 -0
  9. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/AwesomeMenuItem.m +97 -0
  10. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/Images/bg-addbutton-highlighted.png +0 -0
  11. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/Images/bg-addbutton-highlighted@2x.png +0 -0
  12. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/Images/bg-addbutton.png +0 -0
  13. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/Images/bg-addbutton@2x.png +0 -0
  14. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/Images/bg-menuitem-highlighted.png +0 -0
  15. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/Images/bg-menuitem-highlighted@2x.png +0 -0
  16. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/Images/bg-menuitem.png +0 -0
  17. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/Images/bg-menuitem@2x.png +0 -0
  18. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/Images/icon-plus-highlighted.png +0 -0
  19. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/Images/icon-plus-highlighted@2x.png +0 -0
  20. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/Images/icon-plus.png +0 -0
  21. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/Images/icon-plus@2x.png +0 -0
  22. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/Images/icon-star.png +0 -0
  23. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/AwesomeMenu/Images/icon-star@2x.png +0 -0
  24. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/CMPopTipView/CMPopTipView.h +167 -0
  25. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/CMPopTipView/CMPopTipView.m +639 -0
  26. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/FXLabel/FXLabel.h +97 -0
  27. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/FXLabel/FXLabel.m +1080 -0
  28. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/MBProgressHUD/MBProgressHUD.h +451 -0
  29. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/MBProgressHUD/MBProgressHUD.m +865 -0
  30. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/FacingView.h +42 -0
  31. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/FacingView.m +56 -0
  32. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/FoldView.h +90 -0
  33. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/FoldView.m +316 -0
  34. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/MultiFoldView.h +104 -0
  35. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/MultiFoldView.m +516 -0
  36. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/PaperFoldConstants.h +49 -0
  37. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/PaperFoldNavigationController.h +18 -0
  38. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/PaperFoldNavigationController.m +88 -0
  39. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/PaperFoldResources.bundle/swipe_guide_left.png +0 -0
  40. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/PaperFoldResources.bundle/swipe_guide_left@2x.png +0 -0
  41. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/PaperFoldResources.bundle/swipe_guide_right.png +0 -0
  42. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/PaperFoldResources.bundle/swipe_guide_right@2x.png +0 -0
  43. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/PaperFoldSwipeHintView.h +25 -0
  44. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/PaperFoldSwipeHintView.m +76 -0
  45. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/PaperFoldView.h +131 -0
  46. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/PaperFoldView.m +941 -0
  47. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/Resources/swipe_guide.psd +0 -0
  48. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/Resources/swipe_guide2.psd +0 -0
  49. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/ShadowView.h +46 -0
  50. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/ShadowView.m +82 -0
  51. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/TouchThroughUIView.h +39 -0
  52. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/TouchThroughUIView.m +72 -0
  53. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/UIView+Screenshot.h +42 -0
  54. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/PaperFold/UIView+Screenshot.m +100 -0
  55. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/NSBubbleData.h +34 -0
  56. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/NSBubbleData.m +140 -0
  57. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/UIBubbleHeaderTableViewCell.h +17 -0
  58. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/UIBubbleHeaderTableViewCell.m +57 -0
  59. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/UIBubbleTableView.h +30 -0
  60. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/UIBubbleTableView.m +233 -0
  61. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/UIBubbleTableViewCell.h +19 -0
  62. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/UIBubbleTableViewCell.m +122 -0
  63. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/UIBubbleTableViewDataSource.h +24 -0
  64. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/UIBubbleTypingTableViewCell.h +20 -0
  65. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/UIBubbleTypingTableViewCell.m +56 -0
  66. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/images/bubbleMine.png +0 -0
  67. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/images/bubbleMine@2x.png +0 -0
  68. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/images/bubbleSomeone.png +0 -0
  69. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/images/bubbleSomeone@2x.png +0 -0
  70. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/images/missingAvatar.png +0 -0
  71. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/images/missingAvatar@2x.png +0 -0
  72. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/images/typingMine.png +0 -0
  73. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/images/typingMine@2x.png +0 -0
  74. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/images/typingSomeone.png +0 -0
  75. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIBubbleTableView/images/typingSomeone@2x.png +0 -0
  76. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIGlossyButton/UIGlossyButton.h +124 -0
  77. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIGlossyButton/UIGlossyButton.m +545 -0
  78. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIGlossyButton/UIView+LayerEffects.h +22 -0
  79. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/UIGlossyButton/UIView+LayerEffects.m +32 -0
  80. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/AFIncrementalStore/AFIncrementalStore.h +344 -0
  81. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/AFIncrementalStore/AFIncrementalStore.m +848 -0
  82. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/AFIncrementalStore/AFRESTClient.h +135 -0
  83. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/AFIncrementalStore/AFRESTClient.m +441 -0
  84. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/InflectorKit/NSString+InflectorKit.h +40 -0
  85. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/InflectorKit/NSString+InflectorKit.m +36 -0
  86. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/InflectorKit/TTTStringInflector.h +76 -0
  87. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/InflectorKit/TTTStringInflector.m +270 -0
  88. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/MKAnnotationView+WebCache.h +95 -0
  89. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/MKAnnotationView+WebCache.m +78 -0
  90. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/SDImageCache.h +144 -0
  91. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/SDImageCache.m +311 -0
  92. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/SDWebImageCompat.h +40 -0
  93. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/SDWebImageCompat.m +54 -0
  94. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/SDWebImageDecoder.h +18 -0
  95. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/SDWebImageDecoder.m +70 -0
  96. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/SDWebImageDownloader.h +102 -0
  97. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/SDWebImageDownloader.m +226 -0
  98. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/SDWebImageDownloaderOperation.h +25 -0
  99. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/SDWebImageDownloaderOperation.m +339 -0
  100. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/SDWebImageManager.h +167 -0
  101. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/SDWebImageManager.m +244 -0
  102. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/SDWebImageOperation.h +15 -0
  103. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/SDWebImagePrefetcher.h +58 -0
  104. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/SDWebImagePrefetcher.m +127 -0
  105. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/UIButton+WebCache.h +173 -0
  106. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/UIButton+WebCache.m +129 -0
  107. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/UIImageView+WebCache.h +140 -0
  108. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/SDWebImage/UIImageView+WebCache.m +84 -0
  109. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CPAnimationSequence/CPAnimationProgram.h +28 -0
  110. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CPAnimationSequence/CPAnimationSequence.h +28 -0
  111. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CPAnimationSequence/CPAnimationStep.h +49 -0
  112. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CPAnimationSequence/private/CPAnimationProgram.m +100 -0
  113. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CPAnimationSequence/private/CPAnimationSequence.m +85 -0
  114. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CPAnimationSequence/private/CPAnimationStep.m +122 -0
  115. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaAsyncSocket/GCDAsyncSocket.h +1074 -0
  116. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaAsyncSocket/GCDAsyncSocket.m +7430 -0
  117. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Categories/DDData.h +14 -0
  118. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Categories/DDData.m +158 -0
  119. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Categories/DDNumber.h +12 -0
  120. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Categories/DDNumber.m +88 -0
  121. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Categories/DDRange.h +56 -0
  122. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Categories/DDRange.m +104 -0
  123. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/HTTPAuthenticationRequest.h +45 -0
  124. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/HTTPAuthenticationRequest.m +195 -0
  125. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/HTTPConnection.h +119 -0
  126. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/HTTPConnection.m +2708 -0
  127. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/HTTPLogging.h +136 -0
  128. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/HTTPMessage.h +48 -0
  129. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/HTTPMessage.m +113 -0
  130. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/HTTPResponse.h +149 -0
  131. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/HTTPServer.h +205 -0
  132. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/HTTPServer.m +772 -0
  133. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Mime/MultipartFormDataParser.h +65 -0
  134. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Mime/MultipartFormDataParser.m +529 -0
  135. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Mime/MultipartMessageHeader.h +33 -0
  136. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Mime/MultipartMessageHeader.m +86 -0
  137. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Mime/MultipartMessageHeaderField.h +23 -0
  138. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Mime/MultipartMessageHeaderField.m +211 -0
  139. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Responses/HTTPAsyncFileResponse.h +75 -0
  140. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Responses/HTTPAsyncFileResponse.m +405 -0
  141. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Responses/HTTPDataResponse.h +13 -0
  142. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Responses/HTTPDataResponse.m +79 -0
  143. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Responses/HTTPDynamicFileResponse.h +52 -0
  144. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Responses/HTTPDynamicFileResponse.m +292 -0
  145. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Responses/HTTPErrorResponse.h +9 -0
  146. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Responses/HTTPErrorResponse.m +38 -0
  147. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Responses/HTTPFileResponse.h +25 -0
  148. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Responses/HTTPFileResponse.m +237 -0
  149. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Responses/HTTPRedirectResponse.h +12 -0
  150. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/Responses/HTTPRedirectResponse.m +73 -0
  151. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/WebSocket.h +105 -0
  152. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Core/WebSocket.m +791 -0
  153. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Extensions/WebDAV/DAVConnection.h +7 -0
  154. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Extensions/WebDAV/DAVConnection.m +160 -0
  155. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Extensions/WebDAV/DAVResponse.h +11 -0
  156. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Extensions/WebDAV/DAVResponse.m +372 -0
  157. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Extensions/WebDAV/DELETEResponse.h +7 -0
  158. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Extensions/WebDAV/DELETEResponse.m +49 -0
  159. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Extensions/WebDAV/PUTResponse.h +8 -0
  160. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/CocoaHTTPServer/Extensions/WebDAV/PUTResponse.m +69 -0
  161. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/hpple/TFHpple.h +54 -0
  162. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/hpple/TFHpple.m +102 -0
  163. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/hpple/TFHppleElement.h +103 -0
  164. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/hpple/TFHppleElement.m +200 -0
  165. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/hpple/XPathQuery.h +10 -0
  166. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/hpple/XPathQuery.m +197 -0
  167. data/lib/appjam/version.rb +1 -1
  168. metadata +164 -3
@@ -23,6 +23,32 @@
23
23
  // ALog always displays output regardless of the DEBUG setting
24
24
  #define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
25
25
 
26
+ #define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)
27
+ #define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)
28
+ #define SAFE_RELEASE(x) [x release];x=nil
29
+ #define IOS_VERSION [[[UIDevice currentDevice] systemVersion] floatValue]
30
+ #define CurrentSystemVersion ([[UIDevice currentDevice] systemVersion])
31
+ #define CurrentLanguage ([[NSLocale preferredLanguages] objectAtIndex:0])
32
+
33
+ #define BACKGROUND_COLOR [UIColor colorWithRed:242.0/255.0 green:236.0/255.0 blue:231.0/255.0 alpha:1.0]
34
+
35
+ #define isRetina ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 960), [[UIScreen mainScreen] currentMode].size) : NO)
36
+ #define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
37
+ #define isPad (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
38
+
39
+ #define GLOBAL_QUEUE(block) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block)
40
+ #define MAIN_QUEUE(block) dispatch_async(dispatch_get_main_queue(),block)
41
+
42
+ #define USER_DEFAULT [NSUserDefaults standardUserDefaults]
43
+
44
+ #pragma mark - degrees/radian functions
45
+ #define degreesToRadian(x) (M_PI * (x) / 180.0)
46
+ #define radianToDegrees(radian) (radian*180.0)/(M_PI)
47
+
48
+ #pragma mark - color functions
49
+ #define RGBCOLOR(r,g,b) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:1]
50
+ #define RGBACOLOR(r,g,b,a) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:(a)]
51
+
26
52
  #ifdef __OBJC__
27
53
  #import <UIKit/UIKit.h>
28
54
  #import <Foundation/Foundation.h>
@@ -0,0 +1,52 @@
1
+ //
2
+ // AwesomeMenu.h
3
+ // AwesomeMenu
4
+ //
5
+ // Created by Levey on 11/30/11.
6
+ // Copyright (c) 2011 Levey & Other Contributors. All rights reserved.
7
+ //
8
+
9
+ #import <UIKit/UIKit.h>
10
+ #import "AwesomeMenuItem.h"
11
+
12
+ @protocol AwesomeMenuDelegate;
13
+
14
+
15
+ @interface AwesomeMenu : UIView <AwesomeMenuItemDelegate>
16
+ {
17
+ NSArray *_menusArray;
18
+ int _flag;
19
+ NSTimer *_timer;
20
+ AwesomeMenuItem *_addButton;
21
+
22
+ id<AwesomeMenuDelegate> __weak _delegate;
23
+ BOOL _isAnimating;
24
+ }
25
+ @property (nonatomic, copy) NSArray *menusArray;
26
+ @property (nonatomic, getter = isExpanding) BOOL expanding;
27
+ @property (nonatomic, weak) id<AwesomeMenuDelegate> delegate;
28
+
29
+ @property (nonatomic, strong) UIImage *image;
30
+ @property (nonatomic, strong) UIImage *highlightedImage;
31
+ @property (nonatomic, strong) UIImage *contentImage;
32
+ @property (nonatomic, strong) UIImage *highlightedContentImage;
33
+
34
+ @property (nonatomic, assign) CGFloat nearRadius;
35
+ @property (nonatomic, assign) CGFloat endRadius;
36
+ @property (nonatomic, assign) CGFloat farRadius;
37
+ @property (nonatomic, assign) CGPoint startPoint;
38
+ @property (nonatomic, assign) CGFloat timeOffset;
39
+ @property (nonatomic, assign) CGFloat rotateAngle;
40
+ @property (nonatomic, assign) CGFloat menuWholeAngle;
41
+ @property (nonatomic, assign) CGFloat expandRotation;
42
+ @property (nonatomic, assign) CGFloat closeRotation;
43
+
44
+ - (id)initWithFrame:(CGRect)frame menus:(NSArray *)aMenusArray;
45
+ @end
46
+
47
+ @protocol AwesomeMenuDelegate <NSObject>
48
+ - (void)AwesomeMenu:(AwesomeMenu *)menu didSelectIndex:(NSInteger)idx;
49
+ @optional
50
+ - (void)AwesomeMenuDidFinishAnimationClose:(AwesomeMenu *)menu;
51
+ - (void)AwesomeMenuDidFinishAnimationOpen:(AwesomeMenu *)menu;
52
+ @end
@@ -0,0 +1,412 @@
1
+ //
2
+ // AwesomeMenu.m
3
+ // AwesomeMenu
4
+ //
5
+ // Created by Levey on 11/30/11.
6
+ // Copyright (c) 2011 Levey & Other Contributors. All rights reserved.
7
+ //
8
+
9
+ #import "AwesomeMenu.h"
10
+ #import <QuartzCore/QuartzCore.h>
11
+
12
+ static CGFloat const kAwesomeMenuDefaultNearRadius = 110.0f;
13
+ static CGFloat const kAwesomeMenuDefaultEndRadius = 120.0f;
14
+ static CGFloat const kAwesomeMenuDefaultFarRadius = 140.0f;
15
+ static CGFloat const kAwesomeMenuDefaultStartPointX = 160.0;
16
+ static CGFloat const kAwesomeMenuDefaultStartPointY = 240.0;
17
+ static CGFloat const kAwesomeMenuDefaultTimeOffset = 0.036f;
18
+ static CGFloat const kAwesomeMenuDefaultRotateAngle = 0.0;
19
+ static CGFloat const kAwesomeMenuDefaultMenuWholeAngle = M_PI * 2;
20
+ static CGFloat const kAwesomeMenuDefaultExpandRotation = M_PI;
21
+ static CGFloat const kAwesomeMenuDefaultCloseRotation = M_PI * 2;
22
+
23
+
24
+ static CGPoint RotateCGPointAroundCenter(CGPoint point, CGPoint center, float angle)
25
+ {
26
+ CGAffineTransform translation = CGAffineTransformMakeTranslation(center.x, center.y);
27
+ CGAffineTransform rotation = CGAffineTransformMakeRotation(angle);
28
+ CGAffineTransform transformGroup = CGAffineTransformConcat(CGAffineTransformConcat(CGAffineTransformInvert(translation), rotation), translation);
29
+ return CGPointApplyAffineTransform(point, transformGroup);
30
+ }
31
+
32
+ @interface AwesomeMenu ()
33
+ - (void)_expand;
34
+ - (void)_close;
35
+ - (void)_setMenu;
36
+ - (CAAnimationGroup *)_blowupAnimationAtPoint:(CGPoint)p;
37
+ - (CAAnimationGroup *)_shrinkAnimationAtPoint:(CGPoint)p;
38
+ @end
39
+
40
+ @implementation AwesomeMenu
41
+
42
+ @synthesize nearRadius, endRadius, farRadius, timeOffset, rotateAngle, menuWholeAngle, startPoint, expandRotation, closeRotation;
43
+ @synthesize expanding = _expanding;
44
+ @synthesize delegate = _delegate;
45
+ @synthesize menusArray = _menusArray;
46
+
47
+ #pragma mark - initialization & cleaning up
48
+ - (id)initWithFrame:(CGRect)frame menus:(NSArray *)aMenusArray
49
+ {
50
+ self = [super initWithFrame:frame];
51
+ if (self) {
52
+ self.backgroundColor = [UIColor clearColor];
53
+
54
+ self.nearRadius = kAwesomeMenuDefaultNearRadius;
55
+ self.endRadius = kAwesomeMenuDefaultEndRadius;
56
+ self.farRadius = kAwesomeMenuDefaultFarRadius;
57
+ self.timeOffset = kAwesomeMenuDefaultTimeOffset;
58
+ self.rotateAngle = kAwesomeMenuDefaultRotateAngle;
59
+ self.menuWholeAngle = kAwesomeMenuDefaultMenuWholeAngle;
60
+ self.startPoint = CGPointMake(kAwesomeMenuDefaultStartPointX, kAwesomeMenuDefaultStartPointY);
61
+ self.expandRotation = kAwesomeMenuDefaultExpandRotation;
62
+ self.closeRotation = kAwesomeMenuDefaultCloseRotation;
63
+
64
+ self.menusArray = aMenusArray;
65
+
66
+ // add the "Add" Button.
67
+ _addButton = [[AwesomeMenuItem alloc] initWithImage:[UIImage imageNamed:@"bg-addbutton.png"]
68
+ highlightedImage:[UIImage imageNamed:@"bg-addbutton-highlighted.png"]
69
+ ContentImage:[UIImage imageNamed:@"icon-plus.png"]
70
+ highlightedContentImage:[UIImage imageNamed:@"icon-plus-highlighted.png"]];
71
+ _addButton.delegate = self;
72
+ _addButton.center = self.startPoint;
73
+ [self addSubview:_addButton];
74
+ }
75
+ return self;
76
+ }
77
+
78
+
79
+ #pragma mark - getters & setters
80
+
81
+ - (void)setStartPoint:(CGPoint)aPoint
82
+ {
83
+ startPoint = aPoint;
84
+ _addButton.center = aPoint;
85
+ }
86
+
87
+ #pragma mark - images
88
+
89
+ - (void)setImage:(UIImage *)image {
90
+ _addButton.image = image;
91
+ }
92
+
93
+ - (UIImage*)image {
94
+ return _addButton.image;
95
+ }
96
+
97
+ - (void)setHighlightedImage:(UIImage *)highlightedImage {
98
+ _addButton.highlightedImage = highlightedImage;
99
+ }
100
+
101
+ - (UIImage*)highlightedImage {
102
+ return _addButton.highlightedImage;
103
+ }
104
+
105
+
106
+ - (void)setContentImage:(UIImage *)contentImage {
107
+ _addButton.contentImageView.image = contentImage;
108
+ }
109
+
110
+ - (UIImage*)contentImage {
111
+ return _addButton.contentImageView.image;
112
+ }
113
+
114
+ - (void)setHighlightedContentImage:(UIImage *)highlightedContentImage {
115
+ _addButton.contentImageView.highlightedImage = highlightedContentImage;
116
+ }
117
+
118
+ - (UIImage*)highlightedContentImage {
119
+ return _addButton.contentImageView.highlightedImage;
120
+ }
121
+
122
+
123
+
124
+ #pragma mark - UIView's methods
125
+ - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
126
+ {
127
+ // if the menu is animating, prevent touches
128
+ if (_isAnimating)
129
+ {
130
+ return NO;
131
+ }
132
+ // if the menu state is expanding, everywhere can be touch
133
+ // otherwise, only the add button are can be touch
134
+ if (YES == _expanding)
135
+ {
136
+ return YES;
137
+ }
138
+ else
139
+ {
140
+ return CGRectContainsPoint(_addButton.frame, point);
141
+ }
142
+ }
143
+
144
+ - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
145
+ {
146
+ self.expanding = !self.isExpanding;
147
+ }
148
+
149
+ #pragma mark - AwesomeMenuItem delegates
150
+ - (void)AwesomeMenuItemTouchesBegan:(AwesomeMenuItem *)item
151
+ {
152
+ if (item == _addButton)
153
+ {
154
+ self.expanding = !self.isExpanding;
155
+ }
156
+ }
157
+ - (void)AwesomeMenuItemTouchesEnd:(AwesomeMenuItem *)item
158
+ {
159
+ // exclude the "add" button
160
+ if (item == _addButton)
161
+ {
162
+ return;
163
+ }
164
+ // blowup the selected menu button
165
+ CAAnimationGroup *blowup = [self _blowupAnimationAtPoint:item.center];
166
+ [item.layer addAnimation:blowup forKey:@"blowup"];
167
+ item.center = item.startPoint;
168
+
169
+ // shrink other menu buttons
170
+ for (int i = 0; i < [_menusArray count]; i ++)
171
+ {
172
+ AwesomeMenuItem *otherItem = [_menusArray objectAtIndex:i];
173
+ CAAnimationGroup *shrink = [self _shrinkAnimationAtPoint:otherItem.center];
174
+ if (otherItem.tag == item.tag) {
175
+ continue;
176
+ }
177
+ [otherItem.layer addAnimation:shrink forKey:@"shrink"];
178
+
179
+ otherItem.center = otherItem.startPoint;
180
+ }
181
+ _expanding = NO;
182
+
183
+ // rotate "add" button
184
+ float angle = self.isExpanding ? -M_PI_4 : 0.0f;
185
+ [UIView animateWithDuration:0.2f animations:^{
186
+ _addButton.transform = CGAffineTransformMakeRotation(angle);
187
+ }];
188
+
189
+ if ([_delegate respondsToSelector:@selector(AwesomeMenu:didSelectIndex:)])
190
+ {
191
+ [_delegate AwesomeMenu:self didSelectIndex:item.tag - 1000];
192
+ }
193
+ }
194
+
195
+ #pragma mark - instant methods
196
+ - (void)setMenusArray:(NSArray *)aMenusArray
197
+ {
198
+ if (aMenusArray == _menusArray)
199
+ {
200
+ return;
201
+ }
202
+ _menusArray = [aMenusArray copy];
203
+
204
+
205
+ // clean subviews
206
+ for (UIView *v in self.subviews)
207
+ {
208
+ if (v.tag >= 1000)
209
+ {
210
+ [v removeFromSuperview];
211
+ }
212
+ }
213
+ }
214
+
215
+
216
+ - (void)_setMenu {
217
+ int count = [_menusArray count];
218
+ for (int i = 0; i < count; i ++)
219
+ {
220
+ AwesomeMenuItem *item = [_menusArray objectAtIndex:i];
221
+ item.tag = 1000 + i;
222
+ item.startPoint = startPoint;
223
+ CGPoint endPoint = CGPointMake(startPoint.x + endRadius * sinf(i * menuWholeAngle / count), startPoint.y - endRadius * cosf(i * menuWholeAngle / count));
224
+ item.endPoint = RotateCGPointAroundCenter(endPoint, startPoint, rotateAngle);
225
+ CGPoint nearPoint = CGPointMake(startPoint.x + nearRadius * sinf(i * menuWholeAngle / count), startPoint.y - nearRadius * cosf(i * menuWholeAngle / count));
226
+ item.nearPoint = RotateCGPointAroundCenter(nearPoint, startPoint, rotateAngle);
227
+ CGPoint farPoint = CGPointMake(startPoint.x + farRadius * sinf(i * menuWholeAngle / count), startPoint.y - farRadius * cosf(i * menuWholeAngle / count));
228
+ item.farPoint = RotateCGPointAroundCenter(farPoint, startPoint, rotateAngle);
229
+ item.center = item.startPoint;
230
+ item.delegate = self;
231
+ [self insertSubview:item belowSubview:_addButton];
232
+ }
233
+ }
234
+
235
+ - (BOOL)isExpanding
236
+ {
237
+ return _expanding;
238
+ }
239
+ - (void)setExpanding:(BOOL)expanding
240
+ {
241
+ if (expanding) {
242
+ [self _setMenu];
243
+ }
244
+
245
+ _expanding = expanding;
246
+
247
+ // rotate add button
248
+ float angle = self.isExpanding ? -M_PI_4 : 0.0f;
249
+ [UIView animateWithDuration:0.2f animations:^{
250
+ _addButton.transform = CGAffineTransformMakeRotation(angle);
251
+ }];
252
+
253
+ // expand or close animation
254
+ if (!_timer)
255
+ {
256
+ _flag = self.isExpanding ? 0 : ([_menusArray count] - 1);
257
+ SEL selector = self.isExpanding ? @selector(_expand) : @selector(_close);
258
+
259
+ // Adding timer to runloop to make sure UI event won't block the timer from firing
260
+ _timer = [NSTimer timerWithTimeInterval:timeOffset target:self selector:selector userInfo:nil repeats:YES];
261
+ [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
262
+ _isAnimating = YES;
263
+ }
264
+ }
265
+ #pragma mark - private methods
266
+ - (void)_expand
267
+ {
268
+
269
+ if (_flag == [_menusArray count])
270
+ {
271
+ _isAnimating = NO;
272
+ [_timer invalidate];
273
+ _timer = nil;
274
+ return;
275
+ }
276
+
277
+ int tag = 1000 + _flag;
278
+ AwesomeMenuItem *item = (AwesomeMenuItem *)[self viewWithTag:tag];
279
+
280
+ CAKeyframeAnimation *rotateAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];
281
+ rotateAnimation.values = [NSArray arrayWithObjects:[NSNumber numberWithFloat:expandRotation],[NSNumber numberWithFloat:0.0f], nil];
282
+ rotateAnimation.duration = 0.5f;
283
+ rotateAnimation.keyTimes = [NSArray arrayWithObjects:
284
+ [NSNumber numberWithFloat:.3],
285
+ [NSNumber numberWithFloat:.4], nil];
286
+
287
+ CAKeyframeAnimation *positionAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
288
+ positionAnimation.duration = 0.5f;
289
+ CGMutablePathRef path = CGPathCreateMutable();
290
+ CGPathMoveToPoint(path, NULL, item.startPoint.x, item.startPoint.y);
291
+ CGPathAddLineToPoint(path, NULL, item.farPoint.x, item.farPoint.y);
292
+ CGPathAddLineToPoint(path, NULL, item.nearPoint.x, item.nearPoint.y);
293
+ CGPathAddLineToPoint(path, NULL, item.endPoint.x, item.endPoint.y);
294
+ positionAnimation.path = path;
295
+ CGPathRelease(path);
296
+
297
+ CAAnimationGroup *animationgroup = [CAAnimationGroup animation];
298
+ animationgroup.animations = [NSArray arrayWithObjects:positionAnimation, rotateAnimation, nil];
299
+ animationgroup.duration = 0.5f;
300
+ animationgroup.fillMode = kCAFillModeForwards;
301
+ animationgroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
302
+ animationgroup.delegate = self;
303
+ if(_flag == [_menusArray count] - 1){
304
+ [animationgroup setValue:@"firstAnimation" forKey:@"id"];
305
+ }
306
+
307
+ [item.layer addAnimation:animationgroup forKey:@"Expand"];
308
+ item.center = item.endPoint;
309
+
310
+ _flag ++;
311
+
312
+ }
313
+
314
+ - (void)_close
315
+ {
316
+ if (_flag == -1)
317
+ {
318
+ _isAnimating = NO;
319
+ [_timer invalidate];
320
+ _timer = nil;
321
+ return;
322
+ }
323
+
324
+ int tag = 1000 + _flag;
325
+ AwesomeMenuItem *item = (AwesomeMenuItem *)[self viewWithTag:tag];
326
+
327
+ CAKeyframeAnimation *rotateAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];
328
+ rotateAnimation.values = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f],[NSNumber numberWithFloat:closeRotation],[NSNumber numberWithFloat:0.0f], nil];
329
+ rotateAnimation.duration = 0.5f;
330
+ rotateAnimation.keyTimes = [NSArray arrayWithObjects:
331
+ [NSNumber numberWithFloat:.0],
332
+ [NSNumber numberWithFloat:.4],
333
+ [NSNumber numberWithFloat:.5], nil];
334
+
335
+ CAKeyframeAnimation *positionAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
336
+ positionAnimation.duration = 0.5f;
337
+ CGMutablePathRef path = CGPathCreateMutable();
338
+ CGPathMoveToPoint(path, NULL, item.endPoint.x, item.endPoint.y);
339
+ CGPathAddLineToPoint(path, NULL, item.farPoint.x, item.farPoint.y);
340
+ CGPathAddLineToPoint(path, NULL, item.startPoint.x, item.startPoint.y);
341
+ positionAnimation.path = path;
342
+ CGPathRelease(path);
343
+
344
+ CAAnimationGroup *animationgroup = [CAAnimationGroup animation];
345
+ animationgroup.animations = [NSArray arrayWithObjects:positionAnimation, rotateAnimation, nil];
346
+ animationgroup.duration = 0.5f;
347
+ animationgroup.fillMode = kCAFillModeForwards;
348
+ animationgroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
349
+ animationgroup.delegate = self;
350
+ if(_flag == 0){
351
+ [animationgroup setValue:@"lastAnimation" forKey:@"id"];
352
+ }
353
+
354
+ [item.layer addAnimation:animationgroup forKey:@"Close"];
355
+ item.center = item.startPoint;
356
+
357
+ _flag --;
358
+ }
359
+ - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
360
+ if([[anim valueForKey:@"id"] isEqual:@"lastAnimation"]) {
361
+ if(self.delegate && [self.delegate respondsToSelector:@selector(AwesomeMenuDidFinishAnimationClose:)]){
362
+ [self.delegate AwesomeMenuDidFinishAnimationClose:self];
363
+ }
364
+ }
365
+ if([[anim valueForKey:@"id"] isEqual:@"firstAnimation"]) {
366
+ if(self.delegate && [self.delegate respondsToSelector:@selector(AwesomeMenuDidFinishAnimationOpen:)]){
367
+ [self.delegate AwesomeMenuDidFinishAnimationOpen:self];
368
+ }
369
+ }
370
+ }
371
+ - (CAAnimationGroup *)_blowupAnimationAtPoint:(CGPoint)p
372
+ {
373
+ CAKeyframeAnimation *positionAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
374
+ positionAnimation.values = [NSArray arrayWithObjects:[NSValue valueWithCGPoint:p], nil];
375
+ positionAnimation.keyTimes = [NSArray arrayWithObjects: [NSNumber numberWithFloat:.3], nil];
376
+
377
+ CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
378
+ scaleAnimation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(3, 3, 1)];
379
+
380
+ CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
381
+ opacityAnimation.toValue = [NSNumber numberWithFloat:0.0f];
382
+
383
+ CAAnimationGroup *animationgroup = [CAAnimationGroup animation];
384
+ animationgroup.animations = [NSArray arrayWithObjects:positionAnimation, scaleAnimation, opacityAnimation, nil];
385
+ animationgroup.duration = 0.3f;
386
+ animationgroup.fillMode = kCAFillModeForwards;
387
+
388
+ return animationgroup;
389
+ }
390
+
391
+ - (CAAnimationGroup *)_shrinkAnimationAtPoint:(CGPoint)p
392
+ {
393
+ CAKeyframeAnimation *positionAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
394
+ positionAnimation.values = [NSArray arrayWithObjects:[NSValue valueWithCGPoint:p], nil];
395
+ positionAnimation.keyTimes = [NSArray arrayWithObjects: [NSNumber numberWithFloat:.3], nil];
396
+
397
+ CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
398
+ scaleAnimation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(.01, .01, 1)];
399
+
400
+ CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
401
+ opacityAnimation.toValue = [NSNumber numberWithFloat:0.0f];
402
+
403
+ CAAnimationGroup *animationgroup = [CAAnimationGroup animation];
404
+ animationgroup.animations = [NSArray arrayWithObjects:positionAnimation, scaleAnimation, opacityAnimation, nil];
405
+ animationgroup.duration = 0.3f;
406
+ animationgroup.fillMode = kCAFillModeForwards;
407
+
408
+ return animationgroup;
409
+ }
410
+
411
+
412
+ @end