From 8329ef237d1841d377718813a0b452ea0df64378 Mon Sep 17 00:00:00 2001
From: 单军华 <WindShan@danjunhuas-MacBook-Pro.local>
Date: Wed, 21 Dec 2016 11:35:39 +0800
Subject: [PATCH] ioS 曲线图demo

---
 JHChart/JHChartDemo/Base.lproj/LaunchScreen.storyboard                                                           |   27 
 JHChart/JHChartDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata                                       |    7 
 JHChart/JHChartDemo/JHChart/JHTableDataRowModel.m                                                                |   13 
 JHChart/JHChartDemo/JHChart/JHTableDataRowModel.h                                                                |   26 
 JHChart/JHChartDemo/AppDelegate.m                                                                                |   45 
 JHChart/JHChartDemo/JHChart/JHPieItemsView.h                                                                     |   24 
 JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcschemes/JHChartDemo.xcscheme              |  111 +
 JHChart/JHChartDemo/ViewController.m                                                                             |   78 
 JHChart/JHChartDemo/GIFResource/环状图demo.gif                                                                      |    0 
 JHChart/JHChartDemo/JHChart/JHWaveChart.h                                                                        |   36 
 JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcschemes/xcschememanagement.plist          |   32 
 JHChart/JHChartDemo/JHChart/JHLineChart.m                                                                        | 1096 ++++++++++
 JHChart/JHChartDemoUITests/JHChartDemoUITests.m                                                                  |   40 
 JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist               |  151 +
 JHChart/JHChartDemo/JHChart/JHWaveChart.m                                                                        |  111 +
 JHChart/JHChartDemo/ViewController.h                                                                             |   15 
 JHChart/JHChartDemo/AppDelegate.h                                                                                |   17 
 JHChart/JHChartDemo/GIFResource/饼状图demo.gif                                                                      |    0 
 JHChart/JHChartDemo/JHShowController.h                                                                           |   16 
 JHChart/JHChartDemo/GIFResource/line3.png                                                                        |    0 
 JHChart/JHChartDemo/Info.plist                                                                                   |   40 
 JHChart/JHChartDemo/GIFResource/look.gif                                                                         |    0 
 JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist                     |    5 
 JHChart/JHChartDemo/JHChart/JHPieItemsView.m                                                                     |   68 
 JHChart/JHChartDemo/GIFResource/0011.gif                                                                         |    0 
 JHChart/JHChartDemo/GIFResource/line4.png                                                                        |    0 
 JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist        |    5 
 JHChart/README.md                                                                                                |  211 +
 JHChart/JHChartDemo/GIFResource/table1.png                                                                       |    0 
 JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcuserdata/JH.xcuserdatad/UserInterfaceState.xcuserstate       |    0 
 JHChart/JHChartDemo/main.m                                                                                       |   16 
 JHChart/JHChartDemo/GIFResource/折线图demo.png                                                                      |    0 
 JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcshareddata/JHChartDemo.xcscmblueprint                        |   30 
 JHChart/JHChartDemo/JHShowController.m                                                                           |  370 +++
 JHChart/JHChartDemo/JHChart/JHChartHeader.h                                                                      |   17 
 JHChart/JHChartDemo/JHChart/JHTableChart.m                                                                       |  344 +++
 JHChart/JHChartDemo/Assets.xcassets/AppIcon.appiconset/Contents.json                                             |   38 
 JHChart/JHChartDemo/GIFResource/line1.png                                                                        |    0 
 JHChart/JHChartDemo/JHChart/JHTableChart.h                                                                       |   91 
 JHChart/JHChartDemo/JHChart/JHColumnChart.h                                                                      |   76 
 JHChart/JHChartDemo/JHChart/JHColumnChart.m                                                                      |  396 +++
 JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcschemes/JHChartDemo.xcscheme                           |  111 +
 JHChart/JHChartDemo/Base.lproj/Main.storyboard                                                                   |   44 
 JHChart/JHChartDemo/GIFResource/line2.png                                                                        |    0 
 JHChart/JHChartDemo/JHChart/JHPieChart.h                                                                         |   39 
 JHChart/JHChartDemo/GIFResource/huan1.png                                                                        |    0 
 JHChart/JHChartDemo/GIFResource/雷达图demo.png                                                                      |    0 
 JHChart/JHChartDemo/JHChart/JHChart.h                                                                            |  128 +
 JHChart/JHChartDemo/JHChart/JHRadarChart.h                                                                       |   72 
 JHChart/JHChartDemo/JHChart/JHChart.m                                                                            |  159 +
 JHChart/JHChartDemo/JHChart/JHRadarChart.m                                                                       |  270 ++
 JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcschemes/xcschememanagement.plist                       |   32 
 JHChart/JHChartDemo/JHChart/JHPieChart.m                                                                         |  301 ++
 JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcschemes/JHChartDemo.xcscheme                     |  111 +
 JHChart/JHChartDemo/JHChart/JHPieForeBGView.m                                                                    |   56 
 JHChart/JHChartDemo/GIFResource/lines.png                                                                        |    0 
 JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcschemes/xcschememanagement.plist                 |   32 
 JHChart/JHChartDemo/GIFResource/zhu1.png                                                                         |    0 
 JHChart/JHChartDemo/JHChart/JHShowInfoView.h                                                                     |   20 
 JHChart/JHChartDemoTests/JHChartDemoTests.m                                                                      |   39 
 JHChart/JHChartDemo/JHChart/JHLineChart.h                                                                        |  192 +
 JHChart/JHChartDemo.xcodeproj/project.pbxproj                                                                    |  689 ++++++
 JHChart/JHChartDemo/JHChart/JHShowInfoView.m                                                                     |   80 
 JHChart/JHChartDemo/JHChart/JHPieForeBGView.h                                                                    |   26 
 JHChart/JHChartDemo/JHChart/JHRingChart.m                                                                        |  168 +
 JHChart/JHChart.podspec                                                                                          |  139 +
 JHChart/JHChartDemoTests/Info.plist                                                                              |   24 
 JHChart/JHChartDemo/JHChart/JHRingChart.h                                                                        |   30 
 JHChart/JHChartDemoUITests/Info.plist                                                                            |   24 
 JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcuserdata/WindShan.xcuserdatad/UserInterfaceState.xcuserstate |    0 
 JHChart/JHChartDemo/GIFResource/柱状图demo.gif                                                                      |    0 
 JHChart/JHChartDemo/GIFResource/pie1.png                                                                         |    0 
 72 files changed, 6,338 insertions(+), 0 deletions(-)

diff --git a/JHChart/JHChart.podspec b/JHChart/JHChart.podspec
new file mode 100755
index 0000000..b84b075
--- /dev/null
+++ b/JHChart/JHChart.podspec
@@ -0,0 +1,139 @@
+#
+#  Be sure to run `pod spec lint JHChart.podspec' to ensure this is a
+#  valid spec and to remove all comments including this before submitting the spec.
+#
+#  To learn more about Podspec attributes see http://docs.cocoapods.org/specification.html
+#  To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/
+#
+
+Pod::Spec.new do |s|
+
+  # ���������  Spec Metadata  ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #
+  #
+  #  These will help people to find your library, and whilst it
+  #  can feel like a chore to fill in it's definitely to your advantage. The
+  #  summary should be tweet-length, and the description more in depth.
+  #
+
+  s.name         = "JHChart"
+  s.version      = "0.0.1"
+  s.summary      = "This repo provide some charts for us."
+
+  # This description is used to generate tags and improve search results.
+  #   * Think: What does it do? Why did you write it? What is the focus?
+  #   * Try to keep it short, snappy and to the point.
+  #   * Write the description between the DESC delimiters below.
+  #   * Finally, don't worry about the indent, CocoaPods strips it!
+  s.description  = <<-DESC
+                   DESC
+
+  s.homepage     = "http://no url for this repo/JHChart"
+  # s.screenshots  = "www.example.com/screenshots_1.gif", "www.example.com/screenshots_2.gif"
+
+
+  # ���������  Spec License  ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� #
+  #
+  #  Licensing your code is important. See http://choosealicense.com for more info.
+  #  CocoaPods will detect a license file if there is a named LICENSE*
+  #  Popular ones are 'MIT', 'BSD' and 'Apache License, Version 2.0'.
+  #
+
+ # s.license      = { :type => "MIT", :file => "File_license"}
+  # s.license      = { :type => "MIT", :file => "FILE_LICENSE" 
+}
+ # s.source	 ={ :git => "https://github.com/China131/JHChart.git", :tag => "0.0.1"
+}
+s.source_files ="JHChartDemo/JHChart *", "*{h,m}" 
+  # ��������� Author Metadata  ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������� #
+  #
+  #  Specify the authors of the library, with email addresses. Email addresses
+  #  of the authors are extracted from the SCM log. E.g. $ git log. CocoaPods also
+  #  accepts just a name if you'd rather not provide an email address.
+  #
+  #  Specify a social_media_url where others can refer to, for example a twitter
+  #  profile URL.
+  #
+
+  s.author             = { "China131" => "13162255392@163.com" }
+  # Or just: s.author    = "China131"
+  # s.authors            = { "China131" => "13162255392@163.com" }
+  # s.social_media_url   = "http://twitter.com/China131"
+
+  # ��������� Platform Specifics ��������������������������������������������������������������������������������������������������������������������������������������������������������������������� #
+  #
+  #  If this Pod runs only on iOS or OS X, then specify the platform and
+  #  the deployment target. You can optionally include the target after the platform.
+  #
+
+  # s.platform     = :ios
+  # s.platform     = :ios, "5.0"
+
+  #  When using multiple platforms
+  # s.ios.deployment_target = "5.0"
+  # s.osx.deployment_target = "10.7"
+  # s.watchos.deployment_target = "2.0"
+  # s.tvos.deployment_target = "9.0"
+
+
+  # ��������� Source Location ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #
+  #
+  #  Specify the location from where the source should be retrieved.
+  #  Supports git, hg, bzr, svn and HTTP.
+  #
+  s.source       = { :git => "https://github.com/China131/JHChart.git", :tag => "0.0.1" }
+
+
+  # ��������� Source Code ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #
+  #
+  #  CocoaPods is smart about how it includes source code. For source files
+  #  giving a folder will include any swift, h, m, mm, c & cpp files.
+  #  For header files it will include any header in the folder.
+  #  Not including the public_header_files will make all headers public.
+  #
+
+ # s.source_files  = "Classes", "/JHChartDemo/JHChart*.{h,m}"
+  s.exclude_files = "Classes/Exclude"
+
+  # s.public_header_files = "Classes/**/*.h"
+
+
+  # ��������� Resources ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #
+  #
+  #  A list of resources included with the Pod. These are copied into the
+  #  target bundle with a build phase script. Anything else will be cleaned.
+  #  You can preserve files from being cleaned, please don't preserve
+  #  non-essential files like tests, examples and documentation.
+  #
+
+  # s.resource  = "icon.png"
+  # s.resources = "Resources/*.png"
+
+  # s.preserve_paths = "FilesToSave", "MoreFilesToSave"
+
+
+  # ��������� Project Linking ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #
+  #
+  #  Link your library with frameworks, or libraries. Libraries do not include
+  #  the lib prefix of their name.
+  #
+
+  # s.framework  = "SomeFramework"
+  # s.frameworks = "SomeFramework", "AnotherFramework"
+
+  # s.library   = "iconv"
+  # s.libraries = "iconv", "xml2"
+
+
+  # ��������� Project Settings ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������� #
+  #
+  #  If your library depends on compiler flags you can set them in the xcconfig hash
+  #  where they will only apply to your library. If you depend on other Podspecs
+  #  you can include multiple dependencies to ensure it works.
+
+  # s.requires_arc = true
+
+  # s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }
+  # s.dependency "JSONKit", "~> 1.4"
+
+
+end
diff --git a/JHChart/JHChartDemo.xcodeproj/project.pbxproj b/JHChart/JHChartDemo.xcodeproj/project.pbxproj
new file mode 100755
index 0000000..339b768
--- /dev/null
+++ b/JHChart/JHChartDemo.xcodeproj/project.pbxproj
@@ -0,0 +1,689 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 46;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		AA0031601CBCCFD500F4FDEB /* JHShowController.m in Sources */ = {isa = PBXBuildFile; fileRef = AA00315F1CBCCFD500F4FDEB /* JHShowController.m */; };
+		AA441C311CE1684D0056993D /* JHColumnChart.m in Sources */ = {isa = PBXBuildFile; fileRef = AA441C301CE1684D0056993D /* JHColumnChart.m */; };
+		AA57D8A91CD9C492003EA0A7 /* JHShowInfoView.m in Sources */ = {isa = PBXBuildFile; fileRef = AA57D8A81CD9C492003EA0A7 /* JHShowInfoView.m */; };
+		AA5E2BB31CBA298F00FC19EE /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = AA5E2BB21CBA298F00FC19EE /* main.m */; };
+		AA5E2BB61CBA298F00FC19EE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = AA5E2BB51CBA298F00FC19EE /* AppDelegate.m */; };
+		AA5E2BB91CBA298F00FC19EE /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AA5E2BB81CBA298F00FC19EE /* ViewController.m */; };
+		AA5E2BBC1CBA298F00FC19EE /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA5E2BBA1CBA298F00FC19EE /* Main.storyboard */; };
+		AA5E2BBE1CBA298F00FC19EE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AA5E2BBD1CBA298F00FC19EE /* Assets.xcassets */; };
+		AA5E2BC11CBA298F00FC19EE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA5E2BBF1CBA298F00FC19EE /* LaunchScreen.storyboard */; };
+		AA5E2BCC1CBA298F00FC19EE /* JHChartDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = AA5E2BCB1CBA298F00FC19EE /* JHChartDemoTests.m */; };
+		AA5E2BD71CBA298F00FC19EE /* JHChartDemoUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = AA5E2BD61CBA298F00FC19EE /* JHChartDemoUITests.m */; };
+		AA5E2BE71CBA2B3100FC19EE /* JHLineChart.m in Sources */ = {isa = PBXBuildFile; fileRef = AA5E2BE61CBA2B3100FC19EE /* JHLineChart.m */; };
+		AA5E2BEA1CBA2CE700FC19EE /* JHChart.m in Sources */ = {isa = PBXBuildFile; fileRef = AA5E2BE91CBA2CE700FC19EE /* JHChart.m */; };
+		AAA60A8F1CD8A81A0094D6E5 /* JHPieChart.m in Sources */ = {isa = PBXBuildFile; fileRef = AAA60A8A1CD8A81A0094D6E5 /* JHPieChart.m */; };
+		AAA60A901CD8A81A0094D6E5 /* JHPieForeBGView.m in Sources */ = {isa = PBXBuildFile; fileRef = AAA60A8C1CD8A81A0094D6E5 /* JHPieForeBGView.m */; };
+		AAA60A911CD8A81A0094D6E5 /* JHPieItemsView.m in Sources */ = {isa = PBXBuildFile; fileRef = AAA60A8E1CD8A81A0094D6E5 /* JHPieItemsView.m */; };
+		AAE935E81CBE0CCA002517EB /* JHWaveChart.m in Sources */ = {isa = PBXBuildFile; fileRef = AAE935E71CBE0CCA002517EB /* JHWaveChart.m */; };
+		E90C3EB01D6D971A0019BE6A /* JHTableChart.m in Sources */ = {isa = PBXBuildFile; fileRef = E90C3EAF1D6D971A0019BE6A /* JHTableChart.m */; };
+		E9135FE61D2B810B00ED9F6D /* JHRingChart.m in Sources */ = {isa = PBXBuildFile; fileRef = E9135FE51D2B810B00ED9F6D /* JHRingChart.m */; };
+		E918287A1D785E1900F60BB6 /* 0011.gif in Resources */ = {isa = PBXBuildFile; fileRef = E91828791D785E1900F60BB6 /* 0011.gif */; };
+		E918287C1D7860F300F60BB6 /* lines.png in Resources */ = {isa = PBXBuildFile; fileRef = E918287B1D7860F300F60BB6 /* lines.png */; };
+		E91828851D7864F600F60BB6 /* huan1.png in Resources */ = {isa = PBXBuildFile; fileRef = E918287D1D7864F600F60BB6 /* huan1.png */; };
+		E91828861D7864F600F60BB6 /* line1.png in Resources */ = {isa = PBXBuildFile; fileRef = E918287E1D7864F600F60BB6 /* line1.png */; };
+		E91828871D7864F600F60BB6 /* line2.png in Resources */ = {isa = PBXBuildFile; fileRef = E918287F1D7864F600F60BB6 /* line2.png */; };
+		E91828881D7864F600F60BB6 /* line3.png in Resources */ = {isa = PBXBuildFile; fileRef = E91828801D7864F600F60BB6 /* line3.png */; };
+		E91828891D7864F600F60BB6 /* line4.png in Resources */ = {isa = PBXBuildFile; fileRef = E91828811D7864F600F60BB6 /* line4.png */; };
+		E918288A1D7864F600F60BB6 /* pie1.png in Resources */ = {isa = PBXBuildFile; fileRef = E91828821D7864F600F60BB6 /* pie1.png */; };
+		E918288B1D7864F600F60BB6 /* table1.png in Resources */ = {isa = PBXBuildFile; fileRef = E91828831D7864F600F60BB6 /* table1.png */; };
+		E918288C1D7864F600F60BB6 /* zhu1.png in Resources */ = {isa = PBXBuildFile; fileRef = E91828841D7864F600F60BB6 /* zhu1.png */; };
+		E922F8051D82A8B0000C7C77 /* JHRadarChart.m in Sources */ = {isa = PBXBuildFile; fileRef = E922F8041D82A8B0000C7C77 /* JHRadarChart.m */; };
+		E99BDEDF1D812F720062F314 /* ���������demo.gif in Resources */ = {isa = PBXBuildFile; fileRef = E99BDEDB1D812F720062F314 /* ���������demo.gif */; };
+		E99BDEE01D812F720062F314 /* ���������demo.gif in Resources */ = {isa = PBXBuildFile; fileRef = E99BDEDC1D812F720062F314 /* ���������demo.gif */; };
+		E99BDEE11D812F720062F314 /* ���������demo.png in Resources */ = {isa = PBXBuildFile; fileRef = E99BDEDD1D812F720062F314 /* ���������demo.png */; };
+		E99BDEE21D812F720062F314 /* ���������demo.gif in Resources */ = {isa = PBXBuildFile; fileRef = E99BDEDE1D812F720062F314 /* ���������demo.gif */; };
+		E9C0B3C81DCAC33B000068ED /* look.gif in Resources */ = {isa = PBXBuildFile; fileRef = E9C0B3C71DCAC33B000068ED /* look.gif */; };
+		E9C0F36E1DCA026800A87CAF /* ���������demo.png in Resources */ = {isa = PBXBuildFile; fileRef = E9C0F36D1DCA026800A87CAF /* ���������demo.png */; };
+		E9DAFF3E1D6EB6E900D4E148 /* JHTableDataRowModel.m in Sources */ = {isa = PBXBuildFile; fileRef = E9DAFF3D1D6EB6E900D4E148 /* JHTableDataRowModel.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		AA5E2BC81CBA298F00FC19EE /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = AA5E2BA61CBA298F00FC19EE /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = AA5E2BAD1CBA298F00FC19EE;
+			remoteInfo = JHChartDemo;
+		};
+		AA5E2BD31CBA298F00FC19EE /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = AA5E2BA61CBA298F00FC19EE /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = AA5E2BAD1CBA298F00FC19EE;
+			remoteInfo = JHChartDemo;
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+		AA00315E1CBCCFD500F4FDEB /* JHShowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JHShowController.h; sourceTree = "<group>"; };
+		AA00315F1CBCCFD500F4FDEB /* JHShowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JHShowController.m; sourceTree = "<group>"; };
+		AA006FFE1CBB77DC0030F296 /* JHChartHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JHChartHeader.h; sourceTree = "<group>"; };
+		AA441C2F1CE1684D0056993D /* JHColumnChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JHColumnChart.h; sourceTree = "<group>"; };
+		AA441C301CE1684D0056993D /* JHColumnChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JHColumnChart.m; sourceTree = "<group>"; };
+		AA57D8A71CD9C492003EA0A7 /* JHShowInfoView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JHShowInfoView.h; sourceTree = "<group>"; };
+		AA57D8A81CD9C492003EA0A7 /* JHShowInfoView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JHShowInfoView.m; sourceTree = "<group>"; };
+		AA5E2BAE1CBA298F00FC19EE /* JHChartDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JHChartDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		AA5E2BB21CBA298F00FC19EE /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+		AA5E2BB41CBA298F00FC19EE /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+		AA5E2BB51CBA298F00FC19EE /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+		AA5E2BB71CBA298F00FC19EE /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
+		AA5E2BB81CBA298F00FC19EE /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
+		AA5E2BBB1CBA298F00FC19EE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
+		AA5E2BBD1CBA298F00FC19EE /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+		AA5E2BC01CBA298F00FC19EE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
+		AA5E2BC21CBA298F00FC19EE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		AA5E2BC71CBA298F00FC19EE /* JHChartDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JHChartDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+		AA5E2BCB1CBA298F00FC19EE /* JHChartDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JHChartDemoTests.m; sourceTree = "<group>"; };
+		AA5E2BCD1CBA298F00FC19EE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		AA5E2BD21CBA298F00FC19EE /* JHChartDemoUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JHChartDemoUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+		AA5E2BD61CBA298F00FC19EE /* JHChartDemoUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JHChartDemoUITests.m; sourceTree = "<group>"; };
+		AA5E2BD81CBA298F00FC19EE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		AA5E2BE51CBA2B3100FC19EE /* JHLineChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JHLineChart.h; sourceTree = "<group>"; };
+		AA5E2BE61CBA2B3100FC19EE /* JHLineChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JHLineChart.m; sourceTree = "<group>"; };
+		AA5E2BE81CBA2CE700FC19EE /* JHChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JHChart.h; sourceTree = "<group>"; };
+		AA5E2BE91CBA2CE700FC19EE /* JHChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JHChart.m; sourceTree = "<group>"; };
+		AAA60A891CD8A81A0094D6E5 /* JHPieChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JHPieChart.h; sourceTree = "<group>"; };
+		AAA60A8A1CD8A81A0094D6E5 /* JHPieChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JHPieChart.m; sourceTree = "<group>"; };
+		AAA60A8B1CD8A81A0094D6E5 /* JHPieForeBGView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JHPieForeBGView.h; sourceTree = "<group>"; };
+		AAA60A8C1CD8A81A0094D6E5 /* JHPieForeBGView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JHPieForeBGView.m; sourceTree = "<group>"; };
+		AAA60A8D1CD8A81A0094D6E5 /* JHPieItemsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JHPieItemsView.h; sourceTree = "<group>"; };
+		AAA60A8E1CD8A81A0094D6E5 /* JHPieItemsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JHPieItemsView.m; sourceTree = "<group>"; };
+		AAE935E61CBE0CCA002517EB /* JHWaveChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JHWaveChart.h; sourceTree = "<group>"; };
+		AAE935E71CBE0CCA002517EB /* JHWaveChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JHWaveChart.m; sourceTree = "<group>"; };
+		E90C3EAE1D6D971A0019BE6A /* JHTableChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JHTableChart.h; sourceTree = "<group>"; };
+		E90C3EAF1D6D971A0019BE6A /* JHTableChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JHTableChart.m; sourceTree = "<group>"; };
+		E9135FE41D2B810B00ED9F6D /* JHRingChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JHRingChart.h; sourceTree = "<group>"; };
+		E9135FE51D2B810B00ED9F6D /* JHRingChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JHRingChart.m; sourceTree = "<group>"; };
+		E91828791D785E1900F60BB6 /* 0011.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = 0011.gif; sourceTree = "<group>"; };
+		E918287B1D7860F300F60BB6 /* lines.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = lines.png; sourceTree = "<group>"; };
+		E918287D1D7864F600F60BB6 /* huan1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = huan1.png; sourceTree = "<group>"; };
+		E918287E1D7864F600F60BB6 /* line1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = line1.png; sourceTree = "<group>"; };
+		E918287F1D7864F600F60BB6 /* line2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = line2.png; sourceTree = "<group>"; };
+		E91828801D7864F600F60BB6 /* line3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = line3.png; sourceTree = "<group>"; };
+		E91828811D7864F600F60BB6 /* line4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = line4.png; sourceTree = "<group>"; };
+		E91828821D7864F600F60BB6 /* pie1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pie1.png; sourceTree = "<group>"; };
+		E91828831D7864F600F60BB6 /* table1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = table1.png; sourceTree = "<group>"; };
+		E91828841D7864F600F60BB6 /* zhu1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = zhu1.png; sourceTree = "<group>"; };
+		E922F8031D82A8B0000C7C77 /* JHRadarChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JHRadarChart.h; sourceTree = "<group>"; };
+		E922F8041D82A8B0000C7C77 /* JHRadarChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JHRadarChart.m; sourceTree = "<group>"; };
+		E99BDEDB1D812F720062F314 /* ���������demo.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = "���������demo.gif"; sourceTree = "<group>"; };
+		E99BDEDC1D812F720062F314 /* ���������demo.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = "���������demo.gif"; sourceTree = "<group>"; };
+		E99BDEDD1D812F720062F314 /* ���������demo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "���������demo.png"; sourceTree = "<group>"; };
+		E99BDEDE1D812F720062F314 /* ���������demo.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = "���������demo.gif"; sourceTree = "<group>"; };
+		E9C0B3C71DCAC33B000068ED /* look.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = look.gif; sourceTree = "<group>"; };
+		E9C0F36D1DCA026800A87CAF /* ���������demo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "���������demo.png"; sourceTree = "<group>"; };
+		E9DAFF3C1D6EB6E900D4E148 /* JHTableDataRowModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JHTableDataRowModel.h; sourceTree = "<group>"; };
+		E9DAFF3D1D6EB6E900D4E148 /* JHTableDataRowModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JHTableDataRowModel.m; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		AA5E2BAB1CBA298F00FC19EE /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		AA5E2BC41CBA298F00FC19EE /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		AA5E2BCF1CBA298F00FC19EE /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		AA5E2BA51CBA298F00FC19EE = {
+			isa = PBXGroup;
+			children = (
+				AA5E2BB01CBA298F00FC19EE /* JHChartDemo */,
+				AA5E2BCA1CBA298F00FC19EE /* JHChartDemoTests */,
+				AA5E2BD51CBA298F00FC19EE /* JHChartDemoUITests */,
+				AA5E2BAF1CBA298F00FC19EE /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+		AA5E2BAF1CBA298F00FC19EE /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				AA5E2BAE1CBA298F00FC19EE /* JHChartDemo.app */,
+				AA5E2BC71CBA298F00FC19EE /* JHChartDemoTests.xctest */,
+				AA5E2BD21CBA298F00FC19EE /* JHChartDemoUITests.xctest */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		AA5E2BB01CBA298F00FC19EE /* JHChartDemo */ = {
+			isa = PBXGroup;
+			children = (
+				AAF615181CBF9E7F00E066C3 /* GIFResource */,
+				AA5E2BE41CBA29CF00FC19EE /* JHChart */,
+				AA5E2BB41CBA298F00FC19EE /* AppDelegate.h */,
+				AA5E2BB51CBA298F00FC19EE /* AppDelegate.m */,
+				AA5E2BB71CBA298F00FC19EE /* ViewController.h */,
+				AA5E2BB81CBA298F00FC19EE /* ViewController.m */,
+				AA00315E1CBCCFD500F4FDEB /* JHShowController.h */,
+				AA00315F1CBCCFD500F4FDEB /* JHShowController.m */,
+				AA5E2BBA1CBA298F00FC19EE /* Main.storyboard */,
+				AA5E2BBD1CBA298F00FC19EE /* Assets.xcassets */,
+				AA5E2BBF1CBA298F00FC19EE /* LaunchScreen.storyboard */,
+				AA5E2BC21CBA298F00FC19EE /* Info.plist */,
+				AA5E2BB11CBA298F00FC19EE /* Supporting Files */,
+			);
+			path = JHChartDemo;
+			sourceTree = "<group>";
+		};
+		AA5E2BB11CBA298F00FC19EE /* Supporting Files */ = {
+			isa = PBXGroup;
+			children = (
+				AA5E2BB21CBA298F00FC19EE /* main.m */,
+			);
+			name = "Supporting Files";
+			sourceTree = "<group>";
+		};
+		AA5E2BCA1CBA298F00FC19EE /* JHChartDemoTests */ = {
+			isa = PBXGroup;
+			children = (
+				AA5E2BCB1CBA298F00FC19EE /* JHChartDemoTests.m */,
+				AA5E2BCD1CBA298F00FC19EE /* Info.plist */,
+			);
+			path = JHChartDemoTests;
+			sourceTree = "<group>";
+		};
+		AA5E2BD51CBA298F00FC19EE /* JHChartDemoUITests */ = {
+			isa = PBXGroup;
+			children = (
+				AA5E2BD61CBA298F00FC19EE /* JHChartDemoUITests.m */,
+				AA5E2BD81CBA298F00FC19EE /* Info.plist */,
+			);
+			path = JHChartDemoUITests;
+			sourceTree = "<group>";
+		};
+		AA5E2BE41CBA29CF00FC19EE /* JHChart */ = {
+			isa = PBXGroup;
+			children = (
+				AA006FFE1CBB77DC0030F296 /* JHChartHeader.h */,
+				AA5E2BE81CBA2CE700FC19EE /* JHChart.h */,
+				AA5E2BE91CBA2CE700FC19EE /* JHChart.m */,
+				AA5E2BE51CBA2B3100FC19EE /* JHLineChart.h */,
+				AA5E2BE61CBA2B3100FC19EE /* JHLineChart.m */,
+				AAA60A891CD8A81A0094D6E5 /* JHPieChart.h */,
+				AAA60A8A1CD8A81A0094D6E5 /* JHPieChart.m */,
+				AAA60A8B1CD8A81A0094D6E5 /* JHPieForeBGView.h */,
+				AAA60A8C1CD8A81A0094D6E5 /* JHPieForeBGView.m */,
+				AAA60A8D1CD8A81A0094D6E5 /* JHPieItemsView.h */,
+				AAA60A8E1CD8A81A0094D6E5 /* JHPieItemsView.m */,
+				AAE935E61CBE0CCA002517EB /* JHWaveChart.h */,
+				AAE935E71CBE0CCA002517EB /* JHWaveChart.m */,
+				AA57D8A71CD9C492003EA0A7 /* JHShowInfoView.h */,
+				AA57D8A81CD9C492003EA0A7 /* JHShowInfoView.m */,
+				AA441C2F1CE1684D0056993D /* JHColumnChart.h */,
+				AA441C301CE1684D0056993D /* JHColumnChart.m */,
+				E9135FE41D2B810B00ED9F6D /* JHRingChart.h */,
+				E9135FE51D2B810B00ED9F6D /* JHRingChart.m */,
+				E90C3EAE1D6D971A0019BE6A /* JHTableChart.h */,
+				E90C3EAF1D6D971A0019BE6A /* JHTableChart.m */,
+				E9DAFF3C1D6EB6E900D4E148 /* JHTableDataRowModel.h */,
+				E9DAFF3D1D6EB6E900D4E148 /* JHTableDataRowModel.m */,
+				E922F8031D82A8B0000C7C77 /* JHRadarChart.h */,
+				E922F8041D82A8B0000C7C77 /* JHRadarChart.m */,
+			);
+			path = JHChart;
+			sourceTree = "<group>";
+		};
+		AAF615181CBF9E7F00E066C3 /* GIFResource */ = {
+			isa = PBXGroup;
+			children = (
+				E9C0B3C71DCAC33B000068ED /* look.gif */,
+				E9C0F36D1DCA026800A87CAF /* ���������demo.png */,
+				E99BDEDB1D812F720062F314 /* ���������demo.gif */,
+				E99BDEDC1D812F720062F314 /* ���������demo.gif */,
+				E99BDEDD1D812F720062F314 /* ���������demo.png */,
+				E99BDEDE1D812F720062F314 /* ���������demo.gif */,
+				E918287D1D7864F600F60BB6 /* huan1.png */,
+				E918287E1D7864F600F60BB6 /* line1.png */,
+				E918287F1D7864F600F60BB6 /* line2.png */,
+				E91828801D7864F600F60BB6 /* line3.png */,
+				E91828811D7864F600F60BB6 /* line4.png */,
+				E91828821D7864F600F60BB6 /* pie1.png */,
+				E91828831D7864F600F60BB6 /* table1.png */,
+				E91828841D7864F600F60BB6 /* zhu1.png */,
+				E918287B1D7860F300F60BB6 /* lines.png */,
+				E91828791D785E1900F60BB6 /* 0011.gif */,
+			);
+			path = GIFResource;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		AA5E2BAD1CBA298F00FC19EE /* JHChartDemo */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = AA5E2BDB1CBA298F00FC19EE /* Build configuration list for PBXNativeTarget "JHChartDemo" */;
+			buildPhases = (
+				AA5E2BAA1CBA298F00FC19EE /* Sources */,
+				AA5E2BAB1CBA298F00FC19EE /* Frameworks */,
+				AA5E2BAC1CBA298F00FC19EE /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = JHChartDemo;
+			productName = JHChartDemo;
+			productReference = AA5E2BAE1CBA298F00FC19EE /* JHChartDemo.app */;
+			productType = "com.apple.product-type.application";
+		};
+		AA5E2BC61CBA298F00FC19EE /* JHChartDemoTests */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = AA5E2BDE1CBA298F00FC19EE /* Build configuration list for PBXNativeTarget "JHChartDemoTests" */;
+			buildPhases = (
+				AA5E2BC31CBA298F00FC19EE /* Sources */,
+				AA5E2BC41CBA298F00FC19EE /* Frameworks */,
+				AA5E2BC51CBA298F00FC19EE /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				AA5E2BC91CBA298F00FC19EE /* PBXTargetDependency */,
+			);
+			name = JHChartDemoTests;
+			productName = JHChartDemoTests;
+			productReference = AA5E2BC71CBA298F00FC19EE /* JHChartDemoTests.xctest */;
+			productType = "com.apple.product-type.bundle.unit-test";
+		};
+		AA5E2BD11CBA298F00FC19EE /* JHChartDemoUITests */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = AA5E2BE11CBA298F00FC19EE /* Build configuration list for PBXNativeTarget "JHChartDemoUITests" */;
+			buildPhases = (
+				AA5E2BCE1CBA298F00FC19EE /* Sources */,
+				AA5E2BCF1CBA298F00FC19EE /* Frameworks */,
+				AA5E2BD01CBA298F00FC19EE /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				AA5E2BD41CBA298F00FC19EE /* PBXTargetDependency */,
+			);
+			name = JHChartDemoUITests;
+			productName = JHChartDemoUITests;
+			productReference = AA5E2BD21CBA298F00FC19EE /* JHChartDemoUITests.xctest */;
+			productType = "com.apple.product-type.bundle.ui-testing";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		AA5E2BA61CBA298F00FC19EE /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0720;
+				ORGANIZATIONNAME = JH;
+				TargetAttributes = {
+					AA5E2BAD1CBA298F00FC19EE = {
+						CreatedOnToolsVersion = 7.2.1;
+						DevelopmentTeam = HRJA43XU8W;
+					};
+					AA5E2BC61CBA298F00FC19EE = {
+						CreatedOnToolsVersion = 7.2.1;
+						TestTargetID = AA5E2BAD1CBA298F00FC19EE;
+					};
+					AA5E2BD11CBA298F00FC19EE = {
+						CreatedOnToolsVersion = 7.2.1;
+						TestTargetID = AA5E2BAD1CBA298F00FC19EE;
+					};
+				};
+			};
+			buildConfigurationList = AA5E2BA91CBA298F00FC19EE /* Build configuration list for PBXProject "JHChartDemo" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = AA5E2BA51CBA298F00FC19EE;
+			productRefGroup = AA5E2BAF1CBA298F00FC19EE /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				AA5E2BAD1CBA298F00FC19EE /* JHChartDemo */,
+				AA5E2BC61CBA298F00FC19EE /* JHChartDemoTests */,
+				AA5E2BD11CBA298F00FC19EE /* JHChartDemoUITests */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		AA5E2BAC1CBA298F00FC19EE /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				E9C0F36E1DCA026800A87CAF /* ���������demo.png in Resources */,
+				AA5E2BC11CBA298F00FC19EE /* LaunchScreen.storyboard in Resources */,
+				E9C0B3C81DCAC33B000068ED /* look.gif in Resources */,
+				E91828851D7864F600F60BB6 /* huan1.png in Resources */,
+				E99BDEDF1D812F720062F314 /* ���������demo.gif in Resources */,
+				E91828881D7864F600F60BB6 /* line3.png in Resources */,
+				E91828861D7864F600F60BB6 /* line1.png in Resources */,
+				E918287A1D785E1900F60BB6 /* 0011.gif in Resources */,
+				E918288C1D7864F600F60BB6 /* zhu1.png in Resources */,
+				E918288A1D7864F600F60BB6 /* pie1.png in Resources */,
+				E99BDEE11D812F720062F314 /* ���������demo.png in Resources */,
+				E99BDEE01D812F720062F314 /* ���������demo.gif in Resources */,
+				AA5E2BBE1CBA298F00FC19EE /* Assets.xcassets in Resources */,
+				AA5E2BBC1CBA298F00FC19EE /* Main.storyboard in Resources */,
+				E91828871D7864F600F60BB6 /* line2.png in Resources */,
+				E91828891D7864F600F60BB6 /* line4.png in Resources */,
+				E918288B1D7864F600F60BB6 /* table1.png in Resources */,
+				E99BDEE21D812F720062F314 /* ���������demo.gif in Resources */,
+				E918287C1D7860F300F60BB6 /* lines.png in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		AA5E2BC51CBA298F00FC19EE /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		AA5E2BD01CBA298F00FC19EE /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		AA5E2BAA1CBA298F00FC19EE /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				AA0031601CBCCFD500F4FDEB /* JHShowController.m in Sources */,
+				E9135FE61D2B810B00ED9F6D /* JHRingChart.m in Sources */,
+				AAA60A8F1CD8A81A0094D6E5 /* JHPieChart.m in Sources */,
+				AA57D8A91CD9C492003EA0A7 /* JHShowInfoView.m in Sources */,
+				AAA60A911CD8A81A0094D6E5 /* JHPieItemsView.m in Sources */,
+				AAE935E81CBE0CCA002517EB /* JHWaveChart.m in Sources */,
+				AA5E2BE71CBA2B3100FC19EE /* JHLineChart.m in Sources */,
+				E922F8051D82A8B0000C7C77 /* JHRadarChart.m in Sources */,
+				AA5E2BEA1CBA2CE700FC19EE /* JHChart.m in Sources */,
+				AA5E2BB91CBA298F00FC19EE /* ViewController.m in Sources */,
+				AA441C311CE1684D0056993D /* JHColumnChart.m in Sources */,
+				AA5E2BB61CBA298F00FC19EE /* AppDelegate.m in Sources */,
+				AAA60A901CD8A81A0094D6E5 /* JHPieForeBGView.m in Sources */,
+				AA5E2BB31CBA298F00FC19EE /* main.m in Sources */,
+				E9DAFF3E1D6EB6E900D4E148 /* JHTableDataRowModel.m in Sources */,
+				E90C3EB01D6D971A0019BE6A /* JHTableChart.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		AA5E2BC31CBA298F00FC19EE /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				AA5E2BCC1CBA298F00FC19EE /* JHChartDemoTests.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		AA5E2BCE1CBA298F00FC19EE /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				AA5E2BD71CBA298F00FC19EE /* JHChartDemoUITests.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		AA5E2BC91CBA298F00FC19EE /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = AA5E2BAD1CBA298F00FC19EE /* JHChartDemo */;
+			targetProxy = AA5E2BC81CBA298F00FC19EE /* PBXContainerItemProxy */;
+		};
+		AA5E2BD41CBA298F00FC19EE /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = AA5E2BAD1CBA298F00FC19EE /* JHChartDemo */;
+			targetProxy = AA5E2BD31CBA298F00FC19EE /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+		AA5E2BBA1CBA298F00FC19EE /* Main.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				AA5E2BBB1CBA298F00FC19EE /* Base */,
+			);
+			name = Main.storyboard;
+			sourceTree = "<group>";
+		};
+		AA5E2BBF1CBA298F00FC19EE /* LaunchScreen.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				AA5E2BC01CBA298F00FC19EE /* Base */,
+			);
+			name = LaunchScreen.storyboard;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		AA5E2BD91CBA298F00FC19EE /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.2;
+				MTL_ENABLE_DEBUG_INFO = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = iphoneos;
+			};
+			name = Debug;
+		};
+		AA5E2BDA1CBA298F00FC19EE /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.2;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				SDKROOT = iphoneos;
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		AA5E2BDC1CBA298F00FC19EE /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				INFOPLIST_FILE = JHChartDemo/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = JH.JHChartDemo;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE = "";
+			};
+			name = Debug;
+		};
+		AA5E2BDD1CBA298F00FC19EE /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				INFOPLIST_FILE = JHChartDemo/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = JH.JHChartDemo;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE = "";
+			};
+			name = Release;
+		};
+		AA5E2BDF1CBA298F00FC19EE /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				BUNDLE_LOADER = "$(TEST_HOST)";
+				INFOPLIST_FILE = JHChartDemoTests/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = JH.JHChartDemoTests;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/JHChartDemo.app/JHChartDemo";
+			};
+			name = Debug;
+		};
+		AA5E2BE01CBA298F00FC19EE /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				BUNDLE_LOADER = "$(TEST_HOST)";
+				INFOPLIST_FILE = JHChartDemoTests/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = JH.JHChartDemoTests;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/JHChartDemo.app/JHChartDemo";
+			};
+			name = Release;
+		};
+		AA5E2BE21CBA298F00FC19EE /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				INFOPLIST_FILE = JHChartDemoUITests/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = JH.JHChartDemoUITests;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				TEST_TARGET_NAME = JHChartDemo;
+				USES_XCTRUNNER = YES;
+			};
+			name = Debug;
+		};
+		AA5E2BE31CBA298F00FC19EE /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				INFOPLIST_FILE = JHChartDemoUITests/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = JH.JHChartDemoUITests;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				TEST_TARGET_NAME = JHChartDemo;
+				USES_XCTRUNNER = YES;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		AA5E2BA91CBA298F00FC19EE /* Build configuration list for PBXProject "JHChartDemo" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				AA5E2BD91CBA298F00FC19EE /* Debug */,
+				AA5E2BDA1CBA298F00FC19EE /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		AA5E2BDB1CBA298F00FC19EE /* Build configuration list for PBXNativeTarget "JHChartDemo" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				AA5E2BDC1CBA298F00FC19EE /* Debug */,
+				AA5E2BDD1CBA298F00FC19EE /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		AA5E2BDE1CBA298F00FC19EE /* Build configuration list for PBXNativeTarget "JHChartDemoTests" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				AA5E2BDF1CBA298F00FC19EE /* Debug */,
+				AA5E2BE01CBA298F00FC19EE /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		AA5E2BE11CBA298F00FC19EE /* Build configuration list for PBXNativeTarget "JHChartDemoUITests" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				AA5E2BE21CBA298F00FC19EE /* Debug */,
+				AA5E2BE31CBA298F00FC19EE /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = AA5E2BA61CBA298F00FC19EE /* Project object */;
+}
diff --git a/JHChart/JHChartDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/JHChart/JHChartDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100755
index 0000000..0aa2d96
--- /dev/null
+++ b/JHChart/JHChartDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:JHChartDemo.xcodeproj">
+   </FileRef>
+</Workspace>
diff --git a/JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcshareddata/JHChartDemo.xcscmblueprint b/JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcshareddata/JHChartDemo.xcscmblueprint
new file mode 100755
index 0000000..6cd5a71
--- /dev/null
+++ b/JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcshareddata/JHChartDemo.xcscmblueprint
@@ -0,0 +1,30 @@
+{
+  "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "D21FADD0802B1CD49C58E7CC20D5844B9F73313E",
+  "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : {
+
+  },
+  "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : {
+    "D21FADD0802B1CD49C58E7CC20D5844B9F73313E" : 0,
+    "05B31EF991A76A9CFFF4DF36E9AF637001A60958" : 0
+  },
+  "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "80FC3190-E32B-4952-BFE0-21F419DF56E3",
+  "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : {
+    "D21FADD0802B1CD49C58E7CC20D5844B9F73313E" : "JHChart\/",
+    "05B31EF991A76A9CFFF4DF36E9AF637001A60958" : ".."
+  },
+  "DVTSourceControlWorkspaceBlueprintNameKey" : "JHChartDemo",
+  "DVTSourceControlWorkspaceBlueprintVersion" : 204,
+  "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "JHChartDemo.xcodeproj",
+  "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [
+    {
+      "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/China131\/CJPravate.git",
+      "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
+      "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "05B31EF991A76A9CFFF4DF36E9AF637001A60958"
+    },
+    {
+      "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/China131\/JHChart.git",
+      "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
+      "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "D21FADD0802B1CD49C58E7CC20D5844B9F73313E"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcuserdata/JH.xcuserdatad/UserInterfaceState.xcuserstate b/JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcuserdata/JH.xcuserdatad/UserInterfaceState.xcuserstate
new file mode 100755
index 0000000..505a807
--- /dev/null
+++ b/JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcuserdata/JH.xcuserdatad/UserInterfaceState.xcuserstate
Binary files differ
diff --git a/JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcuserdata/WindShan.xcuserdatad/UserInterfaceState.xcuserstate b/JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcuserdata/WindShan.xcuserdatad/UserInterfaceState.xcuserstate
new file mode 100644
index 0000000..2e019bf
--- /dev/null
+++ b/JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcuserdata/WindShan.xcuserdatad/UserInterfaceState.xcuserstate
Binary files differ
diff --git a/JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
new file mode 100755
index 0000000..fe2b454
--- /dev/null
+++ b/JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Bucket
+   type = "1"
+   version = "2.0">
+</Bucket>
diff --git a/JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcschemes/JHChartDemo.xcscheme b/JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcschemes/JHChartDemo.xcscheme
new file mode 100755
index 0000000..d7edaac
--- /dev/null
+++ b/JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcschemes/JHChartDemo.xcscheme
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "0720"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "AA5E2BAD1CBA298F00FC19EE"
+               BuildableName = "JHChartDemo.app"
+               BlueprintName = "JHChartDemo"
+               ReferencedContainer = "container:JHChartDemo.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "AA5E2BC61CBA298F00FC19EE"
+               BuildableName = "JHChartDemoTests.xctest"
+               BlueprintName = "JHChartDemoTests"
+               ReferencedContainer = "container:JHChartDemo.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "AA5E2BD11CBA298F00FC19EE"
+               BuildableName = "JHChartDemoUITests.xctest"
+               BlueprintName = "JHChartDemoUITests"
+               ReferencedContainer = "container:JHChartDemo.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "AA5E2BAD1CBA298F00FC19EE"
+            BuildableName = "JHChartDemo.app"
+            BlueprintName = "JHChartDemo"
+            ReferencedContainer = "container:JHChartDemo.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "AA5E2BAD1CBA298F00FC19EE"
+            BuildableName = "JHChartDemo.app"
+            BlueprintName = "JHChartDemo"
+            ReferencedContainer = "container:JHChartDemo.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "AA5E2BAD1CBA298F00FC19EE"
+            BuildableName = "JHChartDemo.app"
+            BlueprintName = "JHChartDemo"
+            ReferencedContainer = "container:JHChartDemo.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcschemes/xcschememanagement.plist b/JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100755
index 0000000..b0680fe
--- /dev/null
+++ b/JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,32 @@
+<?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>SchemeUserState</key>
+	<dict>
+		<key>JHChartDemo.xcscheme</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>0</integer>
+		</dict>
+	</dict>
+	<key>SuppressBuildableAutocreation</key>
+	<dict>
+		<key>AA5E2BAD1CBA298F00FC19EE</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
+		<key>AA5E2BC61CBA298F00FC19EE</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
+		<key>AA5E2BD11CBA298F00FC19EE</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
+	</dict>
+</dict>
+</plist>
diff --git a/JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
new file mode 100644
index 0000000..85e0ba4
--- /dev/null
+++ b/JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Bucket
+   type = "1"
+   version = "2.0">
+   <Breakpoints>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "JHChartDemo/JHShowController.m"
+            timestampString = "503827514.562585"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "152"
+            endingLineNumber = "152"
+            landmarkName = "-showFirstAndSecondQuardrant"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "JHChartDemo/JHShowController.m"
+            timestampString = "503827531.262425"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "161"
+            endingLineNumber = "161"
+            landmarkName = "-showFirstAndFouthQuardrant"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "JHChartDemo/JHShowController.m"
+            timestampString = "503827531.968218"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "160"
+            endingLineNumber = "160"
+            landmarkName = "-showFirstAndFouthQuardrant"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "JHChartDemo/JHShowController.m"
+            timestampString = "503827553.141509"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "117"
+            endingLineNumber = "117"
+            landmarkName = "-showFirstAndSecondQuardrant"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "JHChartDemo/JHShowController.m"
+            timestampString = "503827636.711069"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "122"
+            endingLineNumber = "122"
+            landmarkName = "-showFirstAndSecondQuardrant"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "JHChartDemo/JHChart/JHLineChart.m"
+            timestampString = "503829393.369798"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "152"
+            endingLineNumber = "152"
+            landmarkName = "-setValueArr:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "JHChartDemo/JHShowController.m"
+            timestampString = "503827918.828834"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "121"
+            endingLineNumber = "121"
+            landmarkName = "-showFirstAndSecondQuardrant"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "JHChartDemo/JHChart/JHLineChart.m"
+            timestampString = "503829393.369798"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "153"
+            endingLineNumber = "153"
+            landmarkName = "-setValueArr:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "JHChartDemo/JHChart/JHLineChart.m"
+            timestampString = "503829393.369798"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "906"
+            endingLineNumber = "906"
+            landmarkName = "-drawPathWithDataArr:andIndex:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+   </Breakpoints>
+</Bucket>
diff --git a/JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcschemes/JHChartDemo.xcscheme b/JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcschemes/JHChartDemo.xcscheme
new file mode 100644
index 0000000..7758be2
--- /dev/null
+++ b/JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcschemes/JHChartDemo.xcscheme
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "0810"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "AA5E2BAD1CBA298F00FC19EE"
+               BuildableName = "JHChartDemo.app"
+               BlueprintName = "JHChartDemo"
+               ReferencedContainer = "container:JHChartDemo.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "AA5E2BC61CBA298F00FC19EE"
+               BuildableName = "JHChartDemoTests.xctest"
+               BlueprintName = "JHChartDemoTests"
+               ReferencedContainer = "container:JHChartDemo.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "AA5E2BD11CBA298F00FC19EE"
+               BuildableName = "JHChartDemoUITests.xctest"
+               BlueprintName = "JHChartDemoUITests"
+               ReferencedContainer = "container:JHChartDemo.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "AA5E2BAD1CBA298F00FC19EE"
+            BuildableName = "JHChartDemo.app"
+            BlueprintName = "JHChartDemo"
+            ReferencedContainer = "container:JHChartDemo.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "AA5E2BAD1CBA298F00FC19EE"
+            BuildableName = "JHChartDemo.app"
+            BlueprintName = "JHChartDemo"
+            ReferencedContainer = "container:JHChartDemo.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "AA5E2BAD1CBA298F00FC19EE"
+            BuildableName = "JHChartDemo.app"
+            BlueprintName = "JHChartDemo"
+            ReferencedContainer = "container:JHChartDemo.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcschemes/xcschememanagement.plist b/JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 0000000..b0680fe
--- /dev/null
+++ b/JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,32 @@
+<?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>SchemeUserState</key>
+	<dict>
+		<key>JHChartDemo.xcscheme</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>0</integer>
+		</dict>
+	</dict>
+	<key>SuppressBuildableAutocreation</key>
+	<dict>
+		<key>AA5E2BAD1CBA298F00FC19EE</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
+		<key>AA5E2BC61CBA298F00FC19EE</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
+		<key>AA5E2BD11CBA298F00FC19EE</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
+	</dict>
+</dict>
+</plist>
diff --git a/JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
new file mode 100755
index 0000000..fe2b454
--- /dev/null
+++ b/JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Bucket
+   type = "1"
+   version = "2.0">
+</Bucket>
diff --git a/JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcschemes/JHChartDemo.xcscheme b/JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcschemes/JHChartDemo.xcscheme
new file mode 100755
index 0000000..d7edaac
--- /dev/null
+++ b/JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcschemes/JHChartDemo.xcscheme
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "0720"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "AA5E2BAD1CBA298F00FC19EE"
+               BuildableName = "JHChartDemo.app"
+               BlueprintName = "JHChartDemo"
+               ReferencedContainer = "container:JHChartDemo.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "AA5E2BC61CBA298F00FC19EE"
+               BuildableName = "JHChartDemoTests.xctest"
+               BlueprintName = "JHChartDemoTests"
+               ReferencedContainer = "container:JHChartDemo.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "AA5E2BD11CBA298F00FC19EE"
+               BuildableName = "JHChartDemoUITests.xctest"
+               BlueprintName = "JHChartDemoUITests"
+               ReferencedContainer = "container:JHChartDemo.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "AA5E2BAD1CBA298F00FC19EE"
+            BuildableName = "JHChartDemo.app"
+            BlueprintName = "JHChartDemo"
+            ReferencedContainer = "container:JHChartDemo.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "AA5E2BAD1CBA298F00FC19EE"
+            BuildableName = "JHChartDemo.app"
+            BlueprintName = "JHChartDemo"
+            ReferencedContainer = "container:JHChartDemo.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "AA5E2BAD1CBA298F00FC19EE"
+            BuildableName = "JHChartDemo.app"
+            BlueprintName = "JHChartDemo"
+            ReferencedContainer = "container:JHChartDemo.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcschemes/xcschememanagement.plist b/JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100755
index 0000000..b0680fe
--- /dev/null
+++ b/JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,32 @@
+<?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>SchemeUserState</key>
+	<dict>
+		<key>JHChartDemo.xcscheme</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>0</integer>
+		</dict>
+	</dict>
+	<key>SuppressBuildableAutocreation</key>
+	<dict>
+		<key>AA5E2BAD1CBA298F00FC19EE</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
+		<key>AA5E2BC61CBA298F00FC19EE</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
+		<key>AA5E2BD11CBA298F00FC19EE</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
+	</dict>
+</dict>
+</plist>
diff --git a/JHChart/JHChartDemo/AppDelegate.h b/JHChart/JHChartDemo/AppDelegate.h
new file mode 100755
index 0000000..fcf3f07
--- /dev/null
+++ b/JHChart/JHChartDemo/AppDelegate.h
@@ -0,0 +1,17 @@
+//
+//  AppDelegate.h
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/4/10.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+
+
+@end
+
diff --git a/JHChart/JHChartDemo/AppDelegate.m b/JHChart/JHChartDemo/AppDelegate.m
new file mode 100755
index 0000000..a6c21f2
--- /dev/null
+++ b/JHChart/JHChartDemo/AppDelegate.m
@@ -0,0 +1,45 @@
+//
+//  AppDelegate.m
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/4/10.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import "AppDelegate.h"
+
+@interface AppDelegate ()
+
+@end
+
+@implementation AppDelegate
+
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+    // Override point for customization after application launch.
+    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
diff --git a/JHChart/JHChartDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/JHChart/JHChartDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100755
index 0000000..118c98f
--- /dev/null
+++ b/JHChart/JHChartDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,38 @@
+{
+  "images" : [
+    {
+      "idiom" : "iphone",
+      "size" : "29x29",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "29x29",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "40x40",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "40x40",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "60x60",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "60x60",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file
diff --git a/JHChart/JHChartDemo/Base.lproj/LaunchScreen.storyboard b/JHChart/JHChartDemo/Base.lproj/LaunchScreen.storyboard
new file mode 100755
index 0000000..2e721e1
--- /dev/null
+++ b/JHChart/JHChartDemo/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8150" systemVersion="15A204g" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="01J-lp-oVM">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8122"/>
+    </dependencies>
+    <scenes>
+        <!--View Controller-->
+        <scene sceneID="EHf-IW-A2E">
+            <objects>
+                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
+                    <layoutGuides>
+                        <viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
+                        <viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
+                    </layoutGuides>
+                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
+                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <animations/>
+                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+                    </view>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="53" y="375"/>
+        </scene>
+    </scenes>
+</document>
diff --git a/JHChart/JHChartDemo/Base.lproj/Main.storyboard b/JHChart/JHChartDemo/Base.lproj/Main.storyboard
new file mode 100755
index 0000000..1803b36
--- /dev/null
+++ b/JHChart/JHChartDemo/Base.lproj/Main.storyboard
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9532" systemVersion="15G31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="P5V-0a-TXk">
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9530"/>
+    </dependencies>
+    <scenes>
+        <!--Navigation Controller-->
+        <scene sceneID="5NY-TH-FHx">
+            <objects>
+                <navigationController id="P5V-0a-TXk" sceneMemberID="viewController">
+                    <navigationBar key="navigationBar" contentMode="scaleToFill" id="2HR-0f-iqN">
+                        <rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                    </navigationBar>
+                    <connections>
+                        <segue destination="AjP-2S-xvB" kind="relationship" relationship="rootViewController" id="kVI-sM-2mo"/>
+                    </connections>
+                </navigationController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="yRC-b6-bb2" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="-546" y="425"/>
+        </scene>
+        <!--View Controller-->
+        <scene sceneID="c4f-sg-Oig">
+            <objects>
+                <viewController id="AjP-2S-xvB" customClass="ViewController" sceneMemberID="viewController">
+                    <layoutGuides>
+                        <viewControllerLayoutGuide type="top" id="c9T-2Y-tB1"/>
+                        <viewControllerLayoutGuide type="bottom" id="TH9-LD-UXd"/>
+                    </layoutGuides>
+                    <view key="view" contentMode="scaleToFill" id="pPA-Dw-lnD">
+                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+                    </view>
+                    <navigationItem key="navigationItem" id="IY1-hQ-z0M"/>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="hKb-7S-Cdg" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="203" y="434"/>
+        </scene>
+    </scenes>
+</document>
diff --git a/JHChart/JHChartDemo/GIFResource/0011.gif b/JHChart/JHChartDemo/GIFResource/0011.gif
new file mode 100755
index 0000000..c914c84
--- /dev/null
+++ b/JHChart/JHChartDemo/GIFResource/0011.gif
Binary files differ
diff --git a/JHChart/JHChartDemo/GIFResource/huan1.png b/JHChart/JHChartDemo/GIFResource/huan1.png
new file mode 100755
index 0000000..3f4e9af
--- /dev/null
+++ b/JHChart/JHChartDemo/GIFResource/huan1.png
Binary files differ
diff --git a/JHChart/JHChartDemo/GIFResource/line1.png b/JHChart/JHChartDemo/GIFResource/line1.png
new file mode 100755
index 0000000..a0ed96e
--- /dev/null
+++ b/JHChart/JHChartDemo/GIFResource/line1.png
Binary files differ
diff --git a/JHChart/JHChartDemo/GIFResource/line2.png b/JHChart/JHChartDemo/GIFResource/line2.png
new file mode 100755
index 0000000..03eccf6
--- /dev/null
+++ b/JHChart/JHChartDemo/GIFResource/line2.png
Binary files differ
diff --git a/JHChart/JHChartDemo/GIFResource/line3.png b/JHChart/JHChartDemo/GIFResource/line3.png
new file mode 100755
index 0000000..8696e7f
--- /dev/null
+++ b/JHChart/JHChartDemo/GIFResource/line3.png
Binary files differ
diff --git a/JHChart/JHChartDemo/GIFResource/line4.png b/JHChart/JHChartDemo/GIFResource/line4.png
new file mode 100755
index 0000000..3ca7859
--- /dev/null
+++ b/JHChart/JHChartDemo/GIFResource/line4.png
Binary files differ
diff --git a/JHChart/JHChartDemo/GIFResource/lines.png b/JHChart/JHChartDemo/GIFResource/lines.png
new file mode 100755
index 0000000..d04b512
--- /dev/null
+++ b/JHChart/JHChartDemo/GIFResource/lines.png
Binary files differ
diff --git a/JHChart/JHChartDemo/GIFResource/look.gif b/JHChart/JHChartDemo/GIFResource/look.gif
new file mode 100755
index 0000000..aef864f
--- /dev/null
+++ b/JHChart/JHChartDemo/GIFResource/look.gif
Binary files differ
diff --git a/JHChart/JHChartDemo/GIFResource/pie1.png b/JHChart/JHChartDemo/GIFResource/pie1.png
new file mode 100755
index 0000000..90814d4
--- /dev/null
+++ b/JHChart/JHChartDemo/GIFResource/pie1.png
Binary files differ
diff --git a/JHChart/JHChartDemo/GIFResource/table1.png b/JHChart/JHChartDemo/GIFResource/table1.png
new file mode 100755
index 0000000..9aaada2
--- /dev/null
+++ b/JHChart/JHChartDemo/GIFResource/table1.png
Binary files differ
diff --git a/JHChart/JHChartDemo/GIFResource/zhu1.png b/JHChart/JHChartDemo/GIFResource/zhu1.png
new file mode 100755
index 0000000..f4fe6ea
--- /dev/null
+++ b/JHChart/JHChartDemo/GIFResource/zhu1.png
Binary files differ
diff --git "a/JHChart/JHChartDemo/GIFResource/\346\212\230\347\272\277\345\233\276demo.png" "b/JHChart/JHChartDemo/GIFResource/\346\212\230\347\272\277\345\233\276demo.png"
new file mode 100755
index 0000000..47280c1
--- /dev/null
+++ "b/JHChart/JHChartDemo/GIFResource/\346\212\230\347\272\277\345\233\276demo.png"
Binary files differ
diff --git "a/JHChart/JHChartDemo/GIFResource/\346\237\261\347\212\266\345\233\276demo.gif" "b/JHChart/JHChartDemo/GIFResource/\346\237\261\347\212\266\345\233\276demo.gif"
new file mode 100755
index 0000000..9bcbd7f
--- /dev/null
+++ "b/JHChart/JHChartDemo/GIFResource/\346\237\261\347\212\266\345\233\276demo.gif"
Binary files differ
diff --git "a/JHChart/JHChartDemo/GIFResource/\347\216\257\347\212\266\345\233\276demo.gif" "b/JHChart/JHChartDemo/GIFResource/\347\216\257\347\212\266\345\233\276demo.gif"
new file mode 100755
index 0000000..421779b
--- /dev/null
+++ "b/JHChart/JHChartDemo/GIFResource/\347\216\257\347\212\266\345\233\276demo.gif"
Binary files differ
diff --git "a/JHChart/JHChartDemo/GIFResource/\351\233\267\350\276\276\345\233\276demo.png" "b/JHChart/JHChartDemo/GIFResource/\351\233\267\350\276\276\345\233\276demo.png"
new file mode 100755
index 0000000..f85a378
--- /dev/null
+++ "b/JHChart/JHChartDemo/GIFResource/\351\233\267\350\276\276\345\233\276demo.png"
Binary files differ
diff --git "a/JHChart/JHChartDemo/GIFResource/\351\245\274\347\212\266\345\233\276demo.gif" "b/JHChart/JHChartDemo/GIFResource/\351\245\274\347\212\266\345\233\276demo.gif"
new file mode 100755
index 0000000..1fcae28
--- /dev/null
+++ "b/JHChart/JHChartDemo/GIFResource/\351\245\274\347\212\266\345\233\276demo.gif"
Binary files differ
diff --git a/JHChart/JHChartDemo/Info.plist b/JHChart/JHChartDemo/Info.plist
new file mode 100755
index 0000000..6905cc6
--- /dev/null
+++ b/JHChart/JHChartDemo/Info.plist
@@ -0,0 +1,40 @@
+<?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>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</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</string>
+	<key>LSRequiresIPhoneOS</key>
+	<true/>
+	<key>UILaunchStoryboardName</key>
+	<string>LaunchScreen</string>
+	<key>UIMainStoryboardFile</key>
+	<string>Main</string>
+	<key>UIRequiredDeviceCapabilities</key>
+	<array>
+		<string>armv7</string>
+	</array>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+</dict>
+</plist>
diff --git a/JHChart/JHChartDemo/JHChart/JHChart.h b/JHChart/JHChartDemo/JHChart/JHChart.h
new file mode 100755
index 0000000..0801470
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHChart.h
@@ -0,0 +1,128 @@
+//
+//  JHChart.h
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/4/10.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+
+#import <UIKit/UIKit.h>
+#import <Foundation/Foundation.h>
+
+#define P_M(x,y) CGPointMake(x, y)
+
+#define weakSelf(weakSelf)  __weak typeof(self) weakself = self;
+
+@interface JHChart : UIView
+
+
+/**
+ *  The margin value of the content view chart view
+ */
+@property (nonatomic, assign) UIEdgeInsets contentInsets;
+
+
+/**
+ *  The origin of the chart is different from the meaning of the origin of the chart. 
+    As a pie chart and graph center ring. The line graph represents the origin.
+ */
+@property (assign, nonatomic)  CGPoint chartOrigin;
+
+
+/**
+ *  Name of chart. The name is generally not displayed, just reserved fields
+ */
+@property (copy, nonatomic) NSString * chartTitle;
+
+
+/**
+ *  Start drawing chart.
+ */
+- (void)showAnimation;
+
+/**
+ *  Clear current chart when refresh
+ */
+- (void)clear;
+
+
+/**
+ *  Draw a line according to the conditions
+ *  @param start���Draw Starting Point
+ *  @param end���Draw Ending Point
+ *  @param isDotted���Is the dotted line
+ *  @param color���Line color
+ */
+- (void)drawLineWithContext:(CGContextRef )context
+               andStarPoint:(CGPoint )start
+                andEndPoint:(CGPoint)end
+            andIsDottedLine:(BOOL)isDotted
+                   andColor:(UIColor *)color;
+
+
+/**
+ *  Draw a piece of text at a point
+ *  @param point���Draw position
+ *  @param color���TextColor
+ *  @param fontSize���Text font size
+ */
+- (void)drawText:(NSString *)text
+      andContext:(CGContextRef )context
+         atPoint:(CGPoint )point
+       WithColor:(UIColor *)color
+     andFontSize:(CGFloat)fontSize;
+
+
+
+/**
+ *  Similar to the above method
+ *
+ */
+- (void)drawText:(NSString *)text
+         context:(CGContextRef )context
+         atPoint:(CGRect )rect
+       WithColor:(UIColor *)color
+            font:(UIFont*)font;
+
+
+
+/**
+ *  Determine the width of a certain segment of text in the default font.
+ */
+- (CGFloat)getTextWithWhenDrawWithText:(NSString *)text;
+
+
+
+/**
+ *  Draw a rectangle at a point
+ *  p:Draw position
+ *
+ */
+- (void)drawQuartWithColor:(UIColor *)color
+             andBeginPoint:(CGPoint)p
+                andContext:(CGContextRef)contex;
+
+
+/**
+ *  Draw a circle at a point
+ *  @param redius���Circle redius
+ *  @param p:Draw position
+ *
+ */
+- (void)drawPointWithRedius:(CGFloat)redius
+                   andColor:(UIColor *)color
+                   andPoint:(CGPoint)p
+                 andContext:(CGContextRef)contex;
+
+
+/**
+ *  According to the relevant conditions to determine the width of the text
+ *  @param maxSize���Maximum range of text
+ *  @param textFont���Text font
+ *  @param aimString:Text that needs to be measured
+ */
+- (CGSize)sizeOfStringWithMaxSize:(CGSize)maxSize
+                         textFont:(CGFloat)fontSize
+                        aimString:(NSString *)aimString;
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHChart.m b/JHChart/JHChartDemo/JHChart/JHChart.m
new file mode 100755
index 0000000..db3c549
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHChart.m
@@ -0,0 +1,159 @@
+//
+//  JHChart.m
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/4/10.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import "JHChart.h"
+@interface JHChart()
+
+
+
+@end
+@implementation JHChart
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+-(void)showAnimation{
+    
+}
+
+
+-(void)clear{
+    
+}
+
+
+/**
+ *  ������������
+ *
+ *  @param context  ���������������������
+ *  @param start    ������
+ *  @param end      ������
+ *  @param isDotted ���������������
+ *  @param color    ������������
+ */
+- (void)drawLineWithContext:(CGContextRef )context andStarPoint:(CGPoint )start andEndPoint:(CGPoint)end andIsDottedLine:(BOOL)isDotted andColor:(UIColor *)color{
+    
+    
+    //    ������������
+    CGContextMoveToPoint(context, start.x, start.y);
+    //    ���������
+    CGContextAddLineToPoint(context, end.x, end.y);
+    
+    
+    CGContextSetLineWidth(context, 0.5);
+    
+    
+    [color setStroke];
+    
+    if (isDotted) {
+        CGFloat ss[] = {0.5,2};
+        
+        CGContextSetLineDash(context, 0, ss, 2);
+    }
+    CGContextMoveToPoint(context, end.x, end.y);
+    
+    CGContextDrawPath(context, kCGPathFillStroke);
+}
+
+
+/**
+ *  ������������
+ *
+ *  @param text    ������������
+ *  @param context ���������������������
+ *  @param rect    ���������
+ *  @param color   ������������
+ */
+- (void)drawText:(NSString *)text andContext:(CGContextRef )context atPoint:(CGPoint )rect WithColor:(UIColor *)color andFontSize:(CGFloat)fontSize{
+
+
+    [[NSString stringWithFormat:@"%@",text] drawAtPoint:rect withAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize],NSForegroundColorAttributeName:color}];
+
+    [color setFill];
+
+    CGContextDrawPath(context, kCGPathFill);
+
+}
+
+
+- (void)drawText:(NSString *)text context:(CGContextRef )context atPoint:(CGRect )rect WithColor:(UIColor *)color font:(UIFont*)font{
+    
+    
+//    [[NSString stringWithFormat:@"%@",text] drawAtPoint:rect withAttributes:@{NSFontAttributeName:font,NSForegroundColorAttributeName:color}];
+    
+    [[NSString stringWithFormat:@"%@",text] drawInRect:rect withAttributes:@{NSFontAttributeName:font,NSForegroundColorAttributeName:color}];
+    
+    [color setFill];
+
+    
+    CGContextDrawPath(context, kCGPathFill);
+    
+}
+/**
+ *  ������������������
+ *
+ *  @param text ������������
+ *
+ *  @return ������������
+ */
+- (CGFloat)getTextWithWhenDrawWithText:(NSString *)text{
+    
+    CGSize size = [[NSString stringWithFormat:@"%@",text] boundingRectWithSize:CGSizeMake(100, 15) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:7]} context:nil].size;
+    
+    return size.width;
+}
+
+
+/**
+ *  ���������������
+ *
+ *  @param color  ������������
+ *  @param p      ���������
+ *  @param contex ���������������
+ */
+- (void)drawQuartWithColor:(UIColor *)color andBeginPoint:(CGPoint)p andContext:(CGContextRef)contex{
+    
+    CGContextAddRect(contex, CGRectMake(p.x, p.y, 10, 10));
+    [color setFill];
+    [color setStroke];
+    CGContextDrawPath(contex, kCGPathFillStroke);
+    
+    
+}
+
+
+- (void)drawPointWithRedius:(CGFloat)redius andColor:(UIColor *)color andPoint:(CGPoint)p andContext:(CGContextRef)contex{
+    
+    CGContextAddArc(contex, p.x, p.y, redius, 0, M_PI * 2, YES);
+    [color setFill];
+    CGContextDrawPath(contex, kCGPathFill);
+    
+}
+
+/**
+ *  ������������������������������
+ *
+ *  @param maxSize   ������������
+ *  @param fontSize  ������������
+ *  @param aimString ���������������
+ *
+ *  @return ������������
+ */
+- (CGSize)sizeOfStringWithMaxSize:(CGSize)maxSize textFont:(CGFloat)fontSize aimString:(NSString *)aimString{
+    
+    
+    return [aimString boundingRectWithSize:maxSize options:NSStringDrawingUsesFontLeading|NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingTruncatesLastVisibleLine attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]} context:nil].size;
+    
+}
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHChartHeader.h b/JHChart/JHChartDemo/JHChart/JHChartHeader.h
new file mode 100755
index 0000000..710bd60
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHChartHeader.h
@@ -0,0 +1,17 @@
+//
+//  JHChartHeader.h
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/4/11.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+
+#import "JHChart.h"
+#import "JHLineChart.h"
+#import "JHWaveChart.h"
+#import "JHPieChart.h"
+#import "JHRingChart.h"
+#import "JHColumnChart.h"
+#import "JHTableChart.h"
+#import "JHRadarChart.h"
diff --git a/JHChart/JHChartDemo/JHChart/JHColumnChart.h b/JHChart/JHChartDemo/JHChart/JHColumnChart.h
new file mode 100755
index 0000000..eee6f10
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHColumnChart.h
@@ -0,0 +1,76 @@
+//
+//  JHColumnChart.h
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/5/10.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import "JHChart.h"
+
+@interface JHColumnChart : JHChart
+
+
+/**
+ *  Each histogram of the background color, if you do not set the default value for green. Setup must ensure that the number and type of the data source array are the same, otherwise the default is not set.
+ */
+@property (nonatomic, strong) NSArray<NSArray *> * columnBGcolorsArr;
+
+/**
+ *  Data source array
+ */
+@property (nonatomic, strong) NSArray<NSArray *> * valueArr;
+
+/**
+ *  X axis classification of each icon
+ */
+@property (nonatomic, strong) NSArray * xShowInfoText;
+
+
+/**
+ *  The background color of the content view
+ */
+@property (nonatomic, strong) UIColor  * bgVewBackgoundColor;
+
+
+/**
+ *  Column spacing, non continuous, default is 5
+ */
+@property (nonatomic, assign) CGFloat typeSpace;
+
+/**
+ *  The width of the column, the default is 40
+ */
+@property (nonatomic, assign) CGFloat columnWidth;
+
+/**
+ *  Whether the need for Y, X axis, the default YES
+ */
+@property (nonatomic, assign) BOOL needXandYLine;
+
+/**
+ *  Y, X axis line color
+ */
+@property (nonatomic, strong) UIColor * colorForXYLine;
+
+/**
+ *  X, Y axis text description color
+ */
+@property (nonatomic, strong) UIColor * drawTextColorForX_Y;
+
+/**
+ *  Dotted line guide color
+ */
+@property (nonatomic, strong) UIColor * dashColor;
+
+/**
+ *  The starting point, can be understood as the origin of the left and bottom margins
+ */
+@property (nonatomic, assign) CGPoint originSize;
+
+/**
+ *  Starting from the origin of the horizontal distance histogram
+ */
+@property (nonatomic, assign) CGFloat drawFromOriginX;
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHColumnChart.m b/JHChart/JHChartDemo/JHChart/JHColumnChart.m
new file mode 100755
index 0000000..a8f753b
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHColumnChart.m
@@ -0,0 +1,396 @@
+//
+//  JHColumnChart.m
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/5/10.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import "JHColumnChart.h"
+
+@interface JHColumnChart ()
+
+//���������
+@property (nonatomic,strong)UIScrollView *BGScrollView;
+
+//������
+@property (nonatomic,assign) CGFloat maxHeight;
+
+//���������������
+@property (nonatomic,assign) CGFloat maxWidth;
+
+//Y���������������������
+@property (nonatomic,strong)NSMutableArray * yLineDataArr;
+
+//���������������������
+@property (nonatomic,strong)NSMutableArray * layerArr;
+
+//������������������������
+@property (nonatomic,strong)NSMutableArray * showViewArr;
+
+@property (nonatomic,assign) CGFloat perHeight;
+@end
+
+@implementation JHColumnChart
+
+
+-(NSMutableArray *)showViewArr{
+    
+    
+    if (!_showViewArr) {
+        _showViewArr = [NSMutableArray array];
+    }
+    
+    return _showViewArr;
+    
+}
+
+-(NSMutableArray *)layerArr{
+    
+    
+    if (!_layerArr) {
+        _layerArr = [NSMutableArray array];
+    }
+    
+    return _layerArr;
+}
+
+
+-(UIScrollView *)BGScrollView{
+    
+    
+    if (!_BGScrollView) {
+
+        _BGScrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
+        _BGScrollView.showsHorizontalScrollIndicator = NO;
+        _bgVewBackgoundColor = _bgVewBackgoundColor;
+        [self addSubview:_BGScrollView];
+        
+    }
+    
+    return _BGScrollView;
+    
+    
+}
+
+
+-(void)setBgVewBackgoundColor:(UIColor *)bgVewBackgoundColor{
+    
+    _bgVewBackgoundColor = bgVewBackgoundColor;
+    self.BGScrollView.backgroundColor = _bgVewBackgoundColor;
+    
+}
+
+
+-(NSMutableArray *)yLineDataArr{
+    
+    
+    if (!_yLineDataArr) {
+        _yLineDataArr = [NSMutableArray array];
+    }
+    return _yLineDataArr;
+    
+}
+
+
+-(instancetype)initWithFrame:(CGRect)frame{
+    
+    
+    if (self = [super initWithFrame:frame]) {
+
+        _needXandYLine = YES;
+       
+        
+    }
+    return self;
+    
+}
+
+
+-(void)setValueArr:(NSArray<NSArray *> *)valueArr{
+    
+    
+    _valueArr = valueArr;
+    CGFloat max = 0;
+ 
+    for (NSArray *arr in _valueArr) {
+        
+        for (id number in arr) {
+            
+            CGFloat currentNumber = [NSString stringWithFormat:@"%@",number].floatValue;
+            if (currentNumber>max) {
+                max = currentNumber;
+            }
+            
+        }
+
+    }
+    
+    if (max<5.0) {
+        _maxHeight = 5.0;
+    }else if(max<10){
+        _maxHeight = 10;
+    }else{
+        _maxHeight = max;
+    }
+    
+    _maxHeight += 4;
+    _perHeight = (CGRectGetHeight(self.frame) - 20 - _originSize.y)/_maxHeight;
+    
+    
+}
+
+
+-(void)showAnimation{
+    
+    
+    
+    [self clear];
+    
+    _columnWidth = (_columnWidth<=0?30:_columnWidth);
+    NSInteger count = _valueArr.count * [_valueArr[0] count];
+    _typeSpace = (_typeSpace<=0?15:_typeSpace);
+    _maxWidth = count * _columnWidth + _valueArr.count * _typeSpace + _typeSpace + 40;
+    self.BGScrollView.contentSize = CGSizeMake(_maxWidth, 0);
+    self.BGScrollView.backgroundColor = _bgVewBackgoundColor;
+    
+    
+    /*        ������X���Y���  ������������������X���Y���������������       */
+    if (_needXandYLine) {
+        
+        CAShapeLayer *layer = [CAShapeLayer layer];
+        
+        [self.layerArr addObject:layer];
+        
+        UIBezierPath *bezier = [UIBezierPath bezierPath];
+        
+        [bezier moveToPoint:CGPointMake(self.originSize.x, CGRectGetHeight(self.frame) - self.originSize.y)];
+        
+        [bezier addLineToPoint:P_M(self.originSize.x, 20)];
+        
+        
+        [bezier moveToPoint:CGPointMake(self.originSize.x, CGRectGetHeight(self.frame) - self.originSize.y)];
+    
+        [bezier addLineToPoint:P_M(_maxWidth , CGRectGetHeight(self.frame) - self.originSize.y)];
+        
+        
+        layer.path = bezier.CGPath;
+        
+        layer.strokeColor = (_colorForXYLine==nil?([UIColor blackColor].CGColor):_colorForXYLine.CGColor);
+        
+        
+        CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
+        
+        
+        basic.duration = 1.5;
+        
+        basic.fromValue = @(0);
+        
+        basic.toValue = @(1);
+        
+        basic.autoreverses = NO;
+        
+        basic.fillMode = kCAFillModeForwards;
+        
+        
+        [layer addAnimation:basic forKey:nil];
+        
+        [self.BGScrollView.layer addSublayer:layer];
+        
+//        _maxHeight += 4;
+        
+        /*        ���������������������         */
+        UIBezierPath *second = [UIBezierPath bezierPath];
+        for (NSInteger i = 0; i<5; i++) {
+            NSInteger pace = (_maxHeight) / 5;
+            CGFloat height = _perHeight * (i+1)*pace;
+            [second moveToPoint:P_M(_originSize.x, CGRectGetHeight(self.frame) - _originSize.y -height)];
+            [second addLineToPoint:P_M(_maxWidth, CGRectGetHeight(self.frame) - _originSize.y - height)];
+            
+            
+            
+            CATextLayer *textLayer = [CATextLayer layer];
+            
+            textLayer.contentsScale = [UIScreen mainScreen].scale;
+            NSString *text =[NSString stringWithFormat:@"%ld",(i + 1) * pace];
+            CGFloat be = [self getTextWithWhenDrawWithText:text];
+            textLayer.frame = CGRectMake(self.originSize.x - be - 3, CGRectGetHeight(self.frame) - _originSize.y -height - 5, be, 15);
+            
+            UIFont *font = [UIFont systemFontOfSize:7];
+            CFStringRef fontName = (__bridge CFStringRef)font.fontName;
+            CGFontRef fontRef = CGFontCreateWithFontName(fontName);
+            textLayer.font = fontRef;
+            textLayer.fontSize = font.pointSize;
+            CGFontRelease(fontRef);
+            
+            textLayer.string = text;
+            textLayer.foregroundColor = (_drawTextColorForX_Y==nil?[UIColor blackColor].CGColor:_drawTextColorForX_Y.CGColor);
+            [_BGScrollView.layer addSublayer:textLayer];
+            [self.layerArr addObject:textLayer];
+
+        }
+        
+        CAShapeLayer *shapeLayer = [CAShapeLayer layer];
+        
+        shapeLayer.path = second.CGPath;
+        
+        shapeLayer.strokeColor = (_dashColor==nil?([UIColor greenColor].CGColor):_dashColor.CGColor);
+        
+        shapeLayer.lineWidth = 0.5;
+        
+        [shapeLayer setLineDashPattern:@[@(3),@(3)]];
+        
+        CABasicAnimation *basic2 = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
+        
+        
+        basic2.duration = 1.5;
+        
+        basic2.fromValue = @(0);
+        
+        basic2.toValue = @(1);
+        
+        basic2.autoreverses = NO;
+        
+        
+        
+        basic2.fillMode = kCAFillModeForwards;
+        
+        [shapeLayer addAnimation:basic2 forKey:nil];
+        
+        [self.BGScrollView.layer addSublayer:shapeLayer];
+        [self.layerArr addObject:shapeLayer];
+        
+    }
+    
+    
+    
+
+    /*        ������X������������  ���������������������������������X���Y��� ������������������         */
+    if (_xShowInfoText.count == _valueArr.count&&_xShowInfoText.count>0) {
+        
+        NSInteger count = [_valueArr[0] count];
+        
+        for (NSInteger i = 0; i<_xShowInfoText.count; i++) {
+            
+
+            
+            CATextLayer *textLayer = [CATextLayer layer];
+            
+            CGFloat wid =  count * _columnWidth;
+            
+            
+            
+            CGSize size = [_xShowInfoText[i] boundingRectWithSize:CGSizeMake(wid, MAXFLOAT) options:NSStringDrawingUsesFontLeading|NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingTruncatesLastVisibleLine attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:9]} context:nil].size;
+            
+            textLayer.frame = CGRectMake( i * (count * _columnWidth + _typeSpace) + _typeSpace + _originSize.x, CGRectGetHeight(self.frame) - _originSize.y+5,wid, size.height);
+            textLayer.string = _xShowInfoText[i];
+            textLayer.contentsScale = [UIScreen mainScreen].scale;
+            UIFont *font = [UIFont systemFontOfSize:9];
+            
+
+            
+            textLayer.fontSize = font.pointSize;
+            
+            textLayer.foregroundColor = _drawTextColorForX_Y.CGColor;
+            
+            textLayer.alignmentMode = kCAAlignmentCenter;
+            
+            [_BGScrollView.layer addSublayer:textLayer];
+            
+            [self.layerArr addObject:textLayer];
+            
+            
+        }
+        
+        
+    }
+    
+    
+    
+    
+    
+    
+    /*        ������������         */
+    for (NSInteger i = 0; i<_valueArr.count; i++) {
+        
+        
+        NSArray *arr = _valueArr[i];
+
+        for (NSInteger j = 0; j<arr.count; j++) {
+            
+
+            CGFloat height =[arr[j] floatValue] *_perHeight;
+            
+
+            UIView *itemsView = [UIView new];
+            [self.showViewArr addObject:itemsView];
+            itemsView.frame = CGRectMake((i * arr.count + j)*_columnWidth + i*_typeSpace+_originSize.x + _typeSpace, CGRectGetHeight(self.frame) - _originSize.y-1, _columnWidth, 0);
+            itemsView.backgroundColor = (UIColor *)(_columnBGcolorsArr.count<arr.count?[UIColor greenColor]:_columnBGcolorsArr[j]);
+            [UIView animateWithDuration:1 animations:^{
+                
+                 itemsView.frame = CGRectMake((i * arr.count + j)*_columnWidth + i*_typeSpace+_originSize.x + _typeSpace, CGRectGetHeight(self.frame) - height - _originSize.y -1, _columnWidth, height);
+                
+            } completion:^(BOOL finished) {
+                /*        ���������������������������������         */
+                if (finished) {
+                    
+                    CATextLayer *textLayer = [CATextLayer layer];
+                    
+                    [self.layerArr addObject:textLayer];
+                    NSString *str = [NSString stringWithFormat:@"%@",arr[j]];
+                    
+                    CGSize size = [str boundingRectWithSize:CGSizeMake(_columnWidth, MAXFLOAT) options:NSStringDrawingUsesFontLeading|NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingTruncatesLastVisibleLine attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:9]} context:nil].size;
+                    
+                    textLayer.frame = CGRectMake((i * arr.count + j)*_columnWidth + i*_typeSpace+_originSize.x + _typeSpace, CGRectGetHeight(self.frame) - height - _originSize.y -3 - size.width, _columnWidth, size.height);
+                    
+                    textLayer.string = str;
+                    
+                    textLayer.fontSize = 9.0;
+                    
+                    textLayer.alignmentMode = kCAAlignmentCenter;
+                    textLayer.contentsScale = [UIScreen mainScreen].scale;
+                    textLayer.foregroundColor = itemsView.backgroundColor.CGColor;
+                    
+                    [_BGScrollView.layer addSublayer:textLayer];
+                    
+                }
+                
+            }];
+            
+            [self.BGScrollView addSubview:itemsView];
+            
+
+        }
+        
+    }
+    
+    
+    
+    
+    
+}
+
+
+-(void)clear{
+    
+    
+    for (CALayer *lay in self.layerArr) {
+        [lay removeAllAnimations];
+        [lay removeFromSuperlayer];
+    }
+    
+    for (UIView *subV in self.showViewArr) {
+        [subV removeFromSuperview];
+    }
+    
+}
+
+
+
+
+
+
+
+
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHLineChart.h b/JHChart/JHChartDemo/JHChart/JHLineChart.h
new file mode 100755
index 0000000..b2217b5
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHLineChart.h
@@ -0,0 +1,192 @@
+//
+//  JHLineChart.h
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/4/10.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import "JHChart.h"
+
+/**
+ *  Line chart type, has been abandoned
+ */
+typedef  NS_ENUM(NSInteger,JHLineChartType){
+
+    JHChartLineEveryValueForEveryX=0, /*        Default         */
+    JHChartLineValueNotForEveryX
+};
+
+
+
+/**
+ *  Distribution type of line graph
+ */
+typedef NS_ENUM(NSInteger,JHLineChartQuadrantType){
+    
+    /**
+     *  The line chart is distributed in the first quadrant.
+     */
+    JHLineChartQuadrantTypeFirstQuardrant,
+    
+    /**
+     *  The line chart is distributed in the first two quadrant
+     */
+    JHLineChartQuadrantTypeFirstAndSecondQuardrant,
+    
+    /**
+     *  The line chart is distributed in the first four quadrant
+     */
+    JHLineChartQuadrantTypeFirstAndFouthQuardrant,
+    
+    /**
+     *  The line graph is distributed in the whole quadrant
+     */
+    JHLineChartQuadrantTypeAllQuardrant
+    
+    
+};
+
+
+
+/****************************������������������***********************************/
+
+
+
+@interface JHLineChart :JHChart
+
+/**
+ *  X axis scale data of a broken line graph, the proposed use of NSNumber or the number of strings
+ */
+@property (nonatomic, strong) NSArray * xLineDataArr;
+
+
+/**
+ *  Y axis scale data of a broken line graph, the proposed use of NSNumber or the number of strings
+ */
+@property (nonatomic, strong) NSArray * yLineDataArr;
+
+
+/**
+ *  An array of values that are about to be drawn.
+ */
+@property (nonatomic, strong) NSArray * valueArr;
+
+
+/**
+ *  The type of broken line graph has been abandoned.
+ */
+@property (assign , nonatomic) JHLineChartType  lineType ;
+
+
+/**
+ *  The quadrant of the specified line chart
+ */
+@property (assign, nonatomic) JHLineChartQuadrantType  lineChartQuadrantType;
+
+
+/**
+ *  Line width (the value of non drawn path width, only refers to the X, Y axis scale line width)
+ */
+@property (assign, nonatomic) CGFloat lineWidth;
+
+
+/**
+ *  To draw the line color of the target
+ */
+@property (nonatomic, strong) NSArray * valueLineColorArr;
+
+
+/**
+ *  X, Y axis line color
+ */
+@property (nonatomic, strong) UIColor * xAndYLineColor;
+
+
+/**
+ *  Color for each value draw point
+ */
+@property (nonatomic, strong) NSArray * pointColorArr;
+
+
+/**
+ *  Y, X axis scale numerical color
+ */
+@property (nonatomic, strong) UIColor * xAndYNumberColor;
+
+
+/**
+ *  Draw dotted line color
+ */
+@property (nonatomic, strong) NSArray * positionLineColorArr;
+
+
+
+/**
+ *  Draw the text color of the information.
+ */
+@property (nonatomic, strong) NSArray * pointNumberColorArr;
+
+
+
+/**
+ *  Value path is required to draw points
+ */
+@property (assign,  nonatomic) BOOL hasPoint;
+
+
+
+/**
+ *  Draw path line width
+ */
+@property (nonatomic, assign) CGFloat animationPathWidth;
+
+
+/**
+ *  Drawing path is the curve, the default NO
+ */
+@property (nonatomic, assign) BOOL pathCurve;
+
+
+/**
+ *  Whether to fill the contents of the drawing path, the default NO
+ */
+@property (nonatomic, assign) BOOL contentFill;
+
+
+/**
+ *  Draw path fill color, default is grey
+ */
+@property (nonatomic, strong) NSArray * contentFillColorArr;
+
+
+/**
+ *  whether this chart shows the Y line or not.Default is YES
+ */
+@property (nonatomic,assign) BOOL showYLine;
+
+
+/**
+ *  whether this chart shows the Y level lines or not.Default is NO
+ */
+@property (nonatomic,assign) BOOL showYLevelLine;
+
+/**
+ *  whether this chart shows leading lines for value point or not,default is YES
+ */
+@property (nonatomic,assign) BOOL showValueLeadingLine;
+
+/**
+ *  Custom initialization method
+ *
+ *  @param frame         frame
+ *  @param lineChartType Abandoned
+ *
+ */
+-(instancetype)initWithFrame:(CGRect)frame
+            andLineChartType:(JHLineChartType)lineChartType;
+
+
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHLineChart.m b/JHChart/JHChartDemo/JHChart/JHLineChart.m
new file mode 100755
index 0000000..1cb3d16
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHLineChart.m
@@ -0,0 +1,1096 @@
+//
+//  JHLineChart.m
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/4/10.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import "JHLineChart.h"
+#define kXandYSpaceForSuperView 20.0
+
+@interface JHLineChart ()
+
+@property (assign, nonatomic)   CGFloat  xLength;
+@property (assign , nonatomic)  CGFloat  yLength;
+@property (assign , nonatomic)  CGFloat  perXLen ;
+@property (assign , nonatomic)  CGFloat  perYlen ;
+@property (assign , nonatomic)  CGFloat  perValue ;
+@property (nonatomic,strong)    NSMutableArray * drawDataArr;
+@property (nonatomic,strong) CAShapeLayer *shapeLayer;
+@property (assign , nonatomic) BOOL  isEndAnimation ;
+@property (nonatomic,strong) NSMutableArray * layerArr;
+@end
+
+@implementation JHLineChart
+
+
+
+/**
+ *  ���������������������
+ *
+ *  @param frame         frame
+ *  @param lineChartType ���������������
+ *
+ *  @return ������������������
+ */
+-(instancetype)initWithFrame:(CGRect)frame andLineChartType:(JHLineChartType)lineChartType
+{
+    
+    if (self = [super initWithFrame:frame]) {
+        self.backgroundColor = [UIColor colorWithRed:0.2 green:0.7 blue:0.2 alpha:0.3];
+        _lineType = lineChartType;
+        _lineWidth = 0.5;
+        self.contentInsets = UIEdgeInsetsMake(10, 20, 10, 10);
+        _yLineDataArr  = @[@"1",@"2",@"3",@"4",@"5",@"6",@"7"];
+        _xLineDataArr  = @[@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7"];
+        _xAndYLineColor = [UIColor darkGrayColor];
+        _pointNumberColorArr = @[[UIColor redColor]];
+        _positionLineColorArr = @[[UIColor darkGrayColor]];
+        _pointColorArr = @[[UIColor orangeColor]];
+        _xAndYNumberColor = [UIColor darkGrayColor];
+        _valueLineColorArr = @[[UIColor redColor]];
+        _layerArr = [NSMutableArray array];
+        _showYLine = YES;
+        _showYLevelLine = NO;
+        _showValueLeadingLine = YES;
+//        _contentFillColorArr = @[[UIColor lightGrayColor]];
+        [self configChartXAndYLength];
+        [self configChartOrigin];
+        [self configPerXAndPerY];
+}
+    return self;
+    
+}
+
+/**
+ *  ������������������
+ */
+-(void)clear{
+    
+    _valueArr = nil;
+    _drawDataArr = nil;
+    
+    for (CALayer *layer in _layerArr) {
+        
+        [layer removeFromSuperlayer];
+    }
+    [self showAnimation];
+    
+}
+
+/**
+ *  ������������X���y���������������
+ */
+- (void)configPerXAndPerY
+{
+    
+   
+    switch (_lineChartQuadrantType)
+    {
+        case JHLineChartQuadrantTypeFirstQuardrant:
+        {
+            _perXLen = (_xLength-kXandYSpaceForSuperView)/(_xLineDataArr.count-1);
+            _perYlen = (_yLength-kXandYSpaceForSuperView)/_yLineDataArr.count;
+        }
+            break;
+        case JHLineChartQuadrantTypeFirstAndSecondQuardrant:
+        {
+            _perXLen = (_xLength/2-kXandYSpaceForSuperView)/[_xLineDataArr[0] count];
+            _perYlen = (_yLength-kXandYSpaceForSuperView)/_yLineDataArr.count;
+        }
+            break;
+        case JHLineChartQuadrantTypeFirstAndFouthQuardrant:
+        {
+            _perXLen = (_xLength-kXandYSpaceForSuperView)/(_xLineDataArr.count-1);
+            _perYlen = (_yLength/2-kXandYSpaceForSuperView)/[_yLineDataArr[0] count];
+        }
+            break;
+        case JHLineChartQuadrantTypeAllQuardrant:
+        {
+             _perXLen = (_xLength/2-kXandYSpaceForSuperView)/([_xLineDataArr[0] count]);
+             _perYlen = (_yLength/2-kXandYSpaceForSuperView)/[_yLineDataArr[0] count];
+        }
+            break;
+            
+        default:
+            break;
+    }
+    
+}
+
+
+/**
+ *  ������LineChartQuardrantType���setter������ ���������������������������
+ *
+ */
+-(void)setLineChartQuadrantType:(JHLineChartQuadrantType)lineChartQuadrantType{
+    
+    _lineChartQuadrantType = lineChartQuadrantType;
+    [self configChartOrigin];
+    
+}
+
+
+
+/**
+ *  ������X���Y������������
+ */
+- (void)configChartXAndYLength{
+    _xLength = CGRectGetWidth(self.frame)-self.contentInsets.left-self.contentInsets.right;
+    _yLength = CGRectGetHeight(self.frame)-self.contentInsets.top-self.contentInsets.bottom;
+}
+
+
+/**
+ *  ������ValueArr���setter������ ���������������Y���������������
+ *
+ */
+-(void)setValueArr:(NSArray *)valueArr
+{
+    
+    _valueArr = valueArr;
+    
+    [self updateYScale];
+    
+    
+}
+
+
+/**
+ *  ������Y������������������
+ */
+- (void)updateYScale{
+        switch (_lineChartQuadrantType)
+    {
+        case JHLineChartQuadrantTypeFirstAndFouthQuardrant:
+        {
+            
+            NSInteger max = 0;
+            NSInteger min = 0;
+            
+            for (NSArray *arr in _valueArr) {
+                for (NSString * numer  in arr) {
+                    NSInteger i = [numer integerValue];
+                    if (i>=max) {
+                        max = i;
+                    }
+                    if (i<=min) {
+                        min = i;
+                    }
+                }
+                
+            }
+            
+         min = labs(min);
+         max = (min<max?(max):(min));
+        if (max%5==0) {
+                max = max;
+            }else
+                max = (max/5+1)*5;
+        NSMutableArray *arr = [NSMutableArray array];
+        NSMutableArray *minArr = [NSMutableArray array];
+        if (max<=5) {
+            for (NSInteger i = 0; i<5; i++) {
+                    
+                [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*1]];
+                [minArr addObject:[NSString stringWithFormat:@"-%ld",(i+1)*1]];
+                }
+            }
+            
+        if (max<=10&&max>5) {
+                
+                
+            for (NSInteger i = 0; i<5; i++) {
+                    
+                    [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*2]];
+                [minArr addObject:[NSString stringWithFormat:@"-%ld",(i+1)*2]];
+
+                }
+                
+        }else if(max>10&&max<=100){
+            
+            
+            for (NSInteger i = 0; i<max/5; i++) {
+                [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*5]];
+                [minArr addObject:[NSString stringWithFormat:@"-%ld",(i+1)*5]];
+            }
+            
+        }else{
+            
+            NSInteger count = max / 10;
+            
+            for (NSInteger i = 0; i<11; i++) {
+                [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*count]];
+                [minArr addObject:[NSString stringWithFormat:@"-%ld",(i+1)*count]];
+            }
+            
+        }
+
+        
+            
+            _yLineDataArr = @[[arr copy],[minArr copy]];
+            
+            
+            [self setNeedsDisplay];
+            
+            
+        }break;
+        case JHLineChartQuadrantTypeAllQuardrant:{
+            
+            NSInteger max = 0;
+            NSInteger min = 0;
+            
+            
+            for (NSArray *arr in _valueArr)
+            {
+                for (NSString * numer  in arr)
+                {
+                    NSInteger i = [numer integerValue];
+                    if (i>=max) {
+                        max = i;
+                    }
+                    if (i<=min) {
+                        min = i;
+                    }
+                }
+                
+            }
+
+            
+            min = labs(min);
+            max = (min<max?(max):(min));
+            if (max%5==0) {
+                max = max;
+            }else
+                max = (max/5+1)*5;
+            NSMutableArray *arr = [NSMutableArray array];
+            NSMutableArray *minArr = [NSMutableArray array];
+            if (max<=5) {
+                for (NSInteger i = 0; i<5; i++) {
+                    
+                    [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*1]];
+                    [minArr addObject:[NSString stringWithFormat:@"-%ld",(i+1)*1]];
+                }
+            }
+            
+            if (max<=10&&max>5) {
+                
+                
+                for (NSInteger i = 0; i<5; i++) {
+                    
+                    [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*2]];
+                    [minArr addObject:[NSString stringWithFormat:@"-%ld",(i+1)*2]];
+                    
+                }
+                
+            }else if(max>10&&max<=100){
+                
+                
+                for (NSInteger i = 0; i<max/5; i++) {
+                    [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*5]];
+                    [minArr addObject:[NSString stringWithFormat:@"-%ld",(i+1)*5]];
+                }
+                
+            }else{
+                
+                NSInteger count = max / 10;
+                
+                for (NSInteger i = 0; i<11; i++) {
+                    [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*count]];
+                    [minArr addObject:[NSString stringWithFormat:@"-%ld",(i+1)*count]];
+                }
+                
+            }
+
+            _yLineDataArr = @[[arr copy],[minArr copy]];
+            
+            [self setNeedsDisplay];
+        }break;
+        default:{
+            if (_valueArr.count) {
+                
+                NSInteger max=0;
+                
+                for (NSArray *arr in _valueArr) {
+                    for (NSString * numer  in arr) {
+                        NSInteger i = [numer integerValue];
+                        if (i>=max) {
+                            max = i;
+                        }
+                        
+                    }
+                    
+                }
+
+                
+                if (max%5==0) {
+                    max = max;
+                }else
+                    max = (max/5+1)*5;
+                _yLineDataArr = nil;
+                NSMutableArray *arr = [NSMutableArray array];
+                if (max<=5) {
+                    for (NSInteger i = 0; i<5; i++) {
+                        
+                        [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*1]];
+                        
+                    }
+                }
+                
+                if (max<=10&&max>5) {
+                    
+                    
+                    for (NSInteger i = 0; i<5; i++) {
+                        
+                        [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*2]];
+                        
+                    }
+                    
+                }else if(max>10&&max<=50){
+                    
+                    for (NSInteger i = 0; i<max/5+1; i++) {
+                        [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*5]];
+                        
+                        
+                    }
+                    
+                }else if(max<=100){
+                    
+                    for (NSInteger i = 0; i<max/10; i++) {
+                        [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*10]];
+                        
+                        
+                    }
+                    
+                }else if(max > 100){
+                    
+                    NSInteger count = max / 10;
+                    
+                    for (NSInteger i = 0; i<10+1; i++) {
+                        [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*count]];
+                        
+                    }
+                }
+
+                
+                _yLineDataArr = [arr copy];
+                
+                [self setNeedsDisplay];
+                
+                
+            }
+
+        }
+            break;
+    }
+    
+    
+    
+}
+
+
+/**
+ *  ���������������������
+ */
+- (void)configChartOrigin{
+    
+    switch (_lineChartQuadrantType) {
+        case JHLineChartQuadrantTypeFirstQuardrant:
+        {
+            self.chartOrigin = CGPointMake(self.contentInsets.left, self.frame.size.height-self.contentInsets.bottom);
+        }
+            break;
+        case JHLineChartQuadrantTypeFirstAndSecondQuardrant:
+        {
+            self.chartOrigin = CGPointMake(self.contentInsets.left+_xLength/2, CGRectGetHeight(self.frame)-self.contentInsets.bottom);
+        }
+            break;
+        case JHLineChartQuadrantTypeFirstAndFouthQuardrant:
+        {
+            self.chartOrigin = CGPointMake(self.contentInsets.left, self.contentInsets.top+_yLength/2);
+        }
+            break;
+        case JHLineChartQuadrantTypeAllQuardrant:
+        {
+             self.chartOrigin = CGPointMake(self.contentInsets.left+_xLength/2, self.contentInsets.top+_yLength/2);
+        }
+            break;
+            
+        default:
+            break;
+    }
+    
+}
+
+
+
+
+/* ������x���y��� */
+- (void)drawXAndYLineWithContext:(CGContextRef)context{
+
+    switch (_lineChartQuadrantType) {
+        case JHLineChartQuadrantTypeFirstQuardrant:{
+            
+            [self drawLineWithContext:context andStarPoint:self.chartOrigin andEndPoint:P_M(self.contentInsets.left+_xLength, self.chartOrigin.y) andIsDottedLine:NO andColor:_xAndYLineColor];
+            if (_showYLine) {
+                  [self drawLineWithContext:context andStarPoint:self.chartOrigin andEndPoint:P_M(self.chartOrigin.x,self.chartOrigin.y-_yLength) andIsDottedLine:NO andColor:_xAndYLineColor];
+            }
+          
+            if (_xLineDataArr.count>0)
+            {
+                CGFloat xPace = (_xLength-kXandYSpaceForSuperView)/(_xLineDataArr.count-1);
+                
+                for (NSInteger i = 0; i<_xLineDataArr.count;i++ ) {
+                    CGPoint p = P_M(i*xPace+self.chartOrigin.x, self.chartOrigin.y);
+                    CGFloat len = [self getTextWithWhenDrawWithText:_xLineDataArr[i]];
+                    [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x, p.y-3) andIsDottedLine:NO andColor:_xAndYLineColor];
+                    
+                    [self drawText:[NSString stringWithFormat:@"%@",_xLineDataArr[i]] andContext:context atPoint:P_M(p.x-len/2, p.y+2) WithColor:_xAndYNumberColor andFontSize:7.0];
+                }
+              
+                
+                
+            }
+            
+            if (_yLineDataArr.count>0) {
+                CGFloat yPace = (_yLength - kXandYSpaceForSuperView)/(_yLineDataArr.count);
+                for (NSInteger i = 0; i<_yLineDataArr.count; i++) {
+                    CGPoint p = P_M(self.chartOrigin.x, self.chartOrigin.y - (i+1)*yPace);
+                    CGFloat len = [self getTextWithWhenDrawWithText:_yLineDataArr[i]];
+                    if (_showYLevelLine) {
+                         [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(self.contentInsets.left+_xLength, p.y) andIsDottedLine:NO andColor:_xAndYLineColor];
+                        
+                    }else{
+                        [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x+3, p.y) andIsDottedLine:NO andColor:_xAndYLineColor];
+                    }
+                    [self drawText:[NSString stringWithFormat:@"%@",_yLineDataArr[i]] andContext:context atPoint:P_M(p.x-len-3, p.y-3) WithColor:_xAndYNumberColor andFontSize:7.0];
+                }
+            }
+            
+        }break;
+        case JHLineChartQuadrantTypeFirstAndSecondQuardrant:{
+            [self drawLineWithContext:context andStarPoint:P_M(self.contentInsets.left, self.chartOrigin.y) andEndPoint:P_M(self.contentInsets.left+_xLength, self.chartOrigin.y) andIsDottedLine:NO andColor:_xAndYLineColor];
+            
+            if (_showYLine) {
+                 [self drawLineWithContext:context andStarPoint:self.chartOrigin andEndPoint:P_M(self.chartOrigin.x,self.chartOrigin.y-_yLength) andIsDottedLine:NO andColor:_xAndYLineColor];
+            }
+           
+            
+            
+            if (_xLineDataArr.count == 2) {
+                NSArray * rightArr = _xLineDataArr[1];
+                NSArray * leftArr = _xLineDataArr[0];
+                
+                CGFloat xPace = (_xLength/2-kXandYSpaceForSuperView)/(rightArr.count-1);
+                
+                for (NSInteger i = 0; i<rightArr.count;i++ ) {
+                    CGPoint p = P_M(i*xPace+self.chartOrigin.x, self.chartOrigin.y);
+                    CGFloat len = [self getTextWithWhenDrawWithText:rightArr[i]];
+                    [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x, p.y-3) andIsDottedLine:NO andColor:_xAndYLineColor];
+                    
+                    [self drawText:[NSString stringWithFormat:@"%@",rightArr[i]] andContext:context atPoint:P_M(p.x-len/2, p.y+2) WithColor:_xAndYNumberColor andFontSize:7.0];
+                }
+                
+                for (NSInteger i = 0; i<leftArr.count;i++ ) {
+                    CGPoint p = P_M(self.chartOrigin.x-(i+1)*xPace, self.chartOrigin.y);
+                    CGFloat len = [self getTextWithWhenDrawWithText:leftArr[i]];
+                    
+
+                        
+                    [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x, p.y-3) andIsDottedLine:NO andColor:_xAndYLineColor];
+                        
+
+                    [self drawText:[NSString stringWithFormat:@"%@",leftArr[leftArr.count-1-i]] andContext:context atPoint:P_M(p.x-len/2, p.y+2) WithColor:_xAndYNumberColor andFontSize:7.0];
+                }
+                
+            }
+            if (_yLineDataArr.count>0) {
+                CGFloat yPace = (_yLength - kXandYSpaceForSuperView)/(_yLineDataArr.count);
+                for (NSInteger i = 0; i<_yLineDataArr.count; i++) {
+                    CGPoint p = P_M(self.chartOrigin.x, self.chartOrigin.y - (i+1)*yPace);
+                    CGFloat len = [self getTextWithWhenDrawWithText:_yLineDataArr[i]];
+                    if (_showYLevelLine) {
+                         [self drawLineWithContext:context andStarPoint:P_M(self.contentInsets.left, p.y) andEndPoint:P_M(self.contentInsets.left+_xLength, p.y) andIsDottedLine:NO andColor:_xAndYLineColor];
+                    }else
+                        [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x+3, p.y) andIsDottedLine:NO andColor:_xAndYLineColor];
+                    [self drawText:[NSString stringWithFormat:@"%@",_yLineDataArr[i]] andContext:context atPoint:P_M(p.x-len-3, p.y-3) WithColor:_xAndYNumberColor andFontSize:7.0];
+                }
+            }
+
+        }break;
+        case JHLineChartQuadrantTypeFirstAndFouthQuardrant:{
+            [self drawLineWithContext:context andStarPoint:self.chartOrigin andEndPoint:P_M(self.contentInsets.left+_xLength, self.chartOrigin.y) andIsDottedLine:NO andColor:_xAndYLineColor];
+            
+            if (_showYLine) {
+                [self drawLineWithContext:context andStarPoint:P_M(self.contentInsets.left,CGRectGetHeight(self.frame)-self.contentInsets.bottom) andEndPoint:P_M(self.chartOrigin.x,self.contentInsets.top) andIsDottedLine:NO andColor:_xAndYLineColor];
+            }
+            
+            if (_xLineDataArr.count>0) {
+                CGFloat xPace = (_xLength-kXandYSpaceForSuperView)/(_xLineDataArr.count-1);
+                
+                for (NSInteger i = 0; i<_xLineDataArr.count;i++ ) {
+                    CGPoint p = P_M(i*xPace+self.chartOrigin.x, self.chartOrigin.y);
+                    CGFloat len = [self getTextWithWhenDrawWithText:_xLineDataArr[i]];
+                    [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x, p.y-3) andIsDottedLine:NO andColor:_xAndYLineColor];
+                    
+                    if (i==0) {
+                        len = -2;
+                    }
+                    
+                    [self drawText:[NSString stringWithFormat:@"%@",_xLineDataArr[i]] andContext:context atPoint:P_M(p.x-len/2, p.y+2) WithColor:_xAndYNumberColor andFontSize:7.0];
+                }
+            }
+            
+            if (_yLineDataArr.count == 2) {
+                
+                NSArray * topArr = _yLineDataArr[0];
+                NSArray * bottomArr = _yLineDataArr[1];
+                CGFloat yPace = (_yLength/2 - kXandYSpaceForSuperView)/([_yLineDataArr[0] count]);
+                _perYlen = yPace;
+                for (NSInteger i = 0; i<topArr.count; i++) {
+                    CGPoint p = P_M(self.chartOrigin.x, self.chartOrigin.y - (i+1)*yPace);
+                    CGFloat len = [self getTextWithWhenDrawWithText:topArr[i]];
+                    if (_showYLevelLine) {
+                         [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(self.contentInsets.left+_xLength, p.y) andIsDottedLine:NO andColor:_xAndYLineColor];
+                    }else
+                        [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x+3, p.y) andIsDottedLine:NO andColor:_xAndYLineColor];
+                    [self drawText:[NSString stringWithFormat:@"%@",topArr[i]] andContext:context atPoint:P_M(p.x-len-3, p.y-3) WithColor:_xAndYNumberColor andFontSize:7.0];
+                    
+                }
+                
+                
+                for (NSInteger i = 0; i<bottomArr.count; i++) {
+                    CGPoint p = P_M(self.chartOrigin.x, self.chartOrigin.y + (i+1)*yPace);
+                    CGFloat len = [self getTextWithWhenDrawWithText:bottomArr[i]];
+                    
+                    if (_showYLevelLine) {
+                         [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(self.contentInsets.left+_xLength, p.y) andIsDottedLine:NO andColor:_xAndYLineColor];
+                    }else{
+                    
+                        [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x+3, p.y) andIsDottedLine:NO andColor:_xAndYLineColor];
+                    }
+                    [self drawText:[NSString stringWithFormat:@"%@",bottomArr[i]] andContext:context atPoint:P_M(p.x-len-3, p.y-3) WithColor:_xAndYNumberColor andFontSize:7.0];
+                }
+                
+                
+            }
+
+        }break;
+        case JHLineChartQuadrantTypeAllQuardrant:{
+            [self drawLineWithContext:context andStarPoint:P_M(self.chartOrigin.x-_xLength/2, self.chartOrigin.y) andEndPoint:P_M(self.chartOrigin.x+_xLength/2, self.chartOrigin.y) andIsDottedLine:NO andColor:_xAndYLineColor];
+            
+            if (_showYLine) {
+                [self drawLineWithContext:context andStarPoint:P_M(self.chartOrigin.x,self.chartOrigin.y+_yLength/2) andEndPoint:P_M(self.chartOrigin.x,self.chartOrigin.y-_yLength/2) andIsDottedLine:NO andColor:_xAndYLineColor];
+            }
+            
+            
+            
+            if (_xLineDataArr.count == 2) {
+                NSArray * rightArr = _xLineDataArr[1];
+                NSArray * leftArr = _xLineDataArr[0];
+                
+                CGFloat xPace = (_xLength/2-kXandYSpaceForSuperView)/(rightArr.count-1);
+                
+                for (NSInteger i = 0; i<rightArr.count;i++ ) {
+                    CGPoint p = P_M(i*xPace+self.chartOrigin.x, self.chartOrigin.y);
+                    CGFloat len = [self getTextWithWhenDrawWithText:rightArr[i]];
+                    [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x, p.y-3) andIsDottedLine:NO andColor:_xAndYLineColor];
+                    
+                    [self drawText:[NSString stringWithFormat:@"%@",rightArr[i]] andContext:context atPoint:P_M(p.x-len/2, p.y+2) WithColor:_xAndYNumberColor andFontSize:7.0];
+                }
+                for (NSInteger i = 0; i<leftArr.count;i++ ) {
+                    CGPoint p = P_M(self.chartOrigin.x-(i+1)*xPace, self.chartOrigin.y);
+                    CGFloat len = [self getTextWithWhenDrawWithText:leftArr[i]];
+                    [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x, p.y-3) andIsDottedLine:NO andColor:_xAndYLineColor];
+                    
+                    [self drawText:[NSString stringWithFormat:@"%@",leftArr[leftArr.count-1-i]] andContext:context atPoint:P_M(p.x-len/2, p.y+2) WithColor:_xAndYNumberColor andFontSize:7.0];
+                }
+                
+            }
+
+            
+            if (_yLineDataArr.count == 2) {
+                
+                NSArray * topArr = _yLineDataArr[0];
+                NSArray * bottomArr = _yLineDataArr[1];
+                CGFloat yPace = (_yLength/2 - kXandYSpaceForSuperView)/([_yLineDataArr[0] count]);
+                _perYlen = yPace;
+                for (NSInteger i = 0; i<topArr.count; i++) {
+                    CGPoint p = P_M(self.chartOrigin.x, self.chartOrigin.y - (i+1)*yPace);
+                    CGFloat len = [self getTextWithWhenDrawWithText:topArr[i]];
+                    [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x+3, p.y) andIsDottedLine:NO andColor:_xAndYLineColor];
+                    [self drawText:[NSString stringWithFormat:@"%@",topArr[i]] andContext:context atPoint:P_M(p.x-len-3, p.y-3) WithColor:_xAndYNumberColor andFontSize:7.0];
+                    
+                }
+                
+                
+                for (NSInteger i = 0; i<bottomArr.count; i++) {
+                    CGPoint p = P_M(self.chartOrigin.x, self.chartOrigin.y + (i+1)*yPace);
+                    CGFloat len = [self getTextWithWhenDrawWithText:bottomArr[i]];
+                    [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x+3, p.y) andIsDottedLine:NO andColor:_xAndYLineColor];
+                    [self drawText:[NSString stringWithFormat:@"%@",bottomArr[i]] andContext:context atPoint:P_M(p.x-len-3, p.y-3) WithColor:_xAndYNumberColor andFontSize:7.0];
+                }
+                
+                
+            }
+            
+        }break;
+            
+        default:
+            break;
+    }
+    
+
+}
+
+/**
+ *  ������������������
+ */
+-(void)showAnimation
+{
+    [self configPerXAndPerY];
+    [self configValueDataArray];
+    [self drawAnimation];
+}
+
+
+- (void)drawRect:(CGRect)rect {
+    
+    
+    CGContextRef context = UIGraphicsGetCurrentContext();
+    
+    [self drawXAndYLineWithContext:context];
+    
+    
+    if (!_isEndAnimation) {
+        return;
+    }
+    
+    if (_drawDataArr.count) {
+        [self drawPositionLineWithContext:context];
+    }
+    
+}
+
+
+
+/**
+ *  ���������������������������
+ */
+- (void)configValueDataArray{
+    _drawDataArr = [NSMutableArray array];
+    
+    if (_valueArr.count==0) {
+        return;
+    }
+    
+    switch (_lineChartQuadrantType) {
+        case JHLineChartQuadrantTypeFirstQuardrant:{
+            _perValue = _perYlen/[[_yLineDataArr firstObject] floatValue];
+            
+            for (NSArray *valueArr in _valueArr) {
+                NSMutableArray *dataMArr = [NSMutableArray array];
+                for (NSInteger i = 0; i<valueArr.count; i++) {
+                    
+                    CGPoint p = P_M(i*_perXLen+self.chartOrigin.x,self.contentInsets.top + _yLength - [valueArr[i] floatValue]*_perValue);
+                    NSValue *value = [NSValue valueWithCGPoint:p];
+                    [dataMArr addObject:value];
+                }
+                [_drawDataArr addObject:[dataMArr copy]];
+                
+            }
+
+            
+        }break;
+        case JHLineChartQuadrantTypeFirstAndSecondQuardrant:{
+            
+            _perValue = _perYlen/[[_yLineDataArr firstObject] floatValue];
+            
+            
+            
+            for (NSArray *valueArr in _valueArr) {
+                NSMutableArray *dataMArr = [NSMutableArray array];
+              
+                    
+                    CGPoint p ;
+                    for (NSInteger i = 0; i<[_xLineDataArr[0] count]; i++) {
+                        p = P_M(self.contentInsets.left + kXandYSpaceForSuperView+i*_perXLen, self.contentInsets.top + _yLength - [valueArr[i] floatValue]*_perValue);
+                        [dataMArr addObject:[NSValue valueWithCGPoint:p]];
+                    }
+                    
+                    for (NSInteger i = 0; i<[_xLineDataArr[1] count]; i++) {
+                        p = P_M(self.chartOrigin.x+i*_perXLen, self.contentInsets.top + _yLength - [valueArr[i+[_xLineDataArr[0] count]] floatValue]*_perValue);
+                        [dataMArr addObject:[NSValue valueWithCGPoint:p]];
+                        
+                    }
+                    
+                    
+               
+                [_drawDataArr addObject:[dataMArr copy]];
+                
+            }
+
+
+            
+            
+        }break;
+        case JHLineChartQuadrantTypeFirstAndFouthQuardrant:{
+            _perValue = _perYlen/[[_yLineDataArr[0] firstObject] floatValue];
+            for (NSArray *valueArr in _valueArr) {
+                NSMutableArray *dataMArr = [NSMutableArray array];
+                for (NSInteger i = 0; i<valueArr.count; i++) {
+                    
+                    CGPoint p = P_M(i*_perXLen+self.chartOrigin.x,self.chartOrigin.y - [valueArr[i] floatValue]*_perValue);
+                    NSValue *value = [NSValue valueWithCGPoint:p];
+                    [dataMArr addObject:value];
+                }
+                [_drawDataArr addObject:[dataMArr copy]];
+                
+            }
+            
+        }break;
+        case JHLineChartQuadrantTypeAllQuardrant:{
+            
+            
+            
+            _perValue = _perYlen/[[_yLineDataArr[0] firstObject] floatValue];
+            for (NSArray *valueArr in _valueArr) {
+                NSMutableArray *dataMArr = [NSMutableArray array];
+             
+                    
+                    CGPoint p ;
+                    for (NSInteger i = 0; i<[_xLineDataArr[0] count]; i++) {
+                        p = P_M(self.contentInsets.left + kXandYSpaceForSuperView+i*_perXLen, self.chartOrigin.y-[valueArr[i] floatValue]*_perValue);
+                        [dataMArr addObject:[NSValue valueWithCGPoint:p]];
+                    }
+                    
+                    for (NSInteger i = 0; i<[_xLineDataArr[1] count]; i++) {
+                        p = P_M(self.chartOrigin.x+i*_perXLen, self.chartOrigin.y-[valueArr[i+[_xLineDataArr[0] count]] floatValue]*_perValue);
+                        [dataMArr addObject:[NSValue valueWithCGPoint:p]];
+                        
+                    }
+                    
+                    
+           
+                [_drawDataArr addObject:[dataMArr copy]];
+                
+            }
+
+        }break;
+        default:
+            break;
+    }
+
+
+
+}
+
+
+//������������
+- (void)drawAnimation{
+    
+    [_shapeLayer removeFromSuperlayer];
+    _shapeLayer = [CAShapeLayer layer];
+    if (_drawDataArr.count==0) {
+        return;
+    }
+    
+   
+    
+    //���������UIBezierPath������������
+    [self configPerXAndPerY];
+ 
+    
+    for (NSInteger i = 0;i<_drawDataArr.count;i++) {
+        
+        NSArray *dataArr = _drawDataArr[i];
+        
+        [self drawPathWithDataArr:dataArr andIndex:i];
+        
+    }
+    
+
+    
+}
+
+
+- (CGPoint)centerOfFirstPoint:(CGPoint)p1 andSecondPoint:(CGPoint)p2{
+    
+    
+    return P_M((p1.x + p2.x) / 2.0, (p1.y + p2.y) / 2.0);
+    
+}
+
+
+
+- (void)drawPathWithDataArr:(NSArray *)dataArr andIndex:(NSInteger )colorIndex{
+    
+    UIBezierPath *firstPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 0, 0)];
+    
+    UIBezierPath *secondPath = [UIBezierPath bezierPath];
+    
+    for (NSInteger i = 0; i<dataArr.count; i++) {
+        
+        NSValue *value = dataArr[i];
+        
+        CGPoint p = value.CGPointValue;
+        
+        if (_pathCurve) {
+            if (i==0) {
+                
+                if (_contentFill) {
+
+                    [secondPath moveToPoint:P_M(p.x, self.chartOrigin.y)];
+                    [secondPath addLineToPoint:p];
+                }
+
+                [firstPath moveToPoint:p];
+            }else{
+                CGPoint nextP = [dataArr[i-1] CGPointValue];
+                CGPoint control1 = P_M(p.x + (nextP.x - p.x) / 2.0, nextP.y );
+                CGPoint control2 = P_M(p.x + (nextP.x - p.x) / 2.0, p.y);
+                 [secondPath addCurveToPoint:p controlPoint1:control1 controlPoint2:control2];
+                [firstPath addCurveToPoint:p controlPoint1:control1 controlPoint2:control2];
+            }
+        }else{
+            
+              if (i==0) {
+                  if (_contentFill) {
+                      [secondPath moveToPoint:P_M(p.x, self.chartOrigin.y)];
+                      [secondPath addLineToPoint:p];
+                  }
+                  [firstPath moveToPoint:p];
+//                   [secondPath moveToPoint:p];
+              }else{
+                   [firstPath addLineToPoint:p];
+                   [secondPath addLineToPoint:p];
+            }
+
+        }
+
+        if (i==dataArr.count-1) {
+            
+            [secondPath addLineToPoint:P_M(p.x, self.chartOrigin.y)];
+            
+        }
+    }
+    
+    
+    
+    if (_contentFill) {
+        [secondPath closePath];
+    }
+    
+    //���������UIBezierPath���CAShapeLayer������
+    
+    
+    CAShapeLayer *shapeLayer = [CAShapeLayer layer];
+    shapeLayer.frame = self.bounds;
+    shapeLayer.path = firstPath.CGPath;
+    UIColor *color = (_valueLineColorArr.count==_drawDataArr.count?(_valueLineColorArr[colorIndex]):([UIColor orangeColor]));
+    shapeLayer.strokeColor = color.CGColor;
+    shapeLayer.fillColor = [UIColor clearColor].CGColor;
+    shapeLayer.lineWidth = (_animationPathWidth<=0?2:_animationPathWidth);
+    
+    //���������������
+    
+    CABasicAnimation *ani = [CABasicAnimation animationWithKeyPath:NSStringFromSelector(@selector(strokeEnd))];
+    
+    ani.fromValue = @0;
+    
+    ani.toValue = @1;
+    
+    ani.duration = 0.0;
+    
+    ani.delegate = self;
+    
+    [shapeLayer addAnimation:ani forKey:NSStringFromSelector(@selector(strokeEnd))];
+    
+    [self.layer addSublayer:shapeLayer];
+    [_layerArr addObject:shapeLayer];
+    
+    weakSelf(weakSelf)
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(ani.duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        
+        CAShapeLayer *shaperLay = [CAShapeLayer layer];
+        shaperLay.frame = weakself.bounds;
+        shaperLay.path = secondPath.CGPath;
+        if (weakself.contentFillColorArr.count == weakself.drawDataArr.count) {
+            
+            shaperLay.fillColor = [weakself.contentFillColorArr[colorIndex] CGColor];
+        }else{
+            shaperLay.fillColor = [UIColor clearColor].CGColor;
+        }
+        
+        [weakself.layer addSublayer:shaperLay];
+        [_layerArr addObject:shaperLay];
+    });
+    
+    
+}
+
+
+
+/**
+ *  ������������������������
+ *
+ *  @param context ���������������������
+ */
+- (void)drawPositionLineWithContext:(CGContextRef)context{
+    
+    
+    
+    if (_drawDataArr.count==0) {
+        return;
+    }
+    
+    
+    
+    for (NSInteger m = 0;m<_valueArr.count;m++) {
+        NSArray *arr = _drawDataArr[m];
+        
+        for (NSInteger i = 0 ;i<arr.count;i++ ) {
+            
+            CGPoint p = [arr[i] CGPointValue];
+            UIColor *positionLineColor;
+            if (_positionLineColorArr.count == _valueArr.count) {
+                positionLineColor = _positionLineColorArr[m];
+            }else
+                positionLineColor = [UIColor orangeColor];
+
+            
+            if (_showValueLeadingLine) {
+                [self drawLineWithContext:context andStarPoint:P_M(self.chartOrigin.x, p.y) andEndPoint:p andIsDottedLine:YES andColor:positionLineColor];
+                [self drawLineWithContext:context andStarPoint:P_M(p.x, self.chartOrigin.y) andEndPoint:p andIsDottedLine:YES andColor:positionLineColor];
+            }
+          
+            
+            if (p.y!=0) {
+                UIColor *pointNumberColor = (_pointNumberColorArr.count == _valueArr.count?(_pointNumberColorArr[m]):([UIColor orangeColor]));
+                
+                switch (_lineChartQuadrantType) {
+                       
+                        
+                    case JHLineChartQuadrantTypeFirstQuardrant:
+                    {
+                        NSString *aimStr = [NSString stringWithFormat:@"(%@,%@)",_xLineDataArr[i],_valueArr[m][i]];
+                        CGFloat length = [self sizeOfStringWithMaxSize:CGSizeMake(100, 25) textFont:7.0 aimString:aimStr].width;
+                        [self drawText:aimStr andContext:context atPoint:P_M(p.x - length / 2, p.y - 10) WithColor:pointNumberColor andFontSize:7.0];
+                    }
+                        break;
+                    case JHLineChartQuadrantTypeFirstAndSecondQuardrant:
+                    {
+                        NSString *str = (i<[_xLineDataArr[0] count]?(_xLineDataArr[0][i]):(_xLineDataArr[1][i-[_xLineDataArr[0] count]]));
+                        
+                        NSString *aimStr = [NSString stringWithFormat:@"(%@,%@)",str,_valueArr[m][i]];
+                        CGFloat length = [self sizeOfStringWithMaxSize:CGSizeMake(100, 25) textFont:7.0 aimString:aimStr].width;
+                        
+                        [self drawText:aimStr andContext:context atPoint:P_M(p.x - length / 2, p.y - 10) WithColor:pointNumberColor andFontSize:7.0];
+                    }
+                        break;
+                    case JHLineChartQuadrantTypeFirstAndFouthQuardrant:
+                    {
+                        NSString *aimStr = [NSString stringWithFormat:@"(%@,%@)",_xLineDataArr[i],_valueArr[m][i]];
+                        CGFloat length = [self sizeOfStringWithMaxSize:CGSizeMake(100, 25) textFont:7.0 aimString:aimStr].width;
+                        [self drawText:aimStr andContext:context atPoint:P_M(p.x - length / 2, p.y - 10) WithColor:pointNumberColor andFontSize:7.0];
+                    }
+                        break;
+                    case JHLineChartQuadrantTypeAllQuardrant:
+                    {
+                        NSString *str = (i<[_xLineDataArr[0] count]?(_xLineDataArr[0][i]):(_xLineDataArr[1][i-[_xLineDataArr[0] count]]));
+                        
+                        NSString *aimStr =[NSString stringWithFormat:@"(%@,%@)",str,_valueArr[m][i]];
+                        CGFloat length = [self sizeOfStringWithMaxSize:CGSizeMake(100, 25) textFont:7.0 aimString:aimStr].width;
+                        
+                        [self drawText:aimStr andContext:context atPoint:P_M(p.x - length / 2, p.y - 10) WithColor:pointNumberColor andFontSize:7.0];
+                    }
+                        break;
+                        
+                    default:
+                        break;
+                }
+                
+            }
+            
+            
+        }
+    }
+    
+     _isEndAnimation = NO;
+    
+    
+}
+
+
+
+
+
+-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
+    
+    if (flag) {
+        
+        
+     
+        [self drawPoint];
+
+        
+    }
+    
+}
+
+/**
+ *  ���������������
+ */
+- (void)drawPoint{
+    
+    for (NSInteger m = 0;m<_drawDataArr.count;m++) {
+        
+        NSArray *arr = _drawDataArr[m];
+        for (NSInteger i = 0; i<arr.count; i++) {
+            
+            NSValue *value = arr[i];
+            
+            CGPoint p = value.CGPointValue;
+            
+            
+            UIBezierPath *pBezier = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 5, 5)];
+            [pBezier moveToPoint:p];
+            //            [pBezier addArcWithCenter:p radius:13 startAngle:0 endAngle:M_PI*2 clockwise:YES];
+            CAShapeLayer *pLayer = [CAShapeLayer layer];
+            pLayer.frame = CGRectMake(0, 0, 5, 5);
+            pLayer.position = p;
+            pLayer.path = pBezier.CGPath;
+            
+            UIColor *color = _pointColorArr.count==_drawDataArr.count?(_pointColorArr[m]):([UIColor orangeColor]);
+            
+            pLayer.fillColor = color.CGColor;
+            
+            CABasicAnimation *ani = [CABasicAnimation animationWithKeyPath:NSStringFromSelector(@selector(strokeEnd))];
+            
+            ani.fromValue = @0;
+            
+            ani.toValue = @1;
+            
+            ani.duration = 1;
+            
+            
+            [pLayer addAnimation:ani forKey:NSStringFromSelector(@selector(strokeEnd))];
+            
+            [self.layer addSublayer:pLayer];
+            [_layerArr addObject:pLayer];
+            
+            
+        }
+        _isEndAnimation = YES;
+        
+        [self setNeedsDisplay];
+    }
+}
+
+
+
+
+
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHPieChart.h b/JHChart/JHChartDemo/JHChart/JHPieChart.h
new file mode 100755
index 0000000..b512026
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHPieChart.h
@@ -0,0 +1,39 @@
+//
+//  JHPieChart.h
+//  JHCALayer
+//
+//  Created by cjatech-������ on 16/5/3.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import "JHChart.h"
+@interface JHPieChart : JHChart
+
+/**
+ *  Need to draw the specific values���Elements can be either NSString or NSNumber type
+ */
+@property (nonatomic, strong) NSArray * valueArr;
+
+
+/**
+ *  Description of each segment of a pie graph
+ */
+@property (nonatomic, strong) NSArray * descArr;
+
+
+/**
+ *  An array of colors for each section of the pie
+ */
+@property (nonatomic, strong) NSArray * colorArr;
+
+
+/**
+ *  The length of the outward shift when the pie chart hits
+ */
+@property (assign , nonatomic) CGFloat positionChangeLengthWhenClick;
+
+
+
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHPieChart.m b/JHChart/JHChartDemo/JHChart/JHPieChart.m
new file mode 100755
index 0000000..eb089c3
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHPieChart.m
@@ -0,0 +1,301 @@
+//
+//  JHPieChart.m
+//  JHCALayer
+//
+//  Created by cjatech-������ on 16/5/3.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import "JHPieChart.h"
+#import "JHPieItemsView.h"
+#import "JHPieForeBGView.h"
+#import "JHShowInfoView.h"
+#define k_COLOR_STOCK @[[UIColor colorWithRed:244/255.0 green:161/255.0 blue:100/255.0 alpha:1],[UIColor colorWithRed:87/255.0 green:255/255.0 blue:191/255.0 alpha:1],[UIColor colorWithRed:254/255.0 green:224/255.0 blue:90/255.0 alpha:1],[UIColor colorWithRed:240/255.0 green:58/255.0 blue:63/255.0 alpha:1],[UIColor colorWithRed:147/255.0 green:111/255.0 blue:255/255.0 alpha:1],[UIColor colorWithRed:255/255.0 green:255/255.0 blue:199/255.0 alpha:1],[UIColor colorWithRed:90/255.0 green:159/255.0 blue:229/255.0 alpha:1],[UIColor colorWithRed:100/255.0 green:230/255.0 blue:95/255.0 alpha:1],[UIColor colorWithRed:33/255.0 green:255/255.0 blue:255/255.0 alpha:1],[UIColor colorWithRed:249/255.0 green:110/255.0 blue:176/255.0 alpha:1],[UIColor colorWithRed:192/255.0 green:168/255.0 blue:250/255.0 alpha:1],[UIColor colorWithRed:166/255.0 green:134/255.0 blue:54/255.0 alpha:1],[UIColor colorWithRed:217/255.0 green:221/255.0 blue:228/255.0 alpha:1],[UIColor colorWithRed:99/255.0 green:106/255.0 blue:192/255.0 alpha:1]]
+
+@interface JHPieChart ()
+
+@property (nonatomic,strong) JHPieForeBGView * pieForeView;
+
+
+@property (assign , nonatomic) NSInteger  allValueCount ;
+
+
+@property (nonatomic,strong) NSMutableArray * angleArr;
+
+
+@property (nonatomic,strong) NSMutableArray * countPreAngeleArr;
+
+
+@property (nonatomic,strong) NSMutableArray * layersArr;
+
+@property (assign , nonatomic) NSInteger  saveIndex ;
+
+
+@property (assign , nonatomic) CGFloat  chartArcLength ;
+
+@property (nonatomic,strong) JHShowInfoView * showInfoView;
+@end
+
+
+@implementation JHPieChart
+
+
+-(instancetype)init{
+    
+    if (self = [super init]) {
+        _chartArcLength = 8.0;
+    }
+    
+    return self;
+    
+}
+
+
+-(instancetype)initWithFrame:(CGRect)frame{
+    
+    if (self = [super initWithFrame:frame]) {
+        
+        _chartArcLength = 8.0;
+    }
+    
+    return self;
+    
+}
+
+-(void)drawRect:(CGRect)rect{
+    
+    CGContextRef contex = UIGraphicsGetCurrentContext();
+    
+    if (_descArr.count==_valueArr.count&&_descArr.count>0) {
+        
+        NSArray *colors = nil;
+        
+        if (_colorArr.count==_valueArr.count) {
+            colors = _colorArr;
+        }else{
+            colors = k_COLOR_STOCK;
+        }
+        
+        for (NSInteger i = 0; i<_descArr.count; i++) {
+        
+             [self drawQuartWithColor:colors[i%colors.count] andBeginPoint:P_M(15+self.frame.size.width/2*(i%2), 20*(i/2  )+25+_chartArcLength*2) andContext:contex];
+            CGFloat present = [_valueArr[i] floatValue]/_allValueCount*100;
+            [self drawText:[NSString stringWithFormat:@"%@ ������:% 3ld ������:%.1f%c",_descArr[i],[_valueArr[i] integerValue],present,'%'] andContext:contex atPoint:P_M(30+self.frame.size.width/2*(i%2), 20*(i/2  )+25+_chartArcLength*2) WithColor:[UIColor blackColor] andTextFontSize:8];
+        }
+       
+        
+    }
+    
+    
+}
+- (void)drawText:(NSString *)text andContext:(CGContextRef )context atPoint:(CGPoint )rect WithColor:(UIColor *)color andTextFontSize:(CGFloat )fontSize{
+    
+    
+    [[NSString stringWithFormat:@"%@",text] drawAtPoint:rect withAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"CourierNewPSMT" size:fontSize],NSForegroundColorAttributeName:color}];
+    
+    
+    [color setFill];
+    
+    CGContextDrawPath(context, kCGPathFill);
+    
+}
+- (void)countAllValue{
+    _allValueCount = 0;
+    for (NSString *obj in _valueArr) {
+        
+        _allValueCount += obj.integerValue;
+        
+    }
+}
+
+
+- (void)countAllAngleDataArr{
+    
+    _angleArr = [NSMutableArray array];
+    for (NSString *obj in _valueArr) {
+        
+        [_angleArr addObject:[NSNumber numberWithDouble:obj.floatValue*M_PI * 2/_allValueCount]];
+        
+    }
+    
+    _countPreAngeleArr = [NSMutableArray array];
+    
+    for (NSInteger i = 0; i<_angleArr.count; i++) {
+        
+        if (i==0) {
+             [_countPreAngeleArr addObject:[NSNumber numberWithFloat:0]];
+        }
+        CGFloat angle = 0.0;
+        for (NSInteger j = 0; j<=i; j++) {
+            
+            angle += [_angleArr[j] floatValue];
+            
+        }
+        
+        [_countPreAngeleArr addObject:[NSNumber numberWithFloat:angle]];
+
+        
+    }
+    
+    
+    
+}
+
+-(void)showAnimation{
+    
+ 
+    
+    if (_valueArr.count>0) {
+        
+        [self countAllValue];
+        
+        [self countAllAngleDataArr];
+        
+        _layersArr = [NSMutableArray array];
+        
+        CGFloat wid = self.frame.size.width-20;
+        
+        if (_descArr.count>0) {
+            
+            NSInteger i = _descArr.count/2 + _descArr.count%2;
+            
+            wid = self.frame.size.height - 10 - i*25;
+            
+        }
+        
+        _chartArcLength = wid/2;
+        
+        NSArray *colors = nil;
+        
+        if (_colorArr.count == _valueArr.count) {
+            
+            colors = _colorArr;
+            
+        }else{
+            
+            colors = k_COLOR_STOCK;
+            
+        }
+        
+        
+        for (NSInteger i = 0; i<_countPreAngeleArr.count-1; i++) {
+            
+            JHPieItemsView *itemsView = [[JHPieItemsView alloc] initWithFrame:CGRectMake(10, 10, wid/2, wid/2) andBeginAngle:[_countPreAngeleArr[i] floatValue] andEndAngle:[_countPreAngeleArr[i+1] floatValue] andFillColor:colors[i%colors.count]];
+            
+            itemsView.center = CGPointMake(self.frame.size.width/2, 10+wid/2);
+            
+            itemsView.tag = i;
+            
+            [_layersArr addObject:itemsView];
+            
+            [self addSubview:itemsView];
+            
+        }
+        
+        _pieForeView = [[JHPieForeBGView alloc] initWithFrame:CGRectMake(10, 10, wid,  wid)];
+        
+        _pieForeView.center = CGPointMake(self.frame.size.width/2, 10+wid/2);
+        
+        _pieForeView.backgroundColor = [UIColor clearColor];
+        if (_showInfoView==nil) {
+            _showInfoView = [[JHShowInfoView alloc] init];
+            _showInfoView.hidden = YES;
+            [_pieForeView addSubview:_showInfoView];
+        }
+        _pieForeView.select = ^(CGFloat angle,CGPoint p){
+           
+            [self judgeWhitchOneIsNowAngle:angle andShowPoint:p];
+            
+        };
+        
+        [self addSubview:_pieForeView];
+        
+    }
+    
+    [self setNeedsDisplay];
+    
+}
+
+
+- (void)judgeWhitchOneIsNowAngle:(CGFloat )angel andShowPoint:(CGPoint)p{
+    
+    for (NSInteger i = 0; i<_countPreAngeleArr.count-1; i++) {
+        
+        if ([_countPreAngeleArr[i+1] floatValue]>=angel) {
+            
+         
+            
+            CGFloat NOW_ANGLE = [_countPreAngeleArr[i] floatValue]+[_angleArr[i] floatValue]/2;
+            
+            CGFloat standarSpa = _positionChangeLengthWhenClick;
+            
+
+            
+            CGFloat spa = sin(NOW_ANGLE)*standarSpa;
+            
+            CGFloat xSpa = cos(NOW_ANGLE)*standarSpa;
+            
+            JHPieItemsView *itemsView = _layersArr[i];
+           
+            JHPieItemsView *saveItems = _layersArr[_saveIndex];
+            
+            CGFloat wid = self.frame.size.width-20;
+            
+            if (_descArr.count>0) {
+                
+                NSInteger i = _descArr.count/2 + _descArr.count%2;
+                
+                wid = self.frame.size.height - 10 - i*25;
+                
+            }
+            NSArray *colors = nil;
+            
+            if (_colorArr.count == _valueArr.count) {
+                
+                colors = _colorArr;
+                
+            }else{
+                
+                colors = k_COLOR_STOCK;
+                
+            }
+             CGFloat present = [_valueArr[i] floatValue]/_allValueCount*100;
+            [UIView animateWithDuration:0.3 animations:^{
+                if (_saveIndex==i) {
+                    
+                    if (saveItems.center.x==self.frame.size.width/2) {
+                        _showInfoView.hidden = NO;
+                        itemsView.center = CGPointMake(self.frame.size.width/2+xSpa, 10+wid/2+spa);
+                        [_showInfoView updateFrameTo:CGRectMake(p.x, p.y, _showInfoView.frame.size.width, _showInfoView.frame.size.height) andBGColor:colors[i%colors.count] andShowContentString:[NSString stringWithFormat:@"%@ ������:% 3ld ������:%.1f%c",_descArr[i],[_valueArr[i] integerValue],present,'%']];
+//                        _showInfoView.frame = C   GRectMake(p.x, p.y, _showInfoView.frame.size.width, _showInfoView.frame.size.height);
+                        
+                    }else{
+                        _showInfoView.hidden = YES;
+                        saveItems.center = CGPointMake(self.frame.size.width/2, 10+wid/2);
+                        
+                    }
+                    
+                }else{
+                    
+                    saveItems.center = CGPointMake(self.frame.size.width/2, 10+wid/2);
+                    _showInfoView.hidden = NO;
+                    [_showInfoView updateFrameTo:CGRectMake(p.x, p.y, _showInfoView.frame.size.width, _showInfoView.frame.size.height) andBGColor:colors[i%colors.count] andShowContentString:[NSString stringWithFormat:@"%@ ������:% 3ld ������:%.1f%c",_descArr[i],[_valueArr[i] integerValue],present,'%']];
+                    itemsView.center = CGPointMake(self.frame.size.width/2+xSpa, 10+wid/2+spa);
+                    
+                }
+            }];
+           
+            
+               _saveIndex = i;
+            
+            break;
+        }
+        
+    }
+    
+    
+}
+
+
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHPieForeBGView.h b/JHChart/JHChartDemo/JHChart/JHPieForeBGView.h
new file mode 100755
index 0000000..aedd30e
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHPieForeBGView.h
@@ -0,0 +1,26 @@
+//
+//  JHPieForeBGView.h
+//  JHCALayer
+//
+//  Created by cjatech-������ on 16/4/28.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+/**
+ *  Each click of the pie chart callback block
+ */
+typedef void(^selectBlock)(CGFloat angle,CGPoint p);
+
+
+
+@interface JHPieForeBGView : UIView
+
+/**
+ *  Current pie chart callback block
+ */
+@property (copy, nonatomic) selectBlock select;
+
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHPieForeBGView.m b/JHChart/JHChartDemo/JHChart/JHPieForeBGView.m
new file mode 100755
index 0000000..5e9337d
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHPieForeBGView.m
@@ -0,0 +1,56 @@
+//
+//  JHPieForeBGView.m
+//  JHCALayer
+//
+//  Created by cjatech-������ on 16/4/28.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import "JHPieForeBGView.h"
+
+@implementation JHPieForeBGView
+
+-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
+    
+    [self touchesBegan:touches withEvent:event];
+}
+
+
+-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
+    
+    UITouch *touch = [touches anyObject];
+    
+    CGPoint p = [touch locationInView:self];
+    
+    
+    
+    if ((p.x-self.frame.size.width/2)*(p.x-self.frame.size.width/2) + (p.y-self.frame.size.height/2)*(p.y-self.frame.size.height/2) >self.frame.size.height*self.frame.size.height) {
+        return;
+    }
+    
+    
+    /* ���������������block������ */
+    CGFloat aLen2 = (p.x - self.frame.size.width/2)*(p.x - self.frame.size.width/2) + (p.y - self.frame.size.width/2)*(p.y - self.frame.size.width/2);
+    CGFloat aLen = sqrt(aLen2);
+    
+    CGFloat cLen2 =self.frame.size.width/2 * self.frame.size.width/2;
+    CGFloat cLen = self.frame.size.width/2;
+    
+    CGFloat bLen2 = (p.x - self.frame.size.width)*(p.x - self.frame.size.width) + (p.y - self.frame.size.width/2)*(p.y - self.frame.size.width/2);
+
+    
+    CGFloat angle = acos((aLen2 + cLen2 -bLen2)/2/aLen/cLen);
+    
+    if (p.y<self.frame.size.height/2) {
+        angle = M_PI*2 -angle;
+        
+    }
+    if (self.select) {
+        self.select(angle,p);
+    }
+    
+}
+
+
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHPieItemsView.h b/JHChart/JHChartDemo/JHChart/JHPieItemsView.h
new file mode 100755
index 0000000..4bcc14b
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHPieItemsView.h
@@ -0,0 +1,24 @@
+//
+//  JHPieItemsView.h
+//  JHCALayer
+//
+//  Created by cjatech-������ on 16/4/28.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface JHPieItemsView : UIView
+
+/**
+ *  Each initialization method of pie chart
+ *  @param frame:frame
+ *  @param beginAngle:Starting angle of cake block
+ *  @param endAngle���End angle of cake block
+ *  @param fillColor���Fill color for this cake block
+ */
+- (JHPieItemsView *)initWithFrame:(CGRect)frame
+                    andBeginAngle:(CGFloat)beginAngle
+                      andEndAngle:(CGFloat)endAngle
+                     andFillColor:(UIColor *)fillColor;
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHPieItemsView.m b/JHChart/JHChartDemo/JHChart/JHPieItemsView.m
new file mode 100755
index 0000000..dda3fc3
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHPieItemsView.m
@@ -0,0 +1,68 @@
+//
+//  JHPieItemsView.m
+//  JHCALayer
+//
+//  Created by cjatech-������ on 16/4/28.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import "JHPieItemsView.h"
+@interface JHPieItemsView ()
+
+@property (nonatomic,assign) CGFloat beginAngle;
+@property (nonatomic,assign) CGFloat endAngle;
+@property (nonatomic,strong) UIColor * fillColor;
+@property (nonatomic,strong) CAShapeLayer * shapeLayer;
+@end
+@implementation JHPieItemsView
+-(JHPieItemsView *)initWithFrame:(CGRect)frame andBeginAngle:(CGFloat)beginAngle andEndAngle:(CGFloat)endAngle andFillColor:(UIColor *)fillColor{
+    
+    if (self = [super initWithFrame:frame]) {
+        
+        
+        _beginAngle = beginAngle;
+        _endAngle = endAngle;
+        _fillColor = fillColor;
+        
+        [self configBaseLayer];
+        
+    }
+    
+    return self;
+    
+    
+    
+}
+
+- (void)configBaseLayer{
+    _shapeLayer = [CAShapeLayer layer];
+
+    UIBezierPath *path = [UIBezierPath bezierPath];
+    
+    [path addArcWithCenter:CGPointMake(self.frame.size.width/2, self.frame.size.height/2) radius:self.frame.size.width/2 startAngle:_beginAngle endAngle:_endAngle clockwise:YES];
+    
+    _shapeLayer.path = path.CGPath;
+    _shapeLayer.lineWidth = self.frame.size.width;
+    _shapeLayer.strokeColor = _fillColor.CGColor;
+    _shapeLayer.fillColor = [UIColor clearColor].CGColor;
+
+    
+    [self.layer addSublayer:_shapeLayer];
+    
+    CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
+    basic.duration = 1.1;
+    basic.fromValue = @(0.1f);
+    basic.toValue = @(1.0f);
+    [_shapeLayer addAnimation:basic forKey:@"basic"];
+    
+    
+}
+
+
+
+-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
+    NSLog(@"touch%ld",self.tag);
+    
+}
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHRadarChart.h b/JHChart/JHChartDemo/JHChart/JHRadarChart.h
new file mode 100755
index 0000000..3e65e98
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHRadarChart.h
@@ -0,0 +1,72 @@
+//
+//  JHRadarChart.h
+//  JHChartDemo
+//
+//  Created by ������ on 16/9/9.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+
+
+#import "JHChart.h"
+
+@interface JHRadarChart : JHChart
+
+
+/**
+ *  Data Source Arrays
+ */
+@property (nonatomic, strong) NSArray<NSArray*> * valueDataArray;
+
+
+/**
+ *  Each corner of the description text
+ */
+@property (nonatomic, strong) NSArray<NSString *> * valueDescArray;
+
+
+/**
+ *  The number of layers, the default is 3. (number of scales)
+ */
+@property (nonatomic, assign) NSInteger layerCount;
+
+/**
+ *  Layer of fill color, the best choice of translucent color, otherwise will block the line
+ */
+@property (nonatomic, strong) UIColor * layerFillColor;
+
+
+/**
+ *  Layer boundary line color
+ */
+@property (nonatomic, strong) UIColor * layerBoardColor;
+
+/**
+ *  Block line color
+ */
+@property (nonatomic, strong) UIColor * speraLineColor;
+
+/**
+ *  Maximum value
+ */
+@property (nonatomic, assign) CGFloat perfectNumber;
+
+/**
+ *  Describe the font and color of the text
+ */
+@property (nonatomic, strong) UIFont * descTextFont;
+@property (nonatomic, strong) UIColor * descTextColor;
+
+
+/**
+ *  Fill color array of value module
+ */
+@property (nonatomic, strong) NSArray<UIColor *> * valueDrawFillColorArray;
+
+/**
+ *  Boundary color of value module
+ */
+@property (nonatomic, strong) NSArray<UIColor *> * valueBoardColorArray;
+
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHRadarChart.m b/JHChart/JHChartDemo/JHChart/JHRadarChart.m
new file mode 100755
index 0000000..c594a1a
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHRadarChart.m
@@ -0,0 +1,270 @@
+//
+//  JHRadarChart.m
+//  JHChartDemo
+//
+//  Created by ������ on 16/9/9.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import "JHRadarChart.h"
+
+@interface JHRadarChart ()
+
+@property (nonatomic,assign)CGFloat chartRadius;
+@property (nonatomic,strong)NSMutableArray * drawPointArray;
+
+@property (nonatomic,strong)NSMutableArray * baseDrawPointArray;
+@end
+
+
+@implementation JHRadarChart
+
+
+-(NSMutableArray *)drawPointArray{
+    
+    if (!_drawPointArray) {
+        _drawPointArray = [NSMutableArray array];
+    }
+    
+    return _drawPointArray;
+}
+
+
+-(NSMutableArray *)baseDrawPointArray{
+    
+    if (!_baseDrawPointArray) {
+        _baseDrawPointArray = [NSMutableArray array];
+    }
+    return _baseDrawPointArray;
+}
+
+-(void)setLayerCount:(NSInteger)layerCount{
+    
+    if (layerCount<=0) {
+        return;
+    }
+    
+    _layerCount = layerCount;
+    
+}
+
+-(instancetype)initWithFrame:(CGRect)frame{
+    
+
+    if (self = [super initWithFrame:frame]) {
+        
+        self.layerCount = 3;
+        self.chartRadius = (self.frame.size.height - 50 * 2) / 2.0;
+        self.chartOrigin = CGPointMake(CGRectGetWidth(self.frame) / 2.0, CGRectGetHeight(self.frame) / 2.0);
+        self.layerFillColor = [UIColor colorWithWhite:0.5 alpha:0.3];
+        self.layerBoardColor = [UIColor colorWithWhite:0.5 alpha:0.3];
+        self.speraLineColor = [UIColor whiteColor];
+        self.perfectNumber = 100.0;
+        self.descTextFont = [UIFont systemFontOfSize:14];
+        self.descTextColor = [UIColor darkGrayColor];
+    }
+    
+    
+    return self;
+    
+}
+
+
+/**
+ *  ������������������
+ */
+- (void)configDrawingData{
+    
+    
+    if (self.valueDataArray.count==0) {
+        return;
+    }
+    
+
+    CGFloat perAngle = M_PI * 2 / self.valueDescArray.count;
+    for (NSInteger i = 0; i<self.valueDataArray.count; i++) {
+        
+        NSArray *valueArray = [self.valueDataArray objectAtIndex:i];
+        NSMutableArray *cacheArray = [NSMutableArray array];
+        
+        for (NSInteger j = 0; j<valueArray.count; j++) {
+            CGFloat value = [[valueArray objectAtIndex:j] floatValue];
+            
+            value = (value>self.perfectNumber?self.perfectNumber:value);
+            
+            CGPoint cachePoint = CGPointMake(self.chartOrigin.x + value / self.perfectNumber * self.chartRadius * sin(j * perAngle), self.chartOrigin.y - value / self.perfectNumber * self.chartRadius * cos(j * perAngle));
+            [cacheArray addObject:[NSValue valueWithCGPoint:cachePoint]];
+            
+        }
+        
+        [self.drawPointArray addObject:[cacheArray copy]];
+        
+    }
+    
+}
+
+
+- (void)configBaseViewDataArray{
+    
+    [self.baseDrawPointArray removeAllObjects];
+    CGFloat perLength = self.chartRadius / self.layerCount;
+    
+    CGFloat perAngle = M_PI * 2 / self.valueDescArray.count;
+    
+    for (NSInteger i = 0; i<self.layerCount; i++) {
+        
+        NSMutableArray *cacheArray = [NSMutableArray array];
+        CGFloat cacheLength = (i+1) * perLength;
+        for (NSInteger j = 0; j<self.valueDescArray.count; j++) {
+            
+            CGPoint cachePoint = CGPointMake(self.chartOrigin.x + cacheLength * sin(j * perAngle) , self.chartOrigin.y - cacheLength * cos(j * perAngle));
+            
+//            NSLog(@"-----%-----i== %ld     ======%@",j * perAngle,i,NSStringFromCGPoint(cachePoint));
+            NSValue *cacheValue = [NSValue valueWithCGPoint:cachePoint];
+            [cacheArray addObject:cacheValue];
+            
+            
+            if (i==0) {
+                
+                CGFloat width = [self sizeOfStringWithMaxSize:CGSizeMake(100, 20) textFont:self.descTextFont.pointSize aimString:self.valueDescArray[j]].width;
+                UILabel *cacheLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, width, 20)];
+                cacheLabel.font = self.descTextFont;
+                cacheLabel.center = CGPointMake(self.chartOrigin.x + (self.chartRadius + width / 2 + 5) * sin(j * perAngle) ,self.chartOrigin.y - (self.chartRadius + 20 / 2 + 5) * cos(j * perAngle));
+                cacheLabel.text = self.valueDescArray[j];
+                cacheLabel.textColor = self.descTextColor;
+                [self addSubview:cacheLabel];
+            }
+
+            
+        }
+        
+        [self.baseDrawPointArray addObject:[cacheArray copy]];
+        [cacheArray removeAllObjects];
+        
+    }
+    
+    
+    
+}
+
+
+/**
+ *  ���������������������������
+ */
+- (void)drawBaseView{
+    for (NSInteger i = self.baseDrawPointArray.count-1; i>=0; i--) {
+        CAShapeLayer *shapeLayer = [CAShapeLayer layer];
+        
+        UIBezierPath *path = [UIBezierPath bezierPath];
+        NSArray * cacheArray = [self.baseDrawPointArray objectAtIndex:i];
+        for (NSInteger j = 0; j<cacheArray.count; j++) {
+            
+            NSValue *cacheValue = [cacheArray objectAtIndex:j];
+            CGPoint currentCachePoint = [cacheValue CGPointValue];
+            
+            
+            NSLog(@"i== %ld     ======%@",i,NSStringFromCGPoint(currentCachePoint));
+            if (j==0) {
+                [path moveToPoint:currentCachePoint];
+            }else if(j==cacheArray.count){
+                [path addLineToPoint:currentCachePoint];
+                [path moveToPoint:currentCachePoint];
+            }else{
+                [path addLineToPoint:currentCachePoint];
+            }
+        }
+        
+        [path closePath];
+        shapeLayer.path = path.CGPath;
+        shapeLayer.fillColor = self.layerFillColor.CGColor;
+        shapeLayer.strokeColor = self.layerBoardColor.CGColor;
+        [self.layer addSublayer:shapeLayer];
+    }
+    
+    CAShapeLayer *shapeLayer = [CAShapeLayer layer];
+    
+    UIBezierPath *path = [UIBezierPath bezierPath];
+    [path closePath];
+    [path moveToPoint:self.chartOrigin];
+    NSMutableArray * cacheArray = [self.baseDrawPointArray lastObject];
+    for (NSInteger j = 0; j<cacheArray.count; j++) {
+        NSValue *cacheValue = [cacheArray objectAtIndex:j];
+        CGPoint currentCachePoint = [cacheValue CGPointValue];
+        
+        [path addLineToPoint:currentCachePoint];
+        [path moveToPoint:self.chartOrigin];
+    }
+    shapeLayer.path = path.CGPath;
+    shapeLayer.strokeColor = self.speraLineColor.CGColor;
+    [self.layer addSublayer:shapeLayer];
+    
+    
+    
+
+}
+
+
+- (void)drawValueView{
+    
+    
+    if (self.drawPointArray.count==0) {
+        return;
+    }
+    
+    
+    for (NSInteger i = 0 ; i<self.drawPointArray.count; i++) {
+        
+        NSArray *cacheArray = [self.drawPointArray objectAtIndex:i];
+        UIBezierPath *path = [UIBezierPath bezierPath];
+        for (NSInteger j = 0; j<cacheArray.count; j++) {
+            
+            
+            
+            if (j==0) {
+                [path moveToPoint:[[cacheArray objectAtIndex:j] CGPointValue]];
+            }else{
+                [path addLineToPoint:[[cacheArray objectAtIndex:j] CGPointValue]];
+            }
+
+        }
+        [path closePath];
+        CAShapeLayer *shaper = [CAShapeLayer layer];
+        shaper.path = path.CGPath;
+        shaper.borderWidth = 1.0;
+        UIColor *cacheColor = [UIColor clearColor];
+        if (self.valueDrawFillColorArray.count>i) {
+            cacheColor = self.valueDrawFillColorArray[i];
+        }
+        shaper.fillColor = cacheColor.CGColor;
+        
+        
+        if (self.valueBoardColorArray.count>i) {
+            cacheColor = self.valueBoardColorArray[i];
+        }else{
+            cacheColor = [UIColor clearColor];
+        }
+        shaper.strokeColor = cacheColor.CGColor;
+        
+        
+        [self.layer addSublayer:shaper];
+        
+    }
+    
+    
+    
+}
+
+-(void)showAnimation{
+    
+    [self configBaseViewDataArray];
+    [self configDrawingData];
+    [self drawBaseView];
+    [self drawValueView];
+    
+}
+
+
+
+
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHRingChart.h b/JHChart/JHChartDemo/JHChart/JHRingChart.h
new file mode 100755
index 0000000..714a668
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHRingChart.h
@@ -0,0 +1,30 @@
+//
+//  JHRingChart.h
+//  JHChartDemo
+//
+//  Created by ������ on 16/7/5.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import "JHChart.h"
+
+@interface JHRingChart : JHChart
+#define k_Width_Scale  (self.frame.size.width / [UIScreen mainScreen].bounds.size.width)
+
+/**
+ *  Data source Array
+ */
+@property (nonatomic, strong) NSArray * valueDataArr;
+
+
+/**
+ *  An array of colors in the loop graph
+ */
+@property (nonatomic, strong) NSArray * fillColorArray;
+
+
+/**
+ *  Ring Chart width
+ */
+@property (nonatomic, assign) CGFloat ringWidth;
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHRingChart.m b/JHChart/JHChartDemo/JHChart/JHRingChart.m
new file mode 100755
index 0000000..18af31f
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHRingChart.m
@@ -0,0 +1,168 @@
+//
+//  JHRingChart.m
+//  JHChartDemo
+//
+//  Created by ������ on 16/7/5.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import "JHRingChart.h"
+#define k_COLOR_STOCK @[[UIColor colorWithRed:1.000 green:0.783 blue:0.371 alpha:1.000], [UIColor colorWithRed:1.000 green:0.562 blue:0.968 alpha:1.000],[UIColor colorWithRed:0.313 green:1.000 blue:0.983 alpha:1.000],[UIColor colorWithRed:0.560 green:1.000 blue:0.276 alpha:1.000],[UIColor colorWithRed:0.239 green:0.651 blue:0.170 alpha:1.000]]
+
+@interface JHRingChart ()
+
+//������������ �����������
+@property (nonatomic,assign)CGFloat itemsSpace;
+
+//���������
+@property (nonatomic,assign) CGFloat totolCount;
+
+@property (nonatomic,assign) CGFloat redius;
+
+@end
+
+
+@implementation JHRingChart
+
+
+
+-(instancetype)initWithFrame:(CGRect)frame {
+    
+    if (self = [super initWithFrame:frame]) {
+        self.chartOrigin = CGPointMake(CGRectGetWidth(self.frame) / 2, CGRectGetHeight(self.frame)/2);
+        _redius = (CGRectGetHeight(self.frame) -60*k_Width_Scale)/4;
+        _ringWidth = 40;
+    }
+    return self;
+}
+
+
+
+-(void)setValueDataArr:(NSArray *)valueDataArr{
+    
+    
+    _valueDataArr = valueDataArr;
+    
+    [self configBaseData];
+    
+}
+
+- (void)configBaseData{
+    
+    _totolCount = 0;
+    _itemsSpace =  (M_PI * 2.0 * 10 / 360)/_valueDataArr.count ;
+    for (id obj in _valueDataArr) {
+        
+        _totolCount += [obj floatValue];
+        
+    }
+
+}
+
+
+
+//������������
+- (void)showAnimation{
+    
+    /*        ���������������������������������������layer         */
+    for (CALayer *layer in self.layer.sublayers) {
+        [layer removeFromSuperlayer];
+    }
+    
+    
+    CGFloat lastBegin = -M_PI/2;
+    
+    CGFloat totloL = 0;
+    NSInteger  i = 0;
+    for (id obj in _valueDataArr) {
+        
+        CAShapeLayer *layer = [CAShapeLayer layer] ;
+
+        UIBezierPath *path = [UIBezierPath bezierPath];
+        
+        layer.fillColor = [UIColor clearColor].CGColor;
+        
+        if (i<_fillColorArray.count) {
+            layer.strokeColor =[_fillColorArray[i] CGColor];
+        }else{
+             layer.strokeColor =[k_COLOR_STOCK[i%k_COLOR_STOCK.count] CGColor];
+        }
+        CGFloat cuttentpace = [obj floatValue] / _totolCount * (M_PI * 2 - _itemsSpace * _valueDataArr.count);
+        totloL += [obj floatValue] / _totolCount;
+
+        [path addArcWithCenter:self.chartOrigin radius:_redius startAngle:lastBegin  endAngle:lastBegin  + cuttentpace clockwise:YES];
+        
+        layer.path = path.CGPath;
+        [self.layer addSublayer:layer];
+        layer.lineWidth = _ringWidth;
+        CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
+        basic.fromValue = @(0);
+        basic.toValue = @(1);
+        basic.duration = 0.5;
+        basic.fillMode = kCAFillModeForwards;
+        
+        [layer addAnimation:basic forKey:@"basic"];
+        lastBegin += (cuttentpace+_itemsSpace);
+        i++;
+
+    }
+
+}
+
+
+-(void)drawRect:(CGRect)rect{
+    
+    
+    CGContextRef contex = UIGraphicsGetCurrentContext();
+    
+    CGFloat lastBegin = 0;
+    CGFloat longLen = _redius +30*k_Width_Scale;
+    for (NSInteger i = 0; i<_valueDataArr.count; i++) {
+        id obj = _valueDataArr[i];
+        CGFloat currentSpace = [obj floatValue] / _totolCount * (M_PI * 2 - _itemsSpace * _valueDataArr.count);;
+        NSLog(@"%f",currentSpace);
+        CGFloat midSpace = lastBegin + currentSpace / 2;
+        
+        CGPoint begin = CGPointMake(self.chartOrigin.x + sin(midSpace) * _redius, self.chartOrigin.y - cos(midSpace)*_redius);
+        CGPoint endx = CGPointMake(self.chartOrigin.x + sin(midSpace) * longLen, self.chartOrigin.y - cos(midSpace)*longLen);
+        
+        NSLog(@"%@%@",NSStringFromCGPoint(begin),NSStringFromCGPoint(endx));
+        lastBegin += _itemsSpace + currentSpace;
+        
+        UIColor *color;
+        
+        if (_fillColorArray.count<_valueDataArr.count) {
+            color = k_COLOR_STOCK[i%k_COLOR_STOCK.count];
+        }else{
+            color = _fillColorArray[i];
+        }
+        
+        [self drawLineWithContext:contex andStarPoint:begin andEndPoint:endx andIsDottedLine:NO andColor:color];
+        
+        
+        CGPoint secondP = CGPointZero;
+        
+        CGSize size = [[NSString stringWithFormat:@"%.02f%c",[obj floatValue] / _totolCount * 100,'%'] boundingRectWithSize:CGSizeMake(200, 100) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:10*k_Width_Scale]} context:nil].size;
+        
+        if (midSpace<M_PI) {
+            secondP =CGPointMake(endx.x + 20*k_Width_Scale, endx.y);
+          [self drawText:[NSString stringWithFormat:@"%.02f%c",[obj floatValue] / _totolCount * 100,'%'] andContext:contex atPoint:CGPointMake(secondP.x + 3, secondP.y - size.height / 2) WithColor:k_COLOR_STOCK[i] andFontSize:10*k_Width_Scale];
+
+        }else{
+             secondP =CGPointMake(endx.x - 20*k_Width_Scale, endx.y);
+            [self drawText:[NSString stringWithFormat:@"%.02f%c",[obj floatValue] / _totolCount * 100,'%'] andContext:contex atPoint:CGPointMake(secondP.x - size.width - 3, secondP.y - size.height/2) WithColor:color andFontSize:10*k_Width_Scale];
+        }
+          [self drawLineWithContext:contex andStarPoint:endx andEndPoint:secondP andIsDottedLine:NO andColor:color];
+        [self drawPointWithRedius:3*k_Width_Scale andColor:color andPoint:secondP andContext:contex];
+       
+    }
+    
+    
+    
+    
+}
+
+
+
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHShowInfoView.h b/JHChart/JHChartDemo/JHChart/JHShowInfoView.h
new file mode 100755
index 0000000..6fc60dd
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHShowInfoView.h
@@ -0,0 +1,20 @@
+//
+//  JHShowInfoView.h
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/5/4.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface JHShowInfoView : UIView
+
+
+
+@property (copy, nonatomic) NSString * showContentString;
+
+
+- (void)updateFrameTo:(CGRect)frame andBGColor:(UIColor *)bgColor andShowContentString:(NSString *)contentString;
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHShowInfoView.m b/JHChart/JHChartDemo/JHChart/JHShowInfoView.m
new file mode 100755
index 0000000..2461aa6
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHShowInfoView.m
@@ -0,0 +1,80 @@
+//
+//  JHShowInfoView.m
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/5/4.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import "JHShowInfoView.h"
+
+
+@interface JHShowInfoView ()
+
+
+@property (nonatomic,strong) UILabel * bgLabel;
+
+@end
+
+
+@implementation JHShowInfoView
+
+
+-(instancetype)init{
+    
+    if (self = [super init]) {
+        self.layer.borderWidth  = 2;
+        self.layer.cornerRadius = 5;
+        self.clipsToBounds      = YES;
+        self.layer.masksToBounds = YES;
+        self.backgroundColor = [UIColor colorWithWhite:1 alpha:0.9];
+    }
+    
+    return self;
+    
+}
+
+
+-(void)setShowContentString:(NSString *)showContentString{
+    
+    
+    _showContentString = showContentString;
+    CGSize size = [showContentString boundingRectWithSize:CGSizeMake(50, 100) options:NSStringDrawingUsesFontLeading|NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingTruncatesLastVisibleLine attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:8],NSForegroundColorAttributeName:[UIColor darkGrayColor]} context:nil].size;
+    
+    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, size.width+10, 30);
+    
+    if (_bgLabel==nil) {
+        
+        _bgLabel = [[UILabel alloc] initWithFrame:self.bounds];
+        _bgLabel.center = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);
+        _bgLabel.backgroundColor = [UIColor clearColor];
+        _bgLabel.font = [UIFont systemFontOfSize:8];
+        _bgLabel.textColor = [UIColor blackColor];
+        _bgLabel.numberOfLines = 2;
+        [self addSubview:_bgLabel];
+        
+    }
+    _bgLabel.frame = CGRectMake(0, 0, size.width, size.height);
+    _bgLabel.text = _showContentString;
+    _bgLabel.center = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);
+    
+}
+
+-(void)updateFrameTo:(CGRect)frame andBGColor:(UIColor *)bgColor andShowContentString:(NSString *)contentString{
+    self.showContentString = contentString;
+    
+    [UIView animateWithDuration:0.5 animations:^{
+
+        
+        
+        self.layer.borderColor = bgColor.CGColor;
+
+        self.center = CGPointMake(frame.origin.x, frame.origin.y);
+        
+    } completion:^(BOOL finished) {
+        
+    }];
+    
+}
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHTableChart.h b/JHChart/JHChartDemo/JHChart/JHTableChart.h
new file mode 100755
index 0000000..d8627d5
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHTableChart.h
@@ -0,0 +1,91 @@
+//
+//  JHTableChart.h
+//  JHChartDemo
+//
+//  Created by ������ on 16/8/24.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+/************************************************************
+ *                                                           *
+ *                                                           *
+                            ������
+ *                                                           *
+ *                                                              *
+ ************************************************************/
+
+
+#import "JHChart.h"
+
+@interface JHTableChart : JHChart
+/**
+ *  Table name, if it is empty, does not display a table name
+ */
+@property (nonatomic, copy) NSString * tableTitleString;
+
+/**
+ *  Table header row height, default 50
+ */
+@property (nonatomic, assign) CGFloat tableChartTitleItemsHeight;
+
+
+/**
+ *  Table header text font size (default 15), color (default depth)
+ */
+@property (nonatomic, strong) UIFont * tableTitleFont;
+@property (nonatomic, strong) UIColor * tableTitleColor;
+
+
+
+/**
+ *  Table line color
+ */
+@property (nonatomic, strong) UIColor  * lineColor;
+
+
+/**
+ *  Data Source Arrays
+ */
+@property (nonatomic, strong) NSArray * dataArr;
+
+
+/**
+ *  Width of each column
+ */
+@property (nonatomic, strong) NSArray * colWidthArr;
+
+/**
+ *  The smallest line is high, the default is 50
+ */
+@property (nonatomic, assign) CGFloat minHeightItems;
+
+
+/**
+ *  Table data display color
+ */
+@property (nonatomic, strong) UIColor * bodyTextColor;
+
+
+/**
+ *  The column header name, the first column horizontal statement, need to use | segmentation
+ */
+@property (nonatomic, strong) NSArray * colTitleArr;
+
+/**
+ *  Anyway, the ranks of name statement, if it is necessary to fill out a two data
+ */
+@property (nonatomic, strong) NSArray * rowAndColTitleArr;
+
+
+/**
+ *  Offset value of start point
+ */
+@property (nonatomic, assign) CGFloat beginSpace;
+
+
+
+/**
+ *  According to the current data source to determine the desired table view
+ */
+- (CGFloat)heightFromThisDataSource;
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHTableChart.m b/JHChart/JHChartDemo/JHChart/JHTableChart.m
new file mode 100755
index 0000000..db340e8
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHTableChart.m
@@ -0,0 +1,344 @@
+//
+//  JHTableChart.m
+//  JHChartDemo
+//
+//  Created by ������ on 16/8/24.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import "JHTableChart.h"
+#import "JHTableDataRowModel.h"
+@interface JHTableChart ()
+
+@property (nonatomic,assign)CGFloat tableWidth;
+@property (nonatomic,assign) CGFloat tableHeight;
+@property (nonatomic,assign) CGFloat lastY;
+@property (nonatomic,assign) CGFloat bodyHeight;
+@property (nonatomic,strong)NSMutableArray * dataModelArr;
+@end
+
+@implementation JHTableChart
+
+-(instancetype)initWithFrame:(CGRect)frame{
+    
+    if (self = [super initWithFrame:frame]) {
+        
+        _minHeightItems             = 40;
+        _beginSpace                 = 15.0;
+        _tableChartTitleItemsHeight = 50.0;
+        _lineColor                  = [UIColor darkGrayColor];
+        _tableTitleFont             = [UIFont systemFontOfSize:15];
+        _tableTitleColor            = [UIColor darkGrayColor];
+        _tableWidth                 = 100;
+        _lastY                      = _beginSpace;
+        _bodyHeight                 = 0;
+        _bodyTextColor              = [UIColor darkGrayColor];
+        
+    }
+    return self;
+}
+
+-(void)setBeginSpace:(CGFloat)beginSpace{
+    
+    _beginSpace = beginSpace;
+    _lastY = beginSpace;
+    
+}
+
+
+-(void)setDataArr:(NSArray *)dataArr{
+    
+    
+    _dataArr = dataArr;
+    
+    _dataModelArr = [NSMutableArray array];
+    
+    for (NSInteger i = 0; i<_dataArr.count; i++) {
+        
+        JHTableDataRowModel *model = [JHTableDataRowModel new];
+        model.maxCount = 1;
+        
+        for (id obj in _dataArr[i]) {
+            
+            if ([obj isKindOfClass:[NSArray class]]) {
+                if (model.maxCount<=[obj count]) {
+                    model.maxCount = [obj count];
+                }
+            }
+        }
+        model.dataArr = dataArr[i];
+      
+        [_dataModelArr addObject:model];
+    }
+    
+    
+    
+}
+
+
+/**
+ *  CoreGraphic ������
+ *
+ *  @param rect
+ */
+-(void)drawRect:(CGRect)rect{
+    
+    CGContextRef context = UIGraphicsGetCurrentContext();
+    /*        ������������������         */
+    
+    /*        ���         */
+    [self drawLineWithContext:context andStarPoint:P_M(_beginSpace, _beginSpace) andEndPoint:P_M(CGRectGetWidth(self.frame) - _beginSpace , _beginSpace) andIsDottedLine:NO andColor:_lineColor];
+    
+    /*        ���         */
+    [self drawLineWithContext:context andStarPoint:P_M(_beginSpace, _beginSpace + _tableHeight) andEndPoint:P_M(CGRectGetWidth(self.frame) - _beginSpace ,_beginSpace + _tableHeight) andIsDottedLine:NO andColor:_lineColor];
+    
+    
+    NSLog(@"������������%@\n",NSStringFromCGRect(self.frame));
+    NSLog(@"������������%f\n",_beginSpace);
+    
+    /*        ���         */
+    [self drawLineWithContext:context andStarPoint:P_M(_beginSpace, _beginSpace) andEndPoint:P_M(_beginSpace,  _beginSpace + _tableHeight) andIsDottedLine:NO andColor:_lineColor];
+    
+    /*        ���         */
+    [self drawLineWithContext:context andStarPoint:P_M(CGRectGetWidth(self.frame) - _beginSpace, _beginSpace) andEndPoint:P_M(CGRectGetWidth(self.frame) - _beginSpace,  _beginSpace + _tableHeight) andIsDottedLine:NO andColor:_lineColor];
+    
+    /*        ������         */
+    if (_tableTitleString.length>0) {
+        [self drawLineWithContext:context andStarPoint:P_M(_beginSpace, _beginSpace +_tableChartTitleItemsHeight) andEndPoint:P_M(CGRectGetWidth(self.frame) - _beginSpace , _beginSpace+_tableChartTitleItemsHeight) andIsDottedLine:NO andColor:_lineColor];
+
+        CGSize size = [self sizeOfStringWithMaxSize:CGSizeMake(_tableWidth, _tableChartTitleItemsHeight) textFont:_tableTitleFont.pointSize aimString:_tableTitleString];
+        [self drawText:_tableTitleString context:context atPoint:CGRectMake(CGRectGetWidth(self.frame)/2.0 - size.width / 2, _beginSpace + _tableChartTitleItemsHeight/2 - size.height / 2.0, _tableWidth, _tableChartTitleItemsHeight) WithColor:_tableTitleColor font:_tableTitleFont];
+        _lastY = _beginSpace + _tableChartTitleItemsHeight;
+    }
+    
+    
+    /*        ���������������������         */
+    if (_colTitleArr.count>0) {
+        
+        BOOL hasSetColWidth = 0;
+        /*        ���������������������������         */
+        if (_colTitleArr.count == _colWidthArr.count) {
+            
+            hasSetColWidth = YES;
+            
+        }else{
+            hasSetColWidth = NO;
+        }
+        
+        CGFloat lastX = _beginSpace;
+        for (NSInteger i = 0; i<_colTitleArr.count; i++) {
+            
+            
+            
+            CGFloat wid = (hasSetColWidth?[_colWidthArr[i] floatValue]:_tableWidth / _colTitleArr.count);
+            
+            NSLog(@"���%d��� ������ ��� %f\n",i,wid);
+            
+            CGSize size = [self sizeOfStringWithMaxSize:CGSizeMake(wid, _minHeightItems) textFont:14 aimString:_colTitleArr[i]];
+            
+            
+            if (i==0) {
+
+                NSArray *firArr = [_colTitleArr[0] componentsSeparatedByString:@"|"];
+                if (firArr.count>=2) {
+                    [self drawLineWithContext:context andStarPoint:P_M(lastX, _lastY) andEndPoint:P_M(lastX + wid, _lastY + _minHeightItems) andIsDottedLine:NO andColor:_lineColor];
+                    size = [self sizeOfStringWithMaxSize:CGSizeMake(wid, _minHeightItems) textFont:14 aimString:firArr[0]];
+
+                    [self drawText:firArr[0] context:context atPoint:CGRectMake(lastX + wid / 2.0 + wid / 4.0 - size.width / 2, _lastY + _minHeightItems / 4.0 -size.height / 2.0, wid, _minHeightItems / 2.0) WithColor:_bodyTextColor font:_tableTitleFont];
+                    size = [self sizeOfStringWithMaxSize:CGSizeMake(wid, _minHeightItems) textFont:14 aimString:firArr[1]];
+
+                    [self drawText:firArr[1] context:context atPoint:CGRectMake(lastX + wid / 4.0 - size.width / 2.0, _lastY + _minHeightItems / 2.0 + _minHeightItems / 4.0 - size.height / 2.0, size.width+5, _minHeightItems / 2.0) WithColor:_bodyTextColor font:_tableTitleFont];
+                }else{
+
+                    [self drawText:_colTitleArr[i] context:context atPoint:CGRectMake(lastX + wid / 2.0 - size.width / 2, _lastY + _minHeightItems / 2.0 -size.height / 2.0, wid, size.height) WithColor:_bodyTextColor font:[UIFont systemFontOfSize:14]];;
+                }
+                
+                
+            }else{
+            
+                [self drawText:_colTitleArr[i] context:context atPoint:CGRectMake(lastX + wid / 2.0 - size.width / 2, _lastY + _minHeightItems / 2.0 -size.height / 2.0, wid, _minHeightItems) WithColor:_bodyTextColor font:[UIFont systemFontOfSize:14]];;
+            }
+            lastX += wid;
+            if (i==_colTitleArr.count - 1) {
+                
+            }else
+                [self drawLineWithContext:context andStarPoint:P_M(lastX, _lastY) andEndPoint:P_M(lastX, _lastY + _bodyHeight) andIsDottedLine:NO andColor:_lineColor];
+            
+            
+        }
+        _lastY += _minHeightItems;
+    }
+    /*        ���������������         */
+    [self drawLineWithContext:context andStarPoint:P_M(_beginSpace, _lastY ) andEndPoint:P_M(_beginSpace + _tableWidth, _lastY ) andIsDottedLine:NO andColor:_lineColor];
+    
+    
+    
+    
+    BOOL hasSetColWidth = 0;
+    /*        ���������������������������         */
+    if (_colTitleArr.count == _colWidthArr.count && _colTitleArr.count>0) {
+        
+        hasSetColWidth = YES;
+        
+    }else{
+        hasSetColWidth = NO;
+    }
+
+    /*        ������������������������         */
+    
+    for (NSInteger i = 0; i<_dataModelArr.count; i++) {
+        
+        
+        JHTableDataRowModel *model = _dataModelArr[i];
+        
+        [self drawLineWithContext:context andStarPoint:P_M(_beginSpace, _lastY + model.maxCount * _minHeightItems) andEndPoint:P_M(_beginSpace + _tableWidth, _lastY + model.maxCount * _minHeightItems) andIsDottedLine:NO andColor:_lineColor];
+        
+        CGFloat lastX = _beginSpace;
+        
+        for (NSInteger j = 0; j< model.dataArr.count; j++) {
+            
+            
+            id rowItems = model.dataArr[j];
+            
+          
+            CGFloat wid = (hasSetColWidth?[_colWidthArr[j] floatValue]:_tableWidth / _colTitleArr.count);
+            if ([rowItems isKindOfClass:[NSArray class]]) {
+                
+                CGFloat perItemsHeightByMaxCount = model.maxCount * _minHeightItems / [rowItems count];
+                /*       ���������������������������������       */
+                for (NSInteger n = 0; n<[rowItems count]; n++) {
+                    
+                    [self drawLineWithContext:context andStarPoint:P_M(lastX, _lastY + (n+1) * perItemsHeightByMaxCount) andEndPoint:P_M(lastX + wid, _lastY + (n+1) * perItemsHeightByMaxCount) andIsDottedLine:NO andColor:_lineColor];
+                    CGSize size = [self sizeOfStringWithMaxSize:CGSizeMake(wid, perItemsHeightByMaxCount) textFont:_tableTitleFont.pointSize aimString:rowItems[n]];
+//                    P_M(lastX + wid / 2 - size.width / 2.0, _lastY + (n+1) * perItemsHeightByMaxCount - perItemsHeightByMaxCount / 2.0 - size.height / 2.0)
+                    [self drawText:rowItems[n] context:context atPoint:CGRectMake(lastX + wid / 2 - size.width / 2.0, _lastY + (n+1) * perItemsHeightByMaxCount - perItemsHeightByMaxCount / 2.0 - size.height / 2.0, size.width, size.height) WithColor:_bodyTextColor font:_tableTitleFont];
+                }
+                
+            }else{
+                
+                CGSize size = [self sizeOfStringWithMaxSize:CGSizeMake(wid, model.maxCount * _minHeightItems) textFont:_tableTitleFont.pointSize aimString:rowItems];
+
+                  [self drawText:rowItems context:context atPoint:CGRectMake(lastX + wid / 2 - size.width / 2.0,  _lastY + model.maxCount * _minHeightItems - model.maxCount * _minHeightItems / 2.0 - size.height / 2.0, size.width, size.height) WithColor:_bodyTextColor font:_tableTitleFont];
+            }
+            lastX += wid;
+
+            
+        }
+        _lastY += model.maxCount * _minHeightItems;
+        
+        
+        
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+}
+
+
+/**
+ *  ���������������������
+ */
+- (void)configBaseData{
+    _tableWidth = CGRectGetWidth(self.frame) - _beginSpace * 2;
+    
+    [self configColWidthArr];
+    [self countTableHeight];
+    
+}
+
+
+/**
+ *  ���������������
+ */
+- (void)configColWidthArr{
+    
+    CGFloat wid = 0;
+
+    if (_colTitleArr.count>0&&_colTitleArr.count == _colWidthArr.count) {
+        NSMutableArray *arr = [NSMutableArray array];
+        for (NSInteger i = 0; i<_colWidthArr.count; i++) {
+            
+            if (wid>_tableWidth) {
+                arr = nil;
+            }else{
+                if (i==_colWidthArr.count-1) {
+                    
+                    [arr addObject:[NSNumber numberWithFloat:(_tableWidth - wid)]];
+                }else
+                    [arr addObject:_colWidthArr[i]];
+                
+            }
+            wid += [_colWidthArr[i] floatValue];
+        }
+        _colWidthArr = [arr copy];
+      
+    }else{
+        _colWidthArr = nil;
+    }
+    
+}
+
+/**
+ *  ���������������������������������������
+ */
+- (void)countTableHeight{
+    
+    NSInteger rowCount = 0;
+    for (NSArray * itemsArr in _dataArr) {
+        
+        NSInteger nowCount = 1;
+        
+        for (id obj in itemsArr) {
+            
+            if ([obj isKindOfClass:[NSArray class]]) {
+                
+                if (nowCount<=[obj count]) {
+                    nowCount = [obj count];
+                }
+                
+            }
+            
+        }
+        rowCount += nowCount;
+    }
+    
+    _bodyHeight = rowCount * _minHeightItems  + (_colTitleArr.count>0?_minHeightItems:0);
+    _tableHeight = 0;
+    _tableHeight += (_tableTitleString.length>0?_tableChartTitleItemsHeight:0) + _bodyHeight;
+}
+
+/**
+ *  ������������
+ */
+-(void)showAnimation{
+    
+    [self configBaseData];
+    
+    [self setNeedsDisplay];
+    
+    
+    
+    
+}
+
+/**
+ *  ������������������������������
+ *
+ *  @return ������
+ */
+- (CGFloat)heightFromThisDataSource{
+    [self countTableHeight];
+    return _tableHeight + _beginSpace * 2;
+    
+}
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHTableDataRowModel.h b/JHChart/JHChartDemo/JHChart/JHTableDataRowModel.h
new file mode 100755
index 0000000..9712761
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHTableDataRowModel.h
@@ -0,0 +1,26 @@
+//
+//  JHTableDataRowModel.h
+//  JHChartDemo
+//
+//  Created by ������ on 16/8/25.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+@interface JHTableDataRowModel : NSObject
+
+/**
+ *  The maximum number of columns in the model.
+ */
+@property (nonatomic, assign) NSInteger maxCount;
+
+
+/**
+ *  Data Source Array
+ */
+@property (nonatomic, strong) NSArray * dataArr;
+
+
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHTableDataRowModel.m b/JHChart/JHChartDemo/JHChart/JHTableDataRowModel.m
new file mode 100755
index 0000000..e479251
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHTableDataRowModel.m
@@ -0,0 +1,13 @@
+//
+//  JHTableDataRowModel.m
+//  JHChartDemo
+//
+//  Created by ������ on 16/8/25.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import "JHTableDataRowModel.h"
+
+@implementation JHTableDataRowModel
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHWaveChart.h b/JHChart/JHChartDemo/JHChart/JHWaveChart.h
new file mode 100755
index 0000000..2991a99
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHWaveChart.h
@@ -0,0 +1,36 @@
+//
+//  JHWaveChart.h
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/4/13.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import "JHChart.h"
+
+typedef NS_ENUM(NSInteger,JHWaveChartType){
+    
+    JHWaveChartUpType = 0,
+    JHWaveChartUpAndDownType
+    
+};
+
+@interface JHWaveChart : JHChart
+
+
+
+
+/*         X���������������          */
+@property (nonatomic, strong) NSArray * xLineDataArr;
+
+
+/*         ���������������          */
+@property (nonatomic, strong) NSArray * valueDataArr;
+
+
+@property (nonatomic, strong) UIColor * xAndYLineColor;
+-(instancetype)initWithFrame:(CGRect)frame andType:(JHWaveChartType)waveChartType;
+
+
+
+@end
diff --git a/JHChart/JHChartDemo/JHChart/JHWaveChart.m b/JHChart/JHChartDemo/JHChart/JHWaveChart.m
new file mode 100755
index 0000000..7ef321f
--- /dev/null
+++ b/JHChart/JHChartDemo/JHChart/JHWaveChart.m
@@ -0,0 +1,111 @@
+//
+//  JHWaveChart.m
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/4/13.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import "JHWaveChart.h"
+
+@interface JHWaveChart()
+
+
+@property (nonatomic,strong) NSArray * yLineDataArr;
+@property (assign , nonatomic) JHWaveChartType  waveChartType ;
+@property (assign , nonatomic) CGFloat  perXLength ;
+@property (assign , nonatomic) CGFloat  xLength ;
+@property (assign , nonatomic) CGFloat  yLength ;
+@property (assign , nonatomic) CGPoint  originPoint ;
+@end
+
+
+@implementation JHWaveChart
+
+
+-(instancetype)initWithFrame:(CGRect)frame andType:(JHWaveChartType)waveChartType{
+    
+    if (self = [super initWithFrame:frame]) {
+        self.backgroundColor = [UIColor whiteColor];
+        _waveChartType = waveChartType;
+        _xLineDataArr = @[@0,@1,@2,@3,@4,@5,@6,@7];
+        _xAndYLineColor = [UIColor darkGrayColor];
+        self.contentInsets = UIEdgeInsetsMake(10, 10, 10, 10);
+    }
+    
+    return self;
+}
+
+
+
+
+- (void)countPerXandPerYLength{
+    _xLength = CGRectGetWidth(self.frame) - self.contentInsets.left - self.contentInsets.right;
+    _yLength = CGRectGetHeight(self.frame) - self.contentInsets.top - self.contentInsets.bottom;
+    
+    if (_xLineDataArr.count) {
+        _perXLength = _xLength/(_xLineDataArr.count-1);
+    }
+    
+    switch (_waveChartType) {
+        case JHWaveChartUpType:
+        {
+            _originPoint = P_M(self.contentInsets.left, CGRectGetHeight(self.frame) - self.contentInsets.bottom);
+            
+        }
+            break;
+        case JHWaveChartUpAndDownType:
+        {
+            
+        }
+            break;
+        default:
+            break;
+    }
+    
+    
+}
+
+
+- (void)drawRect:(CGRect)rect {
+
+    CGContextRef context = UIGraphicsGetCurrentContext();
+    [self countPerXandPerYLength];
+    if (_xLineDataArr.count) {
+        /* ������X��� */
+        [self drawXLineWithContext:context];
+        
+    }
+    
+    
+}
+
+/**
+ *  ������X���
+ *
+ */
+- (void)drawXLineWithContext:(CGContextRef)contex{
+    
+    [self drawLineWithContext:contex andStarPoint:P_M(self.contentInsets.left, CGRectGetHeight(self.frame)-self.contentInsets.bottom) andEndPoint:P_M(CGRectGetWidth(self.frame)-self.contentInsets.right, CGRectGetHeight(self.frame)-self.contentInsets.bottom) andIsDottedLine:NO andColor:_xAndYLineColor];
+    
+    for (NSInteger i =0 ; i<_xLineDataArr.count ; i++) {
+        
+        [self drawLineWithContext:contex andStarPoint:P_M(i*_perXLength, _originPoint.y) andEndPoint:P_M(i*_perXLength, _originPoint.y-3) andIsDottedLine:NO andColor:_xAndYLineColor];
+        CGFloat len = [self getTextWithWhenDrawWithText:_xLineDataArr[i]];
+        [self drawText:_xLineDataArr[i] andContext:contex atPoint:P_M(i*_perXLength-len/2+_originPoint.x, _originPoint.y+5) WithColor:_xAndYLineColor andFontSize:8];
+        
+    }
+    
+}
+
+-(void)setValueDataArr:(NSArray *)valueDataArr{
+    
+    
+    _valueDataArr = valueDataArr;
+    
+    [self setNeedsDisplay];
+    
+}
+
+
+@end
diff --git a/JHChart/JHChartDemo/JHShowController.h b/JHChart/JHChartDemo/JHShowController.h
new file mode 100755
index 0000000..26ee095
--- /dev/null
+++ b/JHChart/JHChartDemo/JHShowController.h
@@ -0,0 +1,16 @@
+//
+//  JHShowController.h
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/4/12.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface JHShowController : UIViewController
+
+@property (assign , nonatomic) NSInteger  index ;
+
+
+@end
diff --git a/JHChart/JHChartDemo/JHShowController.m b/JHChart/JHChartDemo/JHShowController.m
new file mode 100755
index 0000000..62ef732
--- /dev/null
+++ b/JHChart/JHChartDemo/JHShowController.m
@@ -0,0 +1,370 @@
+//
+//  JHShowController.m
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/4/12.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import "JHShowController.h"
+#import "JHChartHeader.h"
+#define k_MainBoundsWidth [UIScreen mainScreen].bounds.size.width
+#define k_MainBoundsHeight [UIScreen mainScreen].bounds.size.height
+@interface JHShowController ()
+
+@end
+
+@implementation JHShowController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    self.view.backgroundColor = [UIColor whiteColor];
+    self.automaticallyAdjustsScrollViewInsets = NO;
+    switch (_index) {
+        case 0:
+        {
+            [self showFirstQuardrant];
+        }
+            break;
+        case 1:
+        {
+            [self showFirstAndSecondQuardrant];
+            
+        }
+            break;
+        case 2:
+        {
+            [self showFirstAndFouthQuardrant];
+        }
+            break;
+        case 3:
+        {
+            [self showAllQuardrant];
+        }
+            break;
+        case 4:
+        {
+            [self showPieChartUpView];
+        }
+            break;
+        case 5:
+        {
+            [self showRingChartView];
+        }
+            break;
+        case 6:
+        {
+            [self showColumnView];
+        }break;
+            case 7:
+        {
+            [self showTableView];
+        }break;
+            case 8:
+        {
+            [self showRadarChartView];
+        }break;
+        default:
+            break;
+    }
+    
+    
+    
+}
+
+
+//���������������������
+- (void)showFirstQuardrant{
+    /*     Create object        */
+    JHLineChart *lineChart = [[JHLineChart alloc] initWithFrame:CGRectMake(10, 40, k_MainBoundsWidth-20, 300) andLineChartType:JHChartLineValueNotForEveryX];
+    
+    /* The scale value of the X axis can be passed into the NSString or NSNumber type and the data structure changes with the change of the line chart type. The details look at the document or other quadrant X axis data source sample.*/
+    
+    lineChart.xLineDataArr = @[@"0",@"1",@"2",@3,@4,@5,@6,@7];
+    
+    /* The different types of the broken line chart, according to the quadrant division, different quadrant correspond to different X axis scale data source and different value data source. */
+    
+    lineChart.lineChartQuadrantType = JHLineChartQuadrantTypeFirstQuardrant;
+    
+    lineChart.valueArr = @[@[@"1",@"12",@"1",@6,@4,@9,@6,@7],@[@"3",@"1",@"2",@16,@2,@3,@5,@10]];
+//    lineChart.showYLevelLine = YES;
+    lineChart.showValueLeadingLine = NO;
+    /* Line Chart colors */
+    lineChart.valueLineColorArr =@[ [UIColor purpleColor], [UIColor brownColor]];
+    /* Colors for every line chart*/
+    lineChart.pointColorArr = @[[UIColor orangeColor],[UIColor yellowColor]];
+    /* color for XY axis */
+    lineChart.xAndYLineColor = [UIColor blackColor];
+    /* XY axis scale color */
+    lineChart.xAndYNumberColor = [UIColor blueColor];
+    /* Dotted line color of the coordinate point */
+    lineChart.positionLineColorArr = @[[UIColor blueColor],[UIColor greenColor]];
+    /*        Set whether to fill the content, the default is False         */
+    lineChart.contentFill = YES;
+    /*        Set whether the curve path         */
+    lineChart.pathCurve = YES;
+    /*        Set fill color array         */
+    lineChart.contentFillColorArr = @[[UIColor colorWithRed:0.500 green:0.000 blue:0.500 alpha:0.468],[UIColor colorWithRed:0.500 green:0.214 blue:0.098 alpha:0.468]];
+    [self.view addSubview:lineChart];
+    /*       Start animation        */
+    [lineChart showAnimation];
+}
+
+
+//���������������
+- (void)showFirstAndSecondQuardrant
+{
+    JHLineChart *lineChart = [[JHLineChart alloc] initWithFrame:CGRectMake(10, 100, k_MainBoundsWidth-20, 300) andLineChartType:JHChartLineValueNotForEveryX];
+    lineChart.xLineDataArr = @[@"-3.1",@"-2.5",@"-1.6",@"1.8"];
+    //lineChart.xLineDataArr = @[@[@"-3",@"-2",@"-1"],@[@0,@1,@2,@3]];
+	
+    lineChart.lineChartQuadrantType = JHLineChartQuadrantTypeFirstQuardrant;
+    lineChart.valueArr = @[@[@"5",@"2",@"7",@"15"]];
+    //lineChart.valueArr = @[@[@"5",@"2",@"7",@4,@25,@15,@6],@[@"1",@"2",@"1",@6,@4,@9,@7]];
+
+    /* ������������������������ ���������������*/
+    lineChart.valueLineColorArr =@[ [UIColor purpleColor]];
+    //lineChart.valueLineColorArr =@[ [UIColor purpleColor], [UIColor brownColor]];
+
+    
+    /* ��������������� ���������������*/
+    lineChart.pointColorArr = @[[UIColor whiteColor]];
+    //lineChart.pointColorArr = @[[UIColor orangeColor],[UIColor yellowColor]];
+
+    
+    /* X���Y������������ ��������������� */
+    lineChart.xAndYLineColor = [UIColor greenColor];
+    
+    lineChart.showYLevelLine = YES;
+    /* XY������������������ m */
+    lineChart.xAndYNumberColor = [UIColor blueColor];
+ 
+    [self.view addSubview:lineChart];
+    
+    /*        ������������������������         */
+    lineChart.contentFill = YES;
+    
+    /*        ������������������         */
+    lineChart.pathCurve = YES;
+    
+    /*        ������������������         */
+    //lineChart.contentFillColorArr = @[[UIColor colorWithRed:1.000 green:0.000 blue:0.000 alpha:0.386]];
+    [lineChart showAnimation];
+    
+    /* ��������������������� */
+//    [lineChart clear];
+}
+
+//���������������
+- (void)showFirstAndFouthQuardrant{
+    JHLineChart *lineChart = [[JHLineChart alloc] initWithFrame:CGRectMake(10, 100, k_MainBoundsWidth-20, 300) andLineChartType:JHChartLineValueNotForEveryX];
+    lineChart.xLineDataArr = @[@"0",@"1",@"2",@3,@4,@5,@6,@7];
+    lineChart.lineChartQuadrantType = JHLineChartQuadrantTypeFirstAndFouthQuardrant;
+    lineChart.valueArr = @[@[@"5",@"-22",@"7",@(-4),@25,@15,@6,@9],@[@"1",@"-12",@"1",@6,@4,@(-8),@6,@7]];
+    /* ������������������������ ���������������*/
+    lineChart.valueLineColorArr =@[ [UIColor purpleColor], [UIColor brownColor]];
+    
+    /* ��������������� ���������������*/
+    lineChart.pointColorArr = @[[UIColor orangeColor],[UIColor yellowColor]];
+   
+    /*        ������������Y��������������� ���������        */
+    lineChart.showYLevelLine = NO;
+    
+    /* X���Y������������ ��������������� */
+    lineChart.xAndYLineColor = [UIColor greenColor];
+    
+    /* XY������������������ m */
+    lineChart.xAndYNumberColor = [UIColor blueColor];
+    
+    lineChart.contentFill = YES;
+    
+    lineChart.pathCurve = YES;
+    
+    lineChart.contentFillColorArr = @[[UIColor colorWithRed:1.000 green:0.000 blue:0.000 alpha:0.386],[UIColor colorWithRed:0.000 green:0.002 blue:0.832 alpha:0.472]];
+    [self.view addSubview:lineChart];
+    [lineChart showAnimation];
+}
+
+
+/**
+ *  ������������������ 
+ */
+- (void)showAllQuardrant{
+    
+    JHLineChart *lineChart = [[JHLineChart alloc] initWithFrame:CGRectMake(10, 100, k_MainBoundsWidth-20, 300) andLineChartType:JHChartLineValueNotForEveryX];
+    
+    lineChart.xLineDataArr = @[@[@"-3",@"-2",@"-1"],@[@0,@1,@2,@3]];
+    lineChart.lineChartQuadrantType = JHLineChartQuadrantTypeAllQuardrant;
+      lineChart.valueArr = @[@[@"5",@"-22",@"70",@(-4),@25,@15,@6,@9],@[@"1",@"-12",@"1",@6,@4,@(-8),@6,@7]];    /* ������������������������ ���������������*/
+    lineChart.valueLineColorArr =@[ [UIColor purpleColor], [UIColor brownColor]];
+    
+    /* ��������������� ���������������*/
+    lineChart.pointColorArr = @[[UIColor orangeColor],[UIColor yellowColor]];
+    
+    /* X���Y������������ ��������������� */
+    lineChart.xAndYLineColor = [UIColor greenColor];
+    
+    /* XY������������������ m */
+    lineChart.xAndYNumberColor = [UIColor blueColor];
+
+    [self.view addSubview:lineChart];
+    
+    [lineChart showAnimation];
+}
+
+
+/**
+ *  ���������
+ */
+- (void)showPieChartUpView{
+    JHPieChart *pie = [[JHPieChart alloc] initWithFrame:CGRectMake(100, 100, 321, 421)];
+    pie.center = CGPointMake(CGRectGetMaxX(self.view.frame)/2, CGRectGetMaxY(self.view.frame)/2);
+    /* Pie chart value, will automatically according to the percentage of numerical calculation */
+    pie.valueArr = @[@18,@10,@25,@40,@18,@10,@25,@40,@18,@10,@15,@12,@30,@18];
+    /* The description of each sector must be filled, and the number must be the same as the pie chart. */
+    pie.descArr = @[@"���������������",@"���������������",@"���������������",@"���������������",@"5",@"6",@"7",@"8",@"9",@"10",@"23",@"12",@"21",@"30"];
+    pie.backgroundColor = [UIColor whiteColor];
+    [self.view addSubview:pie];
+    /*    When touching a pie chart, the animation offset value     */
+    pie.positionChangeLengthWhenClick = 15;
+    /*        Start animation         */
+    [pie showAnimation];}
+
+
+//���������
+- (void)showRingChartView{
+    JHRingChart *ring = [[JHRingChart alloc] initWithFrame:CGRectMake(0, 100, k_MainBoundsWidth, k_MainBoundsWidth)];
+    /*        background color         */
+    ring.backgroundColor = [UIColor blackColor];
+    /*        Data source array, only the incoming value, the corresponding ratio will be automatically calculated         */
+    ring.valueDataArr = @[@"0.5",@"5",@"2",@"10",@"6",@"6"];
+    /*         Width of ring graph        */
+    ring.ringWidth = 35.0;
+    /*        Fill color for each section of the ring diagram         */
+    ring.fillColorArray = @[[UIColor colorWithRed:1.000 green:0.783 blue:0.371 alpha:1.000], [UIColor colorWithRed:1.000 green:0.562 blue:0.968 alpha:1.000],[UIColor colorWithRed:0.313 green:1.000 blue:0.983 alpha:1.000],[UIColor colorWithRed:0.560 green:1.000 blue:0.276 alpha:1.000],[UIColor colorWithRed:0.239 green:0.651 blue:0.170 alpha:1.000],[UIColor colorWithRed:0.239 green:0.651 blue:0.170 alpha:1.000]];
+    /*        Start animation             */
+    [ring showAnimation];
+    [self.view addSubview:ring];
+}
+
+//���������
+- (void)showColumnView{
+    JHColumnChart *column = [[JHColumnChart alloc] initWithFrame:CGRectMake(0, 100, k_MainBoundsWidth, k_MainBoundsWidth)];
+    /*        Create an array of data sources, each array is a module data. For example, the first array can represent the average score of a class of different subjects, the next array represents the average score of different subjects in another class        */
+    column.valueArr = @[
+                        @[@12,@15,@20],
+                        @[@22,@15,@20],
+                        @[@12,@5,@40],
+                        @[@2,@15,@20]
+                        ];
+    /*       This point represents the distance from the lower left corner of the origin.         */
+    column.originSize = CGPointMake(30, 30);
+    /*    The first column of the distance from the starting point     */
+    column.drawFromOriginX = 10;
+    /*        Column width         */
+    column.columnWidth = 40;
+    /*        Column backgroundColor         */
+    column.bgVewBackgoundColor = [UIColor blackColor];
+    /*        X, Y axis font color         */
+    column.drawTextColorForX_Y = [UIColor greenColor];
+    /*        X, Y axis line color         */
+    column.colorForXYLine = [UIColor greenColor];
+    /*    Each module of the color array, such as the A class of the language performance of the color is red, the color of the math achievement is green     */
+    column.columnBGcolorsArr = @[[UIColor redColor],[UIColor greenColor],[UIColor orangeColor]];
+    /*        Module prompt         */
+    column.xShowInfoText = @[@"A������",@"B������",@"C������",@"D������"];
+    /*       Start animation        */
+    [column showAnimation];
+    [self.view addSubview:column];
+}
+
+
+
+
+
+/**
+ *  ������������������
+ */
+- (void)showTableView{
+    JHTableChart *table = [[JHTableChart alloc] initWithFrame:CGRectMake(10, 64, k_MainBoundsWidth-20, k_MainBoundsHeight)];
+    /*       Table name         */
+//    table.tableTitleString = @"������jeep���������";
+    /*        Each column of the statement, one of the first to show if the rows and columns that can use the vertical segmentation of rows and columns         */
+//    table.colTitleArr = @[@"������|������",@"������",@"������",@"������",@"",@"",@"",@"",@"",@""];
+    table.colTitleArr = @[@"������|������",@"������",@"������",@"������"];
+    /*        The width of the column array, starting with the first column         */
+    table.colWidthArr = @[@80.0,@120.0,@70,@100];
+//    table.colWidthArr = @[@80.0,@30.0,@70,@50,@50,@50,@50,@50,@50,@50];
+//    table.beginSpace = 30;
+    /*        Text color of the table body         */
+    table.bodyTextColor = [UIColor redColor];
+    /*        Minimum grid height         */
+    table.minHeightItems = 40;
+    /*        Table line color         */
+    table.lineColor = [UIColor orangeColor];
+    /*       Data source array, in accordance with the data from top to bottom that each line of data, if one of the rows of a column in a number of cells, can be stored in an array of         */
+    table.dataArr = @[
+                      @[@"2.4L���������",@"2016���������������������",@[@"���������",@"������",@"���������"],@[@"4"]],
+                      @[@"2.4���������",@[@"2016���������������������",@"2016������������������",@"2016������������������������"],@[@"���������",@"������",@"���������",@"���������������"],@[@"4",@"5",@"3"]],
+                      @[@"2.4���������",@[@"4",@"3",@"2"]],
+                      @[@"2.4���������"]
+                      ];
+    /*        show                            */
+    [table showAnimation];
+    [self.view addSubview:table];
+    /*        Automatic calculation table height        */
+    table.frame = CGRectMake(10, 64, k_MainBoundsWidth-20, [table heightFromThisDataSource]);
+}
+
+
+- (void)showRadarChartView{
+    
+    
+    JHRadarChart *radarChart = [[JHRadarChart alloc] initWithFrame:CGRectMake(10, 74, k_MainBoundsWidth - 20, k_MainBoundsWidth - 20)];
+    radarChart.backgroundColor = [UIColor whiteColor];
+    /*       Each point of the description text, according to the number of the array to determine the number of basic modules         */
+    radarChart.valueDescArray = @[@"������",@"������",@"������",@"������",@"������",@"������"];
+    
+    /*         Number of basic module layers        */
+    radarChart.layerCount = 5;
+    
+    /*        Array of data sources, the need to add an array of arrays         */
+    radarChart.valueDataArray = @[@[@"80",@"40",@"100",@"76",@"75",@"50"],@[@"50",@"80",@"30",@"46",@"35",@"50"]];
+    
+    /*        Color of each basic module layer         */
+    radarChart.layerFillColor = [UIColor colorWithRed:94/ 256.0 green:187/256.0 blue:242 / 256.0 alpha:0.5];
+    
+    /*        The fill color of the value module is required to specify the color for each value module         */
+    radarChart.valueDrawFillColorArray = @[[UIColor colorWithRed:57/ 256.0 green:137/256.0 blue:21 / 256.0 alpha:0.5],[UIColor colorWithRed:149/ 256.0 green:68/256.0 blue:68 / 256.0 alpha:0.5]];
+    
+    /*       show        */
+    [radarChart showAnimation];
+    
+    [self.view addSubview:radarChart];
+    
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@end
diff --git a/JHChart/JHChartDemo/ViewController.h b/JHChart/JHChartDemo/ViewController.h
new file mode 100755
index 0000000..ead999a
--- /dev/null
+++ b/JHChart/JHChartDemo/ViewController.h
@@ -0,0 +1,15 @@
+//
+//  ViewController.h
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/4/10.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface ViewController : UIViewController
+
+
+@end
+
diff --git a/JHChart/JHChartDemo/ViewController.m b/JHChart/JHChartDemo/ViewController.m
new file mode 100755
index 0000000..6aa5301
--- /dev/null
+++ b/JHChart/JHChartDemo/ViewController.m
@@ -0,0 +1,78 @@
+//
+//  ViewController.m
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/4/10.
+//  Copyright �� 2016��� JH. All rights reserved.
+//  T
+
+#import "ViewController.h"
+#import "JHShowController.h"
+
+@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>
+@property (nonatomic,strong) NSArray * itemsArr;
+@property (nonatomic,strong) UITableView * tableView;
+@end
+
+@implementation ViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+   
+    self.view.backgroundColor = [UIColor whiteColor];
+
+    
+      _itemsArr = @[@"���������-������������",@"���������-���������������",@"������������������������",@"���������-���������",@"������",@"���������",@"���������",@"������",@"���������"];
+
+    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, self.view.frame.size.height-64) style:UITableViewStylePlain];
+    _tableView.dataSource = self;
+    _tableView.delegate  =self;
+    [self.view addSubview:_tableView];
+    
+}
+
+- (void)didReceiveMemoryWarning {
+    [super didReceiveMemoryWarning];
+    // Dispose of any resources that can be recreated.
+}
+
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+    
+    return 1;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+
+    return _itemsArr.count;
+}
+
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuseIdentifier"];
+    
+    if (!cell) {
+        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"reuseIdentifier"];
+    }
+    
+    cell.textLabel.text = _itemsArr[indexPath.row];
+    cell.textLabel.textAlignment = NSTextAlignmentCenter;
+    return cell;
+}
+
+
+-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
+    
+    
+    JHShowController *show = [JHShowController new];
+    
+    show.index = indexPath.row;
+    
+    [self.navigationController pushViewController:show animated:YES];  
+    
+    
+    
+}
+
+
+@end
diff --git a/JHChart/JHChartDemo/main.m b/JHChart/JHChartDemo/main.m
new file mode 100755
index 0000000..46726c3
--- /dev/null
+++ b/JHChart/JHChartDemo/main.m
@@ -0,0 +1,16 @@
+//
+//  main.m
+//  JHChartDemo
+//
+//  Created by cjatech-������ on 16/4/10.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import "AppDelegate.h"
+
+int main(int argc, char * argv[]) {
+    @autoreleasepool {
+        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+    }
+}
diff --git a/JHChart/JHChartDemoTests/Info.plist b/JHChart/JHChartDemoTests/Info.plist
new file mode 100755
index 0000000..ba72822
--- /dev/null
+++ b/JHChart/JHChartDemoTests/Info.plist
@@ -0,0 +1,24 @@
+<?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>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundlePackageType</key>
+	<string>BNDL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+</dict>
+</plist>
diff --git a/JHChart/JHChartDemoTests/JHChartDemoTests.m b/JHChart/JHChartDemoTests/JHChartDemoTests.m
new file mode 100755
index 0000000..4d1b76b
--- /dev/null
+++ b/JHChart/JHChartDemoTests/JHChartDemoTests.m
@@ -0,0 +1,39 @@
+//
+//  JHChartDemoTests.m
+//  JHChartDemoTests
+//
+//  Created by cjatech-������ on 16/4/10.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import <XCTest/XCTest.h>
+
+@interface JHChartDemoTests : XCTestCase
+
+@end
+
+@implementation JHChartDemoTests
+
+- (void)setUp {
+    [super setUp];
+    // Put setup code here. This method is called before the invocation of each test method in the class.
+}
+
+- (void)tearDown {
+    // Put teardown code here. This method is called after the invocation of each test method in the class.
+    [super tearDown];
+}
+
+- (void)testExample {
+    // This is an example of a functional test case.
+    // Use XCTAssert and related functions to verify your tests produce the correct results.
+}
+
+- (void)testPerformanceExample {
+    // This is an example of a performance test case.
+    [self measureBlock:^{
+        // Put the code you want to measure the time of here.
+    }];
+}
+
+@end
diff --git a/JHChart/JHChartDemoUITests/Info.plist b/JHChart/JHChartDemoUITests/Info.plist
new file mode 100755
index 0000000..ba72822
--- /dev/null
+++ b/JHChart/JHChartDemoUITests/Info.plist
@@ -0,0 +1,24 @@
+<?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>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundlePackageType</key>
+	<string>BNDL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+</dict>
+</plist>
diff --git a/JHChart/JHChartDemoUITests/JHChartDemoUITests.m b/JHChart/JHChartDemoUITests/JHChartDemoUITests.m
new file mode 100755
index 0000000..27b68ea
--- /dev/null
+++ b/JHChart/JHChartDemoUITests/JHChartDemoUITests.m
@@ -0,0 +1,40 @@
+//
+//  JHChartDemoUITests.m
+//  JHChartDemoUITests
+//
+//  Created by cjatech-������ on 16/4/10.
+//  Copyright �� 2016��� JH. All rights reserved.
+//
+
+#import <XCTest/XCTest.h>
+
+@interface JHChartDemoUITests : XCTestCase
+
+@end
+
+@implementation JHChartDemoUITests
+
+- (void)setUp {
+    [super setUp];
+    
+    // Put setup code here. This method is called before the invocation of each test method in the class.
+    
+    // In UI tests it is usually best to stop immediately when a failure occurs.
+    self.continueAfterFailure = NO;
+    // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
+    [[[XCUIApplication alloc] init] launch];
+    
+    // In UI tests it���s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
+}
+
+- (void)tearDown {
+    // Put teardown code here. This method is called after the invocation of each test method in the class.
+    [super tearDown];
+}
+
+- (void)testExample {
+    // Use recording to get started writing UI tests.
+    // Use XCTAssert and related functions to verify your tests produce the correct results.
+}
+
+@end
diff --git a/JHChart/README.md b/JHChart/README.md
new file mode 100755
index 0000000..54d1666
--- /dev/null
+++ b/JHChart/README.md
@@ -0,0 +1,211 @@
+#JHChart(������������1.0.3)
+
+Well, I admit that there are a lot of other graphics libraries on the GitHub. But, because of my project needs, most of the library can not fully meet my needs. So I took out a little free time, I wrote a chart library. Initial plan to write only a few lines (my project needs), did not expect the release to GitHub after a number of friends told me that they need more styles.I don't want to tell them I just intend to do it here, so it's a bit of a development to the present 0.1.1 version, basically meet the needs of users before. Of course, the follow-up will continue to update, add more features.
+
+
+## Introduction  
+
+A simple, feature rich and customizable iOS development chart library.
+[Click here](http://www.jianshu.com/p/299066102982) if you want to see the usage of the Chinese description.
+
+![some nice chart](https://raw.githubusercontent.com/China131/JHChart/master/JHChartDemo/GIFResource/look.gif) 
+
+##Requirement
+* Xcode 7.0+
+* iOS 7.0+
+
+##Import library
+
+There are two ways to use the JHChart library.
+* 
+Download the current Demo directly, and then add the JHChart folder to your project
+* 
+Use CocoaPod import, only need to add the following statement in your Podfile:
+pod 'JHChart','~>1.0.3'
+
+**(If you don't know about [cocoapods](https://guides.cocoapods.org/), [click here](https://guides.cocoapods.org/) to go to the official website.)**
+## Detailed usage
+
+### JHLineChart
+**Description: JHLineChart can create a variety of data sources linear charts, including broken lines and curves, can be based on the data source to determine whether the multiple linear table. And, according to the needs of the interval fill color. At the same time the table supports the different needs of different quadrant, here is just set the first quadrant of the sample, the other quadrant of the use of the same method.**
+
+    /*     Create object        */
+    JHLineChart *lineChart = [[JHLineChart alloc] initWithFrame:CGRectMake(10, 100, k_MainBoundsWidth-20, 300) andLineChartType:JHChartLineValueNotForEveryX];
+
+    /* The scale value of the X axis can be passed into the NSString or NSNumber type and the data structure changes with the change of the line chart type. The details look at the document or other quadrant X axis data source sample.*/
+
+    lineChart.xLineDataArr = @[@"0",@"1",@"2",@3,@4,@5,@6,@7];
+
+    /* The different types of the broken line chart, according to the quadrant division, different quadrant correspond to different X axis scale data source and different value data source. */
+
+    lineChart.lineChartQuadrantType = JHLineChartQuadrantTypeFirstQuardrant;
+
+    lineChart.valueArr = @[@[@"1",@"12",@"1",@6,@4,@9,@6,@7],@[@"3",@"1",@"2",@16,@2,@3,@5,@10]];
+
+    /* Line Chart colors */
+    lineChart.valueLineColorArr =@[ [UIColor purpleColor], [UIColor brownColor]];
+    /* Colors for every line chart*/
+    lineChart.pointColorArr = @[[UIColor orangeColor],[UIColor yellowColor]];
+    /* color for XY axis */
+    lineChart.xAndYLineColor = [UIColor blackColor];
+    /* XY axis scale color */
+    lineChart.xAndYNumberColor = [UIColor blueColor];
+    /* Dotted line color of the coordinate point */
+    lineChart.positionLineColorArr = @[[UIColor blueColor],[UIColor greenColor]];
+    /*        Set whether to fill the content, the default is False         */
+    lineChart.contentFill = YES;
+    /*        Set whether the curve path         */
+    lineChart.pathCurve = YES;
+    /*        Set fill color array         */
+    lineChart.contentFillColorArr = @[[UIColor colorWithRed:0.500 green:0.000 blue:0.500 alpha:0.468],[UIColor colorWithRed:0.500 green:0.214 blue:0.098 alpha:0.468]];
+    [self.view addSubview:lineChart];
+    /*       Start animation        */
+    [lineChart showAnimation];
+
+
+
+Actual effect chart���
+
+![���������](https://raw.githubusercontent.com/China131/JHChart/master/JHChartDemo/GIFResource/���������demo.png)     
+
+***
+### JHColumnChart
+**Description: JHColumnChart is a rolling column, you can set the data source you need to draw an array of flexible style, it not only set the column of different color, can also provide you a number of descriptive attributes used to mark different styles**
+
+
+    JHColumnChart *column = [[JHColumnChart alloc] initWithFrame:CGRectMake(0, 100, k_MainBoundsWidth, k_MainBoundsWidth)];
+    /*        Create an array of data sources, each array is a module data. For example, the first array can represent the average score of a class of different subjects, the next array represents the average score of different subjects in another class        */
+    column.valueArr = @[
+    @[@12,@15,@20],
+    @[@22,@15,@20],
+    @[@12,@5,@40],
+    @[@2,@15,@20]
+    ];
+    /*       This point represents the distance from the lower left corner of the origin.         */
+    column.originSize = CGPointMake(30, 30);
+    /*    The first column of the distance from the starting point     */
+    column.drawFromOriginX = 10;
+    /*        Column width         */
+    column.columnWidth = 40;
+    /*        X, Y axis font color         */
+    column.drawTextColorForX_Y = [UIColor greenColor];
+    /*        X, Y axis line color         */
+    column.colorForXYLine = [UIColor greenColor];
+    /*    Each module of the color array, such as the A class of the language performance of the color is red, the color of the math achievement is green     */
+    column.columnBGcolorsArr = @[[UIColor redColor],[UIColor greenColor],[UIColor orangeColor]];
+    /*        Module prompt         */
+    column.xShowInfoText = @[@"A������",@"B������",@"C������",@"D������"];
+    /*       Start animation        */
+    [column showAnimation];
+    [self.view addSubview:column];
+
+Actual effect chart���
+
+![���������](https://raw.githubusercontent.com/China131/JHChart/master/JHChartDemo/GIFResource/���������demo.gif)
+***
+## JHPieChart
+**Description: JHPieChart can be based on your data source and view size settings, automatically generate the appropriate size, and there is a hint of animation pie chart. When you click on a piece of pie chart, the animation shows the current cake block information.**
+
+    JHPieChart *pie = [[JHPieChart alloc] initWithFrame:CGRectMake(100, 100, 321, 421)];
+    pie.center = CGPointMake(CGRectGetMaxX(self.view.frame)/2, CGRectGetMaxY(self.view.frame)/2);
+    /* Pie chart value, will automatically according to the percentage of numerical calculation */
+    pie.valueArr = @[@18,@10,@25,@40,@18,@10,@25,@40,@18,@10,@15,@12,@30,@18];
+    /* The description of each sector must be filled, and the number must be the same as the pie chart. */
+    pie.descArr = @[@"���������������",@"���������������",@"���������������",@"���������������",@"5",@"6",@"7",@"8",@"9",@"10",@"23",@"12",@"21",@"30"];
+    pie.backgroundColor = [UIColor whiteColor];
+    [self.view addSubview:pie];
+    /*    When touching a pie chart, the animation offset value     */
+    pie.positionChangeLengthWhenClick = 15;
+    /*        Start animation         */
+    [pie showAnimation];
+
+Actual effect chart���
+
+![���������](https://raw.githubusercontent.com/China131/JHChart/master/JHChartDemo/GIFResource/���������demo.gif)
+***
+## JHRingChart
+**Description: JHRingChart according to your data source, automatically calculate the proportion of relevant data, the animation shows a ring graph, and from each loop to elicit relevant information tips**
+
+    JHRingChart *ring = [[JHRingChart alloc] initWithFrame:CGRectMake(0, 100, k_MainBoundsWidth, k_MainBoundsWidth)];
+    /*        background color         */
+    ring.backgroundColor = [UIColor blackColor];
+    /*        Data source array, only the incoming value, the corresponding ratio will be automatically calculated         */
+    ring.valueDataArr = @[@"0.5",@"5",@"2",@"10",@"6"];
+    /*         Width of ring graph        */
+    ring.ringWidth = 35.0;
+    /*        Fill color for each section of the ring diagram         */
+    ring.fillColorArray = @[[UIColor colorWithRed:1.000 green:0.783 blue:0.371 alpha:1.000], [UIColor colorWithRed:1.000 green:0.562 blue:0.968 alpha:1.000],[UIColor colorWithRed:0.313 green:1.000 blue:0.983 alpha:1.000],[UIColor colorWithRed:0.560 green:1.000 blue:0.276 alpha:1.000],[UIColor colorWithRed:0.239 green:0.651 blue:0.170 alpha:1.000]];
+    /*        Start animation             */
+    [ring showAnimation];
+    [self.view addSubview:ring];
+
+Actual effect chart���
+
+![���������](https://raw.githubusercontent.com/China131/JHChart/master/JHChartDemo/GIFResource/���������demo.gif)
+***
+## JHTableChart
+**Description: JHTableChart for static drawing style changing table view, all the cell display style depends on the data source, do not need a special treatment of a cell, is very flexible and easy to use**
+
+    JHTableChart *table = [[JHTableChart alloc] initWithFrame:CGRectMake(10, 64, k_MainBoundsWidth-20, k_MainBoundsHeight)];
+    /*       Table name         */
+    table.tableTitleString = @"������jeep���������";
+    /*        Each column of the statement, one of the first to show if the rows and columns that can use the vertical segmentation of rows and columns         */
+    table.colTitleArr = @[@"������|������",@"������",@"������",@"������"];
+    /*        The width of the column array, starting with the first column         */
+    table.colWidthArr = @[@100.0,@120.0,@70,@100];
+    /*        Text color of the table body         */
+    table.bodyTextColor = [UIColor redColor];
+    /*        Minimum grid height         */
+    table.minHeightItems = 40;
+    /*        Table line color         */
+    table.lineColor = [UIColor orangeColor];
+    /*       Data source array, in accordance with the data from top to bottom that each line of data, if one of the rows of a column in a number of cells, can be stored in an array of         */
+    table.dataArr = @[
+    @[@"2.4L���������",@"2016���������������������",@[@"���������",@"������",@"���������"],@[@"4"]],
+    @[@"2.4���������",@[@"2016���������������������",@"2016������������������",@"2016������������������������"],@[@"���������",@"������",@"���������",@"���������������"],@[@"4",@"5",@"3"]],
+    @[@"2.4���������",@[@"4",@"3",@"2"]],
+    @[@"2.4���������"]
+    ];
+    /*        show                            */
+    [table showAnimation];
+    [self.view addSubview:table];
+    /*        Automatic calculation table height        */
+    table.frame = CGRectMake(10, 64, k_MainBoundsWidth-20, [table heightFromThisDataSource]);
+
+Actual effect chart���
+
+![���������](https://raw.githubusercontent.com/China131/JHChart/master/JHChartDemo/GIFResource/table1.png)
+***
+### JHRadarChart
+**Description: JHRadarChart can according to your incoming data description and calculation of drawing data, and pruning, the advantages and disadvantages of each attribute can reflect the image of the**
+
+    JHRadarChart *radarChart = [[JHRadarChart alloc] initWithFrame:CGRectMake(10, 74, k_MainBoundsWidth - 20, k_MainBoundsWidth - 20)];
+    radarChart.backgroundColor = [UIColor whiteColor];
+    /*       Each point of the description text, according to the number of the array to determine the number of basic modules         */
+    radarChart.valueDescArray = @[@"������",@"������",@"������",@"������",@"������",@"������"];
+
+    /*         Number of basic module layers        */
+    radarChart.layerCount = 5;
+
+    /*        Array of data sources, the need to add an array of arrays         */
+    radarChart.valueDataArray = @[@[@"80",@"40",@"100",@"76",@"75",@"50"],@[@"50",@"80",@"30",@"46",@"35",@"50"]];
+
+    /*        Color of each basic module layer         */
+    radarChart.layerFillColor = [UIColor colorWithRed:94/ 256.0 green:187/256.0 blue:242 / 256.0 alpha:0.5];
+
+    /*        The fill color of the value module is required to specify the color for each value module         */
+    radarChart.valueDrawFillColorArray = @[[UIColor colorWithRed:57/ 256.0 green:137/256.0 blue:21 / 256.0 alpha:0.5],[UIColor colorWithRed:149/ 256.0 green:68/256.0 blue:68 / 256.0 alpha:0.5]];
+
+    /*       show        */
+    [radarChart showAnimation];
+
+    [self.view addSubview:radarChart];
+
+Actual effect chart���
+
+![some nice chart](https://raw.githubusercontent.com/China131/JHChart/master/JHChartDemo/GIFResource/���������demo.png) 
+
+### ������������
+* ���������JHSilktree@foxmail.com
+* ���������[���������������](http://www.jianshu.com/users/f9333c379b76/latest_articles)
+* ���������[Silktree](http://www.cnblogs.com/ToBeTheOne/)

--
Gitblit v1.8.0