Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Initial commit

  • Loading branch information...
commit 90ae776e48c1c7042d3deb31f8df08e2d0adefd4 0 parents
@neror authored
Showing with 1,937 additions and 0 deletions.
  1. +760 −0 PhotoDispatch.xcodeproj/project.pbxproj
  2. +7 −0 PhotoDispatch.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  3. +17 −0 PhotoDispatch/AppDelegate.h
  4. +69 −0 PhotoDispatch/AppDelegate.m
  5. +18 −0 PhotoDispatch/DetailViewController.h
  6. +63 −0 PhotoDispatch/DetailViewController.m
  7. +92 −0 PhotoDispatch/FTUtils+UIGestureRecognizer.h
  8. +76 −0 PhotoDispatch/FTUtils+UIGestureRecognizer.m
  9. +115 −0 PhotoDispatch/ImageHelpers.h
  10. BIN  PhotoDispatch/Images/Abstract 1.jpg
  11. BIN  PhotoDispatch/Images/Abstract 2.jpg
  12. BIN  PhotoDispatch/Images/Abstract 3.jpg
  13. BIN  PhotoDispatch/Images/Abstract 4.jpg
  14. BIN  PhotoDispatch/Images/Abstract 5.jpg
  15. BIN  PhotoDispatch/Images/Abstract 6.jpg
  16. BIN  PhotoDispatch/Images/Abstract 7.jpg
  17. BIN  PhotoDispatch/Images/Abstract 8.jpg
  18. BIN  PhotoDispatch/Images/Agave.jpg
  19. BIN  PhotoDispatch/Images/Andromeda Galaxy.jpg
  20. BIN  PhotoDispatch/Images/Aqua Blue.jpg
  21. BIN  PhotoDispatch/Images/Aqua Graphite.jpg
  22. BIN  PhotoDispatch/Images/Aurora.jpg
  23. BIN  PhotoDispatch/Images/Bamboo Grove.jpg
  24. BIN  PhotoDispatch/Images/Beach.jpg
  25. BIN  PhotoDispatch/Images/Bristle Grass.jpg
  26. BIN  PhotoDispatch/Images/Cirques.jpg
  27. BIN  PhotoDispatch/Images/Classic Aqua Blue.jpg
  28. BIN  PhotoDispatch/Images/Classic Aqua Graphite.jpg
  29. BIN  PhotoDispatch/Images/Clown Fish.jpg
  30. BIN  PhotoDispatch/Images/Daisies.jpg
  31. BIN  PhotoDispatch/Images/Dancer on the Stage.jpg
  32. BIN  PhotoDispatch/Images/Dandelion.jpg
  33. BIN  PhotoDispatch/Images/Dew Drop.jpg
  34. BIN  PhotoDispatch/Images/Ducks on a Misty Pond.jpg
  35. BIN  PhotoDispatch/Images/Eagle & Waterfall.jpg
  36. BIN  PhotoDispatch/Images/Earth Horizon.jpg
  37. BIN  PhotoDispatch/Images/Earth.jpg
  38. BIN  PhotoDispatch/Images/Elephant.jpg
  39. BIN  PhotoDispatch/Images/Evening Reflections.jpg
  40. BIN  PhotoDispatch/Images/Fall Leaves.jpg
  41. BIN  PhotoDispatch/Images/Flamingos.jpg
  42. BIN  PhotoDispatch/Images/Floating Leaves.jpg
  43. BIN  PhotoDispatch/Images/Flow 1.jpg
  44. BIN  PhotoDispatch/Images/Flow 2.jpg
  45. BIN  PhotoDispatch/Images/Flow 3.jpg
  46. BIN  PhotoDispatch/Images/Flowing Rock.jpg
  47. BIN  PhotoDispatch/Images/Forest in Mist.jpg
  48. BIN  PhotoDispatch/Images/Gentle Rapids.jpg
  49. BIN  PhotoDispatch/Images/Golden Palace.jpg
  50. BIN  PhotoDispatch/Images/Grass Blades.jpg
  51. BIN  PhotoDispatch/Images/Horizon.jpg
  52. BIN  PhotoDispatch/Images/Iceberg.jpg
  53. BIN  PhotoDispatch/Images/Isles.jpg
  54. BIN  PhotoDispatch/Images/Jaguar Aqua Blue.jpg
  55. BIN  PhotoDispatch/Images/Jaguar Aqua Graphite.jpg
  56. BIN  PhotoDispatch/Images/Ladybug.jpg
  57. BIN  PhotoDispatch/Images/Lake.jpg
  58. BIN  PhotoDispatch/Images/Lavender.jpg
  59. BIN  PhotoDispatch/Images/Leaf Curl.jpg
  60. BIN  PhotoDispatch/Images/Leaves.jpg
  61. BIN  PhotoDispatch/Images/Leopard Aurora.jpg
  62. BIN  PhotoDispatch/Images/Lightning.jpg
  63. BIN  PhotoDispatch/Images/Lines Blue.jpg
  64. BIN  PhotoDispatch/Images/Lines Graphite.jpg
  65. BIN  PhotoDispatch/Images/Lines Moss.jpg
  66. BIN  PhotoDispatch/Images/Lines Plum.jpg
  67. BIN  PhotoDispatch/Images/Lion.jpg
  68. BIN  PhotoDispatch/Images/Lotus.jpg
  69. BIN  PhotoDispatch/Images/Maple.jpg
  70. BIN  PhotoDispatch/Images/Mojave.jpg
  71. BIN  PhotoDispatch/Images/Moon.jpg
  72. BIN  PhotoDispatch/Images/Mt. Fuji.jpg
  73. BIN  PhotoDispatch/Images/Nighthawks.jpg
  74. BIN  PhotoDispatch/Images/Panther Aqua Blue.jpg
  75. BIN  PhotoDispatch/Images/Panther Aqua Graphite.jpg
  76. BIN  PhotoDispatch/Images/Peony.jpg
  77. BIN  PhotoDispatch/Images/Petals.jpg
  78. BIN  PhotoDispatch/Images/Pier.jpg
  79. BIN  PhotoDispatch/Images/Pink Forest.jpg
  80. BIN  PhotoDispatch/Images/Pink Lotus Flower.jpg
  81. BIN  PhotoDispatch/Images/Pinstripe.jpg
  82. BIN  PhotoDispatch/Images/Pond Reeds.jpg
  83. BIN  PhotoDispatch/Images/Poppies Blooming.jpg
  84. BIN  PhotoDispatch/Images/Poppies.jpg
  85. BIN  PhotoDispatch/Images/Purple Frond.jpg
  86. BIN  PhotoDispatch/Images/Red Bells.jpg
  87. BIN  PhotoDispatch/Images/Redwoods.jpg
  88. BIN  PhotoDispatch/Images/Rings.jpg
  89. BIN  PhotoDispatch/Images/Ripples Blue.jpg
  90. BIN  PhotoDispatch/Images/Ripples Moss.jpg
  91. BIN  PhotoDispatch/Images/Ripples Purple.jpg
  92. BIN  PhotoDispatch/Images/Rock Garden.jpg
  93. BIN  PhotoDispatch/Images/Rocks.jpg
  94. BIN  PhotoDispatch/Images/Saree.jpg
  95. BIN  PhotoDispatch/Images/Sea Mist.jpg
  96. BIN  PhotoDispatch/Images/Snow Leopard Prowl.jpg
  97. BIN  PhotoDispatch/Images/Snow Leopard.jpg
  98. BIN  PhotoDispatch/Images/Snowy Hills.jpg
  99. BIN  PhotoDispatch/Images/Stones.jpg
  100. BIN  PhotoDispatch/Images/Summer Leaves.jpg
  101. BIN  PhotoDispatch/Images/Summit.jpg
  102. BIN  PhotoDispatch/Images/Sunday Afternoon.jpg
  103. BIN  PhotoDispatch/Images/Suprematism.jpg
  104. BIN  PhotoDispatch/Images/Tahoe.jpg
  105. BIN  PhotoDispatch/Images/The Great Wave.jpg
  106. BIN  PhotoDispatch/Images/Tiles Blue.jpg
  107. BIN  PhotoDispatch/Images/Tiles Pine.jpg
  108. BIN  PhotoDispatch/Images/Tiles Warm Grey.jpg
  109. BIN  PhotoDispatch/Images/Tranquil Surface.jpg
  110. BIN  PhotoDispatch/Images/Water Lilies.jpg
  111. BIN  PhotoDispatch/Images/Water.jpg
  112. BIN  PhotoDispatch/Images/Wave.jpg
  113. BIN  PhotoDispatch/Images/Winter Sunrise.jpg
  114. BIN  PhotoDispatch/Images/Zebra.jpg
  115. +18 −0 PhotoDispatch/MasterViewController.h
  116. +133 −0 PhotoDispatch/MasterViewController.m
  117. +42 −0 PhotoDispatch/PhotoDispatch-Info.plist
  118. +17 −0 PhotoDispatch/PhotoDispatch-Prefix.pch
  119. +32 −0 PhotoDispatch/PhotoGridTableCell.h
  120. +158 −0 PhotoDispatch/PhotoGridTableCell.m
  121. BIN  PhotoDispatch/ThumbnailLoadingImage.png
  122. +158 −0 PhotoDispatch/en.lproj/DetailViewController.xib
  123. +2 −0  PhotoDispatch/en.lproj/InfoPlist.strings
  124. +142 −0 PhotoDispatch/en.lproj/MasterViewController.xib
  125. +18 −0 PhotoDispatch/main.m
760 PhotoDispatch.xcodeproj/project.pbxproj
@@ -0,0 +1,760 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ DF3C785F14890DD5004746D0 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF3C785E14890DD5004746D0 /* UIKit.framework */; };
+ DF3C786114890DD5004746D0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF3C786014890DD5004746D0 /* Foundation.framework */; };
+ DF3C786314890DD5004746D0 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF3C786214890DD5004746D0 /* CoreGraphics.framework */; };
+ DF3C786914890DD5004746D0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = DF3C786714890DD5004746D0 /* InfoPlist.strings */; };
+ DF3C786B14890DD5004746D0 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = DF3C786A14890DD5004746D0 /* main.m */; };
+ DF3C786F14890DD5004746D0 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = DF3C786E14890DD5004746D0 /* AppDelegate.m */; };
+ DF3C787214890DD5004746D0 /* MasterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DF3C787114890DD5004746D0 /* MasterViewController.m */; };
+ DF3C787514890DD5004746D0 /* DetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DF3C787414890DD5004746D0 /* DetailViewController.m */; };
+ DF3C787814890DD5004746D0 /* MasterViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = DF3C787614890DD5004746D0 /* MasterViewController.xib */; };
+ DF3C787B14890DD5004746D0 /* DetailViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = DF3C787914890DD5004746D0 /* DetailViewController.xib */; };
+ DF3C788214890E24004746D0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF3C788114890E24004746D0 /* QuartzCore.framework */; };
+ DF3C788414890E30004746D0 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF3C788314890E30004746D0 /* ImageIO.framework */; };
+ DF3C78B614891432004746D0 /* Andromeda Galaxy.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C788E14891432004746D0 /* Andromeda Galaxy.jpg */; };
+ DF3C78B714891432004746D0 /* Aqua Blue.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C788F14891432004746D0 /* Aqua Blue.jpg */; };
+ DF3C78B814891432004746D0 /* Aqua Graphite.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C789014891432004746D0 /* Aqua Graphite.jpg */; };
+ DF3C78B914891432004746D0 /* Beach.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C789114891432004746D0 /* Beach.jpg */; };
+ DF3C78BA14891432004746D0 /* Bristle Grass.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C789214891432004746D0 /* Bristle Grass.jpg */; };
+ DF3C78BB14891432004746D0 /* Classic Aqua Blue.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C789314891432004746D0 /* Classic Aqua Blue.jpg */; };
+ DF3C78BC14891432004746D0 /* Classic Aqua Graphite.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C789414891432004746D0 /* Classic Aqua Graphite.jpg */; };
+ DF3C78BD14891432004746D0 /* Ducks on a Misty Pond.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C789514891432004746D0 /* Ducks on a Misty Pond.jpg */; };
+ DF3C78BE14891432004746D0 /* Eagle & Waterfall.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C789614891432004746D0 /* Eagle & Waterfall.jpg */; };
+ DF3C78BF14891432004746D0 /* Elephant.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C789714891432004746D0 /* Elephant.jpg */; };
+ DF3C78C014891432004746D0 /* Flamingos.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C789814891432004746D0 /* Flamingos.jpg */; };
+ DF3C78C114891432004746D0 /* Floating Leaves.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C789914891432004746D0 /* Floating Leaves.jpg */; };
+ DF3C78C214891432004746D0 /* Flow 1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C789A14891432004746D0 /* Flow 1.jpg */; };
+ DF3C78C314891432004746D0 /* Flow 2.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C789B14891432004746D0 /* Flow 2.jpg */; };
+ DF3C78C414891432004746D0 /* Flow 3.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C789C14891432004746D0 /* Flow 3.jpg */; };
+ DF3C78C514891432004746D0 /* Forest in Mist.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C789D14891432004746D0 /* Forest in Mist.jpg */; };
+ DF3C78C614891432004746D0 /* Grass Blades.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C789E14891432004746D0 /* Grass Blades.jpg */; };
+ DF3C78C714891432004746D0 /* Isles.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C789F14891432004746D0 /* Isles.jpg */; };
+ DF3C78C814891432004746D0 /* Jaguar Aqua Blue.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78A014891432004746D0 /* Jaguar Aqua Blue.jpg */; };
+ DF3C78C914891432004746D0 /* Jaguar Aqua Graphite.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78A114891432004746D0 /* Jaguar Aqua Graphite.jpg */; };
+ DF3C78CA14891432004746D0 /* Lake.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78A214891432004746D0 /* Lake.jpg */; };
+ DF3C78CB14891432004746D0 /* Lines Blue.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78A314891432004746D0 /* Lines Blue.jpg */; };
+ DF3C78CC14891432004746D0 /* Lines Graphite.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78A414891432004746D0 /* Lines Graphite.jpg */; };
+ DF3C78CD14891432004746D0 /* Lines Moss.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78A514891432004746D0 /* Lines Moss.jpg */; };
+ DF3C78CE14891432004746D0 /* Lines Plum.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78A614891432004746D0 /* Lines Plum.jpg */; };
+ DF3C78CF14891432004746D0 /* Lion.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78A714891432004746D0 /* Lion.jpg */; };
+ DF3C78D014891432004746D0 /* Moon.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78A814891432004746D0 /* Moon.jpg */; };
+ DF3C78D114891432004746D0 /* Mt. Fuji.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78A914891432004746D0 /* Mt. Fuji.jpg */; };
+ DF3C78D214891432004746D0 /* Panther Aqua Blue.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78AA14891432004746D0 /* Panther Aqua Blue.jpg */; };
+ DF3C78D314891432004746D0 /* Panther Aqua Graphite.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78AB14891432004746D0 /* Panther Aqua Graphite.jpg */; };
+ DF3C78D414891432004746D0 /* Pink Forest.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78AC14891432004746D0 /* Pink Forest.jpg */; };
+ DF3C78D514891432004746D0 /* Pink Lotus Flower.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78AD14891432004746D0 /* Pink Lotus Flower.jpg */; };
+ DF3C78D614891432004746D0 /* Poppies.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78AE14891432004746D0 /* Poppies.jpg */; };
+ DF3C78D714891432004746D0 /* Red Bells.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78AF14891432004746D0 /* Red Bells.jpg */; };
+ DF3C78D814891432004746D0 /* Ripples Blue.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78B014891432004746D0 /* Ripples Blue.jpg */; };
+ DF3C78D914891432004746D0 /* Ripples Moss.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78B114891432004746D0 /* Ripples Moss.jpg */; };
+ DF3C78DA14891432004746D0 /* Ripples Purple.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78B214891432004746D0 /* Ripples Purple.jpg */; };
+ DF3C78DB14891432004746D0 /* Tiles Blue.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78B314891432004746D0 /* Tiles Blue.jpg */; };
+ DF3C78DC14891432004746D0 /* Tiles Pine.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78B414891432004746D0 /* Tiles Pine.jpg */; };
+ DF3C78DD14891432004746D0 /* Tiles Warm Grey.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78B514891432004746D0 /* Tiles Warm Grey.jpg */; };
+ DF3C78E014891653004746D0 /* PhotoGridTableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = DF3C78DF14891653004746D0 /* PhotoGridTableCell.m */; };
+ DF3C78E2148922A7004746D0 /* ThumbnailLoadingImage.png in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78E1148922A7004746D0 /* ThumbnailLoadingImage.png */; };
+ DF3C79241489246A004746D0 /* Abstract 1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78E31489246A004746D0 /* Abstract 1.jpg */; };
+ DF3C79251489246A004746D0 /* Abstract 2.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78E41489246A004746D0 /* Abstract 2.jpg */; };
+ DF3C79261489246A004746D0 /* Abstract 3.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78E51489246A004746D0 /* Abstract 3.jpg */; };
+ DF3C79271489246A004746D0 /* Abstract 4.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78E61489246A004746D0 /* Abstract 4.jpg */; };
+ DF3C79281489246A004746D0 /* Abstract 5.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78E71489246A004746D0 /* Abstract 5.jpg */; };
+ DF3C79291489246A004746D0 /* Abstract 6.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78E81489246A004746D0 /* Abstract 6.jpg */; };
+ DF3C792A1489246A004746D0 /* Abstract 7.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78E91489246A004746D0 /* Abstract 7.jpg */; };
+ DF3C792B1489246A004746D0 /* Abstract 8.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78EA1489246A004746D0 /* Abstract 8.jpg */; };
+ DF3C792C1489246A004746D0 /* Agave.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78EB1489246A004746D0 /* Agave.jpg */; };
+ DF3C792D1489246A004746D0 /* Aurora.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78EC1489246A004746D0 /* Aurora.jpg */; };
+ DF3C792E1489246A004746D0 /* Bamboo Grove.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78ED1489246A004746D0 /* Bamboo Grove.jpg */; };
+ DF3C792F1489246A004746D0 /* Cirques.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78EE1489246A004746D0 /* Cirques.jpg */; };
+ DF3C79301489246A004746D0 /* Clown Fish.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78EF1489246A004746D0 /* Clown Fish.jpg */; };
+ DF3C79311489246A004746D0 /* Daisies.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78F01489246A004746D0 /* Daisies.jpg */; };
+ DF3C79321489246A004746D0 /* Dancer on the Stage.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78F11489246A004746D0 /* Dancer on the Stage.jpg */; };
+ DF3C79331489246A004746D0 /* Dandelion.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78F21489246A004746D0 /* Dandelion.jpg */; };
+ DF3C79341489246A004746D0 /* Dew Drop.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78F31489246A004746D0 /* Dew Drop.jpg */; };
+ DF3C79351489246A004746D0 /* Earth Horizon.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78F41489246A004746D0 /* Earth Horizon.jpg */; };
+ DF3C79361489246A004746D0 /* Earth.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78F51489246A004746D0 /* Earth.jpg */; };
+ DF3C79371489246A004746D0 /* Evening Reflections.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78F61489246A004746D0 /* Evening Reflections.jpg */; };
+ DF3C79381489246A004746D0 /* Fall Leaves.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78F71489246A004746D0 /* Fall Leaves.jpg */; };
+ DF3C79391489246A004746D0 /* Flowing Rock.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78F81489246A004746D0 /* Flowing Rock.jpg */; };
+ DF3C793A1489246A004746D0 /* Gentle Rapids.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78F91489246A004746D0 /* Gentle Rapids.jpg */; };
+ DF3C793B1489246A004746D0 /* Golden Palace.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78FA1489246A004746D0 /* Golden Palace.jpg */; };
+ DF3C793C1489246A004746D0 /* Horizon.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78FB1489246A004746D0 /* Horizon.jpg */; };
+ DF3C793D1489246A004746D0 /* Iceberg.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78FC1489246A004746D0 /* Iceberg.jpg */; };
+ DF3C793E1489246A004746D0 /* Ladybug.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78FD1489246A004746D0 /* Ladybug.jpg */; };
+ DF3C793F1489246A004746D0 /* Lavender.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78FE1489246A004746D0 /* Lavender.jpg */; };
+ DF3C79401489246A004746D0 /* Leaf Curl.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C78FF1489246A004746D0 /* Leaf Curl.jpg */; };
+ DF3C79411489246A004746D0 /* Leaves.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79001489246A004746D0 /* Leaves.jpg */; };
+ DF3C79421489246A004746D0 /* Leopard Aurora.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79011489246A004746D0 /* Leopard Aurora.jpg */; };
+ DF3C79431489246A004746D0 /* Lightning.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79021489246A004746D0 /* Lightning.jpg */; };
+ DF3C79441489246A004746D0 /* Lotus.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79031489246A004746D0 /* Lotus.jpg */; };
+ DF3C79451489246A004746D0 /* Maple.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79041489246A004746D0 /* Maple.jpg */; };
+ DF3C79461489246A004746D0 /* Mojave.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79051489246A004746D0 /* Mojave.jpg */; };
+ DF3C79471489246A004746D0 /* Nighthawks.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79061489246A004746D0 /* Nighthawks.jpg */; };
+ DF3C79481489246A004746D0 /* Peony.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79071489246A004746D0 /* Peony.jpg */; };
+ DF3C79491489246A004746D0 /* Petals.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79081489246A004746D0 /* Petals.jpg */; };
+ DF3C794A1489246A004746D0 /* Pier.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79091489246A004746D0 /* Pier.jpg */; };
+ DF3C794B1489246A004746D0 /* Pinstripe.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C790A1489246A004746D0 /* Pinstripe.jpg */; };
+ DF3C794C1489246A004746D0 /* Pond Reeds.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C790B1489246A004746D0 /* Pond Reeds.jpg */; };
+ DF3C794D1489246A004746D0 /* Poppies Blooming.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C790C1489246A004746D0 /* Poppies Blooming.jpg */; };
+ DF3C794E1489246A004746D0 /* Purple Frond.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C790D1489246A004746D0 /* Purple Frond.jpg */; };
+ DF3C794F1489246A004746D0 /* Redwoods.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C790E1489246A004746D0 /* Redwoods.jpg */; };
+ DF3C79501489246A004746D0 /* Rings.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C790F1489246A004746D0 /* Rings.jpg */; };
+ DF3C79511489246A004746D0 /* Rock Garden.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79101489246A004746D0 /* Rock Garden.jpg */; };
+ DF3C79521489246A004746D0 /* Rocks.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79111489246A004746D0 /* Rocks.jpg */; };
+ DF3C79531489246A004746D0 /* Saree.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79121489246A004746D0 /* Saree.jpg */; };
+ DF3C79541489246A004746D0 /* Sea Mist.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79131489246A004746D0 /* Sea Mist.jpg */; };
+ DF3C79551489246A004746D0 /* Snow Leopard Prowl.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79141489246A004746D0 /* Snow Leopard Prowl.jpg */; };
+ DF3C79561489246A004746D0 /* Snow Leopard.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79151489246A004746D0 /* Snow Leopard.jpg */; };
+ DF3C79571489246A004746D0 /* Snowy Hills.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79161489246A004746D0 /* Snowy Hills.jpg */; };
+ DF3C79581489246A004746D0 /* Stones.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79171489246A004746D0 /* Stones.jpg */; };
+ DF3C79591489246A004746D0 /* Summer Leaves.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79181489246A004746D0 /* Summer Leaves.jpg */; };
+ DF3C795A1489246A004746D0 /* Summit.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79191489246A004746D0 /* Summit.jpg */; };
+ DF3C795B1489246A004746D0 /* Sunday Afternoon.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C791A1489246A004746D0 /* Sunday Afternoon.jpg */; };
+ DF3C795C1489246A004746D0 /* Suprematism.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C791B1489246A004746D0 /* Suprematism.jpg */; };
+ DF3C795D1489246A004746D0 /* Tahoe.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C791C1489246A004746D0 /* Tahoe.jpg */; };
+ DF3C795E1489246A004746D0 /* The Great Wave.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C791D1489246A004746D0 /* The Great Wave.jpg */; };
+ DF3C795F1489246A004746D0 /* Tranquil Surface.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C791E1489246A004746D0 /* Tranquil Surface.jpg */; };
+ DF3C79601489246A004746D0 /* Water Lilies.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C791F1489246A004746D0 /* Water Lilies.jpg */; };
+ DF3C79611489246A004746D0 /* Water.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79201489246A004746D0 /* Water.jpg */; };
+ DF3C79621489246A004746D0 /* Wave.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79211489246A004746D0 /* Wave.jpg */; };
+ DF3C79631489246A004746D0 /* Winter Sunrise.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79221489246A004746D0 /* Winter Sunrise.jpg */; };
+ DF3C79641489246A004746D0 /* Zebra.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DF3C79231489246A004746D0 /* Zebra.jpg */; };
+ DF3C796714892724004746D0 /* FTUtils+UIGestureRecognizer.m in Sources */ = {isa = PBXBuildFile; fileRef = DF3C796614892724004746D0 /* FTUtils+UIGestureRecognizer.m */; };
+ DF3C7969148932FF004746D0 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF3C7968148932FF004746D0 /* Accelerate.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ DF3C785A14890DD5004746D0 /* PhotoDispatch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PhotoDispatch.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ DF3C785E14890DD5004746D0 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ DF3C786014890DD5004746D0 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ DF3C786214890DD5004746D0 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ DF3C786614890DD5004746D0 /* PhotoDispatch-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "PhotoDispatch-Info.plist"; sourceTree = "<group>"; };
+ DF3C786814890DD5004746D0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ DF3C786A14890DD5004746D0 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ DF3C786C14890DD5004746D0 /* PhotoDispatch-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "PhotoDispatch-Prefix.pch"; sourceTree = "<group>"; };
+ DF3C786D14890DD5004746D0 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+ DF3C786E14890DD5004746D0 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+ DF3C787014890DD5004746D0 /* MasterViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MasterViewController.h; sourceTree = "<group>"; };
+ DF3C787114890DD5004746D0 /* MasterViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MasterViewController.m; sourceTree = "<group>"; };
+ DF3C787314890DD5004746D0 /* DetailViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DetailViewController.h; sourceTree = "<group>"; };
+ DF3C787414890DD5004746D0 /* DetailViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DetailViewController.m; sourceTree = "<group>"; };
+ DF3C787714890DD5004746D0 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MasterViewController.xib; sourceTree = "<group>"; };
+ DF3C787A14890DD5004746D0 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/DetailViewController.xib; sourceTree = "<group>"; };
+ DF3C788114890E24004746D0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ DF3C788314890E30004746D0 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = System/Library/Frameworks/ImageIO.framework; sourceTree = SDKROOT; };
+ DF3C788E14891432004746D0 /* Andromeda Galaxy.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Andromeda Galaxy.jpg"; sourceTree = "<group>"; };
+ DF3C788F14891432004746D0 /* Aqua Blue.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Aqua Blue.jpg"; sourceTree = "<group>"; };
+ DF3C789014891432004746D0 /* Aqua Graphite.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Aqua Graphite.jpg"; sourceTree = "<group>"; };
+ DF3C789114891432004746D0 /* Beach.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Beach.jpg; sourceTree = "<group>"; };
+ DF3C789214891432004746D0 /* Bristle Grass.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Bristle Grass.jpg"; sourceTree = "<group>"; };
+ DF3C789314891432004746D0 /* Classic Aqua Blue.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Classic Aqua Blue.jpg"; sourceTree = "<group>"; };
+ DF3C789414891432004746D0 /* Classic Aqua Graphite.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Classic Aqua Graphite.jpg"; sourceTree = "<group>"; };
+ DF3C789514891432004746D0 /* Ducks on a Misty Pond.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Ducks on a Misty Pond.jpg"; sourceTree = "<group>"; };
+ DF3C789614891432004746D0 /* Eagle & Waterfall.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Eagle & Waterfall.jpg"; sourceTree = "<group>"; };
+ DF3C789714891432004746D0 /* Elephant.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Elephant.jpg; sourceTree = "<group>"; };
+ DF3C789814891432004746D0 /* Flamingos.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Flamingos.jpg; sourceTree = "<group>"; };
+ DF3C789914891432004746D0 /* Floating Leaves.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Floating Leaves.jpg"; sourceTree = "<group>"; };
+ DF3C789A14891432004746D0 /* Flow 1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Flow 1.jpg"; sourceTree = "<group>"; };
+ DF3C789B14891432004746D0 /* Flow 2.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Flow 2.jpg"; sourceTree = "<group>"; };
+ DF3C789C14891432004746D0 /* Flow 3.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Flow 3.jpg"; sourceTree = "<group>"; };
+ DF3C789D14891432004746D0 /* Forest in Mist.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Forest in Mist.jpg"; sourceTree = "<group>"; };
+ DF3C789E14891432004746D0 /* Grass Blades.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Grass Blades.jpg"; sourceTree = "<group>"; };
+ DF3C789F14891432004746D0 /* Isles.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Isles.jpg; sourceTree = "<group>"; };
+ DF3C78A014891432004746D0 /* Jaguar Aqua Blue.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Jaguar Aqua Blue.jpg"; sourceTree = "<group>"; };
+ DF3C78A114891432004746D0 /* Jaguar Aqua Graphite.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Jaguar Aqua Graphite.jpg"; sourceTree = "<group>"; };
+ DF3C78A214891432004746D0 /* Lake.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Lake.jpg; sourceTree = "<group>"; };
+ DF3C78A314891432004746D0 /* Lines Blue.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Lines Blue.jpg"; sourceTree = "<group>"; };
+ DF3C78A414891432004746D0 /* Lines Graphite.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Lines Graphite.jpg"; sourceTree = "<group>"; };
+ DF3C78A514891432004746D0 /* Lines Moss.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Lines Moss.jpg"; sourceTree = "<group>"; };
+ DF3C78A614891432004746D0 /* Lines Plum.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Lines Plum.jpg"; sourceTree = "<group>"; };
+ DF3C78A714891432004746D0 /* Lion.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Lion.jpg; sourceTree = "<group>"; };
+ DF3C78A814891432004746D0 /* Moon.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Moon.jpg; sourceTree = "<group>"; };
+ DF3C78A914891432004746D0 /* Mt. Fuji.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Mt. Fuji.jpg"; sourceTree = "<group>"; };
+ DF3C78AA14891432004746D0 /* Panther Aqua Blue.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Panther Aqua Blue.jpg"; sourceTree = "<group>"; };
+ DF3C78AB14891432004746D0 /* Panther Aqua Graphite.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Panther Aqua Graphite.jpg"; sourceTree = "<group>"; };
+ DF3C78AC14891432004746D0 /* Pink Forest.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Pink Forest.jpg"; sourceTree = "<group>"; };
+ DF3C78AD14891432004746D0 /* Pink Lotus Flower.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Pink Lotus Flower.jpg"; sourceTree = "<group>"; };
+ DF3C78AE14891432004746D0 /* Poppies.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Poppies.jpg; sourceTree = "<group>"; };
+ DF3C78AF14891432004746D0 /* Red Bells.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Red Bells.jpg"; sourceTree = "<group>"; };
+ DF3C78B014891432004746D0 /* Ripples Blue.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Ripples Blue.jpg"; sourceTree = "<group>"; };
+ DF3C78B114891432004746D0 /* Ripples Moss.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Ripples Moss.jpg"; sourceTree = "<group>"; };
+ DF3C78B214891432004746D0 /* Ripples Purple.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Ripples Purple.jpg"; sourceTree = "<group>"; };
+ DF3C78B314891432004746D0 /* Tiles Blue.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Tiles Blue.jpg"; sourceTree = "<group>"; };
+ DF3C78B414891432004746D0 /* Tiles Pine.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Tiles Pine.jpg"; sourceTree = "<group>"; };
+ DF3C78B514891432004746D0 /* Tiles Warm Grey.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Tiles Warm Grey.jpg"; sourceTree = "<group>"; };
+ DF3C78DE14891653004746D0 /* PhotoGridTableCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhotoGridTableCell.h; sourceTree = "<group>"; };
+ DF3C78DF14891653004746D0 /* PhotoGridTableCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhotoGridTableCell.m; sourceTree = "<group>"; };
+ DF3C78E1148922A7004746D0 /* ThumbnailLoadingImage.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ThumbnailLoadingImage.png; sourceTree = "<group>"; };
+ DF3C78E31489246A004746D0 /* Abstract 1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Abstract 1.jpg"; sourceTree = "<group>"; };
+ DF3C78E41489246A004746D0 /* Abstract 2.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Abstract 2.jpg"; sourceTree = "<group>"; };
+ DF3C78E51489246A004746D0 /* Abstract 3.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Abstract 3.jpg"; sourceTree = "<group>"; };
+ DF3C78E61489246A004746D0 /* Abstract 4.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Abstract 4.jpg"; sourceTree = "<group>"; };
+ DF3C78E71489246A004746D0 /* Abstract 5.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Abstract 5.jpg"; sourceTree = "<group>"; };
+ DF3C78E81489246A004746D0 /* Abstract 6.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Abstract 6.jpg"; sourceTree = "<group>"; };
+ DF3C78E91489246A004746D0 /* Abstract 7.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Abstract 7.jpg"; sourceTree = "<group>"; };
+ DF3C78EA1489246A004746D0 /* Abstract 8.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Abstract 8.jpg"; sourceTree = "<group>"; };
+ DF3C78EB1489246A004746D0 /* Agave.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Agave.jpg; sourceTree = "<group>"; };
+ DF3C78EC1489246A004746D0 /* Aurora.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Aurora.jpg; sourceTree = "<group>"; };
+ DF3C78ED1489246A004746D0 /* Bamboo Grove.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Bamboo Grove.jpg"; sourceTree = "<group>"; };
+ DF3C78EE1489246A004746D0 /* Cirques.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Cirques.jpg; sourceTree = "<group>"; };
+ DF3C78EF1489246A004746D0 /* Clown Fish.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Clown Fish.jpg"; sourceTree = "<group>"; };
+ DF3C78F01489246A004746D0 /* Daisies.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Daisies.jpg; sourceTree = "<group>"; };
+ DF3C78F11489246A004746D0 /* Dancer on the Stage.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Dancer on the Stage.jpg"; sourceTree = "<group>"; };
+ DF3C78F21489246A004746D0 /* Dandelion.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Dandelion.jpg; sourceTree = "<group>"; };
+ DF3C78F31489246A004746D0 /* Dew Drop.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Dew Drop.jpg"; sourceTree = "<group>"; };
+ DF3C78F41489246A004746D0 /* Earth Horizon.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Earth Horizon.jpg"; sourceTree = "<group>"; };
+ DF3C78F51489246A004746D0 /* Earth.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Earth.jpg; sourceTree = "<group>"; };
+ DF3C78F61489246A004746D0 /* Evening Reflections.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Evening Reflections.jpg"; sourceTree = "<group>"; };
+ DF3C78F71489246A004746D0 /* Fall Leaves.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Fall Leaves.jpg"; sourceTree = "<group>"; };
+ DF3C78F81489246A004746D0 /* Flowing Rock.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Flowing Rock.jpg"; sourceTree = "<group>"; };
+ DF3C78F91489246A004746D0 /* Gentle Rapids.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Gentle Rapids.jpg"; sourceTree = "<group>"; };
+ DF3C78FA1489246A004746D0 /* Golden Palace.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Golden Palace.jpg"; sourceTree = "<group>"; };
+ DF3C78FB1489246A004746D0 /* Horizon.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Horizon.jpg; sourceTree = "<group>"; };
+ DF3C78FC1489246A004746D0 /* Iceberg.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Iceberg.jpg; sourceTree = "<group>"; };
+ DF3C78FD1489246A004746D0 /* Ladybug.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Ladybug.jpg; sourceTree = "<group>"; };
+ DF3C78FE1489246A004746D0 /* Lavender.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Lavender.jpg; sourceTree = "<group>"; };
+ DF3C78FF1489246A004746D0 /* Leaf Curl.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Leaf Curl.jpg"; sourceTree = "<group>"; };
+ DF3C79001489246A004746D0 /* Leaves.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Leaves.jpg; sourceTree = "<group>"; };
+ DF3C79011489246A004746D0 /* Leopard Aurora.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Leopard Aurora.jpg"; sourceTree = "<group>"; };
+ DF3C79021489246A004746D0 /* Lightning.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Lightning.jpg; sourceTree = "<group>"; };
+ DF3C79031489246A004746D0 /* Lotus.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Lotus.jpg; sourceTree = "<group>"; };
+ DF3C79041489246A004746D0 /* Maple.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Maple.jpg; sourceTree = "<group>"; };
+ DF3C79051489246A004746D0 /* Mojave.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Mojave.jpg; sourceTree = "<group>"; };
+ DF3C79061489246A004746D0 /* Nighthawks.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Nighthawks.jpg; sourceTree = "<group>"; };
+ DF3C79071489246A004746D0 /* Peony.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Peony.jpg; sourceTree = "<group>"; };
+ DF3C79081489246A004746D0 /* Petals.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Petals.jpg; sourceTree = "<group>"; };
+ DF3C79091489246A004746D0 /* Pier.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Pier.jpg; sourceTree = "<group>"; };
+ DF3C790A1489246A004746D0 /* Pinstripe.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Pinstripe.jpg; sourceTree = "<group>"; };
+ DF3C790B1489246A004746D0 /* Pond Reeds.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Pond Reeds.jpg"; sourceTree = "<group>"; };
+ DF3C790C1489246A004746D0 /* Poppies Blooming.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Poppies Blooming.jpg"; sourceTree = "<group>"; };
+ DF3C790D1489246A004746D0 /* Purple Frond.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Purple Frond.jpg"; sourceTree = "<group>"; };
+ DF3C790E1489246A004746D0 /* Redwoods.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Redwoods.jpg; sourceTree = "<group>"; };
+ DF3C790F1489246A004746D0 /* Rings.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Rings.jpg; sourceTree = "<group>"; };
+ DF3C79101489246A004746D0 /* Rock Garden.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Rock Garden.jpg"; sourceTree = "<group>"; };
+ DF3C79111489246A004746D0 /* Rocks.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Rocks.jpg; sourceTree = "<group>"; };
+ DF3C79121489246A004746D0 /* Saree.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Saree.jpg; sourceTree = "<group>"; };
+ DF3C79131489246A004746D0 /* Sea Mist.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Sea Mist.jpg"; sourceTree = "<group>"; };
+ DF3C79141489246A004746D0 /* Snow Leopard Prowl.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Snow Leopard Prowl.jpg"; sourceTree = "<group>"; };
+ DF3C79151489246A004746D0 /* Snow Leopard.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Snow Leopard.jpg"; sourceTree = "<group>"; };
+ DF3C79161489246A004746D0 /* Snowy Hills.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Snowy Hills.jpg"; sourceTree = "<group>"; };
+ DF3C79171489246A004746D0 /* Stones.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Stones.jpg; sourceTree = "<group>"; };
+ DF3C79181489246A004746D0 /* Summer Leaves.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Summer Leaves.jpg"; sourceTree = "<group>"; };
+ DF3C79191489246A004746D0 /* Summit.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Summit.jpg; sourceTree = "<group>"; };
+ DF3C791A1489246A004746D0 /* Sunday Afternoon.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Sunday Afternoon.jpg"; sourceTree = "<group>"; };
+ DF3C791B1489246A004746D0 /* Suprematism.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Suprematism.jpg; sourceTree = "<group>"; };
+ DF3C791C1489246A004746D0 /* Tahoe.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Tahoe.jpg; sourceTree = "<group>"; };
+ DF3C791D1489246A004746D0 /* The Great Wave.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "The Great Wave.jpg"; sourceTree = "<group>"; };
+ DF3C791E1489246A004746D0 /* Tranquil Surface.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Tranquil Surface.jpg"; sourceTree = "<group>"; };
+ DF3C791F1489246A004746D0 /* Water Lilies.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Water Lilies.jpg"; sourceTree = "<group>"; };
+ DF3C79201489246A004746D0 /* Water.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Water.jpg; sourceTree = "<group>"; };
+ DF3C79211489246A004746D0 /* Wave.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Wave.jpg; sourceTree = "<group>"; };
+ DF3C79221489246A004746D0 /* Winter Sunrise.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Winter Sunrise.jpg"; sourceTree = "<group>"; };
+ DF3C79231489246A004746D0 /* Zebra.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Zebra.jpg; sourceTree = "<group>"; };
+ DF3C796514892724004746D0 /* FTUtils+UIGestureRecognizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "FTUtils+UIGestureRecognizer.h"; sourceTree = "<group>"; };
+ DF3C796614892724004746D0 /* FTUtils+UIGestureRecognizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "FTUtils+UIGestureRecognizer.m"; sourceTree = "<group>"; };
+ DF3C7968148932FF004746D0 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+ DF3C797F148A7913004746D0 /* ImageHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageHelpers.h; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ DF3C785714890DD5004746D0 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DF3C7969148932FF004746D0 /* Accelerate.framework in Frameworks */,
+ DF3C788414890E30004746D0 /* ImageIO.framework in Frameworks */,
+ DF3C788214890E24004746D0 /* QuartzCore.framework in Frameworks */,
+ DF3C785F14890DD5004746D0 /* UIKit.framework in Frameworks */,
+ DF3C786114890DD5004746D0 /* Foundation.framework in Frameworks */,
+ DF3C786314890DD5004746D0 /* CoreGraphics.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ DF3C784F14890DD5004746D0 = {
+ isa = PBXGroup;
+ children = (
+ DF3C786414890DD5004746D0 /* PhotoDispatch */,
+ DF3C788D14891431004746D0 /* Images */,
+ DF3C785D14890DD5004746D0 /* Frameworks */,
+ DF3C785B14890DD5004746D0 /* Products */,
+ );
+ sourceTree = "<group>";
+ };
+ DF3C785B14890DD5004746D0 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ DF3C785A14890DD5004746D0 /* PhotoDispatch.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ DF3C785D14890DD5004746D0 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ DF3C7968148932FF004746D0 /* Accelerate.framework */,
+ DF3C788314890E30004746D0 /* ImageIO.framework */,
+ DF3C788114890E24004746D0 /* QuartzCore.framework */,
+ DF3C785E14890DD5004746D0 /* UIKit.framework */,
+ DF3C786014890DD5004746D0 /* Foundation.framework */,
+ DF3C786214890DD5004746D0 /* CoreGraphics.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ DF3C786414890DD5004746D0 /* PhotoDispatch */ = {
+ isa = PBXGroup;
+ children = (
+ DF3C797F148A7913004746D0 /* ImageHelpers.h */,
+ DF3C786D14890DD5004746D0 /* AppDelegate.h */,
+ DF3C786E14890DD5004746D0 /* AppDelegate.m */,
+ DF3C787014890DD5004746D0 /* MasterViewController.h */,
+ DF3C787114890DD5004746D0 /* MasterViewController.m */,
+ DF3C787314890DD5004746D0 /* DetailViewController.h */,
+ DF3C787414890DD5004746D0 /* DetailViewController.m */,
+ DF3C78DE14891653004746D0 /* PhotoGridTableCell.h */,
+ DF3C78DF14891653004746D0 /* PhotoGridTableCell.m */,
+ DF3C796514892724004746D0 /* FTUtils+UIGestureRecognizer.h */,
+ DF3C796614892724004746D0 /* FTUtils+UIGestureRecognizer.m */,
+ DF3C787614890DD5004746D0 /* MasterViewController.xib */,
+ DF3C787914890DD5004746D0 /* DetailViewController.xib */,
+ DF3C78E1148922A7004746D0 /* ThumbnailLoadingImage.png */,
+ DF3C786514890DD5004746D0 /* Supporting Files */,
+ );
+ path = PhotoDispatch;
+ sourceTree = "<group>";
+ };
+ DF3C786514890DD5004746D0 /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ DF3C786614890DD5004746D0 /* PhotoDispatch-Info.plist */,
+ DF3C786714890DD5004746D0 /* InfoPlist.strings */,
+ DF3C786A14890DD5004746D0 /* main.m */,
+ DF3C786C14890DD5004746D0 /* PhotoDispatch-Prefix.pch */,
+ );
+ name = "Supporting Files";
+ sourceTree = "<group>";
+ };
+ DF3C788D14891431004746D0 /* Images */ = {
+ isa = PBXGroup;
+ children = (
+ DF3C78E31489246A004746D0 /* Abstract 1.jpg */,
+ DF3C78E41489246A004746D0 /* Abstract 2.jpg */,
+ DF3C78E51489246A004746D0 /* Abstract 3.jpg */,
+ DF3C78E61489246A004746D0 /* Abstract 4.jpg */,
+ DF3C78E71489246A004746D0 /* Abstract 5.jpg */,
+ DF3C78E81489246A004746D0 /* Abstract 6.jpg */,
+ DF3C78E91489246A004746D0 /* Abstract 7.jpg */,
+ DF3C78EA1489246A004746D0 /* Abstract 8.jpg */,
+ DF3C78EB1489246A004746D0 /* Agave.jpg */,
+ DF3C78EC1489246A004746D0 /* Aurora.jpg */,
+ DF3C78ED1489246A004746D0 /* Bamboo Grove.jpg */,
+ DF3C78EE1489246A004746D0 /* Cirques.jpg */,
+ DF3C78EF1489246A004746D0 /* Clown Fish.jpg */,
+ DF3C78F01489246A004746D0 /* Daisies.jpg */,
+ DF3C78F11489246A004746D0 /* Dancer on the Stage.jpg */,
+ DF3C78F21489246A004746D0 /* Dandelion.jpg */,
+ DF3C78F31489246A004746D0 /* Dew Drop.jpg */,
+ DF3C78F41489246A004746D0 /* Earth Horizon.jpg */,
+ DF3C78F51489246A004746D0 /* Earth.jpg */,
+ DF3C78F61489246A004746D0 /* Evening Reflections.jpg */,
+ DF3C78F71489246A004746D0 /* Fall Leaves.jpg */,
+ DF3C78F81489246A004746D0 /* Flowing Rock.jpg */,
+ DF3C78F91489246A004746D0 /* Gentle Rapids.jpg */,
+ DF3C78FA1489246A004746D0 /* Golden Palace.jpg */,
+ DF3C78FB1489246A004746D0 /* Horizon.jpg */,
+ DF3C78FC1489246A004746D0 /* Iceberg.jpg */,
+ DF3C78FD1489246A004746D0 /* Ladybug.jpg */,
+ DF3C78FE1489246A004746D0 /* Lavender.jpg */,
+ DF3C78FF1489246A004746D0 /* Leaf Curl.jpg */,
+ DF3C79001489246A004746D0 /* Leaves.jpg */,
+ DF3C79011489246A004746D0 /* Leopard Aurora.jpg */,
+ DF3C79021489246A004746D0 /* Lightning.jpg */,
+ DF3C79031489246A004746D0 /* Lotus.jpg */,
+ DF3C79041489246A004746D0 /* Maple.jpg */,
+ DF3C79051489246A004746D0 /* Mojave.jpg */,
+ DF3C79061489246A004746D0 /* Nighthawks.jpg */,
+ DF3C79071489246A004746D0 /* Peony.jpg */,
+ DF3C79081489246A004746D0 /* Petals.jpg */,
+ DF3C79091489246A004746D0 /* Pier.jpg */,
+ DF3C790A1489246A004746D0 /* Pinstripe.jpg */,
+ DF3C790B1489246A004746D0 /* Pond Reeds.jpg */,
+ DF3C790C1489246A004746D0 /* Poppies Blooming.jpg */,
+ DF3C790D1489246A004746D0 /* Purple Frond.jpg */,
+ DF3C790E1489246A004746D0 /* Redwoods.jpg */,
+ DF3C790F1489246A004746D0 /* Rings.jpg */,
+ DF3C79101489246A004746D0 /* Rock Garden.jpg */,
+ DF3C79111489246A004746D0 /* Rocks.jpg */,
+ DF3C79121489246A004746D0 /* Saree.jpg */,
+ DF3C79131489246A004746D0 /* Sea Mist.jpg */,
+ DF3C79141489246A004746D0 /* Snow Leopard Prowl.jpg */,
+ DF3C79151489246A004746D0 /* Snow Leopard.jpg */,
+ DF3C79161489246A004746D0 /* Snowy Hills.jpg */,
+ DF3C79171489246A004746D0 /* Stones.jpg */,
+ DF3C79181489246A004746D0 /* Summer Leaves.jpg */,
+ DF3C79191489246A004746D0 /* Summit.jpg */,
+ DF3C791A1489246A004746D0 /* Sunday Afternoon.jpg */,
+ DF3C791B1489246A004746D0 /* Suprematism.jpg */,
+ DF3C791C1489246A004746D0 /* Tahoe.jpg */,
+ DF3C791D1489246A004746D0 /* The Great Wave.jpg */,
+ DF3C791E1489246A004746D0 /* Tranquil Surface.jpg */,
+ DF3C791F1489246A004746D0 /* Water Lilies.jpg */,
+ DF3C79201489246A004746D0 /* Water.jpg */,
+ DF3C79211489246A004746D0 /* Wave.jpg */,
+ DF3C79221489246A004746D0 /* Winter Sunrise.jpg */,
+ DF3C79231489246A004746D0 /* Zebra.jpg */,
+ DF3C788E14891432004746D0 /* Andromeda Galaxy.jpg */,
+ DF3C788F14891432004746D0 /* Aqua Blue.jpg */,
+ DF3C789014891432004746D0 /* Aqua Graphite.jpg */,
+ DF3C789114891432004746D0 /* Beach.jpg */,
+ DF3C789214891432004746D0 /* Bristle Grass.jpg */,
+ DF3C789314891432004746D0 /* Classic Aqua Blue.jpg */,
+ DF3C789414891432004746D0 /* Classic Aqua Graphite.jpg */,
+ DF3C789514891432004746D0 /* Ducks on a Misty Pond.jpg */,
+ DF3C789614891432004746D0 /* Eagle & Waterfall.jpg */,
+ DF3C789714891432004746D0 /* Elephant.jpg */,
+ DF3C789814891432004746D0 /* Flamingos.jpg */,
+ DF3C789914891432004746D0 /* Floating Leaves.jpg */,
+ DF3C789A14891432004746D0 /* Flow 1.jpg */,
+ DF3C789B14891432004746D0 /* Flow 2.jpg */,
+ DF3C789C14891432004746D0 /* Flow 3.jpg */,
+ DF3C789D14891432004746D0 /* Forest in Mist.jpg */,
+ DF3C789E14891432004746D0 /* Grass Blades.jpg */,
+ DF3C789F14891432004746D0 /* Isles.jpg */,
+ DF3C78A014891432004746D0 /* Jaguar Aqua Blue.jpg */,
+ DF3C78A114891432004746D0 /* Jaguar Aqua Graphite.jpg */,
+ DF3C78A214891432004746D0 /* Lake.jpg */,
+ DF3C78A314891432004746D0 /* Lines Blue.jpg */,
+ DF3C78A414891432004746D0 /* Lines Graphite.jpg */,
+ DF3C78A514891432004746D0 /* Lines Moss.jpg */,
+ DF3C78A614891432004746D0 /* Lines Plum.jpg */,
+ DF3C78A714891432004746D0 /* Lion.jpg */,
+ DF3C78A814891432004746D0 /* Moon.jpg */,
+ DF3C78A914891432004746D0 /* Mt. Fuji.jpg */,
+ DF3C78AA14891432004746D0 /* Panther Aqua Blue.jpg */,
+ DF3C78AB14891432004746D0 /* Panther Aqua Graphite.jpg */,
+ DF3C78AC14891432004746D0 /* Pink Forest.jpg */,
+ DF3C78AD14891432004746D0 /* Pink Lotus Flower.jpg */,
+ DF3C78AE14891432004746D0 /* Poppies.jpg */,
+ DF3C78AF14891432004746D0 /* Red Bells.jpg */,
+ DF3C78B014891432004746D0 /* Ripples Blue.jpg */,
+ DF3C78B114891432004746D0 /* Ripples Moss.jpg */,
+ DF3C78B214891432004746D0 /* Ripples Purple.jpg */,
+ DF3C78B314891432004746D0 /* Tiles Blue.jpg */,
+ DF3C78B414891432004746D0 /* Tiles Pine.jpg */,
+ DF3C78B514891432004746D0 /* Tiles Warm Grey.jpg */,
+ );
+ name = Images;
+ path = PhotoDispatch/Images;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ DF3C785914890DD5004746D0 /* PhotoDispatch */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = DF3C787E14890DD5004746D0 /* Build configuration list for PBXNativeTarget "PhotoDispatch" */;
+ buildPhases = (
+ DF3C785614890DD5004746D0 /* Sources */,
+ DF3C785714890DD5004746D0 /* Frameworks */,
+ DF3C785814890DD5004746D0 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = PhotoDispatch;
+ productName = PhotoDispatch;
+ productReference = DF3C785A14890DD5004746D0 /* PhotoDispatch.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ DF3C785114890DD5004746D0 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0420;
+ ORGANIZATIONNAME = "Free Time Studios";
+ };
+ buildConfigurationList = DF3C785414890DD5004746D0 /* Build configuration list for PBXProject "PhotoDispatch" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = DF3C784F14890DD5004746D0;
+ productRefGroup = DF3C785B14890DD5004746D0 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ DF3C785914890DD5004746D0 /* PhotoDispatch */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ DF3C785814890DD5004746D0 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DF3C786914890DD5004746D0 /* InfoPlist.strings in Resources */,
+ DF3C787814890DD5004746D0 /* MasterViewController.xib in Resources */,
+ DF3C787B14890DD5004746D0 /* DetailViewController.xib in Resources */,
+ DF3C78B614891432004746D0 /* Andromeda Galaxy.jpg in Resources */,
+ DF3C78B714891432004746D0 /* Aqua Blue.jpg in Resources */,
+ DF3C78B814891432004746D0 /* Aqua Graphite.jpg in Resources */,
+ DF3C78B914891432004746D0 /* Beach.jpg in Resources */,
+ DF3C78BA14891432004746D0 /* Bristle Grass.jpg in Resources */,
+ DF3C78BB14891432004746D0 /* Classic Aqua Blue.jpg in Resources */,
+ DF3C78BC14891432004746D0 /* Classic Aqua Graphite.jpg in Resources */,
+ DF3C78BD14891432004746D0 /* Ducks on a Misty Pond.jpg in Resources */,
+ DF3C78BE14891432004746D0 /* Eagle & Waterfall.jpg in Resources */,
+ DF3C78BF14891432004746D0 /* Elephant.jpg in Resources */,
+ DF3C78C014891432004746D0 /* Flamingos.jpg in Resources */,
+ DF3C78C114891432004746D0 /* Floating Leaves.jpg in Resources */,
+ DF3C78C214891432004746D0 /* Flow 1.jpg in Resources */,
+ DF3C78C314891432004746D0 /* Flow 2.jpg in Resources */,
+ DF3C78C414891432004746D0 /* Flow 3.jpg in Resources */,
+ DF3C78C514891432004746D0 /* Forest in Mist.jpg in Resources */,
+ DF3C78C614891432004746D0 /* Grass Blades.jpg in Resources */,
+ DF3C78C714891432004746D0 /* Isles.jpg in Resources */,
+ DF3C78C814891432004746D0 /* Jaguar Aqua Blue.jpg in Resources */,
+ DF3C78C914891432004746D0 /* Jaguar Aqua Graphite.jpg in Resources */,
+ DF3C78CA14891432004746D0 /* Lake.jpg in Resources */,
+ DF3C78CB14891432004746D0 /* Lines Blue.jpg in Resources */,
+ DF3C78CC14891432004746D0 /* Lines Graphite.jpg in Resources */,
+ DF3C78CD14891432004746D0 /* Lines Moss.jpg in Resources */,
+ DF3C78CE14891432004746D0 /* Lines Plum.jpg in Resources */,
+ DF3C78CF14891432004746D0 /* Lion.jpg in Resources */,
+ DF3C78D014891432004746D0 /* Moon.jpg in Resources */,
+ DF3C78D114891432004746D0 /* Mt. Fuji.jpg in Resources */,
+ DF3C78D214891432004746D0 /* Panther Aqua Blue.jpg in Resources */,
+ DF3C78D314891432004746D0 /* Panther Aqua Graphite.jpg in Resources */,
+ DF3C78D414891432004746D0 /* Pink Forest.jpg in Resources */,
+ DF3C78D514891432004746D0 /* Pink Lotus Flower.jpg in Resources */,
+ DF3C78D614891432004746D0 /* Poppies.jpg in Resources */,
+ DF3C78D714891432004746D0 /* Red Bells.jpg in Resources */,
+ DF3C78D814891432004746D0 /* Ripples Blue.jpg in Resources */,
+ DF3C78D914891432004746D0 /* Ripples Moss.jpg in Resources */,
+ DF3C78DA14891432004746D0 /* Ripples Purple.jpg in Resources */,
+ DF3C78DB14891432004746D0 /* Tiles Blue.jpg in Resources */,
+ DF3C78DC14891432004746D0 /* Tiles Pine.jpg in Resources */,
+ DF3C78DD14891432004746D0 /* Tiles Warm Grey.jpg in Resources */,
+ DF3C78E2148922A7004746D0 /* ThumbnailLoadingImage.png in Resources */,
+ DF3C79241489246A004746D0 /* Abstract 1.jpg in Resources */,
+ DF3C79251489246A004746D0 /* Abstract 2.jpg in Resources */,
+ DF3C79261489246A004746D0 /* Abstract 3.jpg in Resources */,
+ DF3C79271489246A004746D0 /* Abstract 4.jpg in Resources */,
+ DF3C79281489246A004746D0 /* Abstract 5.jpg in Resources */,
+ DF3C79291489246A004746D0 /* Abstract 6.jpg in Resources */,
+ DF3C792A1489246A004746D0 /* Abstract 7.jpg in Resources */,
+ DF3C792B1489246A004746D0 /* Abstract 8.jpg in Resources */,
+ DF3C792C1489246A004746D0 /* Agave.jpg in Resources */,
+ DF3C792D1489246A004746D0 /* Aurora.jpg in Resources */,
+ DF3C792E1489246A004746D0 /* Bamboo Grove.jpg in Resources */,
+ DF3C792F1489246A004746D0 /* Cirques.jpg in Resources */,
+ DF3C79301489246A004746D0 /* Clown Fish.jpg in Resources */,
+ DF3C79311489246A004746D0 /* Daisies.jpg in Resources */,
+ DF3C79321489246A004746D0 /* Dancer on the Stage.jpg in Resources */,
+ DF3C79331489246A004746D0 /* Dandelion.jpg in Resources */,
+ DF3C79341489246A004746D0 /* Dew Drop.jpg in Resources */,
+ DF3C79351489246A004746D0 /* Earth Horizon.jpg in Resources */,
+ DF3C79361489246A004746D0 /* Earth.jpg in Resources */,
+ DF3C79371489246A004746D0 /* Evening Reflections.jpg in Resources */,
+ DF3C79381489246A004746D0 /* Fall Leaves.jpg in Resources */,
+ DF3C79391489246A004746D0 /* Flowing Rock.jpg in Resources */,
+ DF3C793A1489246A004746D0 /* Gentle Rapids.jpg in Resources */,
+ DF3C793B1489246A004746D0 /* Golden Palace.jpg in Resources */,
+ DF3C793C1489246A004746D0 /* Horizon.jpg in Resources */,
+ DF3C793D1489246A004746D0 /* Iceberg.jpg in Resources */,
+ DF3C793E1489246A004746D0 /* Ladybug.jpg in Resources */,
+ DF3C793F1489246A004746D0 /* Lavender.jpg in Resources */,
+ DF3C79401489246A004746D0 /* Leaf Curl.jpg in Resources */,
+ DF3C79411489246A004746D0 /* Leaves.jpg in Resources */,
+ DF3C79421489246A004746D0 /* Leopard Aurora.jpg in Resources */,
+ DF3C79431489246A004746D0 /* Lightning.jpg in Resources */,
+ DF3C79441489246A004746D0 /* Lotus.jpg in Resources */,
+ DF3C79451489246A004746D0 /* Maple.jpg in Resources */,
+ DF3C79461489246A004746D0 /* Mojave.jpg in Resources */,
+ DF3C79471489246A004746D0 /* Nighthawks.jpg in Resources */,
+ DF3C79481489246A004746D0 /* Peony.jpg in Resources */,
+ DF3C79491489246A004746D0 /* Petals.jpg in Resources */,
+ DF3C794A1489246A004746D0 /* Pier.jpg in Resources */,
+ DF3C794B1489246A004746D0 /* Pinstripe.jpg in Resources */,
+ DF3C794C1489246A004746D0 /* Pond Reeds.jpg in Resources */,
+ DF3C794D1489246A004746D0 /* Poppies Blooming.jpg in Resources */,
+ DF3C794E1489246A004746D0 /* Purple Frond.jpg in Resources */,
+ DF3C794F1489246A004746D0 /* Redwoods.jpg in Resources */,
+ DF3C79501489246A004746D0 /* Rings.jpg in Resources */,
+ DF3C79511489246A004746D0 /* Rock Garden.jpg in Resources */,
+ DF3C79521489246A004746D0 /* Rocks.jpg in Resources */,
+ DF3C79531489246A004746D0 /* Saree.jpg in Resources */,
+ DF3C79541489246A004746D0 /* Sea Mist.jpg in Resources */,
+ DF3C79551489246A004746D0 /* Snow Leopard Prowl.jpg in Resources */,
+ DF3C79561489246A004746D0 /* Snow Leopard.jpg in Resources */,
+ DF3C79571489246A004746D0 /* Snowy Hills.jpg in Resources */,
+ DF3C79581489246A004746D0 /* Stones.jpg in Resources */,
+ DF3C79591489246A004746D0 /* Summer Leaves.jpg in Resources */,
+ DF3C795A1489246A004746D0 /* Summit.jpg in Resources */,
+ DF3C795B1489246A004746D0 /* Sunday Afternoon.jpg in Resources */,
+ DF3C795C1489246A004746D0 /* Suprematism.jpg in Resources */,
+ DF3C795D1489246A004746D0 /* Tahoe.jpg in Resources */,
+ DF3C795E1489246A004746D0 /* The Great Wave.jpg in Resources */,
+ DF3C795F1489246A004746D0 /* Tranquil Surface.jpg in Resources */,
+ DF3C79601489246A004746D0 /* Water Lilies.jpg in Resources */,
+ DF3C79611489246A004746D0 /* Water.jpg in Resources */,
+ DF3C79621489246A004746D0 /* Wave.jpg in Resources */,
+ DF3C79631489246A004746D0 /* Winter Sunrise.jpg in Resources */,
+ DF3C79641489246A004746D0 /* Zebra.jpg in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ DF3C785614890DD5004746D0 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DF3C786B14890DD5004746D0 /* main.m in Sources */,
+ DF3C786F14890DD5004746D0 /* AppDelegate.m in Sources */,
+ DF3C787214890DD5004746D0 /* MasterViewController.m in Sources */,
+ DF3C787514890DD5004746D0 /* DetailViewController.m in Sources */,
+ DF3C78E014891653004746D0 /* PhotoGridTableCell.m in Sources */,
+ DF3C796714892724004746D0 /* FTUtils+UIGestureRecognizer.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ DF3C786714890DD5004746D0 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DF3C786814890DD5004746D0 /* en */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ DF3C787614890DD5004746D0 /* MasterViewController.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DF3C787714890DD5004746D0 /* en */,
+ );
+ name = MasterViewController.xib;
+ sourceTree = "<group>";
+ };
+ DF3C787914890DD5004746D0 /* DetailViewController.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DF3C787A14890DD5004746D0 /* en */,
+ );
+ name = DetailViewController.xib;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ DF3C787C14890DD5004746D0 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 5.0;
+ SDKROOT = iphoneos;
+ };
+ name = Debug;
+ };
+ DF3C787D14890DD5004746D0 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 5.0;
+ OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+ SDKROOT = iphoneos;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ DF3C787F14890DD5004746D0 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "PhotoDispatch/PhotoDispatch-Prefix.pch";
+ INFOPLIST_FILE = "PhotoDispatch/PhotoDispatch-Info.plist";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ DF3C788014890DD5004746D0 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "PhotoDispatch/PhotoDispatch-Prefix.pch";
+ INFOPLIST_FILE = "PhotoDispatch/PhotoDispatch-Info.plist";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ DF3C785414890DD5004746D0 /* Build configuration list for PBXProject "PhotoDispatch" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DF3C787C14890DD5004746D0 /* Debug */,
+ DF3C787D14890DD5004746D0 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ DF3C787E14890DD5004746D0 /* Build configuration list for PBXNativeTarget "PhotoDispatch" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DF3C787F14890DD5004746D0 /* Debug */,
+ DF3C788014890DD5004746D0 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = DF3C785114890DD5004746D0 /* Project object */;
+}
7 PhotoDispatch.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+ version = "1.0">
+ <FileRef
+ location = "self:PhotoDispatch.xcodeproj">
+ </FileRef>
+</Workspace>
17 PhotoDispatch/AppDelegate.h
@@ -0,0 +1,17 @@
+//
+// AppDelegate.h
+// PhotoDispatch
+//
+// Copyright (c) 2011 Nathan Eror & Free Time Studios. All rights reserved.
+//
+
+
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+
+@property (strong, nonatomic) UINavigationController *navigationController;
+
+@end
69 PhotoDispatch/AppDelegate.m
@@ -0,0 +1,69 @@
+//
+// AppDelegate.m
+// PhotoDispatch
+//
+// Copyright (c) 2011 Nathan Eror & Free Time Studios. All rights reserved.
+//
+
+#import "AppDelegate.h"
+
+#import "MasterViewController.h"
+
+@implementation AppDelegate
+
+@synthesize window = _window;
+@synthesize navigationController = _navigationController;
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
+ // Override point for customization after application launch.
+
+ MasterViewController *masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil];
+ self.navigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController];
+ self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
+ self.window.rootViewController = self.navigationController;
+ [self.window makeKeyAndVisible];
+ return YES;
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application
+{
+ /*
+ Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+ Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
+ */
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application
+{
+ /*
+ Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
+ If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
+ */
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application
+{
+ /*
+ Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
+ */
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application
+{
+ /*
+ Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+ */
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application
+{
+ /*
+ Called when the application is about to terminate.
+ Save data if appropriate.
+ See also applicationDidEnterBackground:.
+ */
+}
+
+@end
18 PhotoDispatch/DetailViewController.h
@@ -0,0 +1,18 @@
+//
+// DetailViewController.h
+// PhotoDispatch
+//
+//
+// Copyright (c) 2011 Nathan Eror & Free Time Studios. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface DetailViewController : UIViewController
+
+@property (strong, nonatomic) NSURL *imageUrl;
+@property (unsafe_unretained) BOOL shouldUseGCD;
+
+- (id)initWithImageAtURL:(NSURL *)theImageUrl;
+
+@end
63 PhotoDispatch/DetailViewController.m
@@ -0,0 +1,63 @@
+//
+// DetailViewController.m
+// PhotoDispatch
+//
+// Copyright (c) 2011 Nathan Eror & Free Time Studios. All rights reserved.
+//
+
+
+#import "DetailViewController.h"
+#import "ImageHelpers.h"
+
+@interface DetailViewController ()
+
+@property (nonatomic, strong) IBOutlet UIImageView *imageView;
+
+@end
+
+@implementation DetailViewController
+
+@synthesize imageUrl = _imageUrl;
+@synthesize imageView = _imageView;
+@synthesize shouldUseGCD = _shouldUseGCD;
+
+- (id)initWithImageAtURL:(NSURL *)theImageUrl {
+ self = [super initWithNibName:@"DetailViewController" bundle:nil];
+ if (self) {
+ self.title = [theImageUrl lastPathComponent];
+ _imageUrl = theImageUrl;
+ _shouldUseGCD = NO;
+ }
+ return self;
+}
+
+#pragma mark - View lifecycle
+
+- (void)viewWillAppear:(BOOL)animated {
+ self.title = [self.imageUrl lastPathComponent];
+ UIImage *image;
+ if(self.shouldUseGCD) {
+ image = [UIImage imageNamed:@"ThumbnailLoadingImage"];
+ self.imageView.contentMode = UIViewContentModeCenter;
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
+ CGImageRef convolvedImage = RandomConvolutionCopyOfImageAtURL((__bridge CFURLRef)self.imageUrl);
+ UIImage *uiImage = [UIImage imageWithCGImage:convolvedImage];
+ CGImageRelease(convolvedImage);
+ dispatch_async(dispatch_get_main_queue(), ^{
+ self.imageView.image = uiImage;
+ self.imageView.contentMode = UIViewContentModeScaleAspectFit;
+ });
+ });
+ } else {
+ CGImageRef convolvedImage = RandomConvolutionCopyOfImageAtURL((__bridge CFURLRef)self.imageUrl);
+ image = [UIImage imageWithCGImage:convolvedImage];
+ CGImageRelease(convolvedImage);
+ }
+ self.imageView.image = image;
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
+ return UIInterfaceOrientationIsPortrait(interfaceOrientation);
+}
+
+@end
92 PhotoDispatch/FTUtils+UIGestureRecognizer.h
@@ -0,0 +1,92 @@
+/*
+ The MIT License
+
+ Copyright (c) 2011 Free Time Studios and Nathan Eror
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+*/
+
+#if NS_BLOCKS_AVAILABLE
+
+typedef void (^FTGestureActionBlock)(id recognizer);
+
+/**
+ This category defines methods and properties which allow the use of blocks
+ for working with `UIGestureRecognizer` and its subclasses.
+
+ For more information on working with gestures in iOS, see Apple's
+ [Event Handling Guide for iOS][1].
+
+ [1]:http://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/Introduction/Introduction.html
+ */
+@interface UIGestureRecognizer(FTBlockAdditions)
+
+#pragma mark - Creating a block based Gesture Recognizer
+
+///---------------------------------------------------------------------------
+/// @name Creating a block based Gesture Recognizer
+///---------------------------------------------------------------------------
+
+/**
+ Creates an autoreleased instance of a `UIGestureRecognizer` subclass with
+ its actionBlock set to `nil`.
+
+ @warning *Important:* Until the actionBlock is set, the returned object will do nothing.
+
+ @return An instance of a `UIGestureRecognizer` subclass.
+ @see actionBlock
+ */
++ (id)recognizer;
+
+/**
+ Creates an autoreleased instance of a `UIGestureRecognizer` subclass which
+ uses _action_ to handle gesture actions.
+
+ @return An instance of a `UIGestureRecognizer` subclass.
+ @param action A block which will handle the gesture actions.
+ @see actionBlock
+ */
++ (id)recognizerWithActionBlock:(FTGestureActionBlock)action;
+
+#pragma mark - Setting and getting the action handler blocks
+
+///---------------------------------------------------------------------------
+/// @name Setting and getting the action handler blocks
+///---------------------------------------------------------------------------
+
+/**
+ A block to be executed when a `UIGestureRecognizer` action is fired.
+
+ The block is passed a single parameter which is the `UIGestureRecognizer`
+ instance for this property.
+ */
+@property (copy) FTGestureActionBlock actionBlock;
+
+/**
+ A property indicating that the block should *not* be called when
+ the recognizer fires.
+
+ Useful if you need to temporarily disable an action but you still
+ want the block to be around later on.
+*/
+@property (nonatomic, assign) BOOL disabled;
+
+@end
+
+#endif
76 PhotoDispatch/FTUtils+UIGestureRecognizer.m
@@ -0,0 +1,76 @@
+/*
+ The MIT License
+
+ Copyright (c) 2011 Free Time Studios and Nathan Eror
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ */
+
+#if NS_BLOCKS_AVAILABLE
+
+#import "FTUtils+UIGestureRecognizer.h"
+#import <objc/runtime.h>
+
+@interface UIGestureRecognizer()
+
+- (void)handleAction:(UIGestureRecognizer *)recognizer;
+
+@end
+
+static char * kFTGestureActionKey = "ft_gestureAction";
+static char * kFTGestureDisabledKey = "ft_gestureDisabled";
+
+@implementation UIGestureRecognizer(FTBlockAdditions)
+
++ (id)recognizer {
+ return [self recognizerWithActionBlock:nil];
+}
+
++ (id)recognizerWithActionBlock:(FTGestureActionBlock)action {
+ id me = [[self class] alloc];
+ me = [me initWithTarget:me action:@selector(handleAction:)];
+ [me setActionBlock:action];
+ return me;
+}
+
+- (void)handleAction:(UIGestureRecognizer *)recognizer {
+ if(self.actionBlock && !self.disabled) {
+ self.actionBlock(recognizer);
+ }
+}
+
+- (FTGestureActionBlock)actionBlock {
+ return objc_getAssociatedObject(self, kFTGestureActionKey);
+}
+
+- (void)setActionBlock:(FTGestureActionBlock)actionBlock {
+ objc_setAssociatedObject(self, kFTGestureActionKey, actionBlock, OBJC_ASSOCIATION_COPY);
+}
+
+- (BOOL)disabled {
+ return [objc_getAssociatedObject(self, kFTGestureDisabledKey) boolValue];
+}
+
+- (void)setDisabled:(BOOL)disabled {
+ objc_setAssociatedObject(self, kFTGestureDisabledKey, [NSNumber numberWithBool:disabled], OBJC_ASSOCIATION_RETAIN);
+}
+
+@end
+
+#endif
115 PhotoDispatch/ImageHelpers.h
@@ -0,0 +1,115 @@
+//
+// Helpers.h
+// PhotoDispatch
+//
+// Copyright (c) 2011 Nathan Eror & Free Time Studios. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+static CGImageRef CGImageCreateFromURL(CFURLRef url) {
+ CGImageSourceRef imageSource = CGImageSourceCreateWithURL(url, NULL);
+ if (imageSource == NULL){
+ NSLog(@"%@", @"Image source is NULL.");
+ CFRelease(imageSource);
+ return NULL;
+ }
+
+ CGImageRef fullImage = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL);
+ CFRelease(imageSource);
+
+ if (fullImage == NULL){
+ NSLog(@"%@", @"Thumbnail image not created from image source.");
+ return NULL;
+ }
+
+ return fullImage;
+}
+
+static CGImageRef CGImageCreateThumbnailFromImageAtURL(CFURLRef url, int maxPixelSize) {
+ CFNumberRef pixelSize = CFNumberCreate(NULL, kCFNumberIntType, &maxPixelSize);
+ CFStringRef keys[3] = {
+ kCGImageSourceCreateThumbnailWithTransform,
+ kCGImageSourceCreateThumbnailFromImageAlways,
+ kCGImageSourceThumbnailMaxPixelSize
+ };
+
+ CFTypeRef values[3] = {
+ (CFTypeRef)kCFBooleanTrue,
+ (CFTypeRef)kCFBooleanTrue,
+ (CFTypeRef)pixelSize
+ };
+
+ CFDictionaryRef options = CFDictionaryCreate(NULL, (const void **) keys, (const void **) values, 3, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+ CFRelease(pixelSize);
+
+ CGImageSourceRef imageSource = CGImageSourceCreateWithURL(url, options);
+ if (imageSource == NULL){
+ NSLog(@"%@", @"Image source is NULL.");
+ CFRelease(imageSource);
+ return NULL;
+ }
+
+ CGImageRef thumbnailImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options);
+ CFRelease(imageSource);
+
+ if (thumbnailImage == NULL){
+ NSLog(@"%@", @"Thumbnail image not created from image source.");
+ return nil;
+ }
+
+ return thumbnailImage;
+}
+
+static CGImageRef RandomConvolutionCopyOfImage(CGImageRef image) {
+ void *inData, *outData;
+
+ size_t height = CGImageGetHeight(image);
+ size_t width = CGImageGetWidth(image);
+
+ size_t rowBytes = width * 4;
+
+ inData = calloc(height, rowBytes);
+ outData = calloc(height, rowBytes);
+
+ CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+
+ CGContextRef inBitmapContext = CGBitmapContextCreate(inData, width, height, 8, rowBytes, colorSpace, kCGImageAlphaPremultipliedFirst);
+ CGContextRef outBitmapContext = CGBitmapContextCreate(outData, width, height, 8, rowBytes, colorSpace, kCGImageAlphaPremultipliedFirst);
+ CGContextDrawImage(inBitmapContext, CGRectMake(0, 0, width, height), image);
+
+ const vImage_Buffer inBuffer = { inData, height, width, rowBytes };
+ const vImage_Buffer outBuffer = { outData, height, width, rowBytes };
+ Pixel_8888 bgColor = { 0, 0, 0, 0 };
+ const int16_t kernel[3][9] = {
+ {1, 2, 1, 2, 4, 2, 1, 2, 1},
+ {-2, -2, 0, -2, 6, 0, 0, 0, 0},
+ {-1, -1, -1, 0, 0, 0, 1, 1, 1}
+ };
+
+ int32_t divisor[3] = { 16, 1, 1 };
+
+ int index = arc4random() % 3;
+
+ vImage_Error error = vImageConvolveWithBias_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, kernel[index], 3, 3, divisor[index], 128, bgColor, kvImageBackgroundColorFill);
+
+ if(error != kvImageNoError) {
+ NSLog(@"vImage error '%ld' ", error);
+ }
+
+ CGImageRef convolvedImage = CGBitmapContextCreateImage(outBitmapContext);
+
+ CGContextRelease(inBitmapContext);
+ CGContextRelease(outBitmapContext);
+ CGColorSpaceRelease(colorSpace);
+ free(inData);
+ free(outData);
+ return convolvedImage;
+}
+
+static CGImageRef RandomConvolutionCopyOfImageAtURL(CFURLRef url) {
+ CGImageRef fullImage = CGImageCreateFromURL(url);
+ CGImageRef convolvedImage = RandomConvolutionCopyOfImage(fullImage);
+ CGImageRelease(fullImage);
+ return convolvedImage;
+}
BIN  PhotoDispatch/Images/Abstract 1.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Abstract 2.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Abstract 3.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Abstract 4.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Abstract 5.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Abstract 6.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Abstract 7.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Abstract 8.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Agave.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Andromeda Galaxy.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Aqua Blue.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Aqua Graphite.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Aurora.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Bamboo Grove.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Beach.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Bristle Grass.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Cirques.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Classic Aqua Blue.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Classic Aqua Graphite.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Clown Fish.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Daisies.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Dancer on the Stage.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Dandelion.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Dew Drop.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Ducks on a Misty Pond.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  PhotoDispatch/Images/Eagle & Waterfall.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Earth Horizon.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Earth.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Elephant.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Evening Reflections.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Fall Leaves.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Flamingos.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Floating Leaves.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Flow 1.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Flow 2.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Flow 3.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Flowing Rock.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Forest in Mist.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Gentle Rapids.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Golden Palace.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Grass Blades.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Horizon.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Iceberg.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Isles.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Jaguar Aqua Blue.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Jaguar Aqua Graphite.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Ladybug.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Lake.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Lavender.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Leaf Curl.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Leaves.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Leopard Aurora.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Lightning.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Lines Blue.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Lines Graphite.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Lines Moss.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Lines Plum.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Lion.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Lotus.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Maple.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Mojave.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Moon.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Mt. Fuji.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Nighthawks.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Panther Aqua Blue.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Panther Aqua Graphite.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Peony.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Petals.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Pier.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Pink Forest.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Pink Lotus Flower.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Pinstripe.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Pond Reeds.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Poppies Blooming.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Poppies.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Purple Frond.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Red Bells.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Redwoods.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Rings.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Ripples Blue.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Ripples Moss.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Ripples Purple.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Rock Garden.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Rocks.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Saree.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Sea Mist.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Snow Leopard Prowl.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Snow Leopard.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Snowy Hills.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Stones.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Summer Leaves.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Summit.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Sunday Afternoon.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Suprematism.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Tahoe.jpg
Diff not rendered
BIN  PhotoDispatch/Images/The Great Wave.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Tiles Blue.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Tiles Pine.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Tiles Warm Grey.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Tranquil Surface.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Water Lilies.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Water.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Wave.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Winter Sunrise.jpg
Diff not rendered
BIN  PhotoDispatch/Images/Zebra.jpg
Diff not rendered
18 PhotoDispatch/MasterViewController.h
@@ -0,0 +1,18 @@
+//
+// MasterViewController.h
+// PhotoDispatch
+//
+// Copyright (c) 2011 Nathan Eror & Free Time Studios. All rights reserved.
+//
+
+
+#import <UIKit/UIKit.h>
+#import "PhotoGridTableCell.h"
+
+@class DetailViewController;
+
+@interface MasterViewController : UITableViewController <PhotoGridTableCellDelegate>
+
+@property (strong, nonatomic) DetailViewController *detailViewController;
+
+@end
133 PhotoDispatch/MasterViewController.m
@@ -0,0 +1,133 @@
+//
+// MasterViewController.m
+// PhotoDispatch
+//
+// Copyright (c) 2011 Nathan Eror & Free Time Studios. All rights reserved.
+//
+
+#import "MasterViewController.h"
+#import "DetailViewController.h"
+
+@interface MasterViewController() {
+ dispatch_queue_t _imageProcessingQueue;
+ dispatch_semaphore_t _imageProcessingSemaphore;
+}
+
+@property (strong) NSArray *imageUrls;
+@property (strong) NSCache *thumbnailCache;
+@property (unsafe_unretained) BOOL shouldUseGCD;
+@property (unsafe_unretained) BOOL shouldConvolveImages;
+
+@end
+
+@implementation MasterViewController
+
+@synthesize detailViewController = _detailViewController;
+@synthesize imageUrls = _imageUrls;
+@synthesize thumbnailCache = _thumbnailCache;
+@synthesize shouldUseGCD = _shouldUseGCD;
+@synthesize shouldConvolveImages = _shouldConvolveImages;
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ self.title = NSLocalizedString(@"Photos", @"Photos");
+ NSDirectoryEnumerator *directory = [[NSFileManager defaultManager] enumeratorAtURL:[[NSBundle mainBundle] bundleURL]
+ includingPropertiesForKeys:[NSArray arrayWithObject:NSURLNameKey]
+ options:NSDirectoryEnumerationSkipsSubdirectoryDescendants
+ errorHandler:nil];
+ NSMutableArray *urls = [NSMutableArray array];
+ for(NSURL *url in directory) {
+ NSString *fileName;
+ [url getResourceValue:&fileName forKey:NSURLNameKey error:NULL];
+ if([[fileName pathExtension] isEqualToString:@"jpg"]) {
+ [urls addObject:url];
+ }
+ }
+ self.imageUrls = urls;
+ _thumbnailCache = [[NSCache alloc] init];
+ _shouldUseGCD = NO;
+ _shouldConvolveImages = NO;
+ _imageProcessingSemaphore = nil;//dispatch_semaphore_create(4);
+ _imageProcessingQueue = dispatch_queue_create("com.freetimestudios.ImageProcessingQueue", DISPATCH_QUEUE_CONCURRENT);
+ dispatch_set_target_queue(_imageProcessingQueue, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0));
+ }
+ return self;
+}
+
+- (void)dealloc {
+ dispatch_release(_imageProcessingQueue);
+ dispatch_release(_imageProcessingSemaphore);
+}
+
+#pragma mark - View lifecycle
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ self.navigationItem.rightBarButtonItem =
+ [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(reloadImages)];
+ self.navigationItem.leftBarButtonItem =
+ [[UIBarButtonItem alloc] initWithTitle:@"GCD OFF" style:UIBarButtonItemStyleBordered target:self action:@selector(toggleGCD)];
+}
+
+- (void)viewDidUnload {
+ [super viewDidUnload];
+}
+
+- (void)reloadImages {
+ [self.thumbnailCache removeAllObjects];
+ self.shouldConvolveImages = !self.shouldConvolveImages;
+ [self.tableView reloadData];
+}
+
+- (void)toggleGCD {
+ self.shouldUseGCD = !self.shouldUseGCD;
+ self.navigationItem.leftBarButtonItem.title = self.shouldUseGCD ? @"GCD ON" : @"GCD OFF";
+ [[NSNotificationCenter defaultCenter] postNotificationName:kShouldUseGCDNotification object:[NSNumber numberWithBool:self.shouldUseGCD]];
+}
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+ return 1;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+ return [self.imageUrls count] / kThumbnailsPerRow;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+ static NSString *CellIdentifier = @"PhotoGridCell";
+
+ PhotoGridTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
+ if (cell == nil) {
+ cell = [[PhotoGridTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
+ cell.accessoryType = UITableViewCellAccessoryNone;
+ cell.thumbnailCache = self.thumbnailCache;
+ cell.delegate = self;
+ }
+ cell.shouldConvolveImages = self.shouldConvolveImages;
+ cell.imageProcessingQueue = _imageProcessingQueue;
+ cell.imageProcessingSemaphore = _imageProcessingSemaphore;
+ cell.photoUrls = [self.imageUrls subarrayWithRange:NSMakeRange(indexPath.row * kThumbnailsPerRow, kThumbnailsPerRow)];
+ return cell;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
+ return kThumbnailSize + 6.f;
+}
+
+- (void)photoGridCell:(PhotoGridTableCell *)cell didSelectPhotoAtUrl:(NSURL *)photoUrl {
+ if (!self.detailViewController) {
+ self.detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
+ }
+ self.detailViewController.imageUrl = photoUrl;
+ self.detailViewController.shouldUseGCD = self.shouldUseGCD;
+ [self.navigationController pushViewController:self.detailViewController animated:YES];
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
+ return UIInterfaceOrientationIsPortrait(interfaceOrientation);
+}
+
+@end
42 PhotoDispatch/PhotoDispatch-Info.plist
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFiles</key>
+ <array/>
+ <key>CFBundleIdentifier</key>
+ <string>com.freetimestudios.${PRODUCT_NAME:rfc1034identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UIRequiredDeviceCapabilities</key>
+ <array>
+ <string>armv7</string>
+ </array>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>UIStatusBarStyle</key>
+ <string>UIStatusBarStyleBlackTranslucent</string>
+</dict>
+</plist>
17 PhotoDispatch/PhotoDispatch-Prefix.pch
@@ -0,0 +1,17 @@
+//
+// Prefix header for all source files of the 'PhotoDispatch' target in the 'PhotoDispatch' project
+//
+
+#import <Availability.h>
+
+#ifndef __IPHONE_4_0
+#warning "This project uses features only available in iOS SDK 4.0 and later."
+#endif
+
+#ifdef __OBJC__
+ #import <UIKit/UIKit.h>
+ #import <Foundation/Foundation.h>
+ #import <QuartzCore/QuartzCore.h>
+ #import <ImageIO/ImageIO.h>
+ #import <Accelerate/Accelerate.h>
+#endif
32 PhotoDispatch/PhotoGridTableCell.h
@@ -0,0 +1,32 @@
+//
+// PhotoGridTableCell.h
+// PhotoDispatch
+//
+// Copyright (c) 2011 Nathan Eror & Free Time Studios. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@class PhotoGridTableCell;
+
+const NSUInteger kThumbnailsPerRow;
+const int kThumbnailSize;
+static NSString * const kShouldUseGCDNotification = @"pd_UseGCDNotification";
+
+@protocol PhotoGridTableCellDelegate <NSObject>
+
+- (void)photoGridCell:(PhotoGridTableCell *)cell didSelectPhotoAtUrl:(NSURL *)photoUrl;
+
+@end
+
+@interface PhotoGridTableCell : UITableViewCell
+
+@property (strong) NSArray *photoUrls;
+@property (weak) NSCache *thumbnailCache;
+@property (weak) id<PhotoGridTableCellDelegate> delegate;
+@property (unsafe_unretained) BOOL shouldUseGCD;
+@property (unsafe_unretained) BOOL shouldConvolveImages;
+@property (unsafe_unretained) dispatch_queue_t imageProcessingQueue;
+@property (unsafe_unretained) dispatch_semaphore_t imageProcessingSemaphore;
+
+@end
158 PhotoDispatch/PhotoGridTableCell.m
@@ -0,0 +1,158 @@
+//
+// PhotoGridTableCell.m
+// PhotoDispatch
+//
+// Copyright (c) 2011 Nathan Eror & Free Time Studios. All rights reserved.
+//
+
+#import "PhotoGridTableCell.h"
+#import "FTUtils+UIGestureRecognizer.h"
+#import "ImageHelpers.h"
+
+#define USE_VIMAGE 1
+#define USE_GCD 1
+#define USE_NSCACHE 1
+
+const NSUInteger kThumbnailsPerRow = 3;
+const int kThumbnailSize = 100;
+typedef void (^ImageLoadCompletionBlock)(UIImage *loadedImage);
+
+@interface PhotoGridTableCell()
+
+@property (strong) NSMutableArray *imageViews;
+
+- (void)asyncLoadThumbnailImageAtURL:(NSURL *)url completion:(ImageLoadCompletionBlock)completion;
+
+@end
+
+@implementation PhotoGridTableCell
+
+@synthesize photoUrls = _photoUrls;
+@synthesize delegate = _delegate;
+@synthesize imageViews = _imageViews;
+@synthesize thumbnailCache = _thumbnailCache;
+@synthesize shouldUseGCD = _shouldUseGCD;
+@synthesize shouldConvolveImages = _shouldConvolveImages;
+@synthesize imageProcessingQueue = _imageProcessingQueue;
+@synthesize imageProcessingSemaphore = _imageProcessingSemaphore;
+
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
+ self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+ if (self) {
+ _imageViews = [[NSMutableArray alloc] init];
+ _shouldUseGCD = NO;
+ _shouldConvolveImages = NO;
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(toggleGCD:) name:kShouldUseGCDNotification object:nil];
+ }
+ return self;
+}
+
+- (void)dealloc {
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+- (void)toggleGCD:(NSNotification *)notification {
+ self.shouldUseGCD = [[notification object] boolValue];
+}
+
+- (UIImage *)thumbnailImageAtURL:(NSURL *)url {
+ UIImage *image = [self.thumbnailCache objectForKey:[url absoluteString]];
+ if(!image) {
+ if(self.shouldConvolveImages) {
+ CGImageRef thumbnailImage = CGImageCreateThumbnailFromImageAtURL((__bridge CFURLRef)url, kThumbnailSize);
+ CGImageRef convolvedThumbnail = RandomConvolutionCopyOfImage(thumbnailImage);
+ image = [UIImage imageWithCGImage:convolvedThumbnail];
+ CGImageRelease(convolvedThumbnail);
+ CGImageRelease(thumbnailImage);
+ } else {
+ CGImageRef thumbnailImage = CGImageCreateThumbnailFromImageAtURL((__bridge CFURLRef)url, kThumbnailSize);
+ image = [UIImage imageWithCGImage:thumbnailImage];
+ CGImageRelease(thumbnailImage);
+ }
+ [self.thumbnailCache setObject:image forKey:[url absoluteString]];
+ }
+ return image;
+}
+
+
+- (void)asyncLoadThumbnailImageAtURL:(NSURL *)url completion:(ImageLoadCompletionBlock)completion {
+ __weak id weakSelf = self;
+ dispatch_async(self.imageProcessingQueue, ^{
+ if([weakSelf imageProcessingSemaphore]) {
+ dispatch_semaphore_wait([weakSelf imageProcessingSemaphore], DISPATCH_TIME_FOREVER);
+ }
+ UIImage *image = [weakSelf thumbnailImageAtURL:url];
+ dispatch_async(dispatch_get_main_queue(), ^{
+ completion(image);
+ });
+ if([weakSelf imageProcessingSemaphore]) {
+ dispatch_semaphore_signal([weakSelf imageProcessingSemaphore]);
+ }
+ });
+}
+
+
+/*
+- (void)asyncLoadThumbnailImageAtURL:(NSURL *)url completion:(ImageLoadCompletionBlock)completion {
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
+ UIImage *image = [self thumbnailImageAtURL:url];
+ dispatch_async(dispatch_get_main_queue(), ^{
+ completion(image);
+ });
+ });
+}
+*/
+
+- (void)layoutSubviews {
+ CGFloat cellWidth = 320.f;
+ CGFloat spacing = (cellWidth - kThumbnailSize * kThumbnailsPerRow) / (kThumbnailsPerRow + 1);
+ self.selectionStyle = UITableViewCellSelectionStyleNone;
+
+ [self.photoUrls enumerateObjectsUsingBlock:^(NSURL *photoUrl, NSUInteger idx, BOOL *stop) {
+ UIImageView *thumbnailView;
+ if([self.imageViews count] > idx) {
+ thumbnailView = [self.imageViews objectAtIndex:idx];
+ } else {
+ thumbnailView = [[UIImageView alloc] initWithFrame:CGRectMake(0.f, 0.f, kThumbnailSize, kThumbnailSize)];
+ thumbnailView.userInteractionEnabled = YES;
+ [self.imageViews insertObject:thumbnailView atIndex:idx];
+ }
+
+ for (UIGestureRecognizer *recognizer in thumbnailView.gestureRecognizers) {
+ [thumbnailView removeGestureRecognizer:recognizer];
+ }
+
+ [thumbnailView addGestureRecognizer:[UITapGestureRecognizer recognizerWithActionBlock:^(UITapGestureRecognizer *recognizer) {
+ if(self.delegate && [self.delegate respondsToSelector:@selector(photoGridCell:didSelectPhotoAtUrl:)]) {
+ [self.delegate photoGridCell:self didSelectPhotoAtUrl:photoUrl];
+ }
+ }]];
+
+ if(self.shouldUseGCD) {
+ __block PhotoGridTableCell *weakSelf = self;
+ thumbnailView.image = [UIImage imageNamed:@"ThumbnailLoadingImage"];
+ [self asyncLoadThumbnailImageAtURL:photoUrl completion:^(UIImage *loadedImage) {
+ if([weakSelf.photoUrls containsObject:photoUrl]) {
+ thumbnailView.image = loadedImage;
+ }
+ }];
+ } else {
+ thumbnailView.image = [self thumbnailImageAtURL:photoUrl];
+ }
+
+ CGRect thumbnailFrame = CGRectMake(spacing + (kThumbnailSize * idx) + (spacing * idx),
+ (self.bounds.size.height - kThumbnailSize) / 2.f,
+ kThumbnailSize,
+ kThumbnailSize);
+ thumbnailView.frame = thumbnailFrame;
+ thumbnailView.contentMode = UIViewContentModeScaleToFill;
+ if(thumbnailView.superview != self) {
+ [thumbnailView removeFromSuperview];
+ [self addSubview:thumbnailView];
+ }
+ }];
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {}
+
+@end
BIN  PhotoDispatch/ThumbnailLoadingImage.png
Diff not rendered
158 PhotoDispatch/en.lproj/DetailViewController.xib
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
+ <data>
+ <int key="IBDocument.SystemTarget">1280</int>
+ <string key="IBDocument.SystemVersion">11C74</string>
+ <string key="IBDocument.InterfaceBuilderVersion">1938</string>
+ <string key="IBDocument.AppKitVersion">1138.23</string>
+ <string key="IBDocument.HIToolboxVersion">567.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="NS.object.0">933</string>
+ </object>
+ <array key="IBDocument.IntegratedClassDependencies">
+ <string>IBProxyObject</string>
+ <string>IBUIView</string>
+ <string>IBUIImageView</string>
+ </array>
+ <array key="IBDocument.PluginDependencies">
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </array>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+ <integer value="1" key="NS.object.0"/>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <object class="IBProxyObject" id="372490531">
+ <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBProxyObject" id="975951072">
+ <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBUIView" id="191373211">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">274</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="IBUIImageView" id="659540236">
+ <reference key="NSNextResponder" ref="191373211"/>
+ <int key="NSvFlags">274</int>
+ <string key="NSFrameSize">{320, 460}</string>
+ <reference key="NSSuperview" ref="191373211"/>
+ <reference key="NSWindow"/>
+ <string key="NSReuseIdentifierKey">_NS:567</string>
+ <object class="NSColor" key="IBUIBackgroundColor" id="524899470">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MC42MDAwMDAwMjM4IDAuNjAwMDAwMDIzOCAwLjYwMDAwMDAyMzgAA</bytes>
+ </object>
+ <int key="IBUIContentMode">1</int>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ </array>
+ <string key="NSFrame">{{0, 20}, {320, 460}}</string>
+ <reference key="NSSuperview"/>
+ <reference key="NSWindow"/>
+ <reference key="IBUIBackgroundColor" ref="524899470"/>
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ </array>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <array class="NSMutableArray" key="connectionRecords">
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">view</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="191373211"/>
+ </object>
+ <int key="connectionID">3</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">imageView</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="659540236"/>
+ </object>
+ <int key="connectionID">8</int>
+ </object>
+ </array>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <array key="orderedObjects">
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <array key="object" id="0"/>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">1</int>
+ <reference key="object" ref="191373211"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="659540236"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="372490531"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="975951072"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">7</int>
+ <reference key="object" ref="659540236"/>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ </array>
+ </object>
+ <dictionary class="NSMutableDictionary" key="flattenedProperties">
+ <string key="-1.CustomClassName">DetailViewController</string>
+ <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="-2.CustomClassName">UIResponder</string>
+ <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="7.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
+ <nil key="activeLocalization"/>
+ <dictionary class="NSMutableDictionary" key="localizations"/>
+ <nil key="sourceID"/>
+ <int key="maxID">8</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <array class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <object class="IBPartialClassDescription">
+ <string key="className">DetailViewController</string>
+ <string key="superclassName">UIViewController</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">imageView</string>
+ <string key="NS.object.0">UIImageView</string>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <string key="NS.key.0">imageView</string>
+ <object class="IBToOneOutletInfo" key="NS.object.0">
+ <string key="name">imageView</string>
+ <string key="candidateClassName">UIImageView</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">./Classes/DetailViewController.h</string>
+ </object>
+ </object>
+ </array>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <string key="IBCocoaTouchPluginVersion">933</string>
+ </data>
+</archive>
2  PhotoDispatch/en.lproj/InfoPlist.strings
@@ -0,0 +1,2 @@
+/* Localized versions of Info.plist keys */
+
142 PhotoDispatch/en.lproj/MasterViewController.xib
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
+ <data>
+ <int key="IBDocument.SystemTarget">1280</int>
+ <string key="IBDocument.SystemVersion">11C74</string>
+ <string key="IBDocument.InterfaceBuilderVersion">1938</string>
+ <string key="IBDocument.AppKitVersion">1138.23</string>
+ <string key="IBDocument.HIToolboxVersion">567.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="NS.object.0">933</string>
+ </object>
+ <array key="IBDocument.IntegratedClassDependencies">
+ <string>IBProxyObject</string>
+ <string>IBUITableView</string>
+ </array>
+ <array key="IBDocument.PluginDependencies">
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </array>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+ <integer value="1" key="NS.object.0"/>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <object class="IBProxyObject" id="841351856">
+ <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBProxyObject" id="371349661">
+ <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBUITableView" id="709618507">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">274</int>
+ <string key="NSFrame">{{0, 20}, {320, 460}}</string>
+ <reference key="NSSuperview"/>
+ <reference key="NSWindow"/>
+ <reference key="NSNextKeyView"/>
+ <object class="NSColor" key="IBUIBackgroundColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <array key="IBUIGestureRecognizers" id="0"/>
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <bool key="IBUIAlwaysBounceVertical">YES</bool>
+ <int key="