单军华
2016-12-21 8329ef237d1841d377718813a0b452ea0df64378
ioS 曲线图demo
72 files added
6338 ■■■■■ changed files
JHChart/JHChart.podspec 139 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo.xcodeproj/project.pbxproj 689 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata 7 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcshareddata/JHChartDemo.xcscmblueprint 30 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcuserdata/JH.xcuserdatad/UserInterfaceState.xcuserstate patch | view | raw | blame | history
JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcuserdata/WindShan.xcuserdatad/UserInterfaceState.xcuserstate patch | view | raw | blame | history
JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist 5 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcschemes/JHChartDemo.xcscheme 111 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcschemes/xcschememanagement.plist 32 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist 151 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcschemes/JHChartDemo.xcscheme 111 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcschemes/xcschememanagement.plist 32 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist 5 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcschemes/JHChartDemo.xcscheme 111 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcschemes/xcschememanagement.plist 32 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/AppDelegate.h 17 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/AppDelegate.m 45 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/Assets.xcassets/AppIcon.appiconset/Contents.json 38 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/Base.lproj/LaunchScreen.storyboard 27 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/Base.lproj/Main.storyboard 44 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/GIFResource/0011.gif patch | view | raw | blame | history
JHChart/JHChartDemo/GIFResource/huan1.png patch | view | raw | blame | history
JHChart/JHChartDemo/GIFResource/line1.png patch | view | raw | blame | history
JHChart/JHChartDemo/GIFResource/line2.png patch | view | raw | blame | history
JHChart/JHChartDemo/GIFResource/line3.png patch | view | raw | blame | history
JHChart/JHChartDemo/GIFResource/line4.png patch | view | raw | blame | history
JHChart/JHChartDemo/GIFResource/lines.png patch | view | raw | blame | history
JHChart/JHChartDemo/GIFResource/look.gif patch | view | raw | blame | history
JHChart/JHChartDemo/GIFResource/pie1.png patch | view | raw | blame | history
JHChart/JHChartDemo/GIFResource/table1.png patch | view | raw | blame | history
JHChart/JHChartDemo/GIFResource/zhu1.png patch | view | raw | blame | history
JHChart/JHChartDemo/GIFResource/折线图demo.png patch | view | raw | blame | history
JHChart/JHChartDemo/GIFResource/柱状图demo.gif patch | view | raw | blame | history
JHChart/JHChartDemo/GIFResource/环状图demo.gif patch | view | raw | blame | history
JHChart/JHChartDemo/GIFResource/雷达图demo.png patch | view | raw | blame | history
JHChart/JHChartDemo/GIFResource/饼状图demo.gif patch | view | raw | blame | history
JHChart/JHChartDemo/Info.plist 40 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHChart.h 128 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHChart.m 159 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHChartHeader.h 17 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHColumnChart.h 76 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHColumnChart.m 396 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHLineChart.h 192 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHLineChart.m 1096 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHPieChart.h 39 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHPieChart.m 301 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHPieForeBGView.h 26 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHPieForeBGView.m 56 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHPieItemsView.h 24 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHPieItemsView.m 68 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHRadarChart.h 72 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHRadarChart.m 270 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHRingChart.h 30 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHRingChart.m 168 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHShowInfoView.h 20 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHShowInfoView.m 80 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHTableChart.h 91 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHTableChart.m 344 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHTableDataRowModel.h 26 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHTableDataRowModel.m 13 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHWaveChart.h 36 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHChart/JHWaveChart.m 111 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHShowController.h 16 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/JHShowController.m 370 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/ViewController.h 15 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/ViewController.m 78 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemo/main.m 16 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemoTests/Info.plist 24 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemoTests/JHChartDemoTests.m 39 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemoUITests/Info.plist 24 ●●●●● patch | view | raw | blame | history
JHChart/JHChartDemoUITests/JHChartDemoUITests.m 40 ●●●●● patch | view | raw | blame | history
JHChart/README.md 211 ●●●●● patch | view | raw | blame | history
JHChart/JHChart.podspec
New file
@@ -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
JHChart/JHChartDemo.xcodeproj/project.pbxproj
New file
@@ -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 */;
}
JHChart/JHChartDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
New file
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "self:JHChartDemo.xcodeproj">
   </FileRef>
</Workspace>
JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcshareddata/JHChartDemo.xcscmblueprint
New file
@@ -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"
    }
  ]
}
JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcuserdata/JH.xcuserdatad/UserInterfaceState.xcuserstate
Binary files differ
JHChart/JHChartDemo.xcodeproj/project.xcworkspace/xcuserdata/WindShan.xcuserdatad/UserInterfaceState.xcuserstate
Binary files differ
JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<Bucket
   type = "1"
   version = "2.0">
</Bucket>
JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcschemes/JHChartDemo.xcscheme
New file
@@ -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>
JHChart/JHChartDemo.xcodeproj/xcuserdata/JH.xcuserdatad/xcschemes/xcschememanagement.plist
New file
@@ -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>
JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
New file
@@ -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>
JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcschemes/JHChartDemo.xcscheme
New file
@@ -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>
JHChart/JHChartDemo.xcodeproj/xcuserdata/WindShan.xcuserdatad/xcschemes/xcschememanagement.plist
New file
@@ -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>
JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<Bucket
   type = "1"
   version = "2.0">
</Bucket>
JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcschemes/JHChartDemo.xcscheme
New file
@@ -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>
JHChart/JHChartDemo.xcodeproj/xcuserdata/cjatech-jianhao.xcuserdatad/xcschemes/xcschememanagement.plist
New file
@@ -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>
JHChart/JHChartDemo/AppDelegate.h
New file
@@ -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
JHChart/JHChartDemo/AppDelegate.m
New file
@@ -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
JHChart/JHChartDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
New file
@@ -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"
  }
}
JHChart/JHChartDemo/Base.lproj/LaunchScreen.storyboard
New file
@@ -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>
JHChart/JHChartDemo/Base.lproj/Main.storyboard
New file
@@ -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>
JHChart/JHChartDemo/GIFResource/0011.gif
JHChart/JHChartDemo/GIFResource/huan1.png
JHChart/JHChartDemo/GIFResource/line1.png
JHChart/JHChartDemo/GIFResource/line2.png
JHChart/JHChartDemo/GIFResource/line3.png
JHChart/JHChartDemo/GIFResource/line4.png
JHChart/JHChartDemo/GIFResource/lines.png
JHChart/JHChartDemo/GIFResource/look.gif
JHChart/JHChartDemo/GIFResource/pie1.png
JHChart/JHChartDemo/GIFResource/table1.png
JHChart/JHChartDemo/GIFResource/zhu1.png
JHChart/JHChartDemo/GIFResource/???demo.png
JHChart/JHChartDemo/GIFResource/???demo.gif
JHChart/JHChartDemo/GIFResource/???demo.gif
JHChart/JHChartDemo/GIFResource/???demo.png
JHChart/JHChartDemo/GIFResource/???demo.gif
JHChart/JHChartDemo/Info.plist
New file
@@ -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>
JHChart/JHChartDemo/JHChart/JHChart.h
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHChart.m
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHChartHeader.h
New file
@@ -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"
JHChart/JHChartDemo/JHChart/JHColumnChart.h
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHColumnChart.m
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHLineChart.h
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHLineChart.m
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHPieChart.h
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHPieChart.m
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHPieForeBGView.h
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHPieForeBGView.m
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHPieItemsView.h
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHPieItemsView.m
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHRadarChart.h
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHRadarChart.m
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHRingChart.h
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHRingChart.m
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHShowInfoView.h
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHShowInfoView.m
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHTableChart.h
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHTableChart.m
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHTableDataRowModel.h
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHTableDataRowModel.m
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHWaveChart.h
New file
@@ -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
JHChart/JHChartDemo/JHChart/JHWaveChart.m
New file
@@ -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
JHChart/JHChartDemo/JHShowController.h
New file
@@ -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
JHChart/JHChartDemo/JHShowController.m
New file
@@ -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
JHChart/JHChartDemo/ViewController.h
New file
@@ -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
JHChart/JHChartDemo/ViewController.m
New file
@@ -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
JHChart/JHChartDemo/main.m
New file
@@ -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]));
    }
}
JHChart/JHChartDemoTests/Info.plist
New file
@@ -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>
JHChart/JHChartDemoTests/JHChartDemoTests.m
New file
@@ -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
JHChart/JHChartDemoUITests/Info.plist
New file
@@ -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>
JHChart/JHChartDemoUITests/JHChartDemoUITests.m
New file
@@ -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
JHChart/README.md
New file
@@ -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/)