From a937a35b26343462aa25a056333160ec3b1c2e21 Mon Sep 17 00:00:00 2001 From: Greg Lutz Date: Wed, 20 Jul 2016 13:09:01 -0400 Subject: [PATCH] 8.0.20162.125 2016 v2 release updates --- .../Calendar101.xcodeproj/project.pbxproj | 90 +- .../Calendar101/Calendar101/AppDelegate.m | 2 +- .../Base.lproj/LaunchScreen.storyboard | 43 +- .../Base.lproj/Localizable.strings | 6 + .../Calendar101/Base.lproj/Main.storyboard | 655 ++++++++++-- .../Calendar101/CustomAppearanceController.m | 63 +- .../Calendar101/CustomDayContentController.h | 2 +- .../Calendar101/CustomDayContentController.m | 54 +- .../Calendar101/CustomHeaderController.h | 4 +- .../Calendar101/CustomHeaderController.m | 126 +-- .../Calendar101/CustomSelectionController.h | 2 +- .../Calendar101/CustomSelectionController.m | 47 +- .../Calendar101/GettingStartedController.m | 23 +- .../Calendar101/PopupEditorController.h | 2 +- .../Calendar101/PopupEditorController.m | 43 +- .../VerticalOrientationController.m | 36 +- .../Calendar101/en.lproj/Localizable.strings | 49 + .../Calendar101/ja.lproj/LaunchScreen.strings | 6 + .../Calendar101/ja.lproj/Localizable.strings | 49 + .../Calendar101/ja.lproj/Main.strings | 105 ++ .../project.pbxproj | 37 +- .../Base.lproj/LaunchScreen.storyboard | 4 +- .../Base.lproj/Localizable.strings | 6 + .../Base.lproj/Main.storyboard | 2 +- .../FilteringSampleViewController.m | 6 +- .../AppIcon.appiconset/Contents.json | 81 ++ .../AppIcon.appiconset/Icon-60@2x.png | Bin 0 -> 2715 bytes .../AppIcon.appiconset/Icon-76.png | Bin 0 -> 1947 bytes .../AppIcon.appiconset/Icon-76@2x.png | Bin 0 -> 3815 bytes .../AppIcon.appiconset/Icon-Small-40.png | Bin 0 -> 1071 bytes .../AppIcon.appiconset/Icon-Small-40@2x-1.png | Bin 0 -> 2037 bytes .../AppIcon.appiconset/Icon-Small-40@2x.png | Bin 0 -> 2037 bytes .../AppIcon.appiconset/Icon-Small.png | Bin 0 -> 789 bytes .../AppIcon.appiconset/Icon-Small@2x-1-1.png | Bin 0 -> 1491 bytes .../AppIcon.appiconset/Icon-Small@2x-1.png | Bin 0 -> 1491 bytes .../AppIcon.appiconset/Icon-Small@2x.png | Bin 0 -> 1491 bytes .../SortingSampleTableViewController.m | 6 +- .../CollectionView101/YouTubeCollectionView.m | 3 + .../en.lproj/Localizable.strings | 10 + .../ja.lproj/Localizable.strings | 10 + .../CollectionView101/ja.lproj/Main.strings | 86 +- .../FlexChart101.xcodeproj/project.pbxproj | 240 +++-- .../FlexChart101/FlexChart101/AppDelegate.m | 5 +- .../FlexChart101/Base.lproj/LaunchScreen.xib | 41 +- .../FlexChart101/Base.lproj/Main.storyboard | 962 +++++++++++++++--- .../FlexChart101/BasicChartTypesController.m | 179 ++-- .../FlexChart101/BubbleChartController.m | 54 +- .../FlexChart101/ChartAnnotationsController.m | 42 +- .../FlexChart101/FlexChart101/ChartData.h | 2 + .../FlexChart101/FlexChart101/ChartData.m | 14 +- .../ConditionalFormattingController.m | 54 +- .../CustomPlotElementsController.m | 42 +- .../FlexChart101/CustomTooltipsController.h | 2 +- .../FlexChart101/CustomTooltipsController.m | 59 +- .../FlexChart101/CustomizingAxesController.m | 87 +- .../FlexChart101/DataLabelController.h | 2 +- .../FlexChart101/DataLabelController.m | 165 +-- .../FlexChart101/DynamicChartsController.m | 34 +- .../FlexChart101/FinancialChartController.h | 2 +- .../FlexChart101/FinancialChartController.m | 100 +- .../FlexChart101/GettingStartedController.m | 48 +- .../FlexChart101/HitTestController.h | 2 +- .../FlexChart101/HitTestController.m | 69 +- .../chartscaling.imageset/Contents.json | 21 + .../chartscaling.imageset/chart_line.png | Bin 0 -> 6342 bytes .../FlexChart101/LegendAndTitlesController.m | 83 +- .../FlexChart101/LineMarkerController.h | 4 +- .../FlexChart101/LineMarkerController.m | 158 +-- .../FlexChart101/LoadAnimationController.m | 66 +- .../MainMenuTableViewController.h | 12 + .../MainMenuTableViewController.m | 141 +++ .../FlexChart101/MixedChartTypesController.m | 43 +- .../FlexChart101/MultipleAxesController.m | 69 +- .../FlexChart101/ScrollingController.m | 31 +- .../FlexChart101/SelectionModesController.m | 73 +- .../FlexChart101/SnapshotController.m | 56 +- .../FlexChart101/StylingSeriesController.m | 31 +- .../FlexChart101/ThemingController.m | 45 +- .../FlexChart101/ToggleSeriesController.m | 130 +-- .../FlexChart101/UpdateAnimationController.m | 153 +-- .../ZoomingAndScrollingController.h | 2 +- .../ZoomingAndScrollingController.m | 102 +- .../ja.lproj/LaunchScreen.strings | 8 +- .../FlexChart101/ja.lproj/Localizable.strings | 6 + .../FlexChart101/ja.lproj/Main.strings | 158 ++- .../FlexGrid101.xcodeproj/project.pbxproj | 364 +++++-- .../FlexGrid101/FlexGrid101/AppDelegate.m | 2 +- .../FlexGrid101/Base.lproj/LaunchScreen.xib | 4 +- .../Base.lproj/Localizable.strings | 9 +- .../FlexGrid101/Base.lproj/Main.storyboard | 629 ++++++++++-- .../FlexGrid101/ColumnDefinitionsController.m | 92 +- .../FlexGrid101/ColumnLayoutController.h | 9 +- .../FlexGrid101/ColumnLayoutController.m | 53 +- .../ColumnReordererTableViewController.h | 2 - .../ColumnReordererTableViewController.m | 56 +- .../ConditionalFormattingController.h | 5 +- .../ConditionalFormattingController.m | 139 +-- .../FlexGrid101/CustomCellsController.h | 6 +- .../FlexGrid101/CustomCellsController.m | 131 +-- .../FlexGrid101/CustomMergingViewController.m | 158 ++- .../FlexGrid101/FlexGrid101/CustomerData.h | 5 +- .../FlexGrid101/FlexGrid101/CustomerData.m | 16 +- .../FlexGrid101/CustomerObjectEditor.h | 2 - .../FlexGrid101/CustomerObjectEditor.m | 140 +-- .../FlexGrid101/EditConfirmationController.h | 9 +- .../FlexGrid101/EditConfirmationController.m | 130 ++- .../FlexGrid101/EditingFormController.h | 12 +- .../FlexGrid101/EditingFormController.m | 115 +-- .../FlexGrid101/FilterController.h | 2 + .../FlexGrid101/FilterController.m | 328 ++---- .../FlexGrid101/FlexGrid101/FilterData.h | 25 + .../FlexGrid101/FlexGrid101/FilterData.m | 41 + .../FlexGrid101/FilterGridViewController.h | 13 + .../FlexGrid101/FilterGridViewController.m | 24 + .../FlexGrid101/FrozenCellsController.m | 44 +- .../FlexGrid101/FullTextFilterController.h | 2 +- .../FlexGrid101/FullTextFilterController.m | 189 ++-- .../FlexGrid101/GettingStartedController.h | 6 +- .../FlexGrid101/GettingStartedController.m | 89 +- .../FlexGrid101/GroupingController.m | 122 ++- .../FlexGrid101/OnDemandController.m | 139 ++- .../FlexGrid101/RowDetailsViewController.m | 107 +- .../FlexGrid101/FlexGrid101/SampleData.h | 20 + .../FlexGrid101/FlexGrid101/SampleData.m | 21 + .../FlexGrid101/SelectionModesController.h | 2 +- .../FlexGrid101/SelectionModesController.m | 106 +- .../FlexGrid101/StarSizingController.m | 78 +- .../FlexGrid101/UnboundSampleViewController.h | 13 + .../FlexGrid101/UnboundSampleViewController.m | 81 ++ .../FlexGrid101/YouTubeCollectionView.h | 17 + .../FlexGrid101/YouTubeCollectionView.m | 70 ++ .../FlexGrid101/flexgrid_headers.png | Bin 0 -> 2787 bytes .../FlexGrid101/ja.lproj/LaunchScreen.strings | 8 +- .../FlexGrid101/ja.lproj/Localizable.strings | 9 +- .../FlexGrid101/ja.lproj/Main.strings | 242 ++++- .../FlexPie101.xcodeproj/project.pbxproj | 157 ++- .../FlexPie101/FlexPie101/AppDelegate.m | 2 +- .../FlexPie101/Base.lproj/LaunchScreen.xib | 42 +- .../FlexPie101/Base.lproj/Main.storyboard | 760 ++++++++++++-- .../FlexPie101/BasicFeaturesController.m | 142 +-- .../FlexPie101/GettingStartedController.m | 44 +- .../AppIcon.appiconset/Contents.json | 5 + .../FlexPie101/LegendAndTitlesController.h | 2 +- .../FlexPie101/LegendAndTitlesController.m | 161 +-- .../FlexPie101/SelectionSampleController.h | 2 +- .../FlexPie101/SelectionSampleController.m | 154 +-- .../FlexPie101/SnapshotController.m | 63 +- .../FlexPie101/FlexPie101/ThemingController.m | 52 +- .../FlexPie101/ja.lproj/LaunchScreen.strings | 8 +- .../FlexPie101/ja.lproj/Main.strings | 149 ++- ObjectiveC/FlexPie101/FlexPie101/pie.png | Bin 0 -> 7359 bytes .../FlexPie101/FlexPie101/pie_doughnut.png | Bin 0 -> 7028 bytes .../FlexPie101/FlexPie101/pie_labels.png | Bin 0 -> 10582 bytes ObjectiveC/FlexPie101/FlexPie101/pie_load.png | Bin 0 -> 11184 bytes .../FlexPie101/FlexPie101/pie_selection.png | Bin 0 -> 6971 bytes .../FlexPie101/FlexPie101/pie_title.png | Bin 0 -> 7054 bytes ObjectiveC/FlexPie101/FlexPie101/themes.png | Bin 0 -> 8673 bytes .../Gauges101.xcodeproj/project.pbxproj | 38 +- ObjectiveC/Gauges101/Gauges101/AppDelegate.m | 5 +- .../Gauges101/Base.lproj/Main.storyboard | 518 +++++++++- .../Gauges101/XGAnimationViewController.m | 24 +- .../XGAutomaticScalingViewController.m | 20 +- .../Gauges101/XGBulletGraphViewController.m | 16 +- .../Gauges101/XGDirectionViewController.m | 30 +- .../XGDisplayingValuesViewController.m | 31 +- .../Gauges101/XGExportImageViewController.m | 14 +- .../XGGettingStartedViewController.m | 41 +- .../Gauges101/XGUsingRangesViewController.m | 45 +- .../Gauges101/ja.lproj/LaunchScreen.strings | 2 +- .../Gauges101/Gauges101/ja.lproj/Main.strings | 98 +- .../Gauges101/ja.lproj/Localizable.strings | 4 +- .../Input101.xcodeproj/project.pbxproj | 422 ++++++++ .../contents.xcworkspacedata | 7 + ObjectiveC/Input101/Input101/AppDelegate.h | 16 + ObjectiveC/Input101/Input101/AppDelegate.m | 53 + .../AppIcon.appiconset/Contents.json | 81 ++ .../AppIcon.appiconset/Icon-60@2x.png | Bin 0 -> 2715 bytes .../AppIcon.appiconset/Icon-76.png | Bin 0 -> 1947 bytes .../AppIcon.appiconset/Icon-76@2x.png | Bin 0 -> 3815 bytes .../AppIcon.appiconset/Icon-Small-40.png | Bin 0 -> 1071 bytes .../AppIcon.appiconset/Icon-Small-40@2x-1.png | Bin 0 -> 2037 bytes .../AppIcon.appiconset/Icon-Small-40@2x.png | Bin 0 -> 2037 bytes .../AppIcon.appiconset/Icon-Small@2x-1-1.png | Bin 0 -> 1491 bytes .../AppIcon.appiconset/Icon-Small@2x-1.png | Bin 0 -> 1491 bytes .../Australia.imageset/Australia.png | Bin 0 -> 2623 bytes .../Australia.imageset/Contents.json | 21 + .../Bangladesh.imageset/Contents.json | 21 + .../Bangladesh.imageset/bangladesh.png | Bin 0 -> 1447 bytes .../Brazil.imageset/Brazil.png | Bin 0 -> 2549 bytes .../Brazil.imageset/Contents.json | 21 + .../Canada.imageset/Canada.png | Bin 0 -> 1484 bytes .../Canada.imageset/Contents.json | 21 + .../China.imageset/Contents.json | 21 + .../Assets.xcassets/China.imageset/china.png | Bin 0 -> 1063 bytes .../France.imageset/Contents.json | 21 + .../France.imageset/France.png | Bin 0 -> 941 bytes .../Germany.imageset/Contents.json | 21 + .../Germany.imageset/Germany.png | Bin 0 -> 808 bytes .../India.imageset/Contents.json | 21 + .../Assets.xcassets/India.imageset/india.png | Bin 0 -> 1148 bytes .../Japan.imageset/Contents.json | 21 + .../Assets.xcassets/Japan.imageset/japan.png | Bin 0 -> 1024 bytes .../Nepal.imageset/Contents.json | 21 + .../Assets.xcassets/Nepal.imageset/nepal.png | Bin 0 -> 2026 bytes .../Pakistan.imageset/Contents.json | 21 + .../Pakistan.imageset/pakistan.png | Bin 0 -> 1448 bytes .../Srilanka.imageset/Contents.json | 21 + .../Srilanka.imageset/srilanka.png | Bin 0 -> 2136 bytes .../tip.imageset/Contents.json | 23 + .../Assets.xcassets/tip.imageset/tip.png | Bin 0 -> 784 bytes .../Assets.xcassets/tip.imageset/tip@2x.png | Bin 0 -> 1739 bytes .../Assets.xcassets/tip.imageset/tip@3x.png | Bin 0 -> 2679 bytes .../Base.lproj/LaunchScreen.storyboard | 53 + .../Input101/Base.lproj/Main.storyboard | 500 +++++++++ .../Input101/Images/input_autocomplete.png | Bin 0 -> 6355 bytes .../Input101/Images/input_combobox.png | Bin 0 -> 3679 bytes .../Input101/Images/input_dropdown.png | Bin 0 -> 3349 bytes .../Input101/Input101/Images/input_mask.png | Bin 0 -> 6954 bytes ObjectiveC/Input101/Input101/Info.plist | 47 + ObjectiveC/Input101/Input101/License.h | 10 + ObjectiveC/Input101/Input101/License.m | 10 + .../Input101/Samples/AutoCompleteController.h | 12 + .../Input101/Samples/AutoCompleteController.m | 142 +++ .../Input101/Samples/AutoCompleteData.h | 22 + .../Input101/Samples/AutoCompleteData.m | 51 + .../Input101/Samples/ComboBoxController.h | 12 + .../Input101/Samples/ComboBoxController.m | 56 + .../Input101/Samples/DropDownController.h | 12 + .../Input101/Samples/DropDownController.m | 59 ++ .../Input101/Samples/MaskedInputController.h | 14 + .../Input101/Samples/MaskedInputController.m | 37 + ObjectiveC/Input101/Input101/main.m | 15 + .../Calendar101.xcodeproj/project.pbxproj | 21 + .../Base.lproj/LaunchScreen.storyboard | 2 +- .../Base.lproj/Localizable.strings | 6 + .../CustomAppearanceController.swift | 2 +- .../CustomDayContentController.swift | 18 +- .../Calendar101/CustomHeaderController.swift | 24 +- .../CustomSelectionController.swift | 14 +- .../GettingStartedController.swift | 2 +- .../Calendar101/PopupEditorController.swift | 4 +- .../VerticalOrientationController.swift | 2 +- .../Calendar101/ViewController.swift | 29 +- .../Calendar101/en.lproj/Localizable.strings | 49 + .../Calendar101/ja.lproj/LaunchScreen.strings | 6 + .../Calendar101/ja.lproj/Localizable.strings | 49 + .../Calendar101/ja.lproj/Main.strings | 6 + .../project.pbxproj | 12 +- .../UserInterfaceState.xcuserstate | Bin 64888 -> 69056 bytes .../Base.lproj/Localizable.strings | 6 + .../SortingSampleTableViewController.swift | 6 +- .../en.lproj/Localizable.strings | 10 + .../ja.lproj/Localizable.strings | 10 + .../CollectionView101/ja.lproj/Main.strings | 86 +- .../FlexChart101.xcodeproj/project.pbxproj | 115 +-- .../FlexChart101/Base.lproj/Main.storyboard | 2 +- .../FlexChart101/FlexChart101/ChartData.swift | 12 + .../ConditionalFormattingController.swift | 18 +- .../CustomPlotElementsController.swift | 9 +- .../CustomizingAxesController.swift | 32 +- .../FlexChart101/HitTestController.swift | 4 +- .../chartscaling.imageset/Contents.json | 21 + .../chartscaling.imageset/chart_line.png | Bin 0 -> 6342 bytes .../ja.lproj/LaunchScreen.strings | 2 +- .../FlexChart101/ja.lproj/Localizable.strings | 5 + .../FlexGrid101.xcodeproj/project.pbxproj | 780 ++++++++------ .../contents.xcworkspacedata | 2 +- .../FlexGrid101/FlexGrid101/AppDelegate.swift | 20 +- .../FlexGrid101/Base.lproj/LaunchScreen.xib | 4 +- .../Base.lproj/Localizable.strings | 12 +- .../FlexGrid101/Base.lproj/Main.storyboard | 639 ++++++++++-- .../ColumnDefinitionsController.swift | 64 ++ .../FlexGrid101/ColumnLayoutController.swift | 84 +- .../ColumnReordererTableViewController.swift | 48 +- .../ConditionalFormattingController.swift | 152 ++- .../FlexGrid101/CustomCellsController.swift | 177 ++-- .../CustomMergingViewController.swift | 157 ++- .../FlexGrid101/CustomerData.swift | 139 ++- .../FlexGrid101/CustomerObjectEditor.swift | 94 +- .../EditConfirmationController.swift | 125 +-- .../FlexGrid101/EditingFormController.swift | 93 +- .../FlexGrid101/FilterController.swift | 341 ++----- .../FlexGrid101/FlexGrid101/FilterData.swift | 67 ++ .../FilterGridViewController.swift | 23 + .../FlexGrid101/FrozenCellsController.swift | 73 +- .../FullTextFilterController.swift | 217 ++-- .../GettingStartedController.swift | 101 +- .../FlexGrid101/GroupingController.swift | 150 +-- .../AppIcon.appiconset/Contents.json | 5 +- Swift/FlexGrid101/FlexGrid101/License.swift | 14 +- .../FlexGrid101/OnDemandController.swift | 121 ++- .../RowDetailsViewController.swift | 104 +- .../FlexGrid101/FlexGrid101/SampleData.swift | 22 + .../SelectionModesController.swift | 106 +- .../FlexGrid101/StarSizingController.swift | 90 +- .../UnboundSampleViewController.swift | 69 ++ .../FlexGrid101/YouTubeCollectionView.swift | 73 ++ .../FlexGrid101/flexgrid_headers.png | Bin 0 -> 2787 bytes .../FlexGrid101/ja.lproj/LaunchScreen.strings | 8 +- .../FlexGrid101/ja.lproj/Localizable.strings | 11 +- .../FlexGrid101/ja.lproj/Main.strings | 242 ++++- .../FlexGrid101Tests/FlexGrid101Tests.swift | 19 +- .../Gauges101.xcodeproj/project.pbxproj | 42 +- Swift/Gauges101/Gauges101/AppDelegate.swift | 2 +- .../Gauges101/Base.lproj/Main.storyboard | 32 +- .../Gauges101/XGAnimationViewController.swift | 4 +- .../XGAutomaticScalingViewController.swift | 2 +- .../XGBulletGraphViewController.swift | 2 +- .../Gauges101/XGDirectionViewController.swift | 2 +- .../XGDisplayingValuesViewController.swift | 10 +- .../XGExportImageViewController.swift | 9 +- .../XGGettingStartedViewController.swift | 9 +- .../XGUsingRangesViewController.swift | 8 +- .../Gauges101/ja.lproj/LaunchScreen.strings | 2 +- .../Gauges101/Gauges101/ja.lproj/Main.strings | 98 +- .../Input101.xcodeproj/project.pbxproj | 360 +++++++ .../contents.xcworkspacedata | 7 + Swift/Input101/Input101/AppDelegate.swift | 47 + .../AppIcon.appiconset/Contents.json | 81 ++ .../AppIcon.appiconset/Icon-60@2x.png | Bin 0 -> 2715 bytes .../AppIcon.appiconset/Icon-76.png | Bin 0 -> 1947 bytes .../AppIcon.appiconset/Icon-76@2x.png | Bin 0 -> 3815 bytes .../AppIcon.appiconset/Icon-Small-40.png | Bin 0 -> 1071 bytes .../AppIcon.appiconset/Icon-Small-40@2x-1.png | Bin 0 -> 2037 bytes .../AppIcon.appiconset/Icon-Small-40@2x.png | Bin 0 -> 2037 bytes .../AppIcon.appiconset/Icon-Small@2x-1-1.png | Bin 0 -> 1491 bytes .../AppIcon.appiconset/Icon-Small@2x-1.png | Bin 0 -> 1491 bytes .../Australia.imageset/Contents.json | 21 + .../Australia.imageset/australia.png | Bin 0 -> 2623 bytes .../Bangladesh.imageset/Contents.json | 21 + .../Bangladesh.imageset/bangladesh.png | Bin 0 -> 1447 bytes .../Brazil.imageset/Brazil.png | Bin 0 -> 2549 bytes .../Brazil.imageset/Contents.json | 21 + .../Canada.imageset/Canada.png | Bin 0 -> 1484 bytes .../Canada.imageset/Contents.json | 21 + .../China.imageset/Contents.json | 21 + .../Assets.xcassets/China.imageset/china.png | Bin 0 -> 1063 bytes .../France.imageset/Contents.json | 21 + .../France.imageset/France.png | Bin 0 -> 941 bytes .../Germany.imageset/Contents.json | 21 + .../Germany.imageset/Germany.png | Bin 0 -> 808 bytes .../India.imageset/Contents.json | 21 + .../Assets.xcassets/India.imageset/india.png | Bin 0 -> 1148 bytes .../Japan.imageset/Contents.json | 21 + .../Assets.xcassets/Japan.imageset/japan.png | Bin 0 -> 1024 bytes .../Nepal.imageset/Contents.json | 21 + .../Assets.xcassets/Nepal.imageset/nepal.png | Bin 0 -> 2026 bytes .../Pakistan.imageset/Contents.json | 21 + .../Pakistan.imageset/pakistan.png | Bin 0 -> 1448 bytes .../Srilanka.imageset/Contents.json | 21 + .../Srilanka.imageset/srilanka.png | Bin 0 -> 2136 bytes .../tip.imageset/Contents.json | 23 + .../Assets.xcassets/tip.imageset/tip.png | Bin 0 -> 784 bytes .../Assets.xcassets/tip.imageset/tip@2x.png | Bin 0 -> 1739 bytes .../Assets.xcassets/tip.imageset/tip@3x.png | Bin 0 -> 2679 bytes .../Base.lproj/LaunchScreen.storyboard | 53 + .../Input101/Base.lproj/Main.storyboard | 494 +++++++++ .../Input101/Images/input_autocomplete.png | Bin 0 -> 6355 bytes .../Input101/Images/input_combobox.png | Bin 0 -> 3679 bytes .../Input101/Images/input_dropdown.png | Bin 0 -> 3349 bytes Swift/Input101/Input101/Images/input_mask.png | Bin 0 -> 6954 bytes Swift/Input101/Input101/Info.plist | 47 + Swift/Input101/Input101/License.swift | 13 + .../Samples/AutoCompleteController.swift | 128 +++ .../Input101/Samples/AutoCompleteData.swift | 32 + .../Input101/Samples/ComboBoxController.swift | 50 + .../Input101/Samples/DropDownController.swift | 56 + .../Samples/MaskedInputController.swift | 33 + 368 files changed, 14244 insertions(+), 6360 deletions(-) create mode 100644 ObjectiveC/Calendar101/Calendar101/Base.lproj/Localizable.strings create mode 100644 ObjectiveC/Calendar101/Calendar101/en.lproj/Localizable.strings create mode 100644 ObjectiveC/Calendar101/Calendar101/ja.lproj/LaunchScreen.strings create mode 100644 ObjectiveC/Calendar101/Calendar101/ja.lproj/Localizable.strings create mode 100644 ObjectiveC/Calendar101/Calendar101/ja.lproj/Main.strings create mode 100644 ObjectiveC/CollectionView101/CollectionView101/Base.lproj/Localizable.strings create mode 100644 ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png create mode 100644 ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-76.png create mode 100644 ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png create mode 100644 ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-Small-40.png create mode 100644 ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png create mode 100644 ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png create mode 100644 ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-Small.png create mode 100644 ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1-1.png create mode 100644 ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png create mode 100644 ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png create mode 100644 ObjectiveC/CollectionView101/CollectionView101/en.lproj/Localizable.strings create mode 100644 ObjectiveC/CollectionView101/CollectionView101/ja.lproj/Localizable.strings create mode 100644 ObjectiveC/FlexChart101/FlexChart101/Images.xcassets/chartscaling.imageset/Contents.json create mode 100644 ObjectiveC/FlexChart101/FlexChart101/Images.xcassets/chartscaling.imageset/chart_line.png create mode 100644 ObjectiveC/FlexChart101/FlexChart101/MainMenuTableViewController.h create mode 100644 ObjectiveC/FlexChart101/FlexChart101/MainMenuTableViewController.m create mode 100644 ObjectiveC/FlexGrid101/FlexGrid101/FilterData.h create mode 100644 ObjectiveC/FlexGrid101/FlexGrid101/FilterData.m create mode 100644 ObjectiveC/FlexGrid101/FlexGrid101/FilterGridViewController.h create mode 100644 ObjectiveC/FlexGrid101/FlexGrid101/FilterGridViewController.m create mode 100644 ObjectiveC/FlexGrid101/FlexGrid101/SampleData.h create mode 100644 ObjectiveC/FlexGrid101/FlexGrid101/SampleData.m create mode 100644 ObjectiveC/FlexGrid101/FlexGrid101/UnboundSampleViewController.h create mode 100644 ObjectiveC/FlexGrid101/FlexGrid101/UnboundSampleViewController.m create mode 100644 ObjectiveC/FlexGrid101/FlexGrid101/YouTubeCollectionView.h create mode 100644 ObjectiveC/FlexGrid101/FlexGrid101/YouTubeCollectionView.m create mode 100644 ObjectiveC/FlexGrid101/FlexGrid101/flexgrid_headers.png create mode 100644 ObjectiveC/FlexPie101/FlexPie101/pie.png create mode 100644 ObjectiveC/FlexPie101/FlexPie101/pie_doughnut.png create mode 100644 ObjectiveC/FlexPie101/FlexPie101/pie_labels.png create mode 100644 ObjectiveC/FlexPie101/FlexPie101/pie_load.png create mode 100644 ObjectiveC/FlexPie101/FlexPie101/pie_selection.png create mode 100644 ObjectiveC/FlexPie101/FlexPie101/pie_title.png create mode 100644 ObjectiveC/FlexPie101/FlexPie101/themes.png create mode 100644 ObjectiveC/Input101/Input101.xcodeproj/project.pbxproj create mode 100644 ObjectiveC/Input101/Input101.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ObjectiveC/Input101/Input101/AppDelegate.h create mode 100644 ObjectiveC/Input101/Input101/AppDelegate.m create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-76.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1-1.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Australia.imageset/Australia.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Australia.imageset/Contents.json create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Bangladesh.imageset/Contents.json create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Bangladesh.imageset/bangladesh.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Brazil.imageset/Brazil.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Brazil.imageset/Contents.json create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Canada.imageset/Canada.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Canada.imageset/Contents.json create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/China.imageset/Contents.json create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/China.imageset/china.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/France.imageset/Contents.json create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/France.imageset/France.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Germany.imageset/Contents.json create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Germany.imageset/Germany.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/India.imageset/Contents.json create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/India.imageset/india.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Japan.imageset/Contents.json create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Japan.imageset/japan.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Nepal.imageset/Contents.json create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Nepal.imageset/nepal.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Pakistan.imageset/Contents.json create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Pakistan.imageset/pakistan.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Srilanka.imageset/Contents.json create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/Srilanka.imageset/srilanka.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/tip.imageset/Contents.json create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/tip.imageset/tip.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/tip.imageset/tip@2x.png create mode 100644 ObjectiveC/Input101/Input101/Assets.xcassets/tip.imageset/tip@3x.png create mode 100644 ObjectiveC/Input101/Input101/Base.lproj/LaunchScreen.storyboard create mode 100644 ObjectiveC/Input101/Input101/Base.lproj/Main.storyboard create mode 100644 ObjectiveC/Input101/Input101/Images/input_autocomplete.png create mode 100644 ObjectiveC/Input101/Input101/Images/input_combobox.png create mode 100644 ObjectiveC/Input101/Input101/Images/input_dropdown.png create mode 100644 ObjectiveC/Input101/Input101/Images/input_mask.png create mode 100644 ObjectiveC/Input101/Input101/Info.plist create mode 100644 ObjectiveC/Input101/Input101/License.h create mode 100644 ObjectiveC/Input101/Input101/License.m create mode 100644 ObjectiveC/Input101/Input101/Samples/AutoCompleteController.h create mode 100644 ObjectiveC/Input101/Input101/Samples/AutoCompleteController.m create mode 100644 ObjectiveC/Input101/Input101/Samples/AutoCompleteData.h create mode 100644 ObjectiveC/Input101/Input101/Samples/AutoCompleteData.m create mode 100644 ObjectiveC/Input101/Input101/Samples/ComboBoxController.h create mode 100644 ObjectiveC/Input101/Input101/Samples/ComboBoxController.m create mode 100644 ObjectiveC/Input101/Input101/Samples/DropDownController.h create mode 100644 ObjectiveC/Input101/Input101/Samples/DropDownController.m create mode 100644 ObjectiveC/Input101/Input101/Samples/MaskedInputController.h create mode 100644 ObjectiveC/Input101/Input101/Samples/MaskedInputController.m create mode 100644 ObjectiveC/Input101/Input101/main.m create mode 100644 Swift/Calendar101/Calendar101/Base.lproj/Localizable.strings create mode 100644 Swift/Calendar101/Calendar101/en.lproj/Localizable.strings create mode 100644 Swift/Calendar101/Calendar101/ja.lproj/LaunchScreen.strings create mode 100644 Swift/Calendar101/Calendar101/ja.lproj/Localizable.strings create mode 100644 Swift/Calendar101/Calendar101/ja.lproj/Main.strings create mode 100644 Swift/CollectionView101/CollectionView101/Base.lproj/Localizable.strings create mode 100644 Swift/CollectionView101/CollectionView101/en.lproj/Localizable.strings create mode 100644 Swift/CollectionView101/CollectionView101/ja.lproj/Localizable.strings create mode 100644 Swift/FlexChart101/FlexChart101/Images.xcassets/chartscaling.imageset/Contents.json create mode 100644 Swift/FlexChart101/FlexChart101/Images.xcassets/chartscaling.imageset/chart_line.png create mode 100644 Swift/FlexGrid101/FlexGrid101/ColumnDefinitionsController.swift create mode 100644 Swift/FlexGrid101/FlexGrid101/FilterData.swift create mode 100644 Swift/FlexGrid101/FlexGrid101/FilterGridViewController.swift create mode 100644 Swift/FlexGrid101/FlexGrid101/SampleData.swift create mode 100644 Swift/FlexGrid101/FlexGrid101/UnboundSampleViewController.swift create mode 100644 Swift/FlexGrid101/FlexGrid101/YouTubeCollectionView.swift create mode 100644 Swift/FlexGrid101/FlexGrid101/flexgrid_headers.png create mode 100644 Swift/Input101/Input101.xcodeproj/project.pbxproj create mode 100644 Swift/Input101/Input101.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Swift/Input101/Input101/AppDelegate.swift create mode 100644 Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-76.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1-1.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/Australia.imageset/Contents.json create mode 100644 Swift/Input101/Input101/Assets.xcassets/Australia.imageset/australia.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/Bangladesh.imageset/Contents.json create mode 100644 Swift/Input101/Input101/Assets.xcassets/Bangladesh.imageset/bangladesh.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/Brazil.imageset/Brazil.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/Brazil.imageset/Contents.json create mode 100644 Swift/Input101/Input101/Assets.xcassets/Canada.imageset/Canada.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/Canada.imageset/Contents.json create mode 100644 Swift/Input101/Input101/Assets.xcassets/China.imageset/Contents.json create mode 100644 Swift/Input101/Input101/Assets.xcassets/China.imageset/china.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/France.imageset/Contents.json create mode 100644 Swift/Input101/Input101/Assets.xcassets/France.imageset/France.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/Germany.imageset/Contents.json create mode 100644 Swift/Input101/Input101/Assets.xcassets/Germany.imageset/Germany.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/India.imageset/Contents.json create mode 100644 Swift/Input101/Input101/Assets.xcassets/India.imageset/india.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/Japan.imageset/Contents.json create mode 100644 Swift/Input101/Input101/Assets.xcassets/Japan.imageset/japan.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/Nepal.imageset/Contents.json create mode 100644 Swift/Input101/Input101/Assets.xcassets/Nepal.imageset/nepal.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/Pakistan.imageset/Contents.json create mode 100644 Swift/Input101/Input101/Assets.xcassets/Pakistan.imageset/pakistan.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/Srilanka.imageset/Contents.json create mode 100644 Swift/Input101/Input101/Assets.xcassets/Srilanka.imageset/srilanka.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/tip.imageset/Contents.json create mode 100644 Swift/Input101/Input101/Assets.xcassets/tip.imageset/tip.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/tip.imageset/tip@2x.png create mode 100644 Swift/Input101/Input101/Assets.xcassets/tip.imageset/tip@3x.png create mode 100644 Swift/Input101/Input101/Base.lproj/LaunchScreen.storyboard create mode 100644 Swift/Input101/Input101/Base.lproj/Main.storyboard create mode 100644 Swift/Input101/Input101/Images/input_autocomplete.png create mode 100644 Swift/Input101/Input101/Images/input_combobox.png create mode 100644 Swift/Input101/Input101/Images/input_dropdown.png create mode 100644 Swift/Input101/Input101/Images/input_mask.png create mode 100644 Swift/Input101/Input101/Info.plist create mode 100644 Swift/Input101/Input101/License.swift create mode 100644 Swift/Input101/Input101/Samples/AutoCompleteController.swift create mode 100644 Swift/Input101/Input101/Samples/AutoCompleteData.swift create mode 100644 Swift/Input101/Input101/Samples/ComboBoxController.swift create mode 100644 Swift/Input101/Input101/Samples/DropDownController.swift create mode 100644 Swift/Input101/Input101/Samples/MaskedInputController.swift diff --git a/ObjectiveC/Calendar101/Calendar101.xcodeproj/project.pbxproj b/ObjectiveC/Calendar101/Calendar101.xcodeproj/project.pbxproj index f3d2c0d..65160dd 100644 --- a/ObjectiveC/Calendar101/Calendar101.xcodeproj/project.pbxproj +++ b/ObjectiveC/Calendar101/Calendar101.xcodeproj/project.pbxproj @@ -7,11 +7,15 @@ objects = { /* Begin PBXBuildFile section */ - 8456E5A41C7EA2C1007DBBC9 /* XuniCalendarKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8456E5A21C7EA2C1007DBBC9 /* XuniCalendarKit.framework */; }; - 8456E5A51C7EA2C1007DBBC9 /* XuniCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8456E5A31C7EA2C1007DBBC9 /* XuniCoreKit.framework */; }; + 4C82378F1D26727C002D2BFE /* XuniCalendarDesignTimeStoryboardSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C82378E1D26727C002D2BFE /* XuniCalendarDesignTimeStoryboardSupport.m */; }; + 4C876D141D2583C100AEBAD8 /* XuniCalendarDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C876D121D2583C100AEBAD8 /* XuniCalendarDynamicKit.framework */; }; + 4C876D151D2583C100AEBAD8 /* XuniCoreDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C876D131D2583C100AEBAD8 /* XuniCoreDynamicKit.framework */; }; + 4C876D161D2583C500AEBAD8 /* XuniCalendarDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C876D121D2583C100AEBAD8 /* XuniCalendarDynamicKit.framework */; }; + 4C876D171D2583C500AEBAD8 /* XuniCalendarDynamicKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4C876D121D2583C100AEBAD8 /* XuniCalendarDynamicKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4C876D181D2583C500AEBAD8 /* XuniCoreDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C876D131D2583C100AEBAD8 /* XuniCoreDynamicKit.framework */; }; + 4C876D191D2583C500AEBAD8 /* XuniCoreDynamicKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4C876D131D2583C100AEBAD8 /* XuniCoreDynamicKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 849720C11C647ABB001F538B /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 849720C01C647ABB001F538B /* main.m */; }; 849720C41C647ABB001F538B /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 849720C31C647ABB001F538B /* AppDelegate.m */; }; - 849720C71C647ABB001F538B /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 849720C61C647ABB001F538B /* ViewController.m */; }; 849720CA1C647ABB001F538B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 849720C81C647ABB001F538B /* Main.storyboard */; }; 849720CC1C647ABB001F538B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 849720CB1C647ABB001F538B /* Assets.xcassets */; }; 849720CF1C647ABB001F538B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 849720CD1C647ABB001F538B /* LaunchScreen.storyboard */; }; @@ -25,15 +29,31 @@ 849720F11C647E09001F538B /* VerticalOrientationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 849720EA1C647E09001F538B /* VerticalOrientationController.m */; }; /* End PBXBuildFile section */ +/* Begin PBXCopyFilesBuildPhase section */ + 4C876D1A1D2583C500AEBAD8 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 4C876D191D2583C500AEBAD8 /* XuniCoreDynamicKit.framework in Embed Frameworks */, + 4C876D171D2583C500AEBAD8 /* XuniCalendarDynamicKit.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ - 8456E5A21C7EA2C1007DBBC9 /* XuniCalendarKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCalendarKit.framework; path = "../DerivedData/XuniCalendar/Build/Products/Debug-framework/XuniCalendarKit.framework"; sourceTree = ""; }; - 8456E5A31C7EA2C1007DBBC9 /* XuniCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreKit.framework; path = "../DerivedData/XuniCalendar/Build/Products/Debug-framework/XuniCoreKit.framework"; sourceTree = ""; }; + 4C37D42B1CD30E32009113A8 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/LaunchScreen.strings; sourceTree = ""; }; + 4C37D42C1CD30E33009113A8 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Main.strings; sourceTree = ""; }; + 4C82378E1D26727C002D2BFE /* XuniCalendarDesignTimeStoryboardSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XuniCalendarDesignTimeStoryboardSupport.m; path = ../../../Controls/XuniCalendarDesignTimeStoryboardSupport.m; sourceTree = ""; }; + 4C876D121D2583C100AEBAD8 /* XuniCalendarDynamicKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCalendarDynamicKit.framework; path = ../../../Controls/XuniCalendarDynamicKit.framework; sourceTree = ""; }; + 4C876D131D2583C100AEBAD8 /* XuniCoreDynamicKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreDynamicKit.framework; path = ../../../Controls/XuniCoreDynamicKit.framework; sourceTree = ""; }; 849720BC1C647ABB001F538B /* Calendar101.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Calendar101.app; sourceTree = BUILT_PRODUCTS_DIR; }; 849720C01C647ABB001F538B /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 849720C21C647ABB001F538B /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 849720C31C647ABB001F538B /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 849720C51C647ABB001F538B /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - 849720C61C647ABB001F538B /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 849720C91C647ABB001F538B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 849720CB1C647ABB001F538B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 849720CE1C647ABB001F538B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; @@ -61,19 +81,43 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8456E5A41C7EA2C1007DBBC9 /* XuniCalendarKit.framework in Frameworks */, - 8456E5A51C7EA2C1007DBBC9 /* XuniCoreKit.framework in Frameworks */, + 4C876D161D2583C500AEBAD8 /* XuniCalendarDynamicKit.framework in Frameworks */, + 4C876D141D2583C100AEBAD8 /* XuniCalendarDynamicKit.framework in Frameworks */, + 4C876D181D2583C500AEBAD8 /* XuniCoreDynamicKit.framework in Frameworks */, + 4C876D151D2583C100AEBAD8 /* XuniCoreDynamicKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 4CA1F2451CCE7AEB004B1C98 /* Samples */ = { + isa = PBXGroup; + children = ( + 849720E91C647E09001F538B /* VerticalOrientationController.h */, + 849720EA1C647E09001F538B /* VerticalOrientationController.m */, + 849720E71C647E09001F538B /* PopupEditorController.h */, + 849720E81C647E09001F538B /* PopupEditorController.m */, + 849720DD1C647E09001F538B /* CustomAppearanceController.h */, + 849720DE1C647E09001F538B /* CustomAppearanceController.m */, + 849720DF1C647E09001F538B /* CustomDayContentController.h */, + 849720E01C647E09001F538B /* CustomDayContentController.m */, + 849720E11C647E09001F538B /* CustomHeaderController.h */, + 849720E21C647E09001F538B /* CustomHeaderController.m */, + 849720E31C647E09001F538B /* CustomSelectionController.h */, + 849720E41C647E09001F538B /* CustomSelectionController.m */, + 849720E51C647E09001F538B /* GettingStartedController.h */, + 849720E61C647E09001F538B /* GettingStartedController.m */, + ); + name = Samples; + sourceTree = ""; + }; 849720B31C647ABB001F538B = { isa = PBXGroup; children = ( - 8456E5A21C7EA2C1007DBBC9 /* XuniCalendarKit.framework */, - 8456E5A31C7EA2C1007DBBC9 /* XuniCoreKit.framework */, + 4C82378E1D26727C002D2BFE /* XuniCalendarDesignTimeStoryboardSupport.m */, + 4C876D121D2583C100AEBAD8 /* XuniCalendarDynamicKit.framework */, + 4C876D131D2583C100AEBAD8 /* XuniCoreDynamicKit.framework */, 849720BE1C647ABB001F538B /* Calendar101 */, 849720BD1C647ABB001F538B /* Products */, ); @@ -90,31 +134,16 @@ 849720BE1C647ABB001F538B /* Calendar101 */ = { isa = PBXGroup; children = ( + 4CA1F2451CCE7AEB004B1C98 /* Samples */, 849720C21C647ABB001F538B /* AppDelegate.h */, 849720C31C647ABB001F538B /* AppDelegate.m */, 849720CB1C647ABB001F538B /* Assets.xcassets */, - 849720DD1C647E09001F538B /* CustomAppearanceController.h */, - 849720DE1C647E09001F538B /* CustomAppearanceController.m */, - 849720DF1C647E09001F538B /* CustomDayContentController.h */, - 849720E01C647E09001F538B /* CustomDayContentController.m */, - 849720E11C647E09001F538B /* CustomHeaderController.h */, - 849720E21C647E09001F538B /* CustomHeaderController.m */, - 849720E31C647E09001F538B /* CustomSelectionController.h */, - 849720E41C647E09001F538B /* CustomSelectionController.m */, - 849720E51C647E09001F538B /* GettingStartedController.h */, - 849720E61C647E09001F538B /* GettingStartedController.m */, 849720D01C647ABB001F538B /* Info.plist */, 849720CD1C647ABB001F538B /* LaunchScreen.storyboard */, 849720DA1C647D1A001F538B /* License.h */, 849720DB1C647D1A001F538B /* License.m */, 849720C81C647ABB001F538B /* Main.storyboard */, - 849720E71C647E09001F538B /* PopupEditorController.h */, - 849720E81C647E09001F538B /* PopupEditorController.m */, 849720BF1C647ABB001F538B /* Supporting Files */, - 849720E91C647E09001F538B /* VerticalOrientationController.h */, - 849720EA1C647E09001F538B /* VerticalOrientationController.m */, - 849720C51C647ABB001F538B /* ViewController.h */, - 849720C61C647ABB001F538B /* ViewController.m */, ); path = Calendar101; sourceTree = ""; @@ -137,6 +166,7 @@ 849720B81C647ABB001F538B /* Sources */, 849720B91C647ABB001F538B /* Frameworks */, 849720BA1C647ABB001F538B /* Resources */, + 4C876D1A1D2583C500AEBAD8 /* Embed Frameworks */, ); buildRules = ( ); @@ -199,11 +229,11 @@ files = ( 849720ED1C647E09001F538B /* CustomHeaderController.m in Sources */, 849720F01C647E09001F538B /* PopupEditorController.m in Sources */, - 849720C71C647ABB001F538B /* ViewController.m in Sources */, 849720C41C647ABB001F538B /* AppDelegate.m in Sources */, 849720EE1C647E09001F538B /* CustomSelectionController.m in Sources */, 849720C11C647ABB001F538B /* main.m in Sources */, 849720DC1C647D1A001F538B /* License.m in Sources */, + 4C82378F1D26727C002D2BFE /* XuniCalendarDesignTimeStoryboardSupport.m in Sources */, 849720F11C647E09001F538B /* VerticalOrientationController.m in Sources */, 849720EF1C647E09001F538B /* GettingStartedController.m in Sources */, 849720EB1C647E09001F538B /* CustomAppearanceController.m in Sources */, @@ -218,6 +248,7 @@ isa = PBXVariantGroup; children = ( 849720C91C647ABB001F538B /* Base */, + 4C37D42C1CD30E33009113A8 /* ja */, ); name = Main.storyboard; sourceTree = ""; @@ -226,6 +257,7 @@ isa = PBXVariantGroup; children = ( 849720CE1C647ABB001F538B /* Base */, + 4C37D42B1CD30E32009113A8 /* ja */, ); name = LaunchScreen.storyboard; sourceTree = ""; @@ -324,6 +356,7 @@ "FRAMEWORK_SEARCH_PATHS[arch=*]" = ( "$(inherited)", ../../../Controls, + ../../../../Controls, ); INFOPLIST_FILE = Calendar101/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -342,6 +375,7 @@ "FRAMEWORK_SEARCH_PATHS[arch=*]" = ( "$(inherited)", ../../../Controls, + ../../../Controls, ); INFOPLIST_FILE = Calendar101/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; diff --git a/ObjectiveC/Calendar101/Calendar101/AppDelegate.m b/ObjectiveC/Calendar101/Calendar101/AppDelegate.m index b95438d..757a3c2 100644 --- a/ObjectiveC/Calendar101/Calendar101/AppDelegate.m +++ b/ObjectiveC/Calendar101/Calendar101/AppDelegate.m @@ -6,7 +6,7 @@ // #import "AppDelegate.h" -#import "XuniCoreKit/XuniCoreKit.h" +@import XuniCoreDynamicKit; #import "License.h" @interface AppDelegate () diff --git a/ObjectiveC/Calendar101/Calendar101/Base.lproj/LaunchScreen.storyboard b/ObjectiveC/Calendar101/Calendar101/Base.lproj/LaunchScreen.storyboard index c63d31c..6b42e95 100644 --- a/ObjectiveC/Calendar101/Calendar101/Base.lproj/LaunchScreen.storyboard +++ b/ObjectiveC/Calendar101/Calendar101/Base.lproj/LaunchScreen.storyboard @@ -1,8 +1,9 @@ - + - + + @@ -13,37 +14,31 @@ - + - - + - - - - + + + + + + diff --git a/ObjectiveC/Calendar101/Calendar101/Base.lproj/Localizable.strings b/ObjectiveC/Calendar101/Calendar101/Base.lproj/Localizable.strings new file mode 100644 index 0000000..6c05d6d --- /dev/null +++ b/ObjectiveC/Calendar101/Calendar101/Base.lproj/Localizable.strings @@ -0,0 +1,6 @@ +/* + Localizable.strings + Calendar101 + + Copyright (c) 2015 GrapeCity. All rights reserved. +*/ diff --git a/ObjectiveC/Calendar101/Calendar101/Base.lproj/Main.storyboard b/ObjectiveC/Calendar101/Calendar101/Base.lproj/Main.storyboard index f1f66bd..10812ac 100644 --- a/ObjectiveC/Calendar101/Calendar101/Base.lproj/Main.storyboard +++ b/ObjectiveC/Calendar101/Calendar101/Base.lproj/Main.storyboard @@ -1,27 +1,13 @@ - + - + + + - - - - - - - - - - - - - - - - - + @@ -32,72 +18,95 @@ + + + + + + + + + + + + + + + - + - - + + - + - - + + - + - - - + + + + + + + + + - - + - + + + + + - + + + + + + + + + + + + + - - + + + + + + - - - - - - - + + + - - - - - - - - - - - - - - - - - - - + - + @@ -108,14 +117,33 @@ + + + + + + + + + + + + + + + + + + + - + - + @@ -126,12 +154,32 @@ + + + + + + + + + + + + + + + + + + + + - + @@ -149,9 +197,9 @@ - + - + @@ -162,14 +210,41 @@ + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -180,12 +255,452 @@ + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ObjectiveC/Calendar101/Calendar101/CustomAppearanceController.m b/ObjectiveC/Calendar101/Calendar101/CustomAppearanceController.m index 070a053..87d782e 100644 --- a/ObjectiveC/Calendar101/Calendar101/CustomAppearanceController.m +++ b/ObjectiveC/Calendar101/Calendar101/CustomAppearanceController.m @@ -6,9 +6,10 @@ // #import "CustomAppearanceController.h" -#import "XuniCalendarKit/XuniCalendarKit.h" +@import XuniCalendarDynamicKit; @interface CustomAppearanceController () +@property (weak, nonatomic) IBOutlet XuniCalendar *calendar; @end @@ -16,56 +17,26 @@ @implementation CustomAppearanceController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:@"Custom Appearance"]; - // Do any additional setup after loading the view. - XuniCalendar *calendar = [[XuniCalendar alloc] initWithFrame:CGRectZero]; - calendar.borderColor = [UIColor blackColor]; - calendar.borderWidth = 5.0; + // Do any additional setup after loading the view. + self.calendar.borderColor = [UIColor blackColor]; + self.calendar.borderWidth = 5.0; - calendar.headerBackgroundColor = [UIColor colorWithRed:61 / 255.0 green:131 / 255.0 blue:75 / 255.0 alpha:1.0]; - calendar.headerTextColor = [UIColor whiteColor]; - calendar.headerFont = [UIFont boldSystemFontOfSize:28.0]; + self.calendar.headerBackgroundColor = [UIColor colorWithRed:61 / 255.0 green:131 / 255.0 blue:75 / 255.0 alpha:1.0]; + self.calendar.headerTextColor = [UIColor whiteColor]; + self.calendar.headerFont = [UIFont boldSystemFontOfSize:28.0]; - calendar.dayOfWeekFormat = XuniDayOfWeekFormatD; - calendar.dayOfWeekBackgroundColor = [UIColor colorWithRed:99 / 255.0 green:166 / 255.0 blue:70 / 255.0 alpha:1.0]; - calendar.dayOfWeekTextColor = [UIColor whiteColor]; - calendar.dayOfWeekFont = [UIFont boldSystemFontOfSize:20.0]; + self.calendar.dayOfWeekFormat = XuniDayOfWeekFormatD; + self.calendar.dayOfWeekBackgroundColor = [UIColor colorWithRed:99 / 255.0 green:166 / 255.0 blue:70 / 255.0 alpha:1.0]; + self.calendar.dayOfWeekTextColor = [UIColor whiteColor]; + self.calendar.dayOfWeekFont = [UIFont boldSystemFontOfSize:20.0]; - calendar.dayBorderColor = [UIColor colorWithRed:242 / 255.0 green:242 / 255.0 blue:242 / 255.0 alpha:1.0]; - calendar.dayBorderWidth = 2; + self.calendar.dayBorderColor = [UIColor colorWithRed:242 / 255.0 green:242 / 255.0 blue:242 / 255.0 alpha:1.0]; + self.calendar.dayBorderWidth = 2; - calendar.adjacentDayTextColor = [UIColor grayColor]; - calendar.calendarFont = [UIFont systemFontOfSize:14.0]; - calendar.todayFont = [UIFont italicSystemFontOfSize:16.0]; - - calendar.tag = 1; - - [self.view addSubview:calendar]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - - CGSize size = self.view.bounds.size; - CGFloat width = fminf(size.width, size.height); - XuniCalendar *calendar = (XuniCalendar *)[self.view viewWithTag:1]; - calendar.frame = CGRectMake(0, 70, width, width - 70); -} - -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. + self.calendar.adjacentDayTextColor = [UIColor grayColor]; + self.calendar.calendarFont = [UIFont systemFontOfSize:14.0]; + self.calendar.todayFont = [UIFont italicSystemFontOfSize:16.0]; } -*/ @end diff --git a/ObjectiveC/Calendar101/Calendar101/CustomDayContentController.h b/ObjectiveC/Calendar101/Calendar101/CustomDayContentController.h index f206e15..c4ecff1 100644 --- a/ObjectiveC/Calendar101/Calendar101/CustomDayContentController.h +++ b/ObjectiveC/Calendar101/Calendar101/CustomDayContentController.h @@ -6,7 +6,7 @@ // #import -#import "XuniCalendarKit/XuniCalendarKit.h" +@import XuniCalendarDynamicKit; @interface CustomDayContentController : UIViewController diff --git a/ObjectiveC/Calendar101/Calendar101/CustomDayContentController.m b/ObjectiveC/Calendar101/Calendar101/CustomDayContentController.m index f58eda3..d83dd36 100644 --- a/ObjectiveC/Calendar101/Calendar101/CustomDayContentController.m +++ b/ObjectiveC/Calendar101/Calendar101/CustomDayContentController.m @@ -8,6 +8,7 @@ #import "CustomDayContentController.h" @interface CustomDayContentController () +@property (weak, nonatomic) IBOutlet XuniCalendar *calendar; @end @@ -18,47 +19,28 @@ @implementation CustomDayContentController { - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:@"Custom Day Content"]; - // Do any additional setup after loading the view. weatherIcon = [[NSArray alloc] initWithObjects:@"sunny", @"cloudy", @"rainy", @"stomy", nil]; dotIcon = [[NSArray alloc] initWithObjects:@"blue", @"red", @"green", nil]; - XuniCalendar *calendar = [[XuniCalendar alloc] initWithFrame:CGRectZero]; - calendar.delegate = self; - calendar.dayOfWeekFormat = XuniDayOfWeekFormatDDDD; - calendar.calendarFont = [UIFont systemFontOfSize:14]; - calendar.todayFont = [UIFont boldSystemFontOfSize:14]; - calendar.tag = 1; - - [self.view addSubview:calendar]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} + self.calendar.delegate = self; + self.calendar.dayOfWeekFormat = XuniDayOfWeekFormatDDDD; + self.calendar.calendarFont = [UIFont systemFontOfSize:14]; + self.calendar.todayFont = [UIFont boldSystemFontOfSize:14]; -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - - CGSize size = self.view.bounds.size; - CGFloat width = fminf(size.width, size.height); - XuniCalendar *calendar = (XuniCalendar *)[self.view viewWithTag:1]; - calendar.frame = CGRectMake(0, 75, width, width - 75); } -- (void)dayOfWeekSlotLoading:(XuniCalendar *)sender args:(XuniCalendarDayOfWeekSlotLoadingEventArgs *)args { - args.dayOfWeekSlot.font = args.isWeekend ? [UIFont italicSystemFontOfSize:11.0] : [UIFont boldSystemFontOfSize:11.0]; +- (void)dayOfWeekSlotLoading:(XuniCalendar *)sender dayOfWeek:(XuniDayOfWeek)dayOfWeek isWeekend:(BOOL)isWeekend dayOfWeekSlot:(UILabel*)dayOfWeekSlot { + dayOfWeekSlot.font = isWeekend ? [UIFont italicSystemFontOfSize:11.0] : [UIFont boldSystemFontOfSize:11.0]; } -- (void)daySlotLoading:(XuniCalendar *)sender args:(XuniCalendarDaySlotLoadingEventArgs *)args { - if (args.isAdjacentDay) { - return; +- (XuniCalendarDaySlotBase*)daySlotLoading:(XuniCalendar *)sender date:(NSDate*)date isAdjacentDay:(BOOL)isAdjacentDay daySlot:(XuniCalendarDaySlotBase*)daySlot { + if (isAdjacentDay) { + return daySlot; } - NSInteger day = [[NSCalendar currentCalendar] components:NSCalendarUnitDay fromDate:args.date].day; - CGRect rect = args.daySlot.frame; + NSInteger day = [[NSCalendar currentCalendar] components:NSCalendarUnitDay fromDate:date].day; + CGRect rect = daySlot.frame; CGSize size = rect.size; CGRect rect1, rect2; XuniCalendarImageDaySlot *imageDaySlot = [[XuniCalendarImageDaySlot alloc] initWithCalendar:sender frame:rect]; @@ -81,17 +63,7 @@ - (void)daySlotLoading:(XuniCalendar *)sender args:(XuniCalendarDaySlotLoadingEv imageDaySlot.imageSource = [UIImage imageNamed:[dotIcon objectAtIndex:(day % 3)]]; } - args.daySlot = imageDaySlot; -} - -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. + return imageDaySlot; } -*/ @end diff --git a/ObjectiveC/Calendar101/Calendar101/CustomHeaderController.h b/ObjectiveC/Calendar101/Calendar101/CustomHeaderController.h index 52606b4..b4d45ad 100644 --- a/ObjectiveC/Calendar101/Calendar101/CustomHeaderController.h +++ b/ObjectiveC/Calendar101/Calendar101/CustomHeaderController.h @@ -6,8 +6,8 @@ // #import -#import "XuniCalendarKit/XuniCalendarKit.h" +@import XuniCalendarDynamicKit; -@interface CustomHeaderController : UIViewController +@interface CustomHeaderController : UIViewController @end diff --git a/ObjectiveC/Calendar101/Calendar101/CustomHeaderController.m b/ObjectiveC/Calendar101/Calendar101/CustomHeaderController.m index efb240d..bcc6b7a 100644 --- a/ObjectiveC/Calendar101/Calendar101/CustomHeaderController.m +++ b/ObjectiveC/Calendar101/Calendar101/CustomHeaderController.m @@ -8,111 +8,60 @@ #import "CustomHeaderController.h" @interface CustomHeaderController () +@property (weak, nonatomic) IBOutlet UILabel *dateLabel; +@property (weak, nonatomic) IBOutlet UISegmentedControl *modeSelector; +@property (weak, nonatomic) IBOutlet XuniCalendar *calendar; @end @implementation CustomHeaderController { - NSArray *viewTypePickerData; NSDateFormatter *dateFormatter; + BOOL isEnglish; +} + +- (IBAction)selectToday:(id)sender { + self.calendar.selectedDate = [NSDate date]; + self.calendar.displayDate = [NSDate date]; +} + +- (IBAction)selectMode:(id)sender { + if (self.modeSelector.selectedSegmentIndex == 0) { + [self.calendar changeViewModeAsync:XuniCalendarViewModeMonth date:nil]; + } + else if (self.modeSelector.selectedSegmentIndex == 1) { + [self.calendar changeViewModeAsync:XuniCalendarViewModeYear date:nil]; + } } - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:@"Custom Header"]; - // Do any additional setup after loading the view. - viewTypePickerData = [[NSArray alloc] initWithObjects:@"Month View", @"Year View", nil]; dateFormatter = [[NSDateFormatter alloc] init]; + [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]]; - UIPickerView *viewTypePicker = [[UIPickerView alloc] init]; - viewTypePicker.delegate = self; - viewTypePicker.showsSelectionIndicator = YES; - viewTypePicker.hidden = false; - viewTypePicker.tag = 2; - - UILabel *dateLabel = [[UILabel alloc] init]; - dateLabel.text = @""; - dateLabel.tag = 3; - - UIButton *todayBtn = [UIButton buttonWithType:UIButtonTypeSystem]; - [todayBtn setTitle:@"Today" forState:UIControlStateNormal]; - [todayBtn addTarget:self action:@selector(todayBtnClick:) forControlEvents:UIControlEventTouchUpInside]; - todayBtn.tag = 4; - - XuniCalendar *calendar = [[XuniCalendar alloc] initWithFrame:CGRectZero]; - calendar.delegate = self; - calendar.showHeader = NO; - calendar.tag = 1; - - [self.view addSubview:viewTypePicker]; - [self.view addSubview:dateLabel]; - [self.view addSubview:todayBtn]; - [self.view addSubview:calendar]; + NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0]; + isEnglish = ![language containsString:@"ja"] && ![language containsString:@"zh"]; + + self.calendar.delegate = self; + self.calendar.showHeader = NO; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self updateDateLabel]; } -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - - CGSize size = self.view.bounds.size; - CGFloat width = fminf(size.width, size.height); - XuniCalendar *calendar = (XuniCalendar *)[self.view viewWithTag:1]; - UIPickerView *viewTypePicker = (UIPickerView *)[self.view viewWithTag:2]; - UILabel *dateLabel = (UILabel *)[self.view viewWithTag:3]; - UIButton *todayBtn = (UIButton *)[self.view viewWithTag:4]; - - viewTypePicker.frame = CGRectMake(0, 55, 150, 120); - dateLabel.frame = CGRectMake(170, 120, 130, 30); - todayBtn.frame = CGRectMake(300, 120, 60, 30); - calendar.frame = CGRectMake(0, 55 + 100, width, width - 55 - 120); -} - -- (void)todayBtnClick:(id)sender { - XuniCalendar *calendar = (XuniCalendar *)[self.view viewWithTag:1]; - calendar.selectedDate = [NSDate date]; - calendar.displayDate = [NSDate date]; -} - -- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { - return 1; -} - -- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { - return [viewTypePickerData count]; -} -- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { - XuniCalendar *calendar = (XuniCalendar *)[self.view viewWithTag:1]; +- (void)viewModeChanged:(XuniCalendar *)sender { - if (pickerView.tag == 2) { - if (row == 0) { - calendar.viewMode = XuniCalendarViewModeMonth; - } - else if (row == 1) { - calendar.viewMode = XuniCalendarViewModeYear; - } + if (self.calendar.viewMode == XuniCalendarViewModeMonth) { + self.modeSelector.selectedSegmentIndex = 0; } -} - -- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { - if(pickerView.tag == 2) { - return [viewTypePickerData objectAtIndex:row]; + else if (self.calendar.viewMode == XuniCalendarViewModeYear) { + self.modeSelector.selectedSegmentIndex = 1; } - else { - return @"error"; - } -} - -- (void)viewModeChanged:(XuniCalendar *)sender { + [self updateDateLabel]; } @@ -121,21 +70,12 @@ - (void)displayDateChanged:(XuniCalendar *)sender { } - (void)updateDateLabel { - XuniCalendar *calendar = (XuniCalendar *)[self.view viewWithTag:1]; - UILabel *dateLabel = (UILabel *)[self.view viewWithTag:3]; + XuniCalendar *calendar = self.calendar; + UILabel *dateLabel = self.dateLabel; - dateFormatter.dateFormat = (calendar.viewMode == XuniCalendarViewModeMonth) ? @"MMMM yyyy" : @"yyyy"; + dateFormatter.dateFormat = (calendar.viewMode == XuniCalendarViewModeMonth) ? (isEnglish ? @"MMMM yyyy" : @"yyyy年M月") : @"yyyy"; dateLabel.text = [dateFormatter stringFromDate:calendar.displayDate]; } -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/Calendar101/Calendar101/CustomSelectionController.h b/ObjectiveC/Calendar101/Calendar101/CustomSelectionController.h index 25a3fe6..362a857 100644 --- a/ObjectiveC/Calendar101/Calendar101/CustomSelectionController.h +++ b/ObjectiveC/Calendar101/Calendar101/CustomSelectionController.h @@ -6,7 +6,7 @@ // #import -#import "XuniCalendarKit/XuniCalendarKit.h" +@import XuniCalendarDynamicKit; @interface CustomSelectionController : UIViewController diff --git a/ObjectiveC/Calendar101/Calendar101/CustomSelectionController.m b/ObjectiveC/Calendar101/Calendar101/CustomSelectionController.m index 5e85206..8139f80 100644 --- a/ObjectiveC/Calendar101/Calendar101/CustomSelectionController.m +++ b/ObjectiveC/Calendar101/Calendar101/CustomSelectionController.m @@ -8,6 +8,7 @@ #import "CustomSelectionController.h" @interface CustomSelectionController () +@property (weak, nonatomic) IBOutlet XuniCalendar *calendar; @end @@ -22,18 +23,8 @@ - (void)viewDidLoad { // Do any additional setup after loading the view. components = [[NSDateComponents alloc] init]; - UILabel *stepsLabel = [[UILabel alloc] init]; - stepsLabel.numberOfLines = 3; - stepsLabel.text = @"Step1: Select a date.\nStep2: Select another date in a different week.\nObserve: The weekend days are not selected."; - stepsLabel.tag = 2; - - XuniCalendar *calendar = [[XuniCalendar alloc] initWithFrame:CGRectZero]; - calendar.delegate = self; - calendar.maxSelectionCount = 100; - calendar.tag = 1; - - [self.view addSubview:stepsLabel]; - [self.view addSubview:calendar]; + self.calendar.delegate = self; + self.calendar.maxSelectionCount = 100; } - (void)didReceiveMemoryWarning { @@ -41,28 +32,15 @@ - (void)didReceiveMemoryWarning { // Dispose of any resources that can be recreated. } -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - - CGSize size = self.view.bounds.size; - CGFloat width = fminf(size.width, size.height); - UILabel *stepsLabel = (UILabel *)[self.view viewWithTag:2]; - XuniCalendar *calendar = (XuniCalendar *)[self.view viewWithTag:1]; - - stepsLabel.frame = CGRectMake(0, 55, width, 100); - calendar.frame = CGRectMake(0, 55 + 100, width, width - 55 -100); -} - -- (void)selectionChanging:(XuniCalendar *)sender args:(XuniCalendarSelectionChangedEventArgs *)args { - - for (NSDate *date = args.selectedDates.startDate; - [date compare:args.selectedDates.endDate] == NSOrderedAscending - || [date compare:args.selectedDates.endDate] == NSOrderedSame; +- (void)selectionChanging:(XuniCalendar *)sender selectedDates:(XuniCalendarRange*)selectedDates { + for (NSDate *date = selectedDates.startDate; + [date compare:selectedDates.endDate] == NSOrderedAscending + || [date compare:selectedDates.endDate] == NSOrderedSame; date = [self getNextDateOf:date]) { NSInteger weekday = [[[NSCalendar currentCalendar] components:NSCalendarUnitWeekday fromDate:date] weekday]; if (weekday == 1 || weekday == 7) { - [args.selectedDates addExcludedDates:date]; + [selectedDates addExcludedDates:date]; } } } @@ -72,14 +50,5 @@ - (NSDate *)getNextDateOf:(NSDate *)date { return [[NSCalendar currentCalendar] dateByAddingComponents:components toDate:date options:0]; } -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/Calendar101/Calendar101/GettingStartedController.m b/ObjectiveC/Calendar101/Calendar101/GettingStartedController.m index 3d641b4..c8211b3 100644 --- a/ObjectiveC/Calendar101/Calendar101/GettingStartedController.m +++ b/ObjectiveC/Calendar101/Calendar101/GettingStartedController.m @@ -6,7 +6,7 @@ // #import "GettingStartedController.h" -#import "XuniCalendarKit/XuniCalendarKit.h" +@import XuniCalendarDynamicKit; @interface GettingStartedController () @@ -16,27 +16,6 @@ @implementation GettingStartedController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:@"Getting Started"]; - - // Do any additional setup after loading the view. - XuniCalendar *calendar = [[XuniCalendar alloc] initWithFrame:CGRectZero]; - calendar.tag = 1; - - [self.view addSubview:calendar]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - - CGSize size = self.view.bounds.size; - CGFloat width = fminf(size.width, size.height); - XuniCalendar *calendar = (XuniCalendar *)[self.view viewWithTag:1]; - calendar.frame = CGRectMake(0, 75, width, width - 75); } @end diff --git a/ObjectiveC/Calendar101/Calendar101/PopupEditorController.h b/ObjectiveC/Calendar101/Calendar101/PopupEditorController.h index a378ad5..1050d72 100644 --- a/ObjectiveC/Calendar101/Calendar101/PopupEditorController.h +++ b/ObjectiveC/Calendar101/Calendar101/PopupEditorController.h @@ -6,7 +6,7 @@ // #import -#import "XuniCalendarKit/XuniCalendarKit.h" +@import XuniCalendarDynamicKit; @interface PopupEditorController : UIViewController diff --git a/ObjectiveC/Calendar101/Calendar101/PopupEditorController.m b/ObjectiveC/Calendar101/Calendar101/PopupEditorController.m index 8d38727..3a37d47 100644 --- a/ObjectiveC/Calendar101/Calendar101/PopupEditorController.m +++ b/ObjectiveC/Calendar101/Calendar101/PopupEditorController.m @@ -23,6 +23,7 @@ - (void)viewDidLoad { dateFormatter = [[NSDateFormatter alloc] init]; XuniCalendar *calendar = [[XuniCalendar alloc] initWithFrame:CGRectZero]; + calendar.headerBackgroundColor = [UIColor whiteColor]; calendar.delegate = self; calendar.hidden = YES; calendar.tag = 1; @@ -36,9 +37,17 @@ - (void)viewDidLoad { dateLabel.text = @""; dateLabel.tag = 3; + UIView *view = [[UIView alloc]initWithFrame:CGRectZero]; + view.backgroundColor = [UIColor whiteColor]; + view.userInteractionEnabled = YES; + view.layer.cornerRadius = 4; + view.tag = 4; + [self.view addSubview:pickBtn]; [self.view addSubview:dateLabel]; + [self.view addSubview:view]; [self.view addSubview:calendar]; + } - (void)didReceiveMemoryWarning { @@ -46,6 +55,12 @@ - (void)didReceiveMemoryWarning { // Dispose of any resources that can be recreated. } +- (void)viewWillDisappear:(BOOL)animated +{ + self.view.backgroundColor = [UIColor whiteColor]; + self.navigationController.navigationBar.barTintColor = [UIColor whiteColor]; +} + - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; @@ -54,34 +69,40 @@ - (void)viewDidLayoutSubviews { XuniCalendar *calendar = (XuniCalendar *)[self.view viewWithTag:1]; UIButton *pickBtn = (UIButton *)[self.view viewWithTag:2]; UILabel *dateLabel = (UILabel *)[self.view viewWithTag:3]; + UIView *view = (UIView *)[self.view viewWithTag:4]; pickBtn.frame = CGRectMake(10, 55 + 10, size.width - 10 - 10, 30); dateLabel.frame = CGRectMake((size.width - 280) / 2, 55 + 50, 280, 30); calendar.frame = CGRectMake((size.width - width) / 2, 55 + 140, width, width); + view.frame = CGRectMake((size.width - width) / 2 - 4, 55 + 140 - 4, width + 8, width + 8); } - (void)pickBtnClick:(id)sender { XuniCalendar *calendar = (XuniCalendar *)[self.view viewWithTag:1]; calendar.hidden = !calendar.hidden; + if (calendar.hidden == NO) { + self.view.backgroundColor = [UIColor lightGrayColor]; + self.navigationController.navigationBar.barTintColor = [UIColor lightGrayColor]; + } + else + { + self.view.backgroundColor = [UIColor whiteColor]; + self.navigationController.navigationBar.barTintColor = [UIColor whiteColor]; + } } -- (void)selectionChanged:(XuniCalendar *)sender args:(XuniCalendarSelectionChangedEventArgs *)args { +- (void)selectionChanged:(XuniCalendar *)sender selectedDates:(XuniCalendarRange*)selectedDates { XuniCalendar *calendar = (XuniCalendar *)[self.view viewWithTag:1]; UILabel *dateLabel = (UILabel *)[self.view viewWithTag:3]; dateFormatter.dateFormat = @"M/d/yyyy"; - dateLabel.text = [NSString stringWithFormat:@"The date %@ was selected.", [dateFormatter stringFromDate:args.selectedDates.startDate]]; + dateLabel.text = [NSString stringWithFormat:@"The date %@ was selected.", [dateFormatter stringFromDate:selectedDates.startDate]]; calendar.hidden = YES; + if (calendar.hidden == YES) { + self.view.backgroundColor = [UIColor whiteColor]; + self.navigationController.navigationBar.barTintColor = [UIColor whiteColor]; + } } -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/Calendar101/Calendar101/VerticalOrientationController.m b/ObjectiveC/Calendar101/Calendar101/VerticalOrientationController.m index f21bc31..bc5d5e9 100644 --- a/ObjectiveC/Calendar101/Calendar101/VerticalOrientationController.m +++ b/ObjectiveC/Calendar101/Calendar101/VerticalOrientationController.m @@ -6,9 +6,10 @@ // #import "VerticalOrientationController.h" -#import "XuniCalendarKit/XuniCalendarKit.h" +@import XuniCalendarDynamicKit; @interface VerticalOrientationController () +@property (weak, nonatomic) IBOutlet XuniCalendar *calendar; @end @@ -16,38 +17,7 @@ @implementation VerticalOrientationController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:@"Vertical Orientation"]; - - // Do any additional setup after loading the view. - XuniCalendar *calendar = [[XuniCalendar alloc] initWithFrame:CGRectZero]; - calendar.orientation = XuniCalendarOrientationVertical; - calendar.tag = 1; - - [self.view addSubview:calendar]; + self.calendar.orientation = XuniCalendarOrientationVertical; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - - CGSize size = self.view.bounds.size; - CGFloat width = fminf(size.width, size.height); - XuniCalendar *calendar = (XuniCalendar *)[self.view viewWithTag:1]; - calendar.frame = CGRectMake(0, 75, width, width - 75); -} - -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ - @end diff --git a/ObjectiveC/Calendar101/Calendar101/en.lproj/Localizable.strings b/ObjectiveC/Calendar101/Calendar101/en.lproj/Localizable.strings new file mode 100644 index 0000000..e5586ab --- /dev/null +++ b/ObjectiveC/Calendar101/Calendar101/en.lproj/Localizable.strings @@ -0,0 +1,49 @@ +/* + Localizable.strings + Calendar101 + + Copyright (c) 2015 GrapeCity. All rights reserved. +*/ + +// Samples Title +"Getting Started" = "Getting Started"; + +"Vertical Orientation" = "Vertical Orientation"; + +"Custom Day Content" = "Custom Day Content"; + +"Custom Header" = "Custom Header"; + +"Custom Appearance" = "Custom Appearance"; + +"Popup Editor" = "Popup Editor"; + +"Custom Selection" = "Custom Selection"; + +// Samples Description +"Shows a basic calendar with selection and interaction." = "Shows a basic calendar with selection and interaction."; + +"Shows a calendar with vertical navigation/scrolling." = "Shows a calendar with vertical navigation/scrolling."; + +"Shows how to customize a day slot to show custom content." = "Shows how to customize a day slot to show custom content."; + +"Shows a custom header inspired by a popular Android or iOS calendar app." = "Shows a custom header inspired by a popular Android or iOS calendar app."; + +"Shows a calendar with a custom style." = "Shows a calendar with a custom style."; + +"Shows how to use the control as a pop-up date selector." = "Shows how to use the control as a pop-up date selector."; + +"Shows custom selection scenarios." = "Shows custom selection scenarios."; + +// Strings +"Month View" = "Month View"; + +"Year View" = "Year View"; + +"Today" = "Today"; + +"Step1: Select a date.\nStep2: Select another date in a different week.\nObserve: The weekend days are not selected." = "Step1: Select a date.\nStep2: Select another date in a different week.\nObserve: The weekend days are not selected."; + +"Pick a date" = "Pick a date"; + +"The date %@ was selected." = "The date %@ was selected."; diff --git a/ObjectiveC/Calendar101/Calendar101/ja.lproj/LaunchScreen.strings b/ObjectiveC/Calendar101/Calendar101/ja.lproj/LaunchScreen.strings new file mode 100644 index 0000000..de52d85 --- /dev/null +++ b/ObjectiveC/Calendar101/Calendar101/ja.lproj/LaunchScreen.strings @@ -0,0 +1,6 @@ + +/* Class = "UILabel"; text = " Copyright (c) 2016 GrapeCity. All rights reserved."; ObjectID = "9Ch-tF-3Ra"; */ +"9Ch-tF-3Ra.text" = " Copyright (c) 2016 GrapeCity. All rights reserved."; + +/* Class = "UILabel"; text = "Calendar101"; ObjectID = "U5r-rf-sf8"; */ +"U5r-rf-sf8.text" = "Calendar101"; diff --git a/ObjectiveC/Calendar101/Calendar101/ja.lproj/Localizable.strings b/ObjectiveC/Calendar101/Calendar101/ja.lproj/Localizable.strings new file mode 100644 index 0000000..f614c63 --- /dev/null +++ b/ObjectiveC/Calendar101/Calendar101/ja.lproj/Localizable.strings @@ -0,0 +1,49 @@ +/* + Localizable.strings + Calendar101 + + Copyright (c) 2016 GrapeCity. All rights reserved. +*/ + +// Samples Title +"Getting Started" = "Calendar の基本機能"; + +"Vertical Orientation" = "垂直方向の操作"; + +"Custom Day Content" = "日付領域の変更"; + +"Custom Header" = "ヘッダーのカスタマイズ"; + +"Custom Appearance" = "外観のカスタマイズ"; + +"Popup Editor" = "選択画面"; + +"Custom Selection" = "日付選択のカスタマイズ"; + +// Samples Description +"Shows a basic calendar with selection and interaction." = "カレンダーの日付選択と対話操作"; + +"Shows a calendar with vertical navigation/scrolling." = "縦方向にめくり、スクロール"; + +"Shows how to customize a day slot to show custom content." = "日付を表示する領域に画像など独自の表現を設定"; + +"Shows a custom header inspired by a popular Android or iOS calendar app." = "AndroidやiOSでおなじみの形にカスタマイズ"; + +"Shows a calendar with a custom style." = "独自スタイルを設定したカレンダー"; + +"Shows how to use the control as a pop-up date selector." = "日付選択用の画面をポップアップ表示"; + +"Shows custom selection scenarios." = "カスタマイズした日付選択の利用例"; + +// Strings +"Month View" = "月表示"; + +"Year View" = "年表示"; + +"Today" = "今日"; + +"Step1: Select a date.\nStep2: Select another date in a different week.\nObserve: The weekend days are not selected." = "ステップ1: 日付を選択\nステップ2: 他の週の日付を選択\n結果: 週末を除いた日付のみが選択状態になります"; + +"Pick a date" = "日付の選択"; + +"The date %@ was selected." = " %@ が選択されました"; diff --git a/ObjectiveC/Calendar101/Calendar101/ja.lproj/Main.strings b/ObjectiveC/Calendar101/Calendar101/ja.lproj/Main.strings new file mode 100644 index 0000000..a9af391 --- /dev/null +++ b/ObjectiveC/Calendar101/Calendar101/ja.lproj/Main.strings @@ -0,0 +1,105 @@ + +/* Class = "UILabel"; text = "Shows how to use the control as a pop-up date selector"; ObjectID = "0HI-zA-RCs"; */ +"0HI-zA-RCs.text" = "Shows how to use the control as a pop-up date selector"; + +/* Class = "UILabel"; text = "Vertical Orientation"; ObjectID = "0Nj-ZU-T5v"; */ +"0Nj-ZU-T5v.text" = "Vertical Orientation"; + +/* Class = "UITableViewController"; title = "Calendar101"; ObjectID = "0R6-jw-zkF"; */ +"0R6-jw-zkF.title" = "Calendar101"; + +/* Class = "UILabel"; text = ">"; ObjectID = "1bA-g4-CVS"; */ +"1bA-g4-CVS.text" = ">"; + +/* Class = "UILabel"; text = ">"; ObjectID = "3Rs-q1-T7Z"; */ +"3Rs-q1-T7Z.text" = ">"; + +/* Class = "UIBarButtonItem"; title = "Today"; ObjectID = "8j6-O0-4Q4"; */ +"8j6-O0-4Q4.title" = "Today"; + +/* Class = "UILabel"; text = ">"; ObjectID = "C8f-b3-dfv"; */ +"C8f-b3-dfv.text" = ">"; + +/* Class = "UINavigationItem"; title = "Custom Day Content"; ObjectID = "H0l-ky-yYx"; */ +"H0l-ky-yYx.title" = "Custom Day Content"; + +/* Class = "UILabel"; text = "Custom Selection"; ObjectID = "J1v-Ac-Fc2"; */ +"J1v-Ac-Fc2.text" = "Custom Selection"; + +/* Class = "UILabel"; text = "Shows custom selection scenarios"; ObjectID = "K3Y-fL-wIP"; */ +"K3Y-fL-wIP.text" = "Shows custom selection scenarios"; + +/* Class = "UINavigationItem"; title = "Custom Appearance"; ObjectID = "MGE-lf-VHs"; */ +"MGE-lf-VHs.title" = "Custom Appearance"; + +/* Class = "UILabel"; text = ">"; ObjectID = "MMz-IR-Bsc"; */ +"MMz-IR-Bsc.text" = ">"; + +/* Class = "UILabel"; text = "Shows a calendar with vertical navigation/scrolling"; ObjectID = "NIM-N7-jll"; */ +"NIM-N7-jll.text" = "Shows a calendar with vertical navigation/scrolling"; + +/* Class = "UILabel"; text = "Getting Started"; ObjectID = "NQl-kn-6CR"; */ +"NQl-kn-6CR.text" = "Getting Started"; + +/* Class = "UINavigationItem"; title = "Custom Header"; ObjectID = "Pju-Sf-Y9T"; */ +"Pju-Sf-Y9T.title" = "Custom Header"; + +/* Class = "UILabel"; text = "Shows a basic calendar with selection and interaction"; ObjectID = "QuJ-WX-DHe"; */ +"QuJ-WX-DHe.text" = "Shows a basic calendar with selection and interaction"; + +/* Class = "UILabel"; text = "Custom Appearance"; ObjectID = "RM7-yp-3hJ"; */ +"RM7-yp-3hJ.text" = "Custom Appearance"; + +/* Class = "UILabel"; text = "Custom Header"; ObjectID = "SBF-Rv-TpF"; */ +"SBF-Rv-TpF.text" = "Custom Header"; + +/* Class = "UILabel"; text = "Label"; ObjectID = "SNj-QB-QKl"; */ +"SNj-QB-QKl.text" = "Label"; + +/* Class = "UILabel"; text = "Popup Editor"; ObjectID = "Sb2-tA-wqI"; */ +"Sb2-tA-wqI.text" = "Popup Editor"; + +/* Class = "UISegmentedControl"; Uid-0L-7EV.segmentTitles[0] = "Month"; ObjectID = "Uid-0L-7EV"; */ +"Uid-0L-7EV.segmentTitles[0]" = "Month"; + +/* Class = "UISegmentedControl"; Uid-0L-7EV.segmentTitles[1] = "Year"; ObjectID = "Uid-0L-7EV"; */ +"Uid-0L-7EV.segmentTitles[1]" = "Year"; + +/* Class = "UILabel"; text = "Shows a calendar with a custom style"; ObjectID = "Xi1-s4-npw"; */ +"Xi1-s4-npw.text" = "Shows a calendar with a custom style"; + +/* Class = "UILabel"; text = "Shows a custom header inspired by a popular Android or iOS calendar app"; ObjectID = "ZaX-XG-k3O"; */ +"ZaX-XG-k3O.text" = "Shows a custom header inspired by a popular Android or iOS calendar app"; + +/* Class = "UILabel"; text = ">"; ObjectID = "bEZ-7Z-hbL"; */ +"bEZ-7Z-hbL.text" = ">"; + +/* Class = "UILabel"; text = ">"; ObjectID = "d82-8O-bpn"; */ +"d82-8O-bpn.text" = ">"; + +/* Class = "UINavigationItem"; title = "Calendar101"; ObjectID = "f7P-D1-vH0"; */ +"f7P-D1-vH0.title" = "Calendar101"; + +/* Class = "UILabel"; text = "Shows how to customize a day slot to show custom content"; ObjectID = "jNU-sj-ZJZ"; */ +"jNU-sj-ZJZ.text" = "Shows how to customize a day slot to show custom content"; + +/* Class = "UINavigationItem"; title = "Vertical Orientation"; ObjectID = "jbF-Qn-Ylf"; */ +"jbF-Qn-Ylf.title" = "Vertical Orientation"; + +/* Class = "UILabel"; text = ">"; ObjectID = "muQ-Dv-j0T"; */ +"muQ-Dv-j0T.text" = ">"; + +/* Class = "UILabel"; text = "Custom Day Content"; ObjectID = "oky-vv-ZVE"; */ +"oky-vv-ZVE.text" = "Custom Day Content"; + +/* Class = "UINavigationItem"; title = "Custom Selection"; ObjectID = "tqq-2h-9gq"; */ +"tqq-2h-9gq.title" = "Custom Selection"; + +/* Class = "UINavigationItem"; title = "Getting Started"; ObjectID = "uKQ-Hb-dhw"; */ +"uKQ-Hb-dhw.title" = "Getting Started"; + +/* Class = "UINavigationController"; title = "Calendar101"; ObjectID = "vRJ-fS-8VE"; */ +"vRJ-fS-8VE.title" = "Calendar101"; + +/* Class = "UILabel"; text = "Step1: Select a date.
Step2: Select another date in a different week.
Observe: The weekend days are not selected."; ObjectID = "ziH-bD-d63"; */ +"ziH-bD-d63.text" = "Step1: Select a date.
Step2: Select another date in a different week.
Observe: The weekend days are not selected."; diff --git a/ObjectiveC/CollectionView101/CollectionView101.xcodeproj/project.pbxproj b/ObjectiveC/CollectionView101/CollectionView101.xcodeproj/project.pbxproj index de9e37a..9aa0351 100644 --- a/ObjectiveC/CollectionView101/CollectionView101.xcodeproj/project.pbxproj +++ b/ObjectiveC/CollectionView101/CollectionView101.xcodeproj/project.pbxproj @@ -13,8 +13,6 @@ 4C31AF7D1C74D4B90094D76F /* flexgrid_grouping.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C31AF781C74D4B90094D76F /* flexgrid_grouping.png */; }; 4C31AF7E1C74D4B90094D76F /* flexgrid_loading.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C31AF791C74D4B90094D76F /* flexgrid_loading.png */; }; 4C31AF7F1C74D4B90094D76F /* sort.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C31AF7A1C74D4B90094D76F /* sort.png */; }; - 4C31AF871C74EDA40094D76F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4C31AF861C74EDA40094D76F /* Images.xcassets */; }; - 4C31AF891C74EE9D0094D76F /* XuniCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C31AF881C74EE9D0094D76F /* XuniCoreKit.framework */; }; 4C31AF8D1C74F0E70094D76F /* YouTubeCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C31AF8C1C74F0E70094D76F /* YouTubeCollectionView.m */; }; 4C49FECA1C8F5DA900C4AAEE /* YouTubeOnDemandCanvasTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C49FEC91C8F5DA900C4AAEE /* YouTubeOnDemandCanvasTableViewController.m */; }; 4C49FECD1C8F6A7400C4AAEE /* FilteringDemoCanvasTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C49FECC1C8F6A7400C4AAEE /* FilteringDemoCanvasTableViewController.m */; }; @@ -23,10 +21,13 @@ 4C51F8361C5F4A2600244503 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4C51F8341C5F4A2600244503 /* Main.storyboard */; }; 4C51F83B1C5F4A2600244503 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4C51F8391C5F4A2600244503 /* LaunchScreen.storyboard */; }; 4C51F8441C5F4C8E00244503 /* SampleData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C51F8431C5F4C8E00244503 /* SampleData.m */; }; + 4C65887B1D2418CF00E1F7CF /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4C65887A1D2418CF00E1F7CF /* Images.xcassets */; }; + 4C7CDA921D26E09D00F61693 /* XuniCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C7CDA911D26E09D00F61693 /* XuniCoreKit.framework */; }; 4CE12DCD1C8611B30049DF13 /* SimpleOnDemandSampleTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE12DCC1C8611B30049DF13 /* SimpleOnDemandSampleTableViewController.m */; }; 4CE12DD01C86147F0049DF13 /* FilteringSampleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE12DCF1C86147F0049DF13 /* FilteringSampleViewController.m */; }; 4CE12DD31C8614AA0049DF13 /* GroupingSampleTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE12DD21C8614AA0049DF13 /* GroupingSampleTableViewController.m */; }; 4CE12DD61C8614C70049DF13 /* YouTubeOnDemandSampleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE12DD51C8614C70049DF13 /* YouTubeOnDemandSampleViewController.m */; }; + 843786601CD3085300903308 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 843786621CD3085300903308 /* Localizable.strings */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -37,8 +38,6 @@ 4C31AF781C74D4B90094D76F /* flexgrid_grouping.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = flexgrid_grouping.png; sourceTree = ""; }; 4C31AF791C74D4B90094D76F /* flexgrid_loading.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = flexgrid_loading.png; sourceTree = ""; }; 4C31AF7A1C74D4B90094D76F /* sort.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = sort.png; sourceTree = ""; }; - 4C31AF861C74EDA40094D76F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ../Images.xcassets; sourceTree = ""; }; - 4C31AF881C74EE9D0094D76F /* XuniCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreKit.framework; path = "../../../Controls/XuniCoreKit.framework"; sourceTree = ""; }; 4C31AF8B1C74F0E70094D76F /* YouTubeCollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YouTubeCollectionView.h; sourceTree = ""; }; 4C31AF8C1C74F0E70094D76F /* YouTubeCollectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YouTubeCollectionView.m; sourceTree = ""; }; 4C49FEC81C8F5DA900C4AAEE /* YouTubeOnDemandCanvasTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YouTubeOnDemandCanvasTableViewController.h; sourceTree = ""; }; @@ -56,6 +55,8 @@ 4C51F83C1C5F4A2600244503 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 4C51F8421C5F4C8E00244503 /* SampleData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SampleData.h; sourceTree = ""; }; 4C51F8431C5F4C8E00244503 /* SampleData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SampleData.m; sourceTree = ""; }; + 4C65887A1D2418CF00E1F7CF /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 4C7CDA911D26E09D00F61693 /* XuniCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreKit.framework; path = ../../../Controls/XuniCoreKit.framework; sourceTree = ""; }; 4CE12DCB1C8611B30049DF13 /* SimpleOnDemandSampleTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleOnDemandSampleTableViewController.h; sourceTree = ""; }; 4CE12DCC1C8611B30049DF13 /* SimpleOnDemandSampleTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleOnDemandSampleTableViewController.m; sourceTree = ""; }; 4CE12DCE1C86147F0049DF13 /* FilteringSampleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FilteringSampleViewController.h; sourceTree = ""; }; @@ -64,6 +65,9 @@ 4CE12DD21C8614AA0049DF13 /* GroupingSampleTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GroupingSampleTableViewController.m; sourceTree = ""; }; 4CE12DD41C8614C70049DF13 /* YouTubeOnDemandSampleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YouTubeOnDemandSampleViewController.h; sourceTree = ""; }; 4CE12DD51C8614C70049DF13 /* YouTubeOnDemandSampleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YouTubeOnDemandSampleViewController.m; sourceTree = ""; }; + 843786611CD3085300903308 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; + 843786631CD3085900903308 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + 843786641CD3085A00903308 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -71,7 +75,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4C31AF891C74EE9D0094D76F /* XuniCoreKit.framework in Frameworks */, + 4C7CDA921D26E09D00F61693 /* XuniCoreKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -104,7 +108,7 @@ 4C51F81F1C5F4A2600244503 = { isa = PBXGroup; children = ( - 4C31AF881C74EE9D0094D76F /* XuniCoreKit.framework */, + 4C7CDA911D26E09D00F61693 /* XuniCoreKit.framework */, 4C51F82A1C5F4A2600244503 /* CollectionView101 */, 4C51F8291C5F4A2600244503 /* Products */, ); @@ -121,7 +125,7 @@ 4C51F82A1C5F4A2600244503 /* CollectionView101 */ = { isa = PBXGroup; children = ( - 4C31AF861C74EDA40094D76F /* Images.xcassets */, + 4C65887A1D2418CF00E1F7CF /* Images.xcassets */, 4C31AF751C74D4A90094D76F /* Images */, 4C31AF8A1C74F0C80094D76F /* SampleData */, 4CE12DCE1C86147F0049DF13 /* FilteringSampleViewController.h */, @@ -144,6 +148,7 @@ 4C51F8391C5F4A2600244503 /* LaunchScreen.storyboard */, 4C51F83C1C5F4A2600244503 /* Info.plist */, 4C51F82B1C5F4A2600244503 /* Supporting Files */, + 843786621CD3085300903308 /* Localizable.strings */, ); path = CollectionView101; sourceTree = ""; @@ -197,6 +202,7 @@ knownRegions = ( en, Base, + ja, ); mainGroup = 4C51F81F1C5F4A2600244503; productRefGroup = 4C51F8291C5F4A2600244503 /* Products */; @@ -214,9 +220,10 @@ buildActionMask = 2147483647; files = ( 4C31AF7B1C74D4B90094D76F /* collectionview.png in Resources */, - 4C31AF871C74EDA40094D76F /* Images.xcassets in Resources */, + 4C65887B1D2418CF00E1F7CF /* Images.xcassets in Resources */, 4C51F83B1C5F4A2600244503 /* LaunchScreen.storyboard in Resources */, 4C31AF7E1C74D4B90094D76F /* flexgrid_loading.png in Resources */, + 843786601CD3085300903308 /* Localizable.strings in Resources */, 4C31AF7F1C74D4B90094D76F /* sort.png in Resources */, 4C31AF7C1C74D4B90094D76F /* filter.png in Resources */, 4C51F8361C5F4A2600244503 /* Main.storyboard in Resources */, @@ -266,6 +273,16 @@ name = LaunchScreen.storyboard; sourceTree = ""; }; + 843786621CD3085300903308 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 843786611CD3085300903308 /* Base */, + 843786631CD3085900903308 /* en */, + 843786641CD3085A00903308 /* ja */, + ); + name = Localizable.strings; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ @@ -359,8 +376,10 @@ "$(inherited)", ../../../Controls, ../../../../Controls, + "$(PROJECT_DIR)", ); INFOPLIST_FILE = CollectionView101/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.grapecity.xuni.CollectionView101; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -375,8 +394,10 @@ "$(inherited)", ../../../Controls, ../../../../Controls, + "$(PROJECT_DIR)", ); INFOPLIST_FILE = CollectionView101/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.grapecity.xuni.CollectionView101; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/ObjectiveC/CollectionView101/CollectionView101/Base.lproj/LaunchScreen.storyboard b/ObjectiveC/CollectionView101/CollectionView101/Base.lproj/LaunchScreen.storyboard index f9f02a9..f0ab7c6 100644 --- a/ObjectiveC/CollectionView101/CollectionView101/Base.lproj/LaunchScreen.storyboard +++ b/ObjectiveC/CollectionView101/CollectionView101/Base.lproj/LaunchScreen.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/ObjectiveC/CollectionView101/CollectionView101/Base.lproj/Localizable.strings b/ObjectiveC/CollectionView101/CollectionView101/Base.lproj/Localizable.strings new file mode 100644 index 0000000..79a37c0 --- /dev/null +++ b/ObjectiveC/CollectionView101/CollectionView101/Base.lproj/Localizable.strings @@ -0,0 +1,6 @@ +/* + Localizable.strings + CollectionView101 + + Copyright © 2016 GrapeCity. All rights reserved. +*/ diff --git a/ObjectiveC/CollectionView101/CollectionView101/Base.lproj/Main.storyboard b/ObjectiveC/CollectionView101/CollectionView101/Base.lproj/Main.storyboard index 5900681..2669818 100644 --- a/ObjectiveC/CollectionView101/CollectionView101/Base.lproj/Main.storyboard +++ b/ObjectiveC/CollectionView101/CollectionView101/Base.lproj/Main.storyboard @@ -1,5 +1,5 @@ - + diff --git a/ObjectiveC/CollectionView101/CollectionView101/FilteringSampleViewController.m b/ObjectiveC/CollectionView101/CollectionView101/FilteringSampleViewController.m index 6123271..620ab16 100644 --- a/ObjectiveC/CollectionView101/CollectionView101/FilteringSampleViewController.m +++ b/ObjectiveC/CollectionView101/CollectionView101/FilteringSampleViewController.m @@ -18,12 +18,12 @@ @implementation FilteringSampleViewController -(void) searchBody { FilteringDemoCanvasTableViewController* canvas = [self.childViewControllers objectAtIndex:0]; - canvas.collectionView.filter = ^(NSObject *item) { + canvas.collectionView.filter = ^BOOL(NSObject *item) { if(!self.searchRequest.text.length) { - return (bool)true; + return true; } SampleData *sd = (SampleData *)item; - return (bool)([[sd.title uppercaseString] containsString:[self.searchRequest.text uppercaseString]] || [[sd.description uppercaseString] containsString:[self.searchRequest.text uppercaseString]]); + return ([[sd.title uppercaseString] containsString:[self.searchRequest.text uppercaseString]] || [[sd.description uppercaseString] containsString:[self.searchRequest.text uppercaseString]]); }; [canvas.tableView reloadData]; diff --git a/ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Contents.json b/ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..c4071ec --- /dev/null +++ b/ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,81 @@ +{ + "images" : [ + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-Small@2x-1.png", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-Small-40@2x-1.png", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@2x.png", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small@2x-1-1.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-Small-40.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-Small-40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76@2x.png", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png b/ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6092bc74330d477f4b2ab16215d0600a4749b164 GIT binary patch literal 2715 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 yW=PhPVE&T;oBuqDBzWduQ$5V|l+Q80^I>PM5R zv_kVLW?|BVB$9}Yl>TyuH$6G`dSYuAlQ<|Y{AZ9sWMiL2cx(2 zbh1O{p#ucymuEy zm2SPvgsXKZZ`1k1DM*C{?i@L*i~uK%p1ohg?L;+Yn@;SbadqcWwE);)L<$+YH-8vj zE)!XjeC_;U-F~uHBe!_?VgW_P5R?Ump1sHKg|sUdEND8>PX8-g4hcmCv&-I-=_s7XjXlRke)=t8o2~xzT{E;0coM=@CgBGk2=>+=-z3M`$Yj!V9`uKk zLJHmI;>lzQn5l_KNRxc_*P0+?(IBl2 zEvczXXhO9nPDWw9+Xqj{BaL!nDl?EcB!JsYMO&w;l!s<36-51x>4=FFvDS9%LLl4& zHw_*|)}j!yGy)`umlEVqAk*~Nu+K5eLv*q{0RS`Ehd=K<&P_vzYIblTs${vQ8C~|U zQ~3jSnL7$~lEf5~%^sKbnvUI4ZJ?nMJUM+g5lZG{&aC`TzGCB~6*GxiL^%aEzpncE zcV2(cn+pP9fouFuKLd%MjG{mBt$z305)X-Qjx~-A=RRJvYPsnwZtVHeW%UAaGOSCo zb~De=5`kpQE_M(nLD+EFia}b_5H1L?tI4HHkf0|hmE78bs%ww+_K_$*=XSxUqKJ5@h+s7S=N9{>4Q~K9X21$rqHY%2KfX2Br2jHbv|KJgWFc zh#Z_5p5E9@*LH<7tOPat)xND6<9>|BLf}t&?m2igBV9}9A7a=E8-S4_G zL%=CPA`t!nX_RAnu8m_9PD`bi{#S$ZSL9yM6S*><{&=`_Xp063ytN&>)owvqrK@0W zrNuElH1ikln(RWPqHiY5*!I@Jlf^=vo6hB^f;r>h?vfD(nM%8!6}8sH%jAqAs0^IF zWDq-{wp2=xfw%nk7*+1Dq!ve{3>8$OZpv_%be|>6<5-FxX43qsWtRO4N(oUlrS8iQ z)CQkwqvD~ZqsXP7EJ$+)vS-32ER(3~^QBF39_n>;hJ+gAoasNbB^Po^3^Fi9my0pY zJl;Cm>Z4?QE@td=OLR*H(){HpuJnpu(VR1E1d|Ry)x13}mZ%%=Pi02eQ%K~wgtJ9i z<-ETJMz|jhjPPg*xAEL3W>mBeYjQmvozOl(a@PQj<<}m$UVMKmM;~eb{?+$`7p~7v z#^X|J*4kXbI=xvHc#{y>_(TV*Yy(v5O}fZ2Q^%vBIr(Q+IuxuI(jhrb8#dC9SpXS`cs2o{ zOBv28UKX{)QvwO!B6kbwcP}&w&PY-)`ON>pCS?eTiv(i8UqAbngTEOJTw+q-T?W~Z z^XsaUW6$h_kd+6vONBzp95b9v%OWM=>Jy2R&*0_%fzX5WAU#MA(u4FMJxCAIgY+Oh hNDtD3OmqDszyKg|L&2trb*!Rrj2c^ zSs&}Q{8fdA0|0?DLiCoD`{U63Zuz1jlZW%I+ad?a@nF+X#p)1T- z#1vdmz~FI*x-kEB^+p;S(bhN3Q^|78{QB#jYjr(G!`K$zwc+-8n-KcJ{jlTg zke%6sY~R%!8Q)=d4$BLzhtL0x8F!Nq8-XJM%zSUj!2ch+OKkMN>c6lX^MAZI>VKI? z=Bo798t%zoVSegi;fg^!=aQa(@^+6X(z!;{eP^Y*R1g`?A<8EHmyG&5b`7PC^uVe6Agax-ugmP!zyn#F+Fv)8H3VE za?E(d7EG}{-@(G4qUe6O`8Kg#MQ!JehxnFFlL_5@e(+WkqW1SS{^2zl_8Q**T6pmM zv(|9NUsT`q!Uho~MK3L%X0mex-#=P-{~an5zjY5S9rcPgWfb$&QHbK-juG^E0(xD)b;wn_cj(ja^4dScgfy)aCwY>nCC~gc{ODv8STvI3~MmIw1`+te=p2nmlm-< zsxqH*-HqEUtNprrU|id@Go3bgf`we4UFL;W$KC$H?DF+u=MH2GmGQWryXfU_ycP*x zYZC=LCMk@uowSO6$3p2RT=*@Z+tU#MT1Kma45Z1P!Jj}R-{p8T*@asvu|&S8ZaPB2 zWzH6c16-o_4xm!1BNRS$ZJu0$xM?x$?U{YV{N-}5t;R&{#VQ#^T-8*mv8SDssZ{lV zd9Tb_<6%1ZFr*LH`VttVr~iE;noOHpSvuDWX+hc-@fiiP@_$$s_pRH zSAJUp3FWx!TM%n|->c_Bf{3D)jTX5}iIF7+Gr9nT!in*6zTcj5OY80X%+6fOx;nA%lmmXu;p!J;s~!_PS+AY-LbHYhoQXbToBt4;im!hleoz>@kx*go z$R1v5%T`A+$!s{5lQg+E=z{8c9n}B9TVh)n*HQHkb8n154ASj`Qk_)9xyZq|cEjE> zF~Y&orJRzO_&Sy+{8D}`l0?NL?@DDjY9zbDb4@JstJ7ds?Sl&u){Zg4h;%4Hw2;4>c^!r=xgx zb3~o<|8^Waa8vuWrigBinHzJzuIDH3EG*=A3lfv@d zlb6G#xMc-46?0RVXE}Ld(E`b?5GHSiTd8>&U9IL!(9sMmfv=iSvu8_5Yp0JfN@oHGLLDkvC)6=BIh}7X8GMdLnb0H z2G9n*%LmHoZ$9li(HX>XvMOYhn{yg#=Aq4-E( zJDZxy_S`PJM2FL$TUasLmt*K5*OQKn@y1L}$EnMKHOre&*e<$k)4e<_3BZ6mVi}5k zP<>yOu6t9(Vd0IT@2q57mCy4cT#l#%7we@fImeJ`JzK5vf6hm}UgRd8Y(C=n!qmsO z>^Wp5>8X4a11qtaKRyWS8|jfg4C;RczGkA17#7yn>(aG^fKc0Mf5RnTaHnSB^g>@f zJy+$a@c5BC;pG(M+1jDuh9t_kD$x{CiIN8Hs=usBABdoN++%EIWo9H#W6{Juhe2GhH3NVr{-Ed<>wdzlhNm!*`CA;sy6G;iCg@O_B=Tw%k< zK5b7Gcx);^{q0a+3^D68q~MSd?|+u5FXP6*?v*B{7gzjgHn)`ck5&`9A@>2}tuD+2 zk^!lT?_)XI zyr?ZQa~_w?AY8`VbR^TU2q-ta_#GW&Va*a(A3T-S%RB(HGqwhwq`mUDd^mC8Ce#)C zl7m$NjOQ8aWzH^?alMmVydgs7cs3qn1Ay_CxfZhQSQ=7%A`GC<#&Iy|WWk^Xgs56> zXV0~@Pp6aF+Am%>Z)M#5jp~_wN)v*UFA%My!5pA$f>eN!*2P?Pt3DTs9-Ak<-wOyU zRY&0Bl;n0Yv(q)0B{Or(>g=4n%K0RXMu=oS8P~}&yzfT6etCZLOWW6;R7}63p*=Yx8eus4!5XH0i$Q4D@9PVp+;&xWF$w4r7mp* zQC%@%EKauM;aKXC{!B+ zdN@2gcwKyX$LxMwp~+AJw=tkPPIK)NfWNicwK(8|CjIogpF5sE?I!0HO6;+v*r8~} zk!lep2)AA(bD#cezm`+-*PC@gJ^&gyE-M*dmD!H`h&$C8n(3?_qG1C_xd^eA7xyJC zL>qSt?JhwL@-*sdRtT9Q!9g6L|7l;VO1Dwy`1nZ{ELRZW;AMl6nYBOC)yHU;lPA;Z z-L^2NN*;2hxA=hpki$qTOS$uzs}}>SnCI(TG^U%#R>g@&m&#G=`xarLD%Qy$oC6Tn zBp@`1V*^9eQPwz$%(&T)G9RiqY~N3eEqh?9PP2A(p=>N+q53`?HX>)SjxL>V>kg5U z$eIS6FPbX5wzKQ2c+k_G90)b6l&pERmx#Ww9&$1s7l3y?Pm~#v!`KbTX@8XElgnx0 z4Gfw$duF)5`hHa9u?^Q<5NwlBwbM##hcA9$R#QK1fa6>!R}0v7ht|};d9(8DVChK# z=6N&v&+3=BwJ#)0Pd;g%8NeHB`&?VEp8wpAq5^&kHFvF;?$cRB)v)7R>vgjQ6W_0H z7Ye*8_7iKro?(^nw&=dvNtT8~Pyyj7Sc_v)GS7{yBj(fR`_BS?NBS3;Z{J^0I){^F ze9<#EPQY1WQ=VRkj|P&rKD7p#T{Aax5)ZJo92a0y$v>K?R;c5%S3YV~p}``e4!`Ob z5tR>wpptyiP%3L3^7s>U7tmNYdr$Z8^l1vQyw;oo?U^V+N-P_;I!@l-Ci;iqzkLfb zO~c}~=K>5Fr|-9Bp-nHBO!qE!^!2ZxSFI*bX5noeT7Pe%u$XSVY^va~e2^ibA67%k z00CtJG}KiC*Y!0n2t7#)yyeuwOE|)Xx6Qtf{hBoFZf#u?E?rX&V_vG7y&PW*`r0P+ ztEk$q(n#|NoW=E_N-|liAw2Ql``Ldx+rRX)NWg8%WG#~7WFnBD2KE1C4QW@xokSqn X<+5p>HO`ynO7uwQu{KJ}F6w^(|Kmh? literal 0 HcmV?d00001 diff --git a/ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-Small-40.png b/ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-Small-40.png new file mode 100644 index 0000000000000000000000000000000000000000..abee98b110fe76e165ff87afcb187a20cf9d5b2b GIT binary patch literal 1071 zcmV+~1kn45P)RCwC#mQ6@hQ545#(#nt2Qq)kH zW)LOwqd>~25fq9Rx=EwJBG6VNZX_YyL`k5FY9-E6hzxAe%2`z?I4v?4HfB+?a1y0b z6hBZgMf!OUKA-P3GbVwXxx9IE@4NS$|2gOW&$-v?Nvg8!M>}BIrxpQ@07roTTZ@*z zteSEj=`W8@t&C64dOt0U1lH!4_N@9~QhZ{eJ=s|hYfFu@rOC&M7kxb2z%$;_qRs~C zCtLE>|8;)9Jc9vuFSBAC!(gVw+R{>-`Jyzv;v9>4o0om8?~qQ^&6qs?*5{XyOe}O5 z)*Z>sL`90TU}b!2);pTlR?C`MWrx1yG~WOw;PxCln_Jx7>~K{gXhy}XNoCnKuwYBH z@o9d@ADt8*6>~`QhN+F!wJ$AQbb$Hs>K#Lg=Y==z8>_#4^&Q!bRfO$u`cVx@R1v4? zx5JnV>gv>-Oj-4Z#QEOVWanm_`-)t+2p)boTotjp9RdLD`2D`}K3__DTNg&gHfwbMwY^q8KWV5f%Z7&(5hHpW-AiTJY%zDpLkj z8cI;5sns{D`66)n`!iPKuD7%aOAWJxl)w^vww58mhZdktY|&MpV9tTZqU!aD+uub zQ!kw%YZpfX2ECGdr#l-Ym6;{?%)r)QcP`{fBqEtmXqRw-L3r_UQN0PHB3DzKEj6Lg z!P~re%N@p`XL-PXf%IBBm6@A=>J^*?7`P4}X=X3eBy_N*Cp z1i%4s02}}ZzyWXo8~_Kv0dN2u00+PU@Js|e$GKj8@LhZP@b=w1HwQTRv#0MVN3yiE zp6>-sjn6KcZ}0aX{Wc3Q!#K~sYRQV-

1i>3>$y*Smi)c@ihLd?a)7O9-69{K=P$P%c5KttFhAcP8l6|aJa;Z#b@=p! z{-b9Yr9U-vwAI!x8|dn`H~kM*Z|rEjH#9cbbxv4-bW#x_^yX6sFn(t*a-pt1_zs48ZP#aZs&z-+^HixldiQjqjQl9gLj|l9 zfwuQ{5%a{I5VvRBK2A!Pj-eT!8F-9`IboonWhy3Q+5%{qA&!>gnO$?&CfuF-+|rcL zl^ZITy}t3*)n6Zs-V(L{HF|5q@%NXOHgNv;gNJFJx#jG~^}FBf+xs;Zp*Fnv)WMZI zUad#~RCW7m|NWt{;nNopBmO{5Vj~_2UhD0$p$|F6dwwG5lDzG(<|IBcadXfb zs&&rh6Cd&&ACkSqc$6=2^*hnGr{mP5y?J0g8zGqPLUV^>!|0RmvM}T#P|sYkjOcK2QLLJ^GJ*UCuqS; zG$!CBZnT|hz5~nfxG=9>^DBclJ@yX zltv~IZH%42fhR9+S@UAc8kq;bUCTV8p7#bS#YLB)*umB{qMnmQ~C@Jx=XzklP91T!ujV#}x> z-~M#yg-f+Ci6QFNH?JOpRti}0+sHa|YeXT|`AIjr1K;#Ya# zM*DHu3ogmqP6)Ws{-s3wj03dRtXRm>m5QsSfvJO0LKa=`KU&q z@yI9nX_G^!GErdN&h2V4oYY0)ZZ2;} zd|)nD$>ow2*Tc#L%4@XxC|Q=bNr=>qeAt`SFqhoatS&L!GovB~!eoeA5U|5ES!V6j zAd$^`EM~GRTGd3wiI8WD)}PfPhTVDwCMJ<09go4TZpV}Ti6?SEur%=!W3W0T8;+9d zy0XyrF;5N~^WHN)18Y40<59Zw1^L~=xY*p`FCSx>K?#iLTxgcuBuaVuZ6foHJbzy` zds@AFzH$s(D52+Y1X3=w_Q-Cg;=_sD;irnwI!iMZ;&~3w%EL~A{p0-gmv@vXq~s3l z0v16rY2}-Qs{}s;ayUm=<7d5vvjAHmlX1 z^?9*spBD7Pas^tr-BA#5L}J@4sYXi!UEL#j?N06TOOYfxOlzdr<)|?lJ6bhBunOdl zpjDu|S_Cj?wdQ6?vZznAL~e{(gchwzxQ-gS`+YM2o?K~dR5ifbozWPUUAStzA=oHLi9MRGvde6i&>b0{2JtBV z4*=Ue%4mZS-n4Ly5T2V_Y5yB(d2C$@W~aH~)9$K1;ONcxpv{?yYO%_<>WwQo{=7~2 zw&^t;22z|_N_MF&^XG}^pAk+c$TlV7>QyCM1Bu$M4Wv4|HTKO*fmBpAz!9y-m-^xf zQ`%QfpC~b|ijplPX(17oBp0kQjn1@}ppTDBOQ|rG39pa)b8ZX9X(8!e5TCfOfQylh zY66b8mlBWMmX&RKW#s>g8fjGyS}H^?m6@A=>J^*?7`P4}X=X3eBy_N*Cp z1i%4s02}}ZzyWXo8~_Kv0dN2u00+PU@Js|e$GKj8@LhZP@b=w1HwQTRv#0MVN3yiE zp6>-sjn6KcZ}0aX{Wc3Q!#K~sYRQV-

1i>3>$y*Smi)c@ihLd?a)7O9-69{K=P$P%c5KttFhAcP8l6|aJa;Z#b@=p! z{-b9Yr9U-vwAI!x8|dn`H~kM*Z|rEjH#9cbbxv4-bW#x_^yX6sFn(t*a-pt1_zs48ZP#aZs&z-+^HixldiQjqjQl9gLj|l9 zfwuQ{5%a{I5VvRBK2A!Pj-eT!8F-9`IboonWhy3Q+5%{qA&!>gnO$?&CfuF-+|rcL zl^ZITy}t3*)n6Zs-V(L{HF|5q@%NXOHgNv;gNJFJx#jG~^}FBf+xs;Zp*Fnv)WMZI zUad#~RCW7m|NWt{;nNopBmO{5Vj~_2UhD0$p$|F6dwwG5lDzG(<|IBcadXfb zs&&rh6Cd&&ACkSqc$6=2^*hnGr{mP5y?J0g8zGqPLUV^>!|0RmvM}T#P|sYkjOcK2QLLJ^GJ*UCuqS; zG$!CBZnT|hz5~nfxG=9>^DBclJ@yX zltv~IZH%42fhR9+S@UAc8kq;bUCTV8p7#bS#YLB)*umB{qMnmQ~C@Jx=XzklP91T!ujV#}x> z-~M#yg-f+Ci6QFNH?JOpRti}0+sHa|YeXT|`AIjr1K;#Ya# zM*DHu3ogmqP6)Ws{-s3wj03dRtXRm>m5QsSfvJO0LKa=`KU&q z@yI9nX_G^!GErdN&h2V4oYY0)ZZ2;} zd|)nD$>ow2*Tc#L%4@XxC|Q=bNr=>qeAt`SFqhoatS&L!GovB~!eoeA5U|5ES!V6j zAd$^`EM~GRTGd3wiI8WD)}PfPhTVDwCMJ<09go4TZpV}Ti6?SEur%=!W3W0T8;+9d zy0XyrF;5N~^WHN)18Y40<59Zw1^L~=xY*p`FCSx>K?#iLTxgcuBuaVuZ6foHJbzy` zds@AFzH$s(D52+Y1X3=w_Q-Cg;=_sD;irnwI!iMZ;&~3w%EL~A{p0-gmv@vXq~s3l z0v16rY2}-Qs{}s;ayUm=<7d5vvjAHmlX1 z^?9*spBD7Pas^tr-BA#5L}J@4sYXi!UEL#j?N06TOOYfxOlzdr<)|?lJ6bhBunOdl zpjDu|S_Cj?wdQ6?vZznAL~e{(gchwzxQ-gS`+YM2o?K~dR5ifbozWPUUAStzA=oHLi9MRGvde6i&>b0{2JtBV z4*=Ue%4mZS-n4Ly5T2V_Y5yB(d2C$@W~aH~)9$K1;ONcxpv{?yYO%_<>WwQo{=7~2 zw&^t;22z|_N_MF&^XG}^pAk+c$TlV7>QyCM1Bu$M4Wv4|HTKO*fmBpAz!9y-m-^xf zQ`%QfpC~b|ijplPX(17oBp0kQjn1@}ppTDBOQ|rG39pa)b8ZX9X(8!e5TCfOfQylh zY66b8mlBWMmX&RKW#s>g8fjGyS}H^?VPKNL8C4}qMM=7K@+1*FmY=qV``*{foM#q)hI)2 zg9B9wh0unS7=L}oKAz>-=)hp$=H>O=bMO1kcfNbhtto6dUas1$v}wZMs-cz`OI=M z5S|N9whXvugONowq>KiqU7S`=x83Kdw$$pw0L9y+^@V#nP}90Mmr7$}h!eOE{`MV8AClB$|1~5Q z4=9I+Poqh+_mVPk3y&CVd+&cBDKikaJ9LvUkxrj@*7z1C=I!i&h@{L|c>Re3B=_B2 zjw*9Cl$(?zJFL52_4)M&dvxqP(s3U1MM9M&l0%J*0MeXDOa?eff(L`C{uo7Z^_)X% z6!mWD{a&Tnt02*8W?97I&4Dy~dq@Q-HKuTED+)z0jzohpt-mMP%~|d9xC-TM zsRf;bh9Fu?PLu%$C`%xc1d*hW%JmyNmSTx)DqYjM2OF&ug+iWU%7eiaXHMM!E}Kh0 zjrl@HnYb-&!)IDUN>KxWUz}8hG-|Z>qF!-hzU%Qt*_P0iK{*|?>LGCyl$s-VDFeuoI|eZXUF!vd`^<10 zymCSeAhg=TU`jBFH+}Yw;kTwT|Hrg7H>ae(J{umyeRkl~KjUuwzimF;p8^a3vAl_z T7{J{)00000NkvXXu0mjf#V~Vn literal 0 HcmV?d00001 diff --git a/ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1-1.png b/ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1-1.png new file mode 100644 index 0000000000000000000000000000000000000000..96950d00243a24c25fbaffb47fa53a4be1cc30f1 GIT binary patch literal 1491 zcmV;^1uXiBP)*RqJY`8>`S{VZkD#U5GBE11{Q)6%-T~$*!dZQ}BmM zY0`)UoFN$02@P#RT55y%%zcxOF~hO&yQZDHcZm82jE2cVVKG&UVpBH+1<{;nn>3_w;N^bvyfyZ+;@fAb-$u`AOU;%Q6^G#6^(Lj^a(upmiQAAVdt zvAr>aVggJ)Z<{{(g*@Sf(Gy#`Glp1L7bi;J_8*r6pj4kRk;IK)R^HUns{ZYnIiG52 z4-G!L)A!e3ckhA8wTL=*%QxpPT*YglIiQ%bTPl2#LOslE%k3qAe*5Y&Z(lq=!pt9D zd!Ge;Si$%6d!M3m7Gzobf7i$%A_1lFELN0VT3fp`0?t(Eb9QU2xO3!?ftFXuH5CB( z&-lK#+0yj^4E@vaS^1Bzxq;4(>>D?$!B*Dq%;&-==2B1I6aXMa9=?&T5L_1>#g<`3 z3_c0O>f5MT7^@)(yHwgf&=(fP%t3#){qA$enCbb(ijy$pPZJL(4r6F$wy#n?b7n(C zYK&l3m);}j#>fF{;-E&rbQsF1m>_ZpYiwakVe2rd8Y9w)L-Gg1GNcc&1S94Ypc<}; zmBlR(0UG8l!OWnxT#+wjmTm5Rns_J1BPbnOc%-cvp8j$06vOAv9A$|6LJrYMXZN`w zW@`A$M_(Hk)c{wKfhkoVv0Ur^=i!~@@bZASkN{=W()8?OJK8%AA3#-?_q`J#Bi2h1nH}os}nd9Vh}x6 zT?oiSJPqyR`%9u50Q9O z<%DHK7O}#>+@n5l6(Z3Uk20`i6JrR0<>82$rrN0<^qzsJkFI!B->6iunqf6*9gD7M zZ1K9m)j2t=;!*XeX-1!P%SzXhxYzX?M_;NUZD*l+<;??Y^(~=8sYq}+>IjeD&Qa_#b zU-syz6L@g1j$Ofx$zS(*r3V@kug*5rC2wFg!=Kf~uCOXc{JS@hfl-WGN7U535)H>$ zs?KnImsV&9gHA;jsfszKxeO3}YN$_%V_JD4x93JB9TekRQ#A%bMj1)W{a&LR+)t<_ tx917m1a1O1ft$ch;3ja_Mf+QT0RY3kiZJ>8(N6#X002ovPDHLkV1mMM+E@Sp literal 0 HcmV?d00001 diff --git a/ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png b/ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..96950d00243a24c25fbaffb47fa53a4be1cc30f1 GIT binary patch literal 1491 zcmV;^1uXiBP)*RqJY`8>`S{VZkD#U5GBE11{Q)6%-T~$*!dZQ}BmM zY0`)UoFN$02@P#RT55y%%zcxOF~hO&yQZDHcZm82jE2cVVKG&UVpBH+1<{;nn>3_w;N^bvyfyZ+;@fAb-$u`AOU;%Q6^G#6^(Lj^a(upmiQAAVdt zvAr>aVggJ)Z<{{(g*@Sf(Gy#`Glp1L7bi;J_8*r6pj4kRk;IK)R^HUns{ZYnIiG52 z4-G!L)A!e3ckhA8wTL=*%QxpPT*YglIiQ%bTPl2#LOslE%k3qAe*5Y&Z(lq=!pt9D zd!Ge;Si$%6d!M3m7Gzobf7i$%A_1lFELN0VT3fp`0?t(Eb9QU2xO3!?ftFXuH5CB( z&-lK#+0yj^4E@vaS^1Bzxq;4(>>D?$!B*Dq%;&-==2B1I6aXMa9=?&T5L_1>#g<`3 z3_c0O>f5MT7^@)(yHwgf&=(fP%t3#){qA$enCbb(ijy$pPZJL(4r6F$wy#n?b7n(C zYK&l3m);}j#>fF{;-E&rbQsF1m>_ZpYiwakVe2rd8Y9w)L-Gg1GNcc&1S94Ypc<}; zmBlR(0UG8l!OWnxT#+wjmTm5Rns_J1BPbnOc%-cvp8j$06vOAv9A$|6LJrYMXZN`w zW@`A$M_(Hk)c{wKfhkoVv0Ur^=i!~@@bZASkN{=W()8?OJK8%AA3#-?_q`J#Bi2h1nH}os}nd9Vh}x6 zT?oiSJPqyR`%9u50Q9O z<%DHK7O}#>+@n5l6(Z3Uk20`i6JrR0<>82$rrN0<^qzsJkFI!B->6iunqf6*9gD7M zZ1K9m)j2t=;!*XeX-1!P%SzXhxYzX?M_;NUZD*l+<;??Y^(~=8sYq}+>IjeD&Qa_#b zU-syz6L@g1j$Ofx$zS(*r3V@kug*5rC2wFg!=Kf~uCOXc{JS@hfl-WGN7U535)H>$ zs?KnImsV&9gHA;jsfszKxeO3}YN$_%V_JD4x93JB9TekRQ#A%bMj1)W{a&LR+)t<_ tx917m1a1O1ft$ch;3ja_Mf+QT0RY3kiZJ>8(N6#X002ovPDHLkV1mMM+E@Sp literal 0 HcmV?d00001 diff --git a/ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png b/ObjectiveC/CollectionView101/CollectionView101/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..96950d00243a24c25fbaffb47fa53a4be1cc30f1 GIT binary patch literal 1491 zcmV;^1uXiBP)*RqJY`8>`S{VZkD#U5GBE11{Q)6%-T~$*!dZQ}BmM zY0`)UoFN$02@P#RT55y%%zcxOF~hO&yQZDHcZm82jE2cVVKG&UVpBH+1<{;nn>3_w;N^bvyfyZ+;@fAb-$u`AOU;%Q6^G#6^(Lj^a(upmiQAAVdt zvAr>aVggJ)Z<{{(g*@Sf(Gy#`Glp1L7bi;J_8*r6pj4kRk;IK)R^HUns{ZYnIiG52 z4-G!L)A!e3ckhA8wTL=*%QxpPT*YglIiQ%bTPl2#LOslE%k3qAe*5Y&Z(lq=!pt9D zd!Ge;Si$%6d!M3m7Gzobf7i$%A_1lFELN0VT3fp`0?t(Eb9QU2xO3!?ftFXuH5CB( z&-lK#+0yj^4E@vaS^1Bzxq;4(>>D?$!B*Dq%;&-==2B1I6aXMa9=?&T5L_1>#g<`3 z3_c0O>f5MT7^@)(yHwgf&=(fP%t3#){qA$enCbb(ijy$pPZJL(4r6F$wy#n?b7n(C zYK&l3m);}j#>fF{;-E&rbQsF1m>_ZpYiwakVe2rd8Y9w)L-Gg1GNcc&1S94Ypc<}; zmBlR(0UG8l!OWnxT#+wjmTm5Rns_J1BPbnOc%-cvp8j$06vOAv9A$|6LJrYMXZN`w zW@`A$M_(Hk)c{wKfhkoVv0Ur^=i!~@@bZASkN{=W()8?OJK8%AA3#-?_q`J#Bi2h1nH}os}nd9Vh}x6 zT?oiSJPqyR`%9u50Q9O z<%DHK7O}#>+@n5l6(Z3Uk20`i6JrR0<>82$rrN0<^qzsJkFI!B->6iunqf6*9gD7M zZ1K9m)j2t=;!*XeX-1!P%SzXhxYzX?M_;NUZD*l+<;??Y^(~=8sYq}+>IjeD&Qa_#b zU-syz6L@g1j$Ofx$zS(*r3V@kug*5rC2wFg!=Kf~uCOXc{JS@hfl-WGN7U535)H>$ zs?KnImsV&9gHA;jsfszKxeO3}YN$_%V_JD4x93JB9TekRQ#A%bMj1)W{a&LR+)t<_ tx917m1a1O1ft$ch;3ja_Mf+QT0RY3kiZJ>8(N6#X002ovPDHLkV1mMM+E@Sp literal 0 HcmV?d00001 diff --git a/ObjectiveC/CollectionView101/CollectionView101/SortingSampleTableViewController.m b/ObjectiveC/CollectionView101/CollectionView101/SortingSampleTableViewController.m index 2e9c049..4853a39 100644 --- a/ObjectiveC/CollectionView101/CollectionView101/SortingSampleTableViewController.m +++ b/ObjectiveC/CollectionView101/CollectionView101/SortingSampleTableViewController.m @@ -27,7 +27,7 @@ - (void)viewDidLoad { } - (IBAction)doSort:(id)sender { - if([self.sortButton.title isEqualToString:@"Sort Z-A"]) + if([self.sortButton.title isEqualToString:NSLocalizedString(@"Sort Z-A", nil)]) { XuniSortDescription* sd = [[XuniSortDescription alloc] initWithProperty:@"title" ascending:NO]; @@ -36,7 +36,7 @@ - (IBAction)doSort:(id)sender { [self.collectionView.sortDescriptions addObject:sd]; [self.tableView reloadData]; - self.sortButton.title = @"Sort A-Z"; + self.sortButton.title = NSLocalizedString(@"Sort A-Z", nil); } else { @@ -47,7 +47,7 @@ - (IBAction)doSort:(id)sender { [self.collectionView.sortDescriptions addObject:sd]; [self.tableView reloadData]; - self.sortButton.title = @"Sort Z-A"; + self.sortButton.title = NSLocalizedString(@"Sort Z-A", nil); } } diff --git a/ObjectiveC/CollectionView101/CollectionView101/YouTubeCollectionView.m b/ObjectiveC/CollectionView101/CollectionView101/YouTubeCollectionView.m index 84a4d27..f7a334c 100644 --- a/ObjectiveC/CollectionView101/CollectionView101/YouTubeCollectionView.m +++ b/ObjectiveC/CollectionView101/CollectionView101/YouTubeCollectionView.m @@ -35,6 +35,9 @@ - (NSMutableArray *)itemGetter:(NSNumber *)desiredNumber { NSData *dataResult = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlAddress]]; NSError *error = nil; + + if(dataResult == nil) return nil; + id object = [NSJSONSerialization JSONObjectWithData:dataResult options:0 diff --git a/ObjectiveC/CollectionView101/CollectionView101/en.lproj/Localizable.strings b/ObjectiveC/CollectionView101/CollectionView101/en.lproj/Localizable.strings new file mode 100644 index 0000000..7f7059a --- /dev/null +++ b/ObjectiveC/CollectionView101/CollectionView101/en.lproj/Localizable.strings @@ -0,0 +1,10 @@ +/* + Localizable.strings + CollectionView101 + + Copyright © 2016 GrapeCity. All rights reserved. +*/ + +"Sort A-Z" = "Sort A-Z"; + +"Sort Z-A" = "Sort Z-A"; \ No newline at end of file diff --git a/ObjectiveC/CollectionView101/CollectionView101/ja.lproj/Localizable.strings b/ObjectiveC/CollectionView101/CollectionView101/ja.lproj/Localizable.strings new file mode 100644 index 0000000..00c7da1 --- /dev/null +++ b/ObjectiveC/CollectionView101/CollectionView101/ja.lproj/Localizable.strings @@ -0,0 +1,10 @@ +/* + Localizable.strings + CollectionView101 + + Copyright © 2016 GrapeCity. All rights reserved. +*/ + +"Sort A-Z" = "昇順(A-Z)"; + +"Sort Z-A" = "降順(Z-A)"; \ No newline at end of file diff --git a/ObjectiveC/CollectionView101/CollectionView101/ja.lproj/Main.strings b/ObjectiveC/CollectionView101/CollectionView101/ja.lproj/Main.strings index 17c3950..13399e6 100644 --- a/ObjectiveC/CollectionView101/CollectionView101/ja.lproj/Main.strings +++ b/ObjectiveC/CollectionView101/CollectionView101/ja.lproj/Main.strings @@ -3,91 +3,91 @@ "0Wn-El-nmX.text" = ">"; /* Class = "UILabel"; text = "Sorting"; ObjectID = "0ft-v2-ojG"; */ -"0ft-v2-ojG.text" = "Sorting"; +"0ft-v2-ojG.text" = "ソート"; /* Class = "UILabel"; text = "Detail"; ObjectID = "4na-Qg-5gl"; */ -"4na-Qg-5gl.text" = "Detail"; +"4na-Qg-5gl.text" = "詳細"; /* Class = "UILabel"; text = "Displays a grouped list of YouTube videos"; ObjectID = "5gY-WI-I4l"; */ -"5gY-WI-I4l.text" = "Displays a grouped list of YouTube videos"; +"5gY-WI-I4l.text" = "リストをグループ化して表示"; /* Class = "UIViewController"; title = "YouTube OnDemand"; ObjectID = "69x-Gx-Nb6"; */ -"69x-Gx-Nb6.title" = "YouTube OnDemand"; +"69x-Gx-Nb6.title" = "YouTube オンデマンド"; /* Class = "UILabel"; text = "Shows on-demand loading with a ListView"; ObjectID = "6QK-Cc-y15"; */ -"6QK-Cc-y15.text" = "Shows on-demand loading with a ListView"; +"6QK-Cc-y15.text" = "表示時にデータを要求してリストビューに読み込み"; /* Class = "UINavigationController"; title = "CollectionView101"; ObjectID = "798-98-Js3"; */ "798-98-Js3.title" = "CollectionView101"; /* Class = "UITableViewController"; title = "Sorting"; ObjectID = "7ih-MR-4Cm"; */ -"7ih-MR-4Cm.title" = "Sorting"; +"7ih-MR-4Cm.title" = "ソート"; /* Class = "UITableViewController"; title = "CollectionView101"; ObjectID = "A3s-lV-pdi"; */ "A3s-lV-pdi.title" = "CollectionView101"; /* Class = "UILabel"; text = "Title"; ObjectID = "Anb-IA-gi3"; */ -"Anb-IA-gi3.text" = "Title"; +"Anb-IA-gi3.text" = "タイトル"; /* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "DtY-OV-zVb"; */ -"DtY-OV-zVb.title" = "Back"; +"DtY-OV-zVb.title" = "戻る"; /* Class = "UINavigationItem"; title = "Grouping"; ObjectID = "Eop-Sz-bMd"; */ -"Eop-Sz-bMd.title" = "Grouping"; +"Eop-Sz-bMd.title" = "グループ化"; /* Class = "UINavigationItem"; title = "Filtering Demo"; ObjectID = "F1y-Xk-xGA"; */ -"F1y-Xk-xGA.title" = "Filtering Demo"; +"F1y-Xk-xGA.title" = "フィルタリング"; /* Class = "UILabel"; text = "Simple OnDemand"; ObjectID = "F73-Yk-65J"; */ -"F73-Yk-65J.text" = "Simple OnDemand"; +"F73-Yk-65J.text" = "シンプルオンデマンド"; /* Class = "UITextField"; placeholder = "Enter your search request"; ObjectID = "FzP-fF-yx0"; */ -"FzP-fF-yx0.placeholder" = "Enter your search request"; +"FzP-fF-yx0.placeholder" = "検索するキーワードを入力"; /* Class = "UILabel"; text = "Sort a list of items from the action bar"; ObjectID = "GLZ-02-Gdg"; */ -"GLZ-02-Gdg.text" = "Sort a list of items from the action bar"; +"GLZ-02-Gdg.text" = "アクションバーを操作して項目をソート"; /* Class = "UITableViewController"; title = "Filtering Subview"; ObjectID = "HE6-a9-uUW"; */ -"HE6-a9-uUW.title" = "Filtering Subview"; +"HE6-a9-uUW.title" = "フィルター処理 補助画面"; /* Class = "UISegmentedControl"; IfT-lu-aWn.segmentTitles[0] = "Relevance"; ObjectID = "IfT-lu-aWn"; */ -"IfT-lu-aWn.segmentTitles[0]" = "Relevance"; +"IfT-lu-aWn.segmentTitles[0]" = "関連性"; /* Class = "UISegmentedControl"; IfT-lu-aWn.segmentTitles[1] = "Date"; ObjectID = "IfT-lu-aWn"; */ -"IfT-lu-aWn.segmentTitles[1]" = "Date"; +"IfT-lu-aWn.segmentTitles[1]" = "日付"; /* Class = "UISegmentedControl"; IfT-lu-aWn.segmentTitles[2] = "View Count"; ObjectID = "IfT-lu-aWn"; */ -"IfT-lu-aWn.segmentTitles[2]" = "View Count"; +"IfT-lu-aWn.segmentTitles[2]" = "閲覧数"; /* Class = "UISegmentedControl"; IfT-lu-aWn.segmentTitles[3] = "Rating"; ObjectID = "IfT-lu-aWn"; */ -"IfT-lu-aWn.segmentTitles[3]" = "Rating"; +"IfT-lu-aWn.segmentTitles[3]" = "評価"; /* Class = "UISegmentedControl"; IfT-lu-aWn.segmentTitles[4] = "Title"; ObjectID = "IfT-lu-aWn"; */ -"IfT-lu-aWn.segmentTitles[4]" = "Title"; +"IfT-lu-aWn.segmentTitles[4]" = "タイトル"; /* Class = "UILabel"; text = "Detail"; ObjectID = "IpZ-Hb-7b0"; */ -"IpZ-Hb-7b0.text" = "Detail"; +"IpZ-Hb-7b0.text" = "詳細"; /* Class = "UILabel"; text = "Filtering"; ObjectID = "JAY-lX-H0m"; */ -"JAY-lX-H0m.text" = "Filtering"; +"JAY-lX-H0m.text" = "フィルター処理"; /* Class = "UINavigationItem"; title = "Simple OnDemand"; ObjectID = "JXY-hG-Bev"; */ -"JXY-hG-Bev.title" = "Simple OnDemand"; +"JXY-hG-Bev.title" = "シンプルオンデマンド"; /* Class = "UINavigationItem"; title = "Sorting"; ObjectID = "Jcm-u1-tk4"; */ -"Jcm-u1-tk4.title" = "Sorting"; +"Jcm-u1-tk4.title" = "ソート"; /* Class = "UILabel"; text = "Grouping"; ObjectID = "KOu-Xm-dsd"; */ -"KOu-Xm-dsd.text" = "Grouping"; +"KOu-Xm-dsd.text" = "グループ化"; /* Class = "UILabel"; text = ">"; ObjectID = "L4e-gD-TaT"; */ "L4e-gD-TaT.text" = ">"; /* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "PaI-0O-mFv"; */ -"PaI-0O-mFv.title" = "Back"; +"PaI-0O-mFv.title" = "戻る"; /* Class = "UILabel"; text = "Detail"; ObjectID = "S6E-uQ-8gP"; */ -"S6E-uQ-8gP.text" = "Detail"; +"S6E-uQ-8gP.text" = "詳細"; /* Class = "UILabel"; text = ">"; ObjectID = "W5a-cG-S8t"; */ "W5a-cG-S8t.text" = ">"; @@ -96,58 +96,58 @@ "XJb-4a-6I6.text" = ">"; /* Class = "UIViewController"; title = "Filtering Demo"; ObjectID = "ZzD-FA-sPI"; */ -"ZzD-FA-sPI.title" = "Filtering Demo"; +"ZzD-FA-sPI.title" = "フィルター処理"; /* Class = "UILabel"; text = "Shows on-demand loading with YouTube API"; ObjectID = "aEa-i1-YqZ"; */ -"aEa-i1-YqZ.text" = "Shows on-demand loading with YouTube API"; +"aEa-i1-YqZ.text" = "YouTube APIを使用したロードオンデマンド"; /* Class = "UILabel"; text = "Filters a list of items by typing in an Entry"; ObjectID = "ali-Ve-8YO"; */ -"ali-Ve-8YO.text" = "Filters a list of items by typing in an Entry"; +"ali-Ve-8YO.text" = "テキストを入力して項目をフィルタリング"; /* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "amh-J3-5Vm"; */ -"amh-J3-5Vm.title" = "Back"; +"amh-J3-5Vm.title" = "戻る"; /* Class = "UIBarButtonItem"; title = "Sort"; ObjectID = "cDH-85-JES"; */ -"cDH-85-JES.title" = "Sort"; +"cDH-85-JES.title" = "ソート"; /* Class = "UILabel"; text = "Title"; ObjectID = "dnA-mh-F16"; */ -"dnA-mh-F16.text" = "Title"; +"dnA-mh-F16.text" = "タイトル"; /* Class = "UINavigationItem"; title = "CollectionView101"; ObjectID = "fCS-cL-WFr"; */ "fCS-cL-WFr.title" = "CollectionView101"; /* Class = "UILabel"; text = "Detail"; ObjectID = "ia5-D3-eAA"; */ -"ia5-D3-eAA.text" = "Detail"; +"ia5-D3-eAA.text" = "詳細"; /* Class = "UILabel"; text = "Title"; ObjectID = "lkP-cp-Jjv"; */ -"lkP-cp-Jjv.text" = "Title"; +"lkP-cp-Jjv.text" = "タイトル"; /* Class = "UITextField"; placeholder = "Enter your search request"; ObjectID = "m8O-7S-noj"; */ -"m8O-7S-noj.placeholder" = "Enter your search request"; +"m8O-7S-noj.placeholder" = "検索するキーワードを入力"; /* Class = "UILabel"; text = "YouTube OnDemand"; ObjectID = "qaW-JU-eaf"; */ -"qaW-JU-eaf.text" = "YouTube OnDemand"; +"qaW-JU-eaf.text" = "YouTube オンデマンド"; /* Class = "UILabel"; text = "Title"; ObjectID = "rKx-lQ-Ibr"; */ -"rKx-lQ-Ibr.text" = "Title"; +"rKx-lQ-Ibr.text" = "タイトル"; /* Class = "UILabel"; text = "Title"; ObjectID = "sLW-zD-73r"; */ -"sLW-zD-73r.text" = "Title"; +"sLW-zD-73r.text" = "タイトル"; /* Class = "UINavigationItem"; title = "YouTube OnDemand"; ObjectID = "snp-Lp-uik"; */ -"snp-Lp-uik.title" = "YouTube OnDemand"; +"snp-Lp-uik.title" = "YouTube オンデマンド"; /* Class = "UITableViewController"; title = "Sorting"; ObjectID = "tEM-Ha-q5d"; */ -"tEM-Ha-q5d.title" = "Sorting"; +"tEM-Ha-q5d.title" = "ソート"; /* Class = "UITableViewController"; title = "Grouping"; ObjectID = "ujQ-dv-l4y"; */ -"ujQ-dv-l4y.title" = "Grouping"; +"ujQ-dv-l4y.title" = "グループ化"; /* Class = "UILabel"; text = ">"; ObjectID = "vNr-Nf-FJA"; */ "vNr-Nf-FJA.text" = ">"; /* Class = "UITableViewController"; title = "Sorting"; ObjectID = "wLZ-oO-gNR"; */ -"wLZ-oO-gNR.title" = "Sorting"; +"wLZ-oO-gNR.title" = "ソート"; /* Class = "UILabel"; text = "Detail"; ObjectID = "yLd-8q-2dX"; */ -"yLd-8q-2dX.text" = "Detail"; +"yLd-8q-2dX.text" = "詳細"; diff --git a/ObjectiveC/FlexChart101/FlexChart101.xcodeproj/project.pbxproj b/ObjectiveC/FlexChart101/FlexChart101.xcodeproj/project.pbxproj index a60d16a..0668b38 100644 --- a/ObjectiveC/FlexChart101/FlexChart101.xcodeproj/project.pbxproj +++ b/ObjectiveC/FlexChart101/FlexChart101.xcodeproj/project.pbxproj @@ -7,19 +7,25 @@ objects = { /* Begin PBXBuildFile section */ + 4C87CEDC1D25BC89009781F5 /* XuniChartCoreDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CED91D25BC89009781F5 /* XuniChartCoreDynamicKit.framework */; }; + 4C87CEDD1D25BC89009781F5 /* XuniCoreDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CEDA1D25BC89009781F5 /* XuniCoreDynamicKit.framework */; }; + 4C87CEDE1D25BC89009781F5 /* XuniFlexChartDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CEDB1D25BC89009781F5 /* XuniFlexChartDynamicKit.framework */; }; + 4C87CEDF1D25BC92009781F5 /* XuniChartCoreDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CED91D25BC89009781F5 /* XuniChartCoreDynamicKit.framework */; }; + 4C87CEE01D25BC92009781F5 /* XuniChartCoreDynamicKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CED91D25BC89009781F5 /* XuniChartCoreDynamicKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4C87CEE11D25BC92009781F5 /* XuniCoreDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CEDA1D25BC89009781F5 /* XuniCoreDynamicKit.framework */; }; + 4C87CEE21D25BC92009781F5 /* XuniCoreDynamicKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CEDA1D25BC89009781F5 /* XuniCoreDynamicKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4C87CEE31D25BC92009781F5 /* XuniFlexChartDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CEDB1D25BC89009781F5 /* XuniFlexChartDynamicKit.framework */; }; + 4C87CEE41D25BC92009781F5 /* XuniFlexChartDynamicKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CEDB1D25BC89009781F5 /* XuniFlexChartDynamicKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4C8978E31D268F23004E468B /* XuniFlexChartDesignTimeStoryboardSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8978E21D268F23004E468B /* XuniFlexChartDesignTimeStoryboardSupport.m */; }; + 4CA1F25C1CCF8B7B004B1C98 /* MainMenuTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA1F25B1CCF8B7B004B1C98 /* MainMenuTableViewController.m */; }; 8407E6921BA170B3001C1582 /* LineMarkerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8407E6911BA170B3001C1582 /* LineMarkerController.m */; }; - 841A3ABA1C0593F2004853DD /* XuniChartCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 841A3AB71C0593F2004853DD /* XuniChartCoreKit.framework */; }; - 841A3ABB1C0593F2004853DD /* XuniCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 841A3AB81C0593F2004853DD /* XuniCoreKit.framework */; }; - 841A3ABC1C0593F2004853DD /* XuniFlexChartKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 841A3AB91C0593F2004853DD /* XuniFlexChartKit.framework */; }; - 8435C9491C869C11001AC90E /* ChartAnnotationsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8435C9481C869C11001AC90E /* ChartAnnotationsController.m */; }; - 84D2E7911C02C02500D46662 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 84D2E7931C02C02500D46662 /* Localizable.strings */; }; 84D4F3161BCCB08D000B5960 /* ConditionalFormattingController.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D4F3131BCCB08D000B5960 /* ConditionalFormattingController.m */; }; 84D4F3171BCCB08D000B5960 /* CustomPlotElementsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D4F3151BCCB08D000B5960 /* CustomPlotElementsController.m */; }; 84D4F3201BCF89A1000B5960 /* ScrollingController.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D4F31F1BCF89A1000B5960 /* ScrollingController.m */; }; + 84D5BAEE1C33808E00EFD08B /* ChartAnnotationsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D5BAED1C33808E00EFD08B /* ChartAnnotationsController.m */; }; 84E33AB91B8D6BF4002AE146 /* UpdateAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 84E33AB81B8D6BF4002AE146 /* UpdateAnimationController.m */; }; F2160F8B1B18D45F00F3ADD5 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F2160F8A1B18D45F00F3ADD5 /* main.m */; }; F2160F8E1B18D45F00F3ADD5 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F2160F8D1B18D45F00F3ADD5 /* AppDelegate.m */; }; - F2160F911B18D45F00F3ADD5 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F2160F901B18D45F00F3ADD5 /* ViewController.m */; }; F2160F941B18D45F00F3ADD5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F2160F921B18D45F00F3ADD5 /* Main.storyboard */; }; F2160F961B18D45F00F3ADD5 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F2160F951B18D45F00F3ADD5 /* Images.xcassets */; }; F2160F991B18D45F00F3ADD5 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = F2160F971B18D45F00F3ADD5 /* LaunchScreen.xib */; }; @@ -61,25 +67,41 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + 4C87CEE51D25BC92009781F5 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 4C87CEE41D25BC92009781F5 /* XuniFlexChartDynamicKit.framework in Embed Frameworks */, + 4C87CEE21D25BC92009781F5 /* XuniCoreDynamicKit.framework in Embed Frameworks */, + 4C87CEE01D25BC92009781F5 /* XuniChartCoreDynamicKit.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ + 4C37D4291CD30E1B009113A8 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/LaunchScreen.strings; sourceTree = ""; }; + 4C37D42A1CD30E1B009113A8 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Main.strings; sourceTree = ""; }; + 4C87CED91D25BC89009781F5 /* XuniChartCoreDynamicKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniChartCoreDynamicKit.framework; path = ../../../Controls/XuniChartCoreDynamicKit.framework; sourceTree = ""; }; + 4C87CEDA1D25BC89009781F5 /* XuniCoreDynamicKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreDynamicKit.framework; path = ../../../Controls/XuniCoreDynamicKit.framework; sourceTree = ""; }; + 4C87CEDB1D25BC89009781F5 /* XuniFlexChartDynamicKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniFlexChartDynamicKit.framework; path = ../../../Controls/XuniFlexChartDynamicKit.framework; sourceTree = ""; }; + 4C8978E21D268F23004E468B /* XuniFlexChartDesignTimeStoryboardSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XuniFlexChartDesignTimeStoryboardSupport.m; path = ../../../Controls/XuniFlexChartDesignTimeStoryboardSupport.m; sourceTree = ""; }; + 4CA1F25A1CCF8B7B004B1C98 /* MainMenuTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainMenuTableViewController.h; sourceTree = ""; }; + 4CA1F25B1CCF8B7B004B1C98 /* MainMenuTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainMenuTableViewController.m; sourceTree = ""; }; 8407E6901BA170B3001C1582 /* LineMarkerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LineMarkerController.h; sourceTree = ""; }; 8407E6911BA170B3001C1582 /* LineMarkerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LineMarkerController.m; sourceTree = ""; }; - 841A3AB71C0593F2004853DD /* XuniChartCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniChartCoreKit.framework; path = "../DerivedData/FlexChartWorkspace/Build/Products/Debug-framework/XuniChartCoreKit.framework"; sourceTree = ""; }; - 841A3AB81C0593F2004853DD /* XuniCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreKit.framework; path = "../DerivedData/FlexChartWorkspace/Build/Products/Debug-framework/XuniCoreKit.framework"; sourceTree = ""; }; - 841A3AB91C0593F2004853DD /* XuniFlexChartKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniFlexChartKit.framework; path = "../DerivedData/FlexChartWorkspace/Build/Products/Debug-framework/XuniFlexChartKit.framework"; sourceTree = ""; }; - 8435C9471C869C11001AC90E /* ChartAnnotationsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChartAnnotationsController.h; sourceTree = ""; }; - 8435C9481C869C11001AC90E /* ChartAnnotationsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChartAnnotationsController.m; sourceTree = ""; }; - 84D2E7821C02BAA100D46662 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/LaunchScreen.strings; sourceTree = ""; }; - 84D2E7831C02BAA100D46662 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Main.strings; sourceTree = ""; }; - 84D2E7921C02C02500D46662 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; - 84D2E7941C02C02900D46662 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; lineEnding = 0; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.simpleColoring; }; - 84D2E7951C02C02B00D46662 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; lineEnding = 0; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.simpleColoring; }; 84D4F3121BCCB08D000B5960 /* ConditionalFormattingController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConditionalFormattingController.h; sourceTree = ""; }; 84D4F3131BCCB08D000B5960 /* ConditionalFormattingController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ConditionalFormattingController.m; sourceTree = ""; }; 84D4F3141BCCB08D000B5960 /* CustomPlotElementsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomPlotElementsController.h; sourceTree = ""; }; 84D4F3151BCCB08D000B5960 /* CustomPlotElementsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomPlotElementsController.m; sourceTree = ""; }; 84D4F31E1BCF89A1000B5960 /* ScrollingController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollingController.h; sourceTree = ""; }; 84D4F31F1BCF89A1000B5960 /* ScrollingController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScrollingController.m; sourceTree = ""; }; + 84D5BAEC1C33808E00EFD08B /* ChartAnnotationsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChartAnnotationsController.h; sourceTree = ""; }; + 84D5BAED1C33808E00EFD08B /* ChartAnnotationsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChartAnnotationsController.m; sourceTree = ""; }; 84E33AB71B8D6BF4002AE146 /* UpdateAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UpdateAnimationController.h; sourceTree = ""; }; 84E33AB81B8D6BF4002AE146 /* UpdateAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UpdateAnimationController.m; sourceTree = ""; }; F2160F851B18D45F00F3ADD5 /* FlexChart101.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FlexChart101.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -87,8 +109,6 @@ F2160F8A1B18D45F00F3ADD5 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; F2160F8C1B18D45F00F3ADD5 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; F2160F8D1B18D45F00F3ADD5 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - F2160F8F1B18D45F00F3ADD5 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - F2160F901B18D45F00F3ADD5 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; F2160F931B18D45F00F3ADD5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; F2160F951B18D45F00F3ADD5 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; F2160F981B18D45F00F3ADD5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; @@ -152,9 +172,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 841A3ABA1C0593F2004853DD /* XuniChartCoreKit.framework in Frameworks */, - 841A3ABB1C0593F2004853DD /* XuniCoreKit.framework in Frameworks */, - 841A3ABC1C0593F2004853DD /* XuniFlexChartKit.framework in Frameworks */, + 4C87CEE11D25BC92009781F5 /* XuniCoreDynamicKit.framework in Frameworks */, + 4C87CEDC1D25BC89009781F5 /* XuniChartCoreDynamicKit.framework in Frameworks */, + 4C87CEDD1D25BC89009781F5 /* XuniCoreDynamicKit.framework in Frameworks */, + 4C87CEE31D25BC92009781F5 /* XuniFlexChartDynamicKit.framework in Frameworks */, + 4C87CEDE1D25BC89009781F5 /* XuniFlexChartDynamicKit.framework in Frameworks */, + 4C87CEDF1D25BC92009781F5 /* XuniChartCoreDynamicKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -168,77 +191,47 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - F2160F7C1B18D45F00F3ADD5 = { - isa = PBXGroup; - children = ( - 841A3AB71C0593F2004853DD /* XuniChartCoreKit.framework */, - 841A3AB81C0593F2004853DD /* XuniCoreKit.framework */, - 841A3AB91C0593F2004853DD /* XuniFlexChartKit.framework */, - F2160F871B18D45F00F3ADD5 /* FlexChart101 */, - F2160FA11B18D45F00F3ADD5 /* FlexChart101Tests */, - F2160F861B18D45F00F3ADD5 /* Products */, - ); - sourceTree = ""; - }; - F2160F861B18D45F00F3ADD5 /* Products */ = { + 4CA1F2591CCED8AB004B1C98 /* Samples */ = { isa = PBXGroup; children = ( - F2160F851B18D45F00F3ADD5 /* FlexChart101.app */, - F2160F9E1B18D45F00F3ADD5 /* FlexChart101Tests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - F2160F871B18D45F00F3ADD5 /* FlexChart101 */ = { - isa = PBXGroup; - children = ( - F2160F8C1B18D45F00F3ADD5 /* AppDelegate.h */, - F2160F8D1B18D45F00F3ADD5 /* AppDelegate.m */, - F2160FB11B18EABA00F3ADD5 /* BasicChartTypesController.h */, - F2160FB21B18EABA00F3ADD5 /* BasicChartTypesController.m */, - F2160FBA1B18EB1200F3ADD5 /* BubbleChartController.h */, - F2160FBB1B18EB1200F3ADD5 /* BubbleChartController.m */, - 8435C9471C869C11001AC90E /* ChartAnnotationsController.h */, - 8435C9481C869C11001AC90E /* ChartAnnotationsController.m */, - F2C5897C1B1CAAF100371F29 /* ChartData.h */, - F2C5897D1B1CAAF100371F29 /* ChartData.m */, + F2160FCC1B18EBC600F3ADD5 /* LegendAndTitlesController.h */, + F2160FCD1B18EBC600F3ADD5 /* LegendAndTitlesController.m */, 84D4F3121BCCB08D000B5960 /* ConditionalFormattingController.h */, 84D4F3131BCCB08D000B5960 /* ConditionalFormattingController.m */, F2160FC91B18EBA900F3ADD5 /* CustomizingAxesController.h */, F2160FCA1B18EBA900F3ADD5 /* CustomizingAxesController.m */, 84D4F3141BCCB08D000B5960 /* CustomPlotElementsController.h */, 84D4F3151BCCB08D000B5960 /* CustomPlotElementsController.m */, - F2160FBD1B18EB2C00F3ADD5 /* CustomTooltipsController.h */, - F2160FBE1B18EB2C00F3ADD5 /* CustomTooltipsController.m */, F2BEDB9C1B73DF4000DD2454 /* DataLabelController.h */, F2BEDB9D1B73DF4000DD2454 /* DataLabelController.m */, - F24A601D1B223614000FDBD1 /* DynamicChartData.h */, - F24A601E1B223614000FDBD1 /* DynamicChartData.m */, F2160FD81B18EC2100F3ADD5 /* DynamicChartsController.h */, F2160FD91B18EC2100F3ADD5 /* DynamicChartsController.m */, - F2160FB71B18EAFE00F3ADD5 /* FinancialChartController.h */, - F2160FB81B18EAFE00F3ADD5 /* FinancialChartController.m */, - F2C5898D1B1CF43500371F29 /* FinancialData.h */, - F2C5898E1B1CF43500371F29 /* FinancialData.m */, F2160FAE1B18EA8100F3ADD5 /* GettingStartedController.h */, F2160FAF1B18EA8100F3ADD5 /* GettingStartedController.m */, + F2160FB11B18EABA00F3ADD5 /* BasicChartTypesController.h */, + F2160FB21B18EABA00F3ADD5 /* BasicChartTypesController.m */, + F2160FB41B18EAEA00F3ADD5 /* MixedChartTypesController.h */, + F2160FB51B18EAEA00F3ADD5 /* MixedChartTypesController.m */, + F2160FBD1B18EB2C00F3ADD5 /* CustomTooltipsController.h */, + F2160FBE1B18EB2C00F3ADD5 /* CustomTooltipsController.m */, + F2160FBA1B18EB1200F3ADD5 /* BubbleChartController.h */, + F2160FBB1B18EB1200F3ADD5 /* BubbleChartController.m */, + F2160FB71B18EAFE00F3ADD5 /* FinancialChartController.h */, + F2160FB81B18EAFE00F3ADD5 /* FinancialChartController.m */, F2160FDE1B18ECF000F3ADD5 /* HitTestController.h */, F2160FDF1B18ECF000F3ADD5 /* HitTestController.m */, - F2774A421B21EE69008E721D /* HitTestData.h */, - F2774A431B21EE69008E721D /* HitTestData.m */, - F2160F951B18D45F00F3ADD5 /* Images.xcassets */, - F2160F971B18D45F00F3ADD5 /* LaunchScreen.xib */, - F2160FCC1B18EBC600F3ADD5 /* LegendAndTitlesController.h */, - F2160FCD1B18EBC600F3ADD5 /* LegendAndTitlesController.m */, - F23573661B445E3800F300D7 /* License.h */, - F23573671B445E3800F300D7 /* License.m */, + 84D5BAEC1C33808E00EFD08B /* ChartAnnotationsController.h */, + 84D5BAED1C33808E00EFD08B /* ChartAnnotationsController.m */, + F2160FC01B18EB3D00F3ADD5 /* ThemingController.h */, + F2160FC11B18EB3D00F3ADD5 /* ThemingController.m */, + F2160FD21B18EBF300F3ADD5 /* ToggleSeriesController.h */, + F2160FD31B18EBF300F3ADD5 /* ToggleSeriesController.m */, + 84E33AB71B8D6BF4002AE146 /* UpdateAnimationController.h */, + 84E33AB81B8D6BF4002AE146 /* UpdateAnimationController.m */, 8407E6901BA170B3001C1582 /* LineMarkerController.h */, 8407E6911BA170B3001C1582 /* LineMarkerController.m */, F2160FD51B18EC0E00F3ADD5 /* LoadAnimationController.h */, F2160FD61B18EC0E00F3ADD5 /* LoadAnimationController.m */, - F2160F921B18D45F00F3ADD5 /* Main.storyboard */, - F2160FB41B18EAEA00F3ADD5 /* MixedChartTypesController.h */, - F2160FB51B18EAEA00F3ADD5 /* MixedChartTypesController.m */, F254FAC01B3313FF009CD853 /* MultipleAxesController.h */, F254FAC11B3313FF009CD853 /* MultipleAxesController.m */, 84D4F31E1BCF89A1000B5960 /* ScrollingController.h */, @@ -249,20 +242,67 @@ F254FABE1B31E8BE009CD853 /* SnapshotController.m */, F2160FC61B18EB9200F3ADD5 /* StylingSeriesController.h */, F2160FC71B18EB9200F3ADD5 /* StylingSeriesController.m */, - F2160F881B18D45F00F3ADD5 /* Supporting Files */, - F2160FC01B18EB3D00F3ADD5 /* ThemingController.h */, - F2160FC11B18EB3D00F3ADD5 /* ThemingController.m */, - F2160FD21B18EBF300F3ADD5 /* ToggleSeriesController.h */, - F2160FD31B18EBF300F3ADD5 /* ToggleSeriesController.m */, - 84E33AB71B8D6BF4002AE146 /* UpdateAnimationController.h */, - 84E33AB81B8D6BF4002AE146 /* UpdateAnimationController.m */, - F2160F8F1B18D45F00F3ADD5 /* ViewController.h */, - F2160F901B18D45F00F3ADD5 /* ViewController.m */, - F254FAC31B331663009CD853 /* WeatherData.h */, - F254FAC41B331663009CD853 /* WeatherData.m */, F2160FDB1B18EC3500F3ADD5 /* ZoomingAndScrollingController.h */, F2160FDC1B18EC3500F3ADD5 /* ZoomingAndScrollingController.m */, ); + name = Samples; + sourceTree = ""; + }; + 4CA1F25D1CCFF789004B1C98 /* DataModel */ = { + isa = PBXGroup; + children = ( + F2C5898D1B1CF43500371F29 /* FinancialData.h */, + F2C5898E1B1CF43500371F29 /* FinancialData.m */, + F24A601D1B223614000FDBD1 /* DynamicChartData.h */, + F24A601E1B223614000FDBD1 /* DynamicChartData.m */, + F2C5897C1B1CAAF100371F29 /* ChartData.h */, + F2C5897D1B1CAAF100371F29 /* ChartData.m */, + F2774A421B21EE69008E721D /* HitTestData.h */, + F2774A431B21EE69008E721D /* HitTestData.m */, + F254FAC31B331663009CD853 /* WeatherData.h */, + F254FAC41B331663009CD853 /* WeatherData.m */, + ); + name = DataModel; + sourceTree = ""; + }; + F2160F7C1B18D45F00F3ADD5 = { + isa = PBXGroup; + children = ( + 4C8978E21D268F23004E468B /* XuniFlexChartDesignTimeStoryboardSupport.m */, + 4C87CED91D25BC89009781F5 /* XuniChartCoreDynamicKit.framework */, + 4C87CEDA1D25BC89009781F5 /* XuniCoreDynamicKit.framework */, + 4C87CEDB1D25BC89009781F5 /* XuniFlexChartDynamicKit.framework */, + F2160F871B18D45F00F3ADD5 /* FlexChart101 */, + F2160FA11B18D45F00F3ADD5 /* FlexChart101Tests */, + F2160F861B18D45F00F3ADD5 /* Products */, + ); + sourceTree = ""; + }; + F2160F861B18D45F00F3ADD5 /* Products */ = { + isa = PBXGroup; + children = ( + F2160F851B18D45F00F3ADD5 /* FlexChart101.app */, + F2160F9E1B18D45F00F3ADD5 /* FlexChart101Tests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + F2160F871B18D45F00F3ADD5 /* FlexChart101 */ = { + isa = PBXGroup; + children = ( + 4CA1F25D1CCFF789004B1C98 /* DataModel */, + 4CA1F2591CCED8AB004B1C98 /* Samples */, + F2160F8C1B18D45F00F3ADD5 /* AppDelegate.h */, + F2160F8D1B18D45F00F3ADD5 /* AppDelegate.m */, + F2160F951B18D45F00F3ADD5 /* Images.xcassets */, + F2160F971B18D45F00F3ADD5 /* LaunchScreen.xib */, + F23573661B445E3800F300D7 /* License.h */, + F23573671B445E3800F300D7 /* License.m */, + F2160F921B18D45F00F3ADD5 /* Main.storyboard */, + F2160F881B18D45F00F3ADD5 /* Supporting Files */, + 4CA1F25A1CCF8B7B004B1C98 /* MainMenuTableViewController.h */, + 4CA1F25B1CCF8B7B004B1C98 /* MainMenuTableViewController.m */, + ); path = FlexChart101; sourceTree = ""; }; @@ -271,7 +311,6 @@ children = ( F2160F891B18D45F00F3ADD5 /* Info.plist */, F2160F8A1B18D45F00F3ADD5 /* main.m */, - 84D2E7931C02C02500D46662 /* Localizable.strings */, ); name = "Supporting Files"; sourceTree = ""; @@ -303,6 +342,7 @@ F2160F811B18D45F00F3ADD5 /* Sources */, F2160F821B18D45F00F3ADD5 /* Frameworks */, F2160F831B18D45F00F3ADD5 /* Resources */, + 4C87CEE51D25BC92009781F5 /* Embed Frameworks */, ); buildRules = ( ); @@ -356,7 +396,6 @@ knownRegions = ( en, Base, - ja, ); mainGroup = F2160F7C1B18D45F00F3ADD5; productRefGroup = F2160F861B18D45F00F3ADD5 /* Products */; @@ -375,7 +414,6 @@ buildActionMask = 2147483647; files = ( F2160F941B18D45F00F3ADD5 /* Main.storyboard in Resources */, - 84D2E7911C02C02500D46662 /* Localizable.strings in Resources */, F2160F991B18D45F00F3ADD5 /* LaunchScreen.xib in Resources */, F2160F961B18D45F00F3ADD5 /* Images.xcassets in Resources */, ); @@ -399,12 +437,14 @@ 84E33AB91B8D6BF4002AE146 /* UpdateAnimationController.m in Sources */, F2160FCE1B18EBC600F3ADD5 /* LegendAndTitlesController.m in Sources */, F2C5898F1B1CF43500371F29 /* FinancialData.m in Sources */, + 4CA1F25C1CCF8B7B004B1C98 /* MainMenuTableViewController.m in Sources */, F2160FC21B18EB3D00F3ADD5 /* ThemingController.m in Sources */, - 8435C9491C869C11001AC90E /* ChartAnnotationsController.m in Sources */, + 84D5BAEE1C33808E00EFD08B /* ChartAnnotationsController.m in Sources */, F2774A441B21EE69008E721D /* HitTestData.m in Sources */, F2160FC81B18EB9200F3ADD5 /* StylingSeriesController.m in Sources */, F2BEDB9E1B73DF4000DD2454 /* DataLabelController.m in Sources */, F2160FDA1B18EC2100F3ADD5 /* DynamicChartsController.m in Sources */, + 4C8978E31D268F23004E468B /* XuniFlexChartDesignTimeStoryboardSupport.m in Sources */, F2160FE01B18ECF000F3ADD5 /* HitTestController.m in Sources */, F254FAC21B3313FF009CD853 /* MultipleAxesController.m in Sources */, F2160FB61B18EAEA00F3ADD5 /* MixedChartTypesController.m in Sources */, @@ -412,7 +452,6 @@ 8407E6921BA170B3001C1582 /* LineMarkerController.m in Sources */, F254FAC51B331663009CD853 /* WeatherData.m in Sources */, F2160FD41B18EBF300F3ADD5 /* ToggleSeriesController.m in Sources */, - F2160F911B18D45F00F3ADD5 /* ViewController.m in Sources */, F2160FD71B18EC0E00F3ADD5 /* LoadAnimationController.m in Sources */, F2160FDD1B18EC3500F3ADD5 /* ZoomingAndScrollingController.m in Sources */, F2160F8E1B18D45F00F3ADD5 /* AppDelegate.m in Sources */, @@ -451,21 +490,11 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ - 84D2E7931C02C02500D46662 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 84D2E7921C02C02500D46662 /* Base */, - 84D2E7941C02C02900D46662 /* en */, - 84D2E7951C02C02B00D46662 /* ja */, - ); - name = Localizable.strings; - sourceTree = ""; - }; F2160F921B18D45F00F3ADD5 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( F2160F931B18D45F00F3ADD5 /* Base */, - 84D2E7831C02BAA100D46662 /* ja */, + 4C37D42A1CD30E1B009113A8 /* ja */, ); name = Main.storyboard; sourceTree = ""; @@ -474,7 +503,7 @@ isa = PBXVariantGroup; children = ( F2160F981B18D45F00F3ADD5 /* Base */, - 84D2E7821C02BAA100D46662 /* ja */, + 4C37D4291CD30E1B009113A8 /* ja */, ); name = LaunchScreen.xib; sourceTree = ""; @@ -503,6 +532,7 @@ COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = "/Users/kotyuck/Desktop/Volumes/main-frameworks"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -548,6 +578,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = "/Users/kotyuck/Desktop/Volumes/main-frameworks"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -569,6 +600,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; ENABLE_BITCODE = NO; @@ -576,6 +608,7 @@ "FRAMEWORK_SEARCH_PATHS[arch=*]" = ( "$(inherited)", ../../../Controls, + ../../../../Controls, ); INFOPLIST_FILE = FlexChart101/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.3; @@ -590,16 +623,15 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - ../../../Controls, - ); + FRAMEWORK_SEARCH_PATHS = ../../../Controls; "FRAMEWORK_SEARCH_PATHS[arch=*]" = ( "$(inherited)", ../../../Controls, + ../../../../Controls, ); INFOPLIST_FILE = FlexChart101/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.3; diff --git a/ObjectiveC/FlexChart101/FlexChart101/AppDelegate.m b/ObjectiveC/FlexChart101/FlexChart101/AppDelegate.m index bb1e932..751a3ff 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/AppDelegate.m +++ b/ObjectiveC/FlexChart101/FlexChart101/AppDelegate.m @@ -6,8 +6,10 @@ // #import "AppDelegate.h" -#import "XuniCoreKit/XuniCorekit.h" +@import XuniCoreDynamicKit; #import "License.h" +@import XuniFlexChartDynamicKit; + @interface AppDelegate () @@ -19,6 +21,7 @@ @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. [XuniLicenseManager setKey:key]; + [FlexChart class]; return YES; } diff --git a/ObjectiveC/FlexChart101/FlexChart101/Base.lproj/LaunchScreen.xib b/ObjectiveC/FlexChart101/FlexChart101/Base.lproj/LaunchScreen.xib index 63f3768..09883cd 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/Base.lproj/LaunchScreen.xib +++ b/ObjectiveC/FlexChart101/FlexChart101/Base.lproj/LaunchScreen.xib @@ -1,42 +1,39 @@ - + - + - - + + - - + - - - - - - + + + + + + - - - diff --git a/ObjectiveC/FlexChart101/FlexChart101/Base.lproj/Main.storyboard b/ObjectiveC/FlexChart101/FlexChart101/Base.lproj/Main.storyboard index f525750..f90fc5f 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/Base.lproj/Main.storyboard +++ b/ObjectiveC/FlexChart101/FlexChart101/Base.lproj/Main.storyboard @@ -1,14 +1,16 @@ - + - + + + - + - + @@ -16,12 +18,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -32,17 +69,17 @@ - + - + - + @@ -50,17 +87,34 @@ + + + + + + + + + + + + + + + + + - + - + - + @@ -68,17 +122,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -86,17 +193,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -104,17 +243,34 @@ + + + + + + + + + + + + + + + + + - + - + - + @@ -122,17 +278,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -140,17 +334,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -158,17 +380,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -176,17 +426,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -194,17 +485,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -212,17 +604,40 @@ + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -230,17 +645,34 @@ + + + + + + + + + + + + + + + + + - + - + - + @@ -248,17 +680,34 @@ + + + + + + + + + + + + + + + + + - + - + - + @@ -266,75 +715,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -342,17 +806,34 @@ + + + + + + + + + + + + + + + + + - + - + - + @@ -360,17 +841,34 @@ + + + + + + + + + + + + + + + + + - + - + - + @@ -378,17 +876,34 @@ + + + + + + + + + + + + + + + + + - + - + - + @@ -396,17 +911,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -414,17 +972,34 @@ + + + + + + + + + + + + + + + + + - + - + - + @@ -432,17 +1007,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -450,17 +1066,37 @@ + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -468,17 +1104,34 @@ + + + + + + + + + + + + + + + + + - + - + - + @@ -486,17 +1139,34 @@ + + + + + + + + + + + + + + + + + - + - + - + @@ -504,17 +1174,34 @@ + + + + + + + + + + + + + + + + + - + - + - + @@ -522,12 +1209,29 @@ + + + + + + + + + + + + + + + + + - + diff --git a/ObjectiveC/FlexChart101/FlexChart101/BasicChartTypesController.m b/ObjectiveC/FlexChart101/FlexChart101/BasicChartTypesController.m index 25ff146..c21bcaa 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/BasicChartTypesController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/BasicChartTypesController.m @@ -7,62 +7,58 @@ #import "BasicChartTypesController.h" #import "ChartData.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; @interface BasicChartTypesController (){ NSMutableArray *chartTypePickerData; NSMutableArray *stackingPickerData; } +@property (weak, nonatomic) IBOutlet UIPickerView *picker; +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @implementation BasicChartTypesController +- (IBAction)reverseSwitched:(id)sender { + UISwitch * switchState = (UISwitch *)sender; + + NSString *temp = [[NSString alloc] init]; + if ([switchState isOn]) { + self.chart.rotated = true; + } + else + { + self.chart.rotated = false; + } + temp = self.chart.axisX.format; + self.chart.axisX.format = self.chart.axisY.format; + self.chart.axisY.format = temp; +} + + - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Basic Chart Types", nil)]; // Do any additional setup after loading the view. chartTypePickerData =[[NSMutableArray alloc] initWithObjects:@"Column", @"Bar", @"Scatter", @"Line", @"LineSymbol", @"Area", nil]; stackingPickerData = [[NSMutableArray alloc]initWithObjects: @"None", @"Stacked", @"Stacked100pc", nil]; - UIPickerView *chartTypePicker = [[UIPickerView alloc] init]; - UIPickerView *stackingPicker = [[UIPickerView alloc] init]; - - FlexChart *chart = [[FlexChart alloc] init]; - UISwitch *rotatedSwitch = [[UISwitch alloc]init]; NSMutableArray *chartData = [ChartData demoData]; - [rotatedSwitch addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged]; - chartTypePicker.delegate = self; - chartTypePicker.showsSelectionIndicator = YES; - chartTypePicker.hidden = false; - - stackingPicker.delegate = self; - stackingPicker.showsSelectionIndicator = YES; - stackingPicker.hidden = false; - - chart.bindingX = @"name"; - XuniSeries *sales = [[XuniSeries alloc] initForChart:chart binding:@"sales, sales" name:@"Sales"]; - XuniSeries *expenses = [[XuniSeries alloc] initForChart:chart binding:@"expenses, expenses" name:@"Expenses"]; - XuniSeries *downloads = [[XuniSeries alloc] initForChart:chart binding:@"downloads, downloads" name:@"Downloads"]; - - [chart.series addObject:sales]; - [chart.series addObject:expenses]; - [chart.series addObject:downloads]; + _picker.delegate = self; - chart.itemsSource = chartData; - chart.chartType = XuniChartTypeArea; - chart.stacking = XuniStackingStacked; + self.chart.bindingX = @"name"; + XuniSeries *sales = [[XuniSeries alloc] initForChart: self.chart binding:@"sales, sales" name:@"Sales"]; + XuniSeries *expenses = [[XuniSeries alloc] initForChart: self.chart binding:@"expenses, expenses" name:@"Expenses"]; + XuniSeries *downloads = [[XuniSeries alloc] initForChart: self.chart binding:@"downloads, downloads" name:@"Downloads"]; - chart.tag = 1; - chartTypePicker.tag = 2; - stackingPicker.tag = 3; - rotatedSwitch.tag = 4; + [self.chart.series addObject:sales]; + [self.chart.series addObject:expenses]; + [self.chart.series addObject:downloads]; - [self.view addSubview:rotatedSwitch]; - [self.view addSubview:chartTypePicker]; - [self.view addSubview:stackingPicker]; - [self.view addSubview:chart]; + self.chart.itemsSource = chartData; + self.chart.chartType = XuniChartTypeArea; + self.chart.stacking = XuniStackingStacked; } - (void)didReceiveMemoryWarning { @@ -73,36 +69,19 @@ - (void)didReceiveMemoryWarning { - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - UIPickerView *chartTypePicker = (UIPickerView*)[self.view viewWithTag:2]; - [chartTypePicker selectRow:5 inComponent:0 animated:NO]; + [self.picker selectRow:5 inComponent:0 animated:NO]; + [self.picker selectRow:1 inComponent:1 animated:NO]; - UIPickerView *stackingPicker = (UIPickerView*)[self.view viewWithTag:3]; - [stackingPicker selectRow:1 inComponent:0 animated:NO]; - UISwitch *rotatedSwitch = (UISwitch*)[self.view viewWithTag:4]; - rotatedSwitch.on = NO; } -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - UIPickerView *chartTypePicker = (UIPickerView*)[self.view viewWithTag:2]; - UIPickerView *stackingPicker = (UIPickerView*)[self.view viewWithTag:3]; - UISwitch *rotatedSwitch = (UISwitch*)[self.view viewWithTag:4]; - chartTypePicker.frame = CGRectMake(0, 44, self.view.bounds.size.width*7/18, 162); - stackingPicker.frame = CGRectMake(self.view.bounds.size.width*7/18, 44, self.view.bounds.size.width*4/9, 162); - rotatedSwitch.frame = CGRectMake((self.view.bounds.size.width * 15/18) + 5, 110, self.view.bounds.size.width*3/18, 50); - chart.frame = CGRectMake(0, 206, self.view.bounds.size.width, self.view.bounds.size.height - 206); - [chart setNeedsDisplay]; -} - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { - return 1; + return 2; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { - - if(pickerView.tag == 2) { + if(component == 0) { return [chartTypePickerData count]; } else { @@ -111,39 +90,39 @@ - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSIn } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { - FlexChart *chart = (FlexChart *)[self.view viewWithTag:1]; + - if (pickerView.tag == 2) + if (component == 0) { if (row == 0) { - chart.chartType = XuniChartTypeColumn; + self.chart.chartType = XuniChartTypeColumn; } else if (row == 1) { - chart.chartType = XuniChartTypeBar; + self.chart.chartType = XuniChartTypeBar; } else if (row == 2) { - chart.chartType = XuniChartTypeScatter; + self.chart.chartType = XuniChartTypeScatter; } else if (row == 3) { - chart.chartType = XuniChartTypeLine; + self.chart.chartType = XuniChartTypeLine; } else if (row == 4) { - chart.chartType = XuniChartTypeLineSymbols; + self.chart.chartType = XuniChartTypeLineSymbols; } else if (row == 5) { - chart.chartType = XuniChartTypeArea; + self.chart.chartType = XuniChartTypeArea; } } - else if (pickerView.tag == 3) { + else if (component==1) { if (row == 0) { - chart.stacking = XuniStackingNone; + self.chart.stacking = XuniStackingNone; } else if (row == 1) { - chart.stacking= XuniStackingStacked; + self.chart.stacking= XuniStackingStacked; } else if (row == 2) { - chart.stacking = XuniStackingStacked100pc; + self.chart.stacking = XuniStackingStacked100pc; } } @@ -151,44 +130,43 @@ - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComp } - (void)setAxisFormatting { - FlexChart *chart = (FlexChart *)[self.view viewWithTag:1]; - if (chart.chartType == XuniChartTypeBar) { - if (chart.stacking == XuniStackingStacked100pc && chart.rotated == false) { - chart.axisX.format = @"F2"; - chart.axisY.format = @"D"; + if (self.chart.chartType == XuniChartTypeBar) { + if (self.chart.stacking == XuniStackingStacked100pc && self.chart.rotated == false) { + self.chart.axisX.format = @"F2"; + self.chart.axisY.format = @"D"; } - else if (chart.stacking == XuniStackingStacked100pc && chart.rotated == true) { - chart.axisX.format = @"D"; - chart.axisY.format = @"F2"; + else if (self.chart.stacking == XuniStackingStacked100pc && self.chart.rotated == true) { + self.chart.axisX.format = @"D"; + self.chart.axisY.format = @"F2"; } else { - chart.axisX.format = @"D"; - chart.axisY.format = @"D"; + self.chart.axisX.format = @"D"; + self.chart.axisY.format = @"D"; } } else { - if (chart.stacking == XuniStackingStacked100pc && chart.rotated == false) { - chart.axisX.format = @"D"; - chart.axisY.format = @"F2"; + if (self.chart.stacking == XuniStackingStacked100pc && self.chart.rotated == false) { + self.chart.axisX.format = @"D"; + self.chart.axisY.format = @"F2"; } - else if (chart.stacking == XuniStackingStacked100pc && chart.rotated == true) { - chart.axisX.format = @"F2"; - chart.axisY.format = @"F2"; + else if (self.chart.stacking == XuniStackingStacked100pc && self.chart.rotated == true) { + self.chart.axisX.format = @"F2"; + self.chart.axisY.format = @"F2"; } else { - chart.axisX.format = @"D"; - chart.axisY.format = @"D"; + self.chart.axisX.format = @"D"; + self.chart.axisY.format = @"D"; } } } - (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { - if(pickerView.tag == 2) + if(component == 0) { return [chartTypePickerData objectAtIndex:row]; } - else if(pickerView.tag == 3){ + else if(component == 1){ return [stackingPickerData objectAtIndex:row]; } else{ @@ -196,29 +174,4 @@ - (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row fo } } -- (void)switchChanged:(UISwitch *) switchState { - FlexChart *chart = (FlexChart *)[self.view viewWithTag:1]; - NSString *temp = [[NSString alloc] init]; - if ([switchState isOn]) { - chart.rotated = true; - } - else - { - chart.rotated = false; - } - temp = chart.axisX.format; - chart.axisX.format = chart.axisY.format; - chart.axisY.format = temp; -} - -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ - @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/BubbleChartController.m b/ObjectiveC/FlexChart101/FlexChart101/BubbleChartController.m index 23acbbc..55c89f6 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/BubbleChartController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/BubbleChartController.m @@ -7,9 +7,10 @@ #import "BubbleChartController.h" #import "ChartData.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; @interface BubbleChartController () +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @@ -17,45 +18,20 @@ @implementation BubbleChartController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Bubble Chart", nil)]; - - // Do any additional setup after loading the view. - FlexChart *chart = [[FlexChart alloc] init]; - NSMutableArray *chartData = [ChartData demoData]; - chart.bindingX = @"name"; - XuniSeries *sales = [[XuniSeries alloc] initForChart:chart binding:@"sales, downloads" name:@"Sales"]; - XuniSeries *expenses = [[XuniSeries alloc] initForChart:chart binding:@"expenses, downloads" name:@"Expenses"]; - - [chart.series addObject:sales]; - [chart.series addObject:expenses]; - chart.chartType = XuniChartTypeBubble; - chart.itemsSource = chartData; - chart.loadAnimation.animationMode = XuniAnimationModeSeries; - - chart.tag = 1; - [self.view addSubview:chart]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - chart.frame = CGRectMake(0, 55, self.view.bounds.size.width, self.view.bounds.size.height - 55); - [chart setNeedsDisplay]; -} - -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. + NSMutableArray *chartData = [ChartData demoData]; + self.chart.bindingX = @"name"; + XuniSeries *sales = [[XuniSeries alloc] initForChart:self.chart binding:@"sales, downloads" name:@"Sales"]; + XuniSeries *expenses = [[XuniSeries alloc] initForChart:self.chart binding:@"expenses, downloads" name:@"Expenses"]; + + [ self.chart.series addObject:sales]; + [ self.chart.series addObject:expenses]; + self.chart.chartType = XuniChartTypeBubble; + self.chart.itemsSource = chartData; + self.chart.loadAnimation.animationMode = XuniAnimationModeSeries; + + self.chart.tag = 1; + [self.view addSubview:self.chart]; } -*/ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/ChartAnnotationsController.m b/ObjectiveC/FlexChart101/FlexChart101/ChartAnnotationsController.m index 909da38..a6dd4ed 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/ChartAnnotationsController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/ChartAnnotationsController.m @@ -8,9 +8,10 @@ #import "ChartAnnotationsController.h" #import "ChartData.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; @interface ChartAnnotationsController () +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @@ -18,20 +19,15 @@ @implementation ChartAnnotationsController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:@"Annotations"]; - - // Do any additional setup after loading the view. - FlexChart *chart = [[FlexChart alloc] init]; + NSMutableArray *chartData = [ChartData annotationData]; - chart.bindingX = @"name"; - chart.chartType = XuniChartTypeLine; - XuniSeries *sales = [[XuniSeries alloc] initForChart:chart binding:@"sales, sales" name:@"Sales"]; - [chart.series addObject:sales]; - chart.itemsSource = chartData; - [self addAnnotations:chart]; + self.chart.bindingX = @"name"; + self.chart.chartType = XuniChartTypeLine; + XuniSeries *sales = [[XuniSeries alloc] initForChart:self.chart binding:@"sales, sales" name:@"Sales"]; + [self.chart.series addObject:sales]; + self.chart.itemsSource = chartData; + [self addAnnotations:self.chart]; - chart.tag = 1; - [self.view addSubview:chart]; } - (void)addAnnotations:(FlexChart *)chart { @@ -127,26 +123,6 @@ - (void)addAnnotations:(FlexChart *)chart { } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - chart.frame = CGRectMake(0, 55, self.view.bounds.size.width, self.view.bounds.size.height - 55); - [chart setNeedsDisplay]; -} - -/* -#pragma mark - Navigation -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/ChartData.h b/ObjectiveC/FlexChart101/FlexChart101/ChartData.h index b02f7ea..eef855b 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/ChartData.h +++ b/ObjectiveC/FlexChart101/FlexChart101/ChartData.h @@ -31,4 +31,6 @@ + (NSMutableArray *)generateRandomPoints:(NSInteger)count; ++ (NSMutableArray *)generateRandomData:(NSInteger)count; + @end \ No newline at end of file diff --git a/ObjectiveC/FlexChart101/FlexChart101/ChartData.m b/ObjectiveC/FlexChart101/FlexChart101/ChartData.m index 4b26e47..0a85406 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/ChartData.m +++ b/ObjectiveC/FlexChart101/FlexChart101/ChartData.m @@ -18,7 +18,7 @@ - (id)initWithName:(NSString *)name sales:(NSNumber *)sales expenses:(NSNumber * _downloads = downloads; } return self; -} +} + (NSNumber *)generateRandom:(NSInteger) max { return [NSNumber numberWithUnsignedInteger:(arc4random() % max)]; } @@ -92,4 +92,16 @@ + (NSMutableArray *)generateRandomPoints:(NSInteger)count { return points; } ++ (NSMutableArray *)generateRandomData:(NSInteger)count { + NSMutableArray *points = [[NSMutableArray alloc] init]; + + for (int i = 0; i < count ; i++) { + double random = arc4random()%10000 + 100; + [points addObject:[[ChartPoint alloc] initWithX:[NSNumber numberWithInt:i*10] + y:[NSNumber numberWithDouble:random]]]; + } + + return points; +} + @end \ No newline at end of file diff --git a/ObjectiveC/FlexChart101/FlexChart101/ConditionalFormattingController.m b/ObjectiveC/FlexChart101/FlexChart101/ConditionalFormattingController.m index 7ec1854..7110e4b 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/ConditionalFormattingController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/ConditionalFormattingController.m @@ -7,9 +7,10 @@ #import "ConditionalFormattingController.h" #import "ChartData.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; @interface ConditionalFormattingController () +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @@ -17,24 +18,20 @@ @implementation ConditionalFormattingController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Conditional Formatting", nil)]; - // Do any additional setup after loading the view. - FlexChart *chart = [[FlexChart alloc] init]; - XuniSeries *sine = [[XuniSeries alloc] initForChart:chart binding:@"y" name:@"sine"]; + XuniSeries *sine = [[XuniSeries alloc] initForChart:self.chart binding:@"y" name:@"sine"]; sine.bindingX = @"x"; - [chart.series addObject:sine]; + [self.chart.series addObject:sine]; - chart.chartType = XuniChartTypeLineSymbols; - chart.bindingX = @"x"; - chart.itemsSource = [self getData]; - chart.loadAnimation.animationMode = XuniAnimationModePoint; - chart.axisY.format = @"F1"; - chart.axisX.format = @"F1"; + self.chart.chartType = XuniChartTypeLineSymbols; + self.chart.bindingX = @"x"; + self.chart.itemsSource = [self getData]; + self.chart.loadAnimation.animationMode = XuniAnimationModePoint; + self.chart.axisY.format = @"F1"; + self.chart.axisX.format = @"F1"; - IXuniEventHandler plotElementLoadingHandler = ^(NSObject *sender, XuniEventArgs *args) - { - XuniChartPlotElementEventArgs *plotArgs = (XuniChartPlotElementEventArgs*)args; + [self.chart.plotElementLoading addHandler: ^(XuniEventContainer *eventContainer) { + XuniChartPlotElementEventArgs *plotArgs = eventContainer.eventArgs; if (plotArgs.dataPoint != nil && plotArgs.defaultRender != nil) { double y = plotArgs.dataPoint.value; @@ -47,11 +44,8 @@ - (void)viewDidLoad { [plotArgs.renderEngine setFill:[UIColor colorWithRed:r green:g blue:b alpha:a]]; [plotArgs.defaultRender execute:nil]; } - }; - [chart.plotElementLoading addHandler:plotElementLoadingHandler forObject:self]; + } forObject:self]; - chart.tag = 1; - [self.view addSubview:chart]; } - (NSMutableArray*)getData { @@ -64,26 +58,4 @@ - (NSMutableArray*)getData { return array; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -- (void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - chart.frame = CGRectMake(0, 65, self.view.bounds.size.width, self.view.bounds.size.height - 65); - [chart setNeedsDisplay]; -} - -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ - @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/CustomPlotElementsController.m b/ObjectiveC/FlexChart101/FlexChart101/CustomPlotElementsController.m index 896f945..57cef56 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/CustomPlotElementsController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/CustomPlotElementsController.m @@ -7,10 +7,10 @@ #import "CustomPlotElementsController.h" #import "ChartData.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; -@interface CustomPlotElementsController () { -} +@interface CustomPlotElementsController () +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @@ -18,10 +18,8 @@ @implementation CustomPlotElementsController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Custom Plot Elements", nil)]; - // Do any additional setup after loading the view. - FlexChart *chart = [[FlexChart alloc] init]; + FlexChart *chart = self.chart; XuniSeries *devicesSold = [[XuniSeries alloc] initForChart:chart binding:@"devicesSold" name:@"Devices sold"]; [chart.series addObject:devicesSold]; @@ -36,9 +34,8 @@ - (void)viewDidLoad { chart.axisX.majorTickWidth = 0; chart.axisX.minorTickWidth = 1; - IXuniEventHandler plotElementLoadingHandler = ^(NSObject *sender, XuniEventArgs *args) - { - XuniChartPlotElementEventArgs *plotArgs = (XuniChartPlotElementEventArgs*)args; + [chart.plotElementLoading addHandler: ^(XuniEventContainer *eventContainer) { + XuniChartPlotElementEventArgs *plotArgs = eventContainer.eventArgs; if (plotArgs.renderEngine != nil && plotArgs.hitTestInfo != nil && plotArgs.defaultRender != nil) { [plotArgs.renderEngine setFill:[UIColor grayColor]]; [plotArgs.defaultRender execute:nil]; @@ -51,34 +48,9 @@ - (void)viewDidLoad { [customPoint.logo drawInRect:rect]; } } - }; - [chart.plotElementLoading addHandler:plotElementLoadingHandler forObject:self]; - - chart.tag = 1; - [self.view addSubview:chart]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. + } forObject:self]; } --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - chart.frame = CGRectMake(0, 65, self.view.bounds.size.width, self.view.bounds.size.height - 65); - [chart setNeedsDisplay]; -} - -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/CustomTooltipsController.h b/ObjectiveC/FlexChart101/FlexChart101/CustomTooltipsController.h index 5ec06cb..e4cbe94 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/CustomTooltipsController.h +++ b/ObjectiveC/FlexChart101/FlexChart101/CustomTooltipsController.h @@ -6,7 +6,7 @@ // #import -#import +@import XuniChartCoreDynamicKit; @interface CustomTooltipsController : UIViewController diff --git a/ObjectiveC/FlexChart101/FlexChart101/CustomTooltipsController.m b/ObjectiveC/FlexChart101/FlexChart101/CustomTooltipsController.m index d506aaa..a98f38c 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/CustomTooltipsController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/CustomTooltipsController.m @@ -6,69 +6,44 @@ // #import "CustomTooltipsController.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" -#import "XuniChartCoreKit/XuniChartCoreKit.h" +@import XuniFlexChartDynamicKit; +@import XuniChartCoreDynamicKit; #import "ChartData.h" @interface CustomTooltipsController (){ MyTooltip *t; } +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @implementation CustomTooltipsController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Custom Tooltips", nil)]; - // Do any additional setup after loading the view. - FlexChart *chart = [[FlexChart alloc] init]; NSMutableArray *chartData = [ChartData demoData]; - chart.bindingX = @"name"; - XuniSeries *sales = [[XuniSeries alloc] initForChart:chart binding:@"sales, sales" name:@"Sales"]; - XuniSeries *expenses = [[XuniSeries alloc] initForChart:chart binding:@"expenses, expenses" name:@"Expenses"]; - XuniSeries *downloads = [[XuniSeries alloc] initForChart:chart binding:@"downloads, downloads" name:@"Downloads"]; + self.chart.bindingX = @"name"; + XuniSeries *sales = [[XuniSeries alloc] initForChart:self.chart binding:@"sales, sales" name:@"Sales"]; + XuniSeries *expenses = [[XuniSeries alloc] initForChart:self.chart binding:@"expenses, expenses" name:@"Expenses"]; + XuniSeries *downloads = [[XuniSeries alloc] initForChart:self.chart binding:@"downloads, downloads" name:@"Downloads"]; - [chart.series addObject:sales]; - [chart.series addObject:expenses]; - [chart.series addObject:downloads]; + [self.chart.series addObject:sales]; + [self.chart.series addObject:expenses]; + [self.chart.series addObject:downloads]; - chart.itemsSource = chartData; - chart.stacking = XuniStackingStacked; - chart.palette = [XuniPalettes zen]; - chart.loadAnimation.animationMode = XuniAnimationModeSeries; - chart.axisY.axisLineVisible = NO; - chart.axisY.majorUnit = 2000; + self.chart.itemsSource = chartData; + self.chart.stacking = XuniStackingStacked; + self.chart.palette = [XuniPalettes zen]; + self.chart.loadAnimation.animationMode = XuniAnimationModeSeries; + self.chart.axisY.axisLineVisible = NO; + self.chart.axisY.majorUnit = 2000; t = [[MyTooltip alloc] init]; t.backgroundColor = [UIColor colorWithRed:1 green:1 blue:0.792 alpha:1]; - chart.tooltip.content = t; + self.chart.tooltip.content = t; - chart.tag = 1; - [self.view addSubview:chart]; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - chart.frame = CGRectMake(0, 55, self.view.bounds.size.width, self.view.bounds.size.height - 55); - [chart setNeedsDisplay]; -} -/* - #pragma mark - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. - } - */ - @end @interface MyTooltip (){ diff --git a/ObjectiveC/FlexChart101/FlexChart101/CustomizingAxesController.m b/ObjectiveC/FlexChart101/FlexChart101/CustomizingAxesController.m index b7cb543..bdd37ed 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/CustomizingAxesController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/CustomizingAxesController.m @@ -6,10 +6,11 @@ // #import "CustomizingAxesController.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; #import "ChartData.h" @interface CustomizingAxesController () +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @@ -17,49 +18,45 @@ @implementation CustomizingAxesController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Customizing Axes", nil)]; - // Do any additional setup after loading the view. NSNumber *max = [[NSNumber alloc] initWithInt:10000]; - FlexChart *chart = [[FlexChart alloc] init]; NSMutableArray *chartData = [ChartData demoData]; - chart.bindingX = @"name"; - XuniSeries *sales = [[XuniSeries alloc] initForChart:chart binding:@"sales, sales" name:@"Sales"]; - XuniSeries *expenses = [[XuniSeries alloc] initForChart:chart binding:@"expenses, expenses" name:@"Expenses"]; + self.chart.bindingX = @"name"; + XuniSeries *sales = [[XuniSeries alloc] initForChart: self.chart binding:@"sales, sales" name:@"Sales"]; + XuniSeries *expenses = [[XuniSeries alloc] initForChart: self.chart binding:@"expenses, expenses" name:@"Expenses"]; - [chart.series addObject:sales]; - [chart.series addObject:expenses]; + [self.chart.series addObject:sales]; + [self.chart.series addObject:expenses]; - chart.itemsSource = chartData; - chart.axisX.title = @"Country"; - chart.axisX.lineWidth = 2; - chart.axisX.minorTickWidth = 1; - chart.axisX.majorTickWidth = 0; - chart.axisY.lineWidth = 2; - chart.axisY.minorGridVisible = YES; - chart.axisY.minorGridWidth = 0.5; - chart.axisY.minorGridDashes = [[NSArray alloc] initWithObjects:@4, @4, nil]; - chart.axisY.minorTickWidth = 1; - chart.axisY.majorTickWidth = 2; - chart.axisY.majorGridWidth = 1; - chart.axisY.majorGridColor = [UIColor colorWithWhite:0.8 alpha:1]; - chart.axisY.majorGridFill = [UIColor colorWithWhite:0.6 alpha:0.2]; - chart.axisY.majorUnit = 1000; - chart.axisY.max = max; + self.chart.itemsSource = chartData; + self.chart.axisX.title = @"Country"; + self.chart.axisX.lineWidth = 2; + self.chart.axisX.minorTickWidth = 1; + self.chart.axisX.majorTickWidth = 0; + self.chart.axisY.lineWidth = 2; + self.chart.axisY.minorGridVisible = YES; + self.chart.axisY.minorGridWidth = 0.5; + self.chart.axisY.minorGridDashes = [[NSArray alloc] initWithObjects:@4, @4, nil]; + self.chart.axisY.minorTickWidth = 1; + self.chart.axisY.majorTickWidth = 2; + self.chart.axisY.majorGridWidth = 1; + self.chart.axisY.majorGridColor = [UIColor colorWithWhite:0.8 alpha:1]; + self.chart.axisY.majorGridFill = [UIColor colorWithWhite:0.6 alpha:0.2]; + self.chart.axisY.majorUnit = 1000; + self.chart.axisY.max = max; - IXuniEventHandler axisXLabelLoadingHandler = ^(NSObject *sender, XuniEventArgs *args) { - XuniLabelLoadingEventArgs *labelArgs = (XuniLabelLoadingEventArgs*)args; + [self.chart.axisX.labelLoading addHandler: ^(XuniEventContainer *eventContainer) { + XuniLabelLoadingEventArgs *labelArgs = eventContainer.eventArgs; labelArgs.label = nil; NSNumber *countryNum = [NSNumber numberWithDouble:labelArgs.value]; UIImage *image = [UIImage imageNamed:[countryNum stringValue]]; CGRect rect = CGRectMake(labelArgs.region.left, labelArgs.region.top, labelArgs.region.width, labelArgs.region.height); [image drawInRect:rect]; - }; - [chart.axisX.labelLoading addHandler:axisXLabelLoadingHandler forObject:self]; + } forObject:self]; - IXuniEventHandler axisYLabelLoadingHandler = ^(NSObject *sender, XuniEventArgs *args) { - XuniLabelLoadingEventArgs *labelArgs = (XuniLabelLoadingEventArgs*)args; + [self.chart.axisY.labelLoading addHandler: ^(XuniEventContainer *eventContainer) { + XuniLabelLoadingEventArgs *labelArgs = eventContainer.eventArgs; if (labelArgs.value <= 3000) { [labelArgs.renderEngine setTextFill:[UIColor redColor]]; } @@ -70,34 +67,8 @@ - (void)viewDidLoad { [labelArgs.renderEngine setTextFill:[UIColor blackColor]]; } labelArgs.label = [NSString stringWithFormat:@"$%dK", (int)(labelArgs.value / 1000)]; - - }; - [chart.axisY.labelLoading addHandler:axisYLabelLoadingHandler forObject:self]; - - chart.tag = 1; - [self.view addSubview:chart]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. + } forObject:self]; } --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - chart.frame = CGRectMake(0, 55, self.view.bounds.size.width, self.view.bounds.size.height - 55); - [chart setNeedsDisplay]; -} - -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/DataLabelController.h b/ObjectiveC/FlexChart101/FlexChart101/DataLabelController.h index 19f0052..2c2abfa 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/DataLabelController.h +++ b/ObjectiveC/FlexChart101/FlexChart101/DataLabelController.h @@ -7,6 +7,6 @@ #import -@interface DataLabelController : UIViewController +@interface DataLabelController : UIViewController @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/DataLabelController.m b/ObjectiveC/FlexChart101/FlexChart101/DataLabelController.m index d2599d4..50f452a 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/DataLabelController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/DataLabelController.m @@ -7,139 +7,70 @@ #import "DataLabelController.h" #import "ChartData.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; -@interface DataLabelController (){ - NSMutableArray *positionPickerData; -} +@interface DataLabelController () +@property (weak, nonatomic) IBOutlet UISegmentedControl *modeSelector; +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @implementation DataLabelController +- (IBAction)modeChanged:(id)sender { + int row = self.modeSelector.selectedSegmentIndex; + if (row == 0) { + self.chart.dataLabel.position = FlexChartDataLabelPositionNone; + } + else if (row == 1){ + self.chart.dataLabel.position = FlexChartDataLabelPositionLeft; + } + else if (row == 2){ + self.chart.dataLabel.position = FlexChartDataLabelPositionTop; + } + else if (row == 3){ + self.chart.dataLabel.position = FlexChartDataLabelPositionRight; + } + else if (row == 4){ + self.chart.dataLabel.position = FlexChartDataLabelPositionBottom; + } + else if (row == 5){ + self.chart.dataLabel.position = FlexChartDataLabelPositionCenter; + } +} + - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Data Labels", nil)]; - - // Do any additional setup after loading the view. - positionPickerData = [[NSMutableArray alloc]initWithObjects:@"None", @"Left", @"Top", @"Right", @"Bottom", @"Center", nil]; - UIPickerView *positionPicker = [[UIPickerView alloc] init]; - positionPicker.delegate = self; - positionPicker.showsSelectionIndicator = YES; - positionPicker.hidden = NO; - FlexChart *chart = [[FlexChart alloc] init]; NSMutableArray *chartData = [ChartData demoData]; - chart.bindingX = @"name"; - XuniSeries *expenses = [[XuniSeries alloc] initForChart:chart binding:@"expenses" name:@"Total Expenses"]; - [chart.series addObject:expenses]; - - chart.itemsSource = chartData; - chart.chartType = XuniChartTypeBar; - chart.isAnimated = NO; - chart.tooltip.isVisible = NO; - chart.axisX.majorGridVisible = YES; - chart.axisY.labelsVisible = NO; - chart.axisY.majorGridVisible = NO; - chart.axisY.minorGridVisible = NO; - chart.axisY.majorTickWidth = 0; - chart.palette = [XuniPalettes organic]; - - chart.dataLabel.content= @"{x} {y}"; - chart.dataLabel.dataLabelFormat = @"F2"; - chart.dataLabel.position = FlexChartDataLabelPositionLeft; - chart.dataLabel.dataLabelFontColor = [UIColor redColor]; - chart.dataLabel.dataLabelBackgroundColor = [UIColor whiteColor]; - chart.dataLabel.dataLabelBorderColor = [UIColor blueColor]; - chart.dataLabel.dataLabelBorderWidth = 1; - chart.dataLabel.dataLabelFont = [UIFont systemFontOfSize:15]; - - chart.tag = 1; - positionPicker.tag = 2; - - [self.view addSubview:positionPicker]; - [self.view addSubview:chart]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; + self.chart.bindingX = @"name"; + XuniSeries *expenses = [[XuniSeries alloc] initForChart:self.chart binding:@"expenses" name:@"Total Expenses"]; + [self.chart.series addObject:expenses]; - UIPickerView *positionPicker = (UIPickerView*)[self.view viewWithTag:2]; - [positionPicker selectRow:1 inComponent:0 animated:NO]; -} - --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - UIPickerView *positionPicker = (UIPickerView*)[self.view viewWithTag:2]; - positionPicker.frame = CGRectMake(0, 44, self.view.bounds.size.width, 162); - chart.frame = CGRectMake(0, 206, self.view.bounds.size.width, self.view.bounds.size.height - 206); - [chart setNeedsDisplay]; -} - -- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ - return 1; -} - -- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ + self.chart.itemsSource = chartData; + self.chart.chartType = XuniChartTypeBar; + self.chart.isAnimated = NO; + self.chart.tooltip.isVisible = NO; + self.chart.axisX.majorGridVisible = YES; + self.chart.axisY.labelsVisible = NO; + self.chart.axisY.majorGridVisible = NO; + self.chart.axisY.minorGridVisible = NO; + self.chart.axisY.majorTickWidth = 0; + self.chart.palette = [XuniPalettes organic]; - if(pickerView.tag == 2){ - return [positionPickerData count]; - } + self.chart.dataLabel.content= @"{x} {y}"; + self.chart.dataLabel.dataLabelFormat = @"F2"; + self.chart.dataLabel.position = FlexChartDataLabelPositionLeft; + self.chart.dataLabel.dataLabelFontColor = [UIColor redColor]; + self.chart.dataLabel.dataLabelBackgroundColor = [UIColor whiteColor]; + self.chart.dataLabel.dataLabelBorderColor = [UIColor blueColor]; + self.chart.dataLabel.dataLabelBorderWidth = 1; + self.chart.dataLabel.dataLabelFont = [UIFont systemFontOfSize:15]; - return 0; -} - -- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ - FlexChart *chart = (FlexChart *)[self.view viewWithTag:1]; - if(pickerView.tag == 2) - { - if (row == 0) { - chart.dataLabel.position = FlexChartDataLabelPositionNone; - } - else if (row == 1){ - chart.dataLabel.position = FlexChartDataLabelPositionLeft; - } - else if (row == 2){ - chart.dataLabel.position = FlexChartDataLabelPositionTop; - } - else if (row == 3){ - chart.dataLabel.position = FlexChartDataLabelPositionRight; - } - else if (row == 4){ - chart.dataLabel.position = FlexChartDataLabelPositionBottom; - } - else if (row == 5){ - chart.dataLabel.position = FlexChartDataLabelPositionCenter; - } - } -} - -- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ - if(pickerView.tag == 2) - { - return [positionPickerData objectAtIndex:row]; - } - else{ - return @"error"; - } + _modeSelector.selectedSegmentIndex = 1; } -/* - #pragma mark - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. - } - */ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/DynamicChartsController.m b/ObjectiveC/FlexChart101/FlexChart101/DynamicChartsController.m index 59c100f..58ed4b5 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/DynamicChartsController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/DynamicChartsController.m @@ -7,12 +7,13 @@ #import "DynamicChartsController.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; #import "DynamicChartData.h" @interface DynamicChartsController (){ NSMutableArray *chartData; } +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @@ -20,10 +21,8 @@ @implementation DynamicChartsController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Dynamic Charts", nil)]; - // Do any additional setup after loading the view. - FlexChart *chart = [[FlexChart alloc] init]; + FlexChart *chart = self.chart; chartData = [DynamicChartData demoData]; chart.bindingX = @"time"; XuniSeries *trucks = [[XuniSeries alloc] initForChart:chart binding:@"trucks, trucks" name:@"Trucks"]; @@ -39,6 +38,8 @@ - (void)viewDidLoad { chart.palette = [XuniPalettes coral]; chart.tooltip.isVisible = false; + chart.loadAnimation.animationMode = XuniAnimationModePoint; + NSDate *d = [NSDate dateWithTimeIntervalSinceNow: chart.loadAnimation.duration + 0.1]; NSTimer *timer = [[NSTimer alloc] initWithFireDate:d interval:1 @@ -49,35 +50,12 @@ - (void)viewDidLoad { NSRunLoop *runner = [NSRunLoop currentRunLoop]; [runner addTimer:timer forMode: NSDefaultRunLoopMode]; - chart.tag = 1; - [self.view addSubview:chart]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - chart.frame = CGRectMake(0, 55, self.view.bounds.size.width, self.view.bounds.size.height - 55); - [chart setNeedsDisplay]; } -(void)onTick{ - FlexChart *chart = (FlexChart *)[self.view viewWithTag:1]; + FlexChart *chart = self.chart; chart.isAnimated = NO; chart.itemsSource = [DynamicChartData dynamicData:chartData]; } -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/FinancialChartController.h b/ObjectiveC/FlexChart101/FlexChart101/FinancialChartController.h index a2700fb..c111774 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/FinancialChartController.h +++ b/ObjectiveC/FlexChart101/FlexChart101/FinancialChartController.h @@ -7,6 +7,6 @@ #import -@interface FinancialChartController : UIViewController +@interface FinancialChartController : UIViewController @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/FinancialChartController.m b/ObjectiveC/FlexChart101/FlexChart101/FinancialChartController.m index 3163f7c..32055ea 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/FinancialChartController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/FinancialChartController.m @@ -6,96 +6,46 @@ // #import "FinancialChartController.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; #import "FinancialData.h" -@interface FinancialChartController (){ - NSMutableArray *pickerData; -} +@interface FinancialChartController () +@property (weak, nonatomic) IBOutlet UISegmentedControl *switcher; +@property (weak, nonatomic) IBOutlet FlexChart *chart; + @end @implementation FinancialChartController - -- (void)viewDidLoad { - [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Financial Chart", nil)]; - - // Do any additional setup after loading the view. - UIPickerView *pickerView; - pickerData =[[NSMutableArray alloc] initWithObjects:@"Candlestick", @"HLOC", nil]; - - pickerView = [[UIPickerView alloc] init]; - pickerView.delegate = self; - pickerView.showsSelectionIndicator = YES; - pickerView.hidden = false; - FlexChart *chart = [[FlexChart alloc] init]; - NSMutableArray *financialData = [FinancialData demoData]; - chart.bindingX = @"date"; - XuniSeries *finance = [[XuniSeries alloc] initForChart:chart binding: @"high,low,open,close" name: @"AAPL"]; - - [chart.series addObject:finance]; - chart.itemsSource = financialData; - chart.chartType = XuniChartTypeCandlestick; - chart.selectionMode = XuniSelectionModePoint; - chart.axisY.majorGridFill = [UIColor colorWithWhite:0.6 alpha:0.2]; - chart.legend.position = XuniChartLegendPositionNone; - - chart.tag = 1; - pickerView.tag = 2; - - [self.view addSubview:chart]; - [self.view addSubview:pickerView]; - -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - UIPickerView *pickerView = (UIPickerView*)[self.view viewWithTag:2]; - pickerView.frame = CGRectMake(self.view.bounds.size.width/4, 44, self.view.bounds.size.width/2, 162); - chart.frame = CGRectMake(0, 206, self.view.bounds.size.width, self.view.bounds.size.height - 206); - [chart setNeedsDisplay]; -} - -- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ - return 1; -} - -- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ - return [pickerData count]; -} - -- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - - switch (row) { +- (IBAction)modeSwitched:(id)sender { + switch (self.switcher.selectedSegmentIndex) { case 0: - chart.chartType = XuniChartTypeCandlestick; + self.chart.chartType = XuniChartTypeCandlestick; break; case 1: - chart.chartType = XuniChartTypeHighLowOpenClose; + self.chart.chartType = XuniChartTypeHighLowOpenClose; break; default: break; } -} -- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ - return [pickerData objectAtIndex:row]; } -/* -#pragma mark - Navigation -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. +- (void)viewDidLoad { + [super viewDidLoad]; + + NSMutableArray *financialData = [FinancialData demoData]; + self.chart.bindingX = @"date"; + XuniSeries *finance = [[XuniSeries alloc] initForChart:self.chart binding: @"high,low,open,close" name: @"AAPL"]; + + [self.chart.series addObject:finance]; + self.chart.itemsSource = financialData; + self.chart.chartType = XuniChartTypeCandlestick; + self.chart.selectionMode = XuniSelectionModePoint; + self.chart.axisY.majorGridFill = [UIColor colorWithWhite:0.6 alpha:0.2]; + self.chart.legend.position = XuniChartLegendPositionNone; + } -*/ + + @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/GettingStartedController.m b/ObjectiveC/FlexChart101/FlexChart101/GettingStartedController.m index cbe18c8..b1cfe73 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/GettingStartedController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/GettingStartedController.m @@ -8,9 +8,10 @@ #import "GettingStartedController.h" #import "ChartData.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; @interface GettingStartedController () +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @@ -18,45 +19,18 @@ @implementation GettingStartedController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Getting Started", nil)]; - // Do any additional setup after loading the view. - FlexChart *chart = [[FlexChart alloc] init]; NSMutableArray *chartData = [ChartData demoData]; - chart.bindingX = @"name"; - XuniSeries *sales = [[XuniSeries alloc] initForChart:chart binding:@"sales, sales" name:@"Sales"]; - XuniSeries *expenses = [[XuniSeries alloc] initForChart:chart binding:@"expenses, expenses" name:@"Expenses"]; - XuniSeries *downloads = [[XuniSeries alloc] initForChart:chart binding:@"downloads, downloads" name:@"Downloads"]; - - [chart.series addObject:sales]; - [chart.series addObject:expenses]; - [chart.series addObject:downloads]; - chart.itemsSource = chartData; - - chart.tag = 1; - [self.view addSubview:chart]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. + self.chart.bindingX = @"name"; + XuniSeries *sales = [[XuniSeries alloc] initForChart:self.chart binding:@"sales, sales" name:@"Sales"]; + XuniSeries *expenses = [[XuniSeries alloc] initForChart:self.chart binding:@"expenses, expenses" name:@"Expenses"]; + XuniSeries *downloads = [[XuniSeries alloc] initForChart:self.chart binding:@"downloads, downloads" name:@"Downloads"]; + + [self.chart.series addObject:sales]; + [self.chart.series addObject:expenses]; + [self.chart.series addObject:downloads]; + self.chart.itemsSource = chartData; } --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - chart.frame = CGRectMake(0, 55, self.view.bounds.size.width, self.view.bounds.size.height - 55); - [chart setNeedsDisplay]; -} - -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/HitTestController.h b/ObjectiveC/FlexChart101/FlexChart101/HitTestController.h index b891291..d7691f5 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/HitTestController.h +++ b/ObjectiveC/FlexChart101/FlexChart101/HitTestController.h @@ -6,7 +6,7 @@ // #import -#import +@import XuniFlexChartDynamicKit; @interface HitTestController : UIViewController diff --git a/ObjectiveC/FlexChart101/FlexChart101/HitTestController.m b/ObjectiveC/FlexChart101/FlexChart101/HitTestController.m index 6998ed1..c59b631 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/HitTestController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/HitTestController.m @@ -7,9 +7,14 @@ #import "HitTestController.h" #import "HitTestData.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; @interface HitTestController () +@property (weak, nonatomic) IBOutlet FlexChart *chart; +@property (weak, nonatomic) IBOutlet UILabel *chartElementLabel; +@property (weak, nonatomic) IBOutlet UILabel *seriesLabel; +@property (weak, nonatomic) IBOutlet UILabel *pointIndexLabel; +@property (weak, nonatomic) IBOutlet UILabel *xyValuesLabel; @end @@ -17,20 +22,9 @@ @implementation HitTestController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Hit Test", nil)]; - // Do any additional setup after loading the view. - UILabel *chartElementlabel = [[UILabel alloc] init]; - chartElementlabel.text = @" Chart element"; - UILabel *seriesLabel = [[UILabel alloc] init]; - seriesLabel.text = @" Series"; - UILabel *pointIndexlabel = [[UILabel alloc] init]; - pointIndexlabel.text = @" Point Index"; - UILabel *xyLabel = [[UILabel alloc] init]; - xyLabel.text = @" X Y Values"; - - FlexChart *chart = [[FlexChart alloc] init]; + FlexChart *chart = self.chart; chart.bindingX = @"x"; XuniSeries *seriesCosX = [[XuniSeries alloc] initForChart:chart binding:@"y, y" name:@"cos(x)"]; XuniSeries *seriesSinX = [[XuniSeries alloc] initForChart:chart binding:@"y, y" name:@"sin(x)"]; @@ -45,48 +39,18 @@ - (void)viewDidLoad { chart.axisY.format = @"F"; chart.header = @"Trigonometric Functions"; chart.footer = @"Cartesian coordinates"; - - chart.tag = 1; - seriesLabel.tag = 2; - pointIndexlabel.tag = 3; - xyLabel.tag = 4; - chartElementlabel.tag = 5; - - [self.view addSubview:chartElementlabel]; - [self.view addSubview:chart]; - [self.view addSubview:pointIndexlabel]; - [self.view addSubview:seriesLabel]; - [self.view addSubview:xyLabel]; -} -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. } --(void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - UILabel *seriesLabel = (UILabel *)[self.view viewWithTag:2]; - UILabel *pointIndexLabel = (UILabel *)[self.view viewWithTag:3]; - UILabel *xyLabel = (UILabel *)[self.view viewWithTag:4]; - UILabel *chartElementLabel = (UILabel *)[self.view viewWithTag:5]; - chart.frame = CGRectMake(0, self.view.bounds.size.height/8, self.view.bounds.size.width, self.view.bounds.size.height*5/8); - seriesLabel.frame = CGRectMake(0, self.view.bounds.size.height*13/16, self.view.bounds.size.width, self.view.bounds.size.height/16); - pointIndexLabel.frame = CGRectMake(0, self.view.bounds.size.height *14/16, self.view.bounds.size.width, self.view.bounds.size.height/16); - xyLabel.frame = CGRectMake(0, self.view.bounds.size.height *15/16, self.view.bounds.size.width, self.view.bounds.size.height/16); - chartElementLabel.frame = CGRectMake(0, self.view.bounds.size.height*6/8, self.view.bounds.size.width, self.view.bounds.size.height/16); - [chart setNeedsDisplay]; -} -(BOOL)tapped:(FlexChartBase *)sender point:(XuniPoint *)point { - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - UILabel *s = (UILabel *)[self.view viewWithTag:2]; - UILabel *pi = (UILabel *)[self.view viewWithTag:3]; - UILabel *xy = (UILabel *)[self.view viewWithTag:4]; - UILabel *ce = (UILabel *)[self.view viewWithTag:5]; + FlexChart *chart = self.chart; + UILabel *s = self.seriesLabel; + UILabel *pi = self.pointIndexLabel; + UILabel *xy = self.xyValuesLabel; + UILabel *ce = self.chartElementLabel; XuniChartHitTestInfo *hitTest = [chart hitTest:point]; pi.text = [@" Point Index: " stringByAppendingString: [NSString stringWithFormat:@"%i", hitTest.dataPoint.pointIndex]]; xy.text = [[NSString stringWithFormat:@" X:%@", hitTest.dataPoint.valueX] stringByAppendingString: [NSString stringWithFormat:@" Y:%1.2f", hitTest.dataPoint.value]]; @@ -135,13 +99,4 @@ -(NSString *)getChartTypeString: (XuniChartElement) chartElement { } - -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} - @end \ No newline at end of file diff --git a/ObjectiveC/FlexChart101/FlexChart101/Images.xcassets/chartscaling.imageset/Contents.json b/ObjectiveC/FlexChart101/FlexChart101/Images.xcassets/chartscaling.imageset/Contents.json new file mode 100644 index 0000000..05e7047 --- /dev/null +++ b/ObjectiveC/FlexChart101/FlexChart101/Images.xcassets/chartscaling.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "chart_line.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ObjectiveC/FlexChart101/FlexChart101/Images.xcassets/chartscaling.imageset/chart_line.png b/ObjectiveC/FlexChart101/FlexChart101/Images.xcassets/chartscaling.imageset/chart_line.png new file mode 100644 index 0000000000000000000000000000000000000000..8a848e74e8b1e79d0114bddae06374899c265972 GIT binary patch literal 6342 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 -#import +@import XuniFlexChartDynamicKit; -@interface LineMarkerController : UIViewController +@interface LineMarkerController : UIViewController @end @interface MyMarkerView : XuniChartMarkerBaseView diff --git a/ObjectiveC/FlexChart101/FlexChart101/LineMarkerController.m b/ObjectiveC/FlexChart101/FlexChart101/LineMarkerController.m index 4a00de0..29e5825 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/LineMarkerController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/LineMarkerController.m @@ -7,127 +7,87 @@ #import "LineMarkerController.h" #import "ChartData.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; -@interface LineMarkerController (){ - NSMutableArray *interactionPickerData; - NSMutableArray *verticalPositionPickerData; -} +@interface LineMarkerController () +@property (weak, nonatomic) IBOutlet FlexChart *chart; +@property (weak, nonatomic) IBOutlet UISlider *positionSelect; +@property (weak, nonatomic) IBOutlet UISegmentedControl *modeSelect; @end @implementation LineMarkerController +- (IBAction)modeSelected:(id)sender { + int row = _modeSelect.selectedSegmentIndex; + if (row == 0) { + self.chart.lineMarker.interaction = XuniChartMarkerInteractionNone; + } + else if (row == 1){ + self.chart.lineMarker.interaction = XuniChartMarkerInteractionMove; + } + else if (row == 2){ + self.chart.lineMarker.interaction = XuniChartMarkerInteractionDrag; + } +} + +- (IBAction)positionChanged:(id)sender { + double pos = self.positionSelect.value; + if(pos == 0) pos = NAN; + self.chart.lineMarker.verticalPosition = pos; +} - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Line Marker", nil)]; - - // Do any additional setup after loading the view. - interactionPickerData = [[NSMutableArray alloc] initWithObjects: @"None", @"Move", @"Drag", nil]; - verticalPositionPickerData = [[NSMutableArray alloc] initWithObjects: @"NaN", @"0", @"0.25", @"0.5", @"0.75", @"1", nil]; - - UIPickerView *interactionPicker = [[UIPickerView alloc] init]; - interactionPicker.delegate = self; - - UIPickerView *verticalPositionPicker = [[UIPickerView alloc] init]; - verticalPositionPicker.delegate = self; + [self setTitle:@"Line Marker"]; - FlexChart *chart = [[FlexChart alloc] init]; NSMutableArray *chartData = [ChartData demoData]; - chart.bindingX = @"name"; + self.chart.bindingX = @"name"; - XuniSeries *sales = [[XuniSeries alloc] initForChart:chart binding:@"sales, sales" name:@"Sales"]; - XuniSeries *expenses = [[XuniSeries alloc] initForChart:chart binding:@"expenses, expenses" name:@"Expenses"]; - XuniSeries *downloads = [[XuniSeries alloc] initForChart:chart binding:@"downloads, downloads" name:@"Downloads"]; + XuniSeries *sales = [[XuniSeries alloc] initForChart:self.chart binding:@"sales, sales" name:@"Sales"]; + XuniSeries *expenses = [[XuniSeries alloc] initForChart:self.chart binding:@"expenses, expenses" name:@"Expenses"]; + XuniSeries *downloads = [[XuniSeries alloc] initForChart:self.chart binding:@"downloads, downloads" name:@"Downloads"]; - [chart.series addObject:sales]; - [chart.series addObject:expenses]; - [chart.series addObject:downloads]; + [self.chart.series addObject:sales]; + [self.chart.series addObject:expenses]; + [self.chart.series addObject:downloads]; - chart.itemsSource = chartData; - chart.chartType = XuniChartTypeBar; + self.chart.itemsSource = chartData; + self.chart.chartType = XuniChartTypeLine; // Implement Chart Line Marker. - MyMarkerView *view = [[MyMarkerView alloc] initWithLineMarker:chart.lineMarker]; + MyMarkerView *view = [[MyMarkerView alloc] initWithLineMarker:self.chart.lineMarker]; view.markerRender = [[MyChartMarkerRender alloc] initWithView:view]; - chart.lineMarker.content = view; - chart.lineMarker.isVisible = YES; - chart.lineMarker.alignment = XuniChartMarkerAlignmentBottomRight; - chart.lineMarker.lines = XuniChartMarkerLinesVertical; - chart.lineMarker.interaction= XuniChartMarkerInteractionMove; - chart.lineMarker.dragContent = YES; - chart.lineMarker.seriesIndex = -1; - chart.lineMarker.verticalLineColor = [UIColor grayColor]; - chart.lineMarker.verticalPosition = 0; - [chart addSubview:view]; + self.chart.lineMarker.content = view; + self.chart.lineMarker.isVisible = YES; + self.chart.lineMarker.alignment = XuniChartMarkerAlignmentBottomRight; + self.chart.lineMarker.lines = XuniChartMarkerLinesVertical; + self.chart.lineMarker.interaction= XuniChartMarkerInteractionMove; + self.chart.lineMarker.dragContent = YES; + self.chart.lineMarker.seriesIndex = -1; + self.chart.lineMarker.verticalLineColor = [UIColor grayColor]; + self.chart.lineMarker.verticalPosition = 0; + [self.chart addSubview:view]; - chart.tag = 1; - interactionPicker.tag = 2; - verticalPositionPicker.tag = 3; - - [self.view addSubview:interactionPicker]; - [self.view addSubview:verticalPositionPicker]; - [self.view addSubview:chart]; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - UIPickerView *interactionPicker = (UIPickerView*)[self.view viewWithTag:2]; - [interactionPicker selectRow:1 inComponent:0 animated:NO]; + _modeSelect.selectedSegmentIndex = 1; + _positionSelect.value = 0.001; - UIPickerView *verticalPositionPicker = (UIPickerView*)[self.view viewWithTag:3]; - [verticalPositionPicker selectRow:1 inComponent:0 animated:NO]; + [self modeSelected:nil]; + [self positionChanged:nil]; } -- (void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - UIPickerView *interactionPicker = (UIPickerView*)[self.view viewWithTag:2]; - UIPickerView *verticalPositionPicker = (UIPickerView*)[self.view viewWithTag:3]; - CGFloat halfWidth = self.view.bounds.size.width / 2; - - interactionPicker.frame = CGRectMake(0, 30, halfWidth, 162); - verticalPositionPicker.frame = CGRectMake(halfWidth, 30, halfWidth, 162); - chart.frame = CGRectMake(0, 162, self.view.bounds.size.width, self.view.bounds.size.height - 162); - [chart setNeedsDisplay]; -} -- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ - return 1; -} - -- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { - if(pickerView.tag == 2){ - return [interactionPickerData count]; - } - else if(pickerView.tag == 3){ - return [verticalPositionPickerData count]; - } - else { - return 0; - } -} - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ FlexChart *chart = (FlexChart *)[self.view viewWithTag:1]; if(pickerView.tag == 2){ - if (row == 0) { - chart.lineMarker.interaction = XuniChartMarkerInteractionNone; - } - else if (row == 1){ - chart.lineMarker.interaction = XuniChartMarkerInteractionMove; - } - else if (row == 2){ - chart.lineMarker.interaction = XuniChartMarkerInteractionDrag; - } + } else if(pickerView.tag == 3){ if (row == 0) { @@ -151,27 +111,7 @@ - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComp } } -- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { - if(pickerView.tag == 2){ - return [interactionPickerData objectAtIndex:row]; - } - else if(pickerView.tag == 3){ - return [verticalPositionPickerData objectAtIndex:row]; - } - else{ - return @"error"; - } -} -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/LoadAnimationController.m b/ObjectiveC/FlexChart101/FlexChart101/LoadAnimationController.m index ffc01b4..cd22824 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/LoadAnimationController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/LoadAnimationController.m @@ -6,13 +6,15 @@ // #import "LoadAnimationController.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; #import "ChartData.h" @interface LoadAnimationController () { NSMutableArray *chartTypePickerData; NSMutableArray *selectionModePickerData; } +@property (weak, nonatomic) IBOutlet UIPickerView *picker; +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @@ -20,25 +22,13 @@ @implementation LoadAnimationController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Load Animation Mode", nil)]; - // Do any additional setup after loading the view. chartTypePickerData =[[NSMutableArray alloc] initWithObjects:@"Column", @"Area", @"Line", @"LineSymbols", @"Spline", @"SplineSymbols", @"SplineArea", @"Scatter", nil]; selectionModePickerData = [[NSMutableArray alloc]initWithObjects: @"All", @"Point", @"Series", nil]; - UIPickerView *chartTypePicker = [[UIPickerView alloc] init]; - chartTypePicker.delegate = self; - chartTypePicker.showsSelectionIndicator = YES; - chartTypePicker.hidden = false; - [chartTypePicker selectRow:0 inComponent:0 animated:false]; + self.picker.delegate = self; - UIPickerView *selectionModePicker = [[UIPickerView alloc] init]; - selectionModePicker.delegate = self; - selectionModePicker.showsSelectionIndicator = YES; - selectionModePicker.hidden = false; - [selectionModePicker selectRow:1 inComponent:0 animated:false]; - - FlexChart *chart = [[FlexChart alloc] init]; + FlexChart *chart = self.chart; NSMutableArray *chartData = [ChartData demoData]; XuniSeries *sales = [[XuniSeries alloc] initForChart:chart binding:@"sales, sales" name:@"Sales"]; XuniSeries *expenses = [[XuniSeries alloc] initForChart:chart binding:@"expenses, expenses" name:@"Expenses"]; @@ -53,39 +43,15 @@ - (void)viewDidLoad { chart.loadAnimation.animationMode = XuniAnimationModePoint; chart.palette = [XuniPalettes modern]; - chart.tag = 1; - chartTypePicker.tag = 2; - selectionModePicker.tag = 3; - - [self.view addSubview:chartTypePicker]; - [self.view addSubview:selectionModePicker]; - [self.view addSubview:chart]; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - --(void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - UIPickerView *chartTypePicker = (UIPickerView*)[self.view viewWithTag:2]; - UIPickerView *selectionModePicker = (UIPickerView*)[self.view viewWithTag:3]; - - chartTypePicker.frame = CGRectMake(0, 44, self.view.bounds.size.width / 2, 162); - selectionModePicker.frame = CGRectMake(self.view.bounds.size.width / 2, 44, self.view.bounds.size.width / 2, 162); - chart.frame = CGRectMake(0, 206, self.view.bounds.size.width, self.view.bounds.size.height - 206); - [chart setNeedsDisplay]; -} - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { - return 1; + return 2; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { - - if (pickerView.tag == 2) { + if (component == 0) { return [chartTypePickerData count]; } else { @@ -94,9 +60,9 @@ - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSIn } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { - FlexChart *chart = (FlexChart *)[self.view viewWithTag:1]; + FlexChart *chart = self.chart; - if (pickerView.tag == 2) { + if (component == 0) { if (row == 0) { chart.chartType = XuniChartTypeColumn; } @@ -122,7 +88,7 @@ - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComp chart.chartType = XuniChartTypeScatter; } } - else if (pickerView.tag == 3) { + else { if (row == 0) { chart.loadAnimation.animationMode = XuniAnimationModeAll; @@ -139,24 +105,16 @@ - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComp } - (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ - if (pickerView.tag == 2) { + if (component == 0) { return [chartTypePickerData objectAtIndex:row]; } - else if (pickerView.tag == 3) { + else if (component == 1) { return [selectionModePickerData objectAtIndex:row]; } else { return @"error"; } } -/* -#pragma mark - Navigation -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/MainMenuTableViewController.h b/ObjectiveC/FlexChart101/FlexChart101/MainMenuTableViewController.h new file mode 100644 index 0000000..118cca5 --- /dev/null +++ b/ObjectiveC/FlexChart101/FlexChart101/MainMenuTableViewController.h @@ -0,0 +1,12 @@ +// +// MainMenuTableViewController.h +// FlexChart101 +// +// Copyright © 2016 GrapeCity. All rights reserved. +// + +#import + +@interface MainMenuTableViewController : UITableViewController + +@end diff --git a/ObjectiveC/FlexChart101/FlexChart101/MainMenuTableViewController.m b/ObjectiveC/FlexChart101/FlexChart101/MainMenuTableViewController.m new file mode 100644 index 0000000..56178eb --- /dev/null +++ b/ObjectiveC/FlexChart101/FlexChart101/MainMenuTableViewController.m @@ -0,0 +1,141 @@ +// +// MainMenuTableViewController.m +// FlexChart101 +// +// Copyright © 2016 GrapeCity. All rights reserved. +// + +#import "MainMenuTableViewController.h" + +@interface MainMenuTableViewController () + +@end + +@implementation MainMenuTableViewController +{ + NSArray *_samplesTitle; + NSArray *_samplesDescription; + NSArray *_samplesImage; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + _samplesTitle = @[NSLocalizedString(@"Getting Started", nil), + NSLocalizedString(@"Basic Chart Types", nil), + NSLocalizedString(@"Mixed Chart Types", nil), + NSLocalizedString(@"Financial Chart", nil), + NSLocalizedString(@"Bubble Chart", nil), + NSLocalizedString(@"Custom Tooltips", nil), + NSLocalizedString(@"Data Labels", nil), + NSLocalizedString(@"Annotations", nil), + NSLocalizedString(@"Line Marker", nil), + NSLocalizedString(@"Customizing Axes", nil), + NSLocalizedString(@"Multiple Axes", nil), + NSLocalizedString(@"Legend and Titles", nil), + NSLocalizedString(@"Conditional Formatting", nil), + NSLocalizedString(@"Custom Plot Elements", nil), + NSLocalizedString(@"Selection Modes", nil), + NSLocalizedString(@"Toggle Series", nil), + NSLocalizedString(@"Load Animation Mode", nil), + NSLocalizedString(@"Update Animation", nil), + NSLocalizedString(@"Dynamic Charts", nil), + NSLocalizedString(@"Hit Test", nil), + NSLocalizedString(@"Scrolling", nil), + NSLocalizedString(@"Zooming and Scrolling", nil), + NSLocalizedString(@"Theming", nil), + NSLocalizedString(@"Styling Series", nil), + NSLocalizedString(@"Export Image", nil)]; + + _samplesDescription = @[NSLocalizedString(@"Shows a simple chart with tooltips.", nil), + NSLocalizedString(@"Shows the basic chart types and stacking options.", nil), + NSLocalizedString(@"Shows a composite chart.", nil), + NSLocalizedString(@"Shows stock data in a candle chart.", nil), + NSLocalizedString(@"Shows a bubble chart.", nil), + NSLocalizedString(@"Shows a customized tooltip.", nil), + NSLocalizedString(@"Shows a simple chart with static data labels.", nil), + NSLocalizedString(@"Shows how to display annotations on FlexChart.", nil), + NSLocalizedString(@"Shows a moveable marker on top of the chart.", nil), + NSLocalizedString(@"Shows customized axis style and label format.", nil), + NSLocalizedString(@"Shows a chart with mutiple Y axes.", nil), + NSLocalizedString(@"Shows basic chart headers and axis titles.", nil), + NSLocalizedString(@"Shows conditional formatting by customizing plot elements.", nil), + NSLocalizedString(@"Shows how to fully customize plot elements.", nil), + NSLocalizedString(@"Shows the different selection modes.", nil), + NSLocalizedString(@"Shows the ability to toggle a series visibility.", nil), + NSLocalizedString(@"Shows animation modes when data is loaded.", nil), + NSLocalizedString(@"Shows animation when data is updated.", nil), + NSLocalizedString(@"Shows a dynamic, “live” chart.", nil), + NSLocalizedString(@"Demonstrates use of the FlexChart's hitTest method.", nil), + NSLocalizedString(@"Shows a chart with panning (or scrolling) along the axes.", nil), + NSLocalizedString(@"Shows stretch zoom-out and pinch zoom-in gestures.", nil), + NSLocalizedString(@"Shows the built-in palettes.", nil), + NSLocalizedString(@"Shows custom series styling.", nil), + NSLocalizedString(@"Shows how to export an image of FlexChart.", nil)]; + + _samplesImage = @[@"Getting Started", + @"Basic Chart Types", + @"Mixed Chart Types", + @"Financial Chart", + @"Bubble Chart", + @"Custom Tooltips", + @"Data Labels", + @"Annotations", + @"Line Marker", + @"Customizing Axes", + @"Multiple Axes", + @"Legend and Titles", + @"Conditional Formatting", + @"Custom Plot Elements", + @"Selection Modes", + @"Toggle Series", + @"Load Animation Mode", + @"Update Animation", + @"Dynamic Charts", + @"Hit Test", + @"Scrolling", + @"Zooming and Scrolling", + @"Theming", + @"Styling Series", + @"Export Image"]; + +} + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return [_samplesTitle count]; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + NSString *SimpleIdentifier = @"SimpleIdentifier"; + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SimpleIdentifier]; + NSString *imageName = [_samplesImage[indexPath.row] stringByReplacingOccurrencesOfString:@" " withString:@""]; + imageName = [NSString stringWithFormat:@"%@%@", imageName.lowercaseString, @".png"]; + + cell.textLabel.text = _samplesTitle[indexPath.row]; + cell.textLabel.textColor = [UIColor colorWithRed:176.0 / 255 green:15.0 / 255 blue:80.0 / 255 alpha:1]; + cell.detailTextLabel.text = _samplesDescription[indexPath.row]; + cell.detailTextLabel.textColor = [UIColor grayColor]; + cell.imageView.image = [UIImage imageNamed:imageName]; + + return cell; + +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + NSString* sampleName = [_samplesImage objectAtIndex:indexPath.row]; + + UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" + bundle:nil]; + UIViewController *sample = + [storyboard instantiateViewControllerWithIdentifier:sampleName]; + + [self.navigationController pushViewController:sample animated:true]; +} + + + +@end diff --git a/ObjectiveC/FlexChart101/FlexChart101/MixedChartTypesController.m b/ObjectiveC/FlexChart101/FlexChart101/MixedChartTypesController.m index bb0f9f5..fdc7813 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/MixedChartTypesController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/MixedChartTypesController.m @@ -7,9 +7,10 @@ #import "MixedChartTypesController.h" #import "ChartData.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; @interface MixedChartTypesController () +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @@ -17,45 +18,21 @@ @implementation MixedChartTypesController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Mixed Chart Types", nil)]; - // Do any additional setup after loading the view. - FlexChart *chart = [[FlexChart alloc] init]; NSMutableArray *chartData = [ChartData demoData]; - chart.bindingX = @"name"; - XuniSeries *sales = [[XuniSeries alloc] initForChart:chart binding:@"sales, sales" name:@"Sales"]; - XuniSeries *expenses = [[XuniSeries alloc] initForChart:chart binding:@"expenses, expenses" name:@"Expenses"]; - XuniSeries *downloads = [[XuniSeries alloc] initForChart:chart binding:@"downloads, downloads" name:@"Downloads"]; + self.chart.bindingX = @"name"; + XuniSeries *sales = [[XuniSeries alloc] initForChart:self.chart binding:@"sales, sales" name:@"Sales"]; + XuniSeries *expenses = [[XuniSeries alloc] initForChart:self.chart binding:@"expenses, expenses" name:@"Expenses"]; + XuniSeries *downloads = [[XuniSeries alloc] initForChart:self.chart binding:@"downloads, downloads" name:@"Downloads"]; downloads.chartType = XuniChartTypeLine; - [chart.series addObject:sales]; - [chart.series addObject:expenses]; - [chart.series addObject:downloads]; - chart.itemsSource = chartData; + [self.chart.series addObject:sales]; + [self.chart.series addObject:expenses]; + [self.chart.series addObject:downloads]; + self.chart.itemsSource = chartData; - chart.tag = 1; - [self.view addSubview:chart]; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - chart.frame = CGRectMake(0, 55, self.view.bounds.size.width, self.view.bounds.size.height - 55); - [chart setNeedsDisplay]; -} -/* -#pragma mark - Navigation -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/MultipleAxesController.m b/ObjectiveC/FlexChart101/FlexChart101/MultipleAxesController.m index a88db8c..94cd2ee 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/MultipleAxesController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/MultipleAxesController.m @@ -6,10 +6,11 @@ // #import "MultipleAxesController.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; #import "WeatherData.h" @interface MultipleAxesController () +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @@ -17,17 +18,14 @@ @implementation MultipleAxesController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Multiple Axes", nil)]; - // Do any additional setup after loading the view. - FlexChart *chart = [[FlexChart alloc] init]; NSMutableArray *chartData = [WeatherData demoData]; - chart.bindingX = @"monthName"; - XuniSeries *precip = [[XuniSeries alloc] initForChart:chart binding:@"precipitation, precipitation" name:@"Precip"]; - XuniSeries *temp= [[XuniSeries alloc] initForChart:chart binding:@"temp, temp" name:@"Avg. Temp"]; + self.chart.bindingX = @"monthName"; + XuniSeries *precip = [[XuniSeries alloc] initForChart:self.chart binding:@"precipitation, precipitation" name:@"Precip"]; + XuniSeries *temp= [[XuniSeries alloc] initForChart:self.chart binding:@"temp, temp" name:@"Avg. Temp"]; temp.chartType = XuniChartTypeSplineSymbols; - XuniAxis *axisT = [[XuniAxis alloc] initWithPosition:XuniPositionRight forChart:chart]; + XuniAxis *axisT = [[XuniAxis alloc] initWithPosition:XuniPositionRight forChart:self.chart]; axisT.min = @0; axisT.max = @80; axisT.majorUnit = 10; @@ -38,48 +36,25 @@ - (void)viewDidLoad { axisT.minorTickWidth = 0; axisT.titleTextColor = [UIColor colorWithRed:0.984 green:0.698 blue:0.345 alpha:1]; axisT.labelsVisible = YES; - [chart.axesArray addObject:axisT]; - - chart.itemsSource = chartData; - chart.axisY.min = @4; - chart.axisY.max = @20; - chart.axisY.majorUnit = 2; - chart.axisY.title = @"Precipitation (in)"; - chart.axisY.axisLineVisible = NO; - chart.axisY.majorTickWidth = 1; - chart.axisY.minorTickWidth = 0; - chart.axisY.titleTextColor = [UIColor colorWithRed:0.533 green:0.741 blue:0.902 alpha:1]; - chart.axisX.labelAngle = 90; - chart.axisX.majorGridVisible = NO; - chart.legend.position = XuniChartLegendPositionNone; + [self.chart.axesArray addObject:axisT]; + + self.chart.itemsSource = chartData; + self.chart.axisY.min = @4; + self.chart.axisY.max = @20; + self.chart.axisY.majorUnit = 2; + self.chart.axisY.title = @"Precipitation (in)"; + self.chart.axisY.axisLineVisible = NO; + self.chart.axisY.majorTickWidth = 1; + self.chart.axisY.minorTickWidth = 0; + self.chart.axisY.titleTextColor = [UIColor colorWithRed:0.533 green:0.741 blue:0.902 alpha:1]; + self.chart.axisX.labelAngle = 90; + self.chart.axisX.majorGridVisible = NO; + self.chart.legend.position = XuniChartLegendPositionNone; [temp setAxisY:axisT]; - [chart.series addObject:precip]; - [chart.series addObject:temp]; - - chart.tag = 1; - [self.view addSubview:chart]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. + [self.chart.series addObject:precip]; + [self.chart.series addObject:temp]; } --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - chart.frame = CGRectMake(0, 65, self.view.bounds.size.width, self.view.bounds.size.height - 65); - [chart setNeedsDisplay]; -} -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/ScrollingController.m b/ObjectiveC/FlexChart101/FlexChart101/ScrollingController.m index 1824259..1f6df41 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/ScrollingController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/ScrollingController.m @@ -6,10 +6,11 @@ // #import "ScrollingController.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; #import "WeatherData.h" @interface ScrollingController () +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @@ -17,10 +18,8 @@ @implementation ScrollingController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Scrolling", nil)]; - // Do any additional setup after loading the view. - FlexChart *chart = [[FlexChart alloc] init]; + FlexChart *chart = self.chart; NSMutableArray *chartData = [WeatherData demoData]; XuniSeries *precip = [[XuniSeries alloc] initForChart:chart binding:@"precipitation" name:@"Precip"]; @@ -53,7 +52,7 @@ - (void)viewDidLoad { chart.axisX.majorGridVisible = NO; chart.axisX.displayedRange = 10; chart.palette = [XuniPalettes midnight]; - chart.header = NSLocalizedString(@"Drag to scroll/Pinch to zoom", nil); + chart.header = @"Drag to scroll/Pinch to zoom"; chart.headerFont = [UIFont systemFontOfSize:14]; chart.headerTextAlignment = XuniHorizontalAlignmentCenter; @@ -63,30 +62,8 @@ - (void)viewDidLoad { [chart.series addObject:temp]; [chart.series addObject:volume]; - chart.tag = 1; - [self.view addSubview:chart]; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - chart.frame = CGRectMake(0, 65, self.view.bounds.size.width, self.view.bounds.size.height - 65); - [chart setNeedsDisplay]; -} -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/SelectionModesController.m b/ObjectiveC/FlexChart101/FlexChart101/SelectionModesController.m index 43e6c4c..73700d6 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/SelectionModesController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/SelectionModesController.m @@ -6,38 +6,31 @@ // #import "SelectionModesController.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; #import "ChartData.h" @interface SelectionModesController (){ NSMutableArray *chartTypePickerData; NSMutableArray *selectionModePickerData; } +@property (weak, nonatomic) IBOutlet FlexChart *chart; +@property (weak, nonatomic) IBOutlet UIPickerView *picker; @end @implementation SelectionModesController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Selection Modes", nil)]; - // Do any additional setup after loading the view. + chartTypePickerData =[[NSMutableArray alloc] initWithObjects:@"Column", @"Bar", @"Scatter", @"Line", @"LineSymbol", @"Area", nil]; selectionModePickerData = [[NSMutableArray alloc]initWithObjects: @"None", @"Series", @"Point", nil]; - UIPickerView *chartTypePicker = [[UIPickerView alloc] init]; - chartTypePicker.delegate = self; - chartTypePicker.showsSelectionIndicator = YES; - chartTypePicker.hidden = false; - UIPickerView *selectionModePicker = [[UIPickerView alloc] init]; - selectionModePicker.delegate = self; - selectionModePicker.tag = 3; - selectionModePicker.showsSelectionIndicator = YES; - selectionModePicker.hidden = false; + self.picker.delegate = self; NSMutableArray *chartData = [ChartData demoData]; - FlexChart *chart = [[FlexChart alloc] init]; + FlexChart *chart = self.chart; XuniSeries *sales = [[XuniSeries alloc] initForChart:chart binding:@"sales, sales" name:@"Sales"]; XuniSeries *expenses = [[XuniSeries alloc] initForChart:chart binding:@"expenses, expenses" name:@"Expenses"]; @@ -53,50 +46,24 @@ - (void)viewDidLoad { chart.selectedBorderColor = [UIColor redColor]; chart.selectedBorderWidth = 3; chart.selectedDashes = [[NSArray alloc] initWithObjects:@7.5, @2.5, nil]; - - chart.tag = 1; - chartTypePicker.tag = 2; - selectionModePicker.tag = 3; - - [self.view addSubview:chartTypePicker]; - [self.view addSubview:selectionModePicker]; - [self.view addSubview:chart]; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - UIPickerView *chartTypePicker = (UIPickerView*)[self.view viewWithTag:2]; - [chartTypePicker selectRow:0 inComponent:0 animated:NO]; - - UIPickerView *selectionModePicker = (UIPickerView*)[self.view viewWithTag:3]; - [selectionModePicker selectRow:1 inComponent:0 animated:NO]; + [self.picker selectRow:0 inComponent:0 animated:NO]; + [self.picker selectRow:1 inComponent:1 animated:NO]; } --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - UIPickerView *chartTypePicker = (UIPickerView*)[self.view viewWithTag:2]; - UIPickerView *selectionModePicker = (UIPickerView*)[self.view viewWithTag:3]; - - chartTypePicker.frame = CGRectMake(0, 44, self.view.bounds.size.width / 2, 162); - selectionModePicker.frame = CGRectMake(self.view.bounds.size.width / 2, 44, self.view.bounds.size.width / 2, 162); - chart.frame = CGRectMake(0, 206, self.view.bounds.size.width, self.view.bounds.size.height - 206); - [chart setNeedsDisplay]; -} - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ - return 1; + return 2; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ - if(pickerView.tag == 2){ + if(component == 0){ return [chartTypePickerData count]; } else{ @@ -105,9 +72,8 @@ - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSIn } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ - FlexChart *chart = (FlexChart *)[self.view viewWithTag:1]; - - if(pickerView.tag == 2) + FlexChart *chart = self.chart; + if(component == 0) { if (row == 0) { chart.chartType = XuniChartTypeColumn; @@ -128,7 +94,7 @@ - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComp chart.chartType = XuniChartTypeArea; } } - else if(pickerView.tag == 3){ + else if(component == 1){ if (row == 0) { chart.selectionMode = XuniSelectionModeNone; } @@ -142,25 +108,16 @@ - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComp } - (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ - if(pickerView.tag == 2) + if(component == 0) { return [chartTypePickerData objectAtIndex:row]; } - else if(pickerView.tag == 3){ + else if(component == 1){ return [selectionModePickerData objectAtIndex:row]; } else{ return @"error"; } } -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/SnapshotController.m b/ObjectiveC/FlexChart101/FlexChart101/SnapshotController.m index d1a57f6..937478c 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/SnapshotController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/SnapshotController.m @@ -6,25 +6,27 @@ // #import "SnapshotController.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; #import "ChartData.h" @interface SnapshotController () +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @implementation SnapshotController +- (IBAction)doSnapshot:(id)sender { + FlexChart *chart = self.chart; + UIImage *image = [[UIImage alloc] init]; + image = [UIImage imageWithData:[chart getImage]]; + UIImageWriteToSavedPhotosAlbum(image, self, @selector(imageSavedToPhotoAlbum:finishedSavingWithError:contextInfo:), nil); + +} - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Export Image", nil)]; - // Do any additional setup after loading the view. - UIButton *snapshotButton = [UIButton buttonWithType:UIButtonTypeSystem]; - [snapshotButton setTitle:NSLocalizedString(@"Take a snapshot", nil) forState:UIControlStateNormal]; - [snapshotButton addTarget:self action:@selector(snapshotButtonClicked) forControlEvents:UIControlEventTouchUpInside]; - - FlexChart *chart = [[FlexChart alloc] init]; + FlexChart *chart = self.chart; XuniSeries *sales = [[XuniSeries alloc] initForChart:chart binding:@"sales, sales" name:@"Sales"]; XuniSeries *expenses = [[XuniSeries alloc] initForChart:chart binding:@"expenses, expenses" name:@"Expenses"]; XuniSeries *downloads = [[XuniSeries alloc] initForChart:chart binding:@"downloads, downloads" name:@"Downloads"]; @@ -36,42 +38,15 @@ - (void)viewDidLoad { chart.bindingX = @"name"; chart.itemsSource = [ChartData demoData]; - chart.tag = 1; - snapshotButton.tag = 2; - - [self.view addSubview:chart]; - [self.view addSubview:snapshotButton]; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - UIButton *snapshotButton = (UIButton*)[self.view viewWithTag:2]; - - chart.frame = CGRectMake(5, 115, self.view.bounds.size.width-10, self.view.bounds.size.height-115); - snapshotButton.frame = CGRectMake(0, 65, self.view.bounds.size.width, 50); - [chart setNeedsDisplay]; -} - -- (void)snapshotButtonClicked { - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - UIImage *image = [[UIImage alloc] init]; - image = [UIImage imageWithData:[chart getImage]]; - UIImageWriteToSavedPhotosAlbum(image, self, @selector(imageSavedToPhotoAlbum:finishedSavingWithError:contextInfo:), nil); -} - (void)imageSavedToPhotoAlbum:(UIImage *)image finishedSavingWithError:(NSError *)error contextInfo:(void *)contextInfo { NSString *message; NSString *title; if (!error) { - title = NSLocalizedString(@"Succes", nil); + title = NSLocalizedString(@"Success", nil); message = NSLocalizedString(@"Image was saved to Camera Roll successfully", nil); } else { @@ -83,14 +58,5 @@ - (void)imageSavedToPhotoAlbum:(UIImage *)image finishedSavingWithError:(NSError [alert show]; } -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/StylingSeriesController.m b/ObjectiveC/FlexChart101/FlexChart101/StylingSeriesController.m index d64b8f7..51849b6 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/StylingSeriesController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/StylingSeriesController.m @@ -6,10 +6,11 @@ // #import "StylingSeriesController.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; #import "ChartData.h" @interface StylingSeriesController () +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @@ -17,10 +18,8 @@ @implementation StylingSeriesController - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Styling Series", nil)]; - // Do any additional setup after loading the view. - FlexChart *chart = [[FlexChart alloc] init]; + FlexChart *chart = self.chart; XuniSeries *sales = [[XuniSeries alloc] initForChart:chart binding:@"sales" name:@"Sales"]; XuniSeries *expenses = [[XuniSeries alloc] initForChart:chart binding:@"expenses" name:@"Expenses"]; XuniSeries *downloads = [[XuniSeries alloc] initForChart:chart binding:@"downloads" name:@"Downloads"]; @@ -44,31 +43,7 @@ - (void)viewDidLoad { chart.bindingX = @"name"; chart.itemsSource = [ChartData demoData]; - chart.tag = 1; - [self.view addSubview:chart]; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - chart.frame = CGRectMake(0, 55, self.view.bounds.size.width, self.view.bounds.size.height - 55); - [chart setNeedsDisplay]; -} - -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/ThemingController.m b/ObjectiveC/FlexChart101/FlexChart101/ThemingController.m index 066ee14..7a72770 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/ThemingController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/ThemingController.m @@ -6,12 +6,14 @@ // #import "ThemingController.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; #import "ChartData.h" @interface ThemingController (){ NSMutableArray *pickerData; } +@property (weak, nonatomic) IBOutlet FlexChart *chart; +@property (weak, nonatomic) IBOutlet UIPickerView *picker; @end @implementation ThemingController @@ -20,16 +22,11 @@ - (void)viewDidLoad { [super viewDidLoad]; [self setTitle:NSLocalizedString(@"Theming", nil)]; - // Do any additional setup after loading the view. - UIPickerView *pickerView; pickerData =[[NSMutableArray alloc] initWithObjects:@"Standard", @"Cocoa", @"Coral", @"Dark", @"HighContrast", @"Light", @"Midnight", @"Minimal", @"Modern", @"Organic", @"Slate", @"Zen", @"Cyborg", @"Superhero", @"Flatly", @"Darkly", @"Cerulean", nil]; - pickerView = [[UIPickerView alloc] init]; - pickerView.delegate = self; - pickerView.showsSelectionIndicator = YES; - pickerView.hidden = false; + self.picker.delegate = self; - FlexChart *chart = [[FlexChart alloc] init]; + FlexChart *chart = self.chart; XuniSeries *sales = [[XuniSeries alloc] initForChart:chart binding:@"sales, sales" name:@"Sales"]; XuniSeries *expenses = [[XuniSeries alloc] initForChart:chart binding:@"expenses, expenses" name:@"Expenses"]; XuniSeries *downloads = [[XuniSeries alloc] initForChart:chart binding:@"downloads, downloads" name:@"Downloads"]; @@ -41,30 +38,9 @@ - (void)viewDidLoad { chart.bindingX = @"name"; chart.itemsSource = [ChartData demoData]; - chart.tag = 1; - pickerView.tag = 2; - - [self.view addSubview:chart]; - [self.view addSubview:pickerView]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. } --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - UIPickerView *pickerView = (UIPickerView*)[self.view viewWithTag:2]; - - pickerView.frame = CGRectMake(self.view.bounds.size.width/4, 44, self.view.bounds.size.width/2, 162); - chart.frame = CGRectMake(0, 206, self.view.bounds.size.width, self.view.bounds.size.height - 206); - [chart setNeedsDisplay]; -} - - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ return 1; } @@ -74,7 +50,7 @@ - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSIn } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; + FlexChart *chart = self.chart; switch (row) { case 0: chart.palette = [XuniPalettes standard]; @@ -135,14 +111,5 @@ - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComp - (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ return [pickerData objectAtIndex:row]; } -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/ToggleSeriesController.m b/ObjectiveC/FlexChart101/FlexChart101/ToggleSeriesController.m index 79a683a..0f82aa2 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/ToggleSeriesController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/ToggleSeriesController.m @@ -7,41 +7,31 @@ #import "ToggleSeriesController.h" #import "ChartData.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; @interface ToggleSeriesController () +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @implementation ToggleSeriesController +- (IBAction)switchChanged:(id)sender { + UISwitch* switchState = (UISwitch*)sender; + int index = switchState.tag; + if ([switchState isOn]) { + ((XuniSeries *)[self.chart.series objectAtIndex:index]).visibility = XuniSeriesVisibilityVisible; + } + else + { + ((XuniSeries *)[self.chart.series objectAtIndex:index]).visibility = XuniSeriesVisibilityHidden; + } +} - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Toggle Series", nil)]; - - // Do any additional setup after loading the view. + NSMutableArray *chartData = [ChartData demoData]; - FlexChart *chart = [[FlexChart alloc] init]; - UISwitch *salesSwitch = [[UISwitch alloc]init]; - UISwitch *expensesSwitch = [[UISwitch alloc]init]; - UISwitch *downloadsSwitch = [[UISwitch alloc]init]; - UILabel *salesLabel = [[UILabel alloc]init]; - UILabel *expensesLabel = [[UILabel alloc]init]; - UILabel *downloadsLabel = [[UILabel alloc]init]; - - salesLabel.text = @"Sales"; - expensesLabel.text = @"Expenses"; - downloadsLabel.text = @"Downloads"; - salesLabel.textAlignment = NSTextAlignmentCenter; - expensesLabel.textAlignment = NSTextAlignmentCenter; - downloadsLabel.textAlignment = NSTextAlignmentCenter; - - salesSwitch.on = YES; - expensesSwitch.on = YES; - downloadsSwitch.on = YES; - [salesSwitch addTarget:self action:@selector(salesSwitchChanged:) forControlEvents:UIControlEventValueChanged]; - [expensesSwitch addTarget:self action:@selector(expensesSwitchChanged:) forControlEvents:UIControlEventValueChanged]; - [downloadsSwitch addTarget:self action:@selector(downloadsSwitchChanged:) forControlEvents:UIControlEventValueChanged]; + FlexChart *chart = self.chart; XuniSeries *sales = [[XuniSeries alloc] initForChart:chart binding:@"sales, sales" name:@"Sales"]; XuniSeries *expenses = [[XuniSeries alloc] initForChart:chart binding:@"expenses, expenses" name:@"Expenses"]; @@ -55,97 +45,7 @@ - (void)viewDidLoad { chart.chartType = XuniChartTypeLineSymbols; chart.selectionMode = XuniSelectionModeSeries; - chart.tag = 1; - salesSwitch.tag = 2; - expensesSwitch.tag = 3; - downloadsSwitch.tag = 4; - salesLabel.tag = 5; - expensesLabel.tag = 6; - downloadsLabel.tag = 7; - - [self.view addSubview:chart]; - [self.view addSubview:salesSwitch]; - [self.view addSubview:expensesSwitch]; - [self.view addSubview:downloadsSwitch]; - [self.view addSubview:salesLabel]; - [self.view addSubview:expensesLabel]; - [self.view addSubview:downloadsLabel]; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - UISwitch *salesSwitch = (UISwitch*)[self.view viewWithTag:2]; - UISwitch *expensesSwitch = (UISwitch*)[self.view viewWithTag:3]; - UISwitch *downloadsSwitch = (UISwitch*)[self.view viewWithTag:4]; - UILabel *salesLabel = (UILabel*)[self.view viewWithTag:5]; - UILabel *expensesLabel = (UILabel*)[self.view viewWithTag:6]; - UILabel *downloadsLabel = (UILabel*)[self.view viewWithTag:7]; - CGFloat switchWidth = self.view.bounds.size.width / 8; - CGFloat switchpadding = self.view.bounds.size.width * 5 / 32; - CGFloat labelWidth = self.view.bounds.size.width / 4; - CGFloat labelpadding = self.view.bounds.size.width / 4 / 4; - CGFloat controlHeight = self.view.bounds.size.height / 16; - - chart.frame = CGRectMake(0, self.view.bounds.size.height * 2 / 8, self.view.bounds.size.width, self.view.bounds.size.height - (self.view.bounds.size.height * 2 / 8 )); - salesSwitch.frame = CGRectMake(switchpadding - 10, controlHeight * 3, switchWidth, controlHeight); - expensesSwitch.frame = CGRectMake(switchpadding * 2 + switchWidth, controlHeight * 3, switchWidth, controlHeight); - downloadsSwitch.frame = CGRectMake(switchpadding * 3 + switchWidth * 2, controlHeight * 3, switchWidth, controlHeight); - salesLabel.frame = CGRectMake(labelpadding, self.view.bounds.size.height / 8, labelWidth, controlHeight); - expensesLabel.frame = CGRectMake(labelpadding * 2 + labelWidth, self.view.bounds.size.height / 8, labelWidth, controlHeight); - downloadsLabel.frame = CGRectMake(labelpadding * 3 + labelWidth * 2, self.view.bounds.size.height / 8, labelWidth, controlHeight); - - [chart setNeedsDisplay]; -} - -- (void)salesSwitchChanged:(UISwitch *)switchState{ - FlexChart *chart = (FlexChart*) [self.view viewWithTag:1]; - - if ([switchState isOn]) { - ((XuniSeries *)[chart.series objectAtIndex:0]).visibility = XuniSeriesVisibilityVisible; - } - else - { - ((XuniSeries *)[chart.series objectAtIndex:0]).visibility = XuniSeriesVisibilityHidden; - } -} - -- (void)expensesSwitchChanged:(UISwitch *)switchState{ - FlexChart *chart = (FlexChart*) [self.view viewWithTag:1]; - - if ([switchState isOn]) { - ((XuniSeries *)[chart.series objectAtIndex:1]).visibility = XuniSeriesVisibilityVisible; - } - else - { - ((XuniSeries *)[chart.series objectAtIndex:1]).visibility = XuniSeriesVisibilityHidden; - } -} - -- (void)downloadsSwitchChanged:(UISwitch *)switchState{ - FlexChart *chart = (FlexChart*) [self.view viewWithTag:1]; - - if ([switchState isOn]) { - ((XuniSeries *)[chart.series objectAtIndex:2]).visibility = XuniSeriesVisibilityVisible; - } - else - { - ((XuniSeries *)[chart.series objectAtIndex:2]).visibility = XuniSeriesVisibilityHidden; - } -} -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/UpdateAnimationController.m b/ObjectiveC/FlexChart101/FlexChart101/UpdateAnimationController.m index c666905..63d190a 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/UpdateAnimationController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/UpdateAnimationController.m @@ -6,7 +6,7 @@ // #import "UpdateAnimationController.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; #import "ChartData.h" @implementation UpdateData @@ -47,41 +47,67 @@ @interface UpdateAnimationController () { NSMutableArray *updatePositionPickerData; NSMutableArray *chartData; } +@property (weak, nonatomic) IBOutlet UIPickerView *picker; +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @implementation UpdateAnimationController +- (IBAction)addPoint:(id)sender { + FlexChart *chart = self.chart; + UIPickerView *updatePositionPicker = self.picker; + NSInteger row = [updatePositionPicker selectedRowInComponent:1]; + int num = 65 + rand() % (90 - 65 + 1); + UpdateData *data = [[UpdateData alloc] initWithXValue:[NSString stringWithFormat:@"%c", num] + y:[UpdateData randomNumberBetween:10 max:80]]; + + if (row == 0) { + [chart.collectionView insertObject:data atIndex:0]; + } + else if (row == 1) { + [chart.collectionView insertObject:data atIndex:chart.collectionView.itemCount / 2]; + } + else if (row == 2) { + [chart.collectionView addObject:data]; + } +} + +- (IBAction)removePoint:(id)sender { + FlexChart *chart = self.chart; + UIPickerView *updatePositionPicker = self.picker; + NSInteger row = [updatePositionPicker selectedRowInComponent:1]; + + if (row == 0) { + [chart.collectionView removeAt:0]; + } + else if (row == 1) { + [chart.collectionView removeAt:chart.collectionView.itemCount / 2]; + } + else if (row == 2) { + [chart.collectionView removeAt:chart.collectionView.itemCount - 1]; + } + +} + - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Update Animation", nil)]; + [self setTitle:@"Update Animation"]; // Do any additional setup after loading the view. chartTypePickerData =[[NSMutableArray alloc] initWithObjects:@"Column", @"Area", @"Line", @"LineSymbols", @"Spline", @"SplineSymbols", @"SplineArea", @"Scatter", nil]; updatePositionPickerData = [[NSMutableArray alloc]initWithObjects: @"Beginning", @"Middle", @"End", nil]; chartData = [[NSMutableArray alloc] initWithArray:[UpdateData demoData]]; - UIPickerView *chartTypePicker = [[UIPickerView alloc] init]; - chartTypePicker.delegate = self; - chartTypePicker.showsSelectionIndicator = YES; - chartTypePicker.hidden = false; - [chartTypePicker selectRow:0 inComponent:0 animated:false]; + self.picker.delegate = self; - UIPickerView *updatePositionPicker = [[UIPickerView alloc] init]; - updatePositionPicker.delegate = self; - updatePositionPicker.showsSelectionIndicator = YES; - updatePositionPicker.hidden = false; - [updatePositionPicker selectRow:0 inComponent:0 animated:false]; + + [self.picker selectRow:0 inComponent:0 animated:false]; - UIButton *addPointBtn = [UIButton buttonWithType:UIButtonTypeSystem]; - [addPointBtn setTitle:NSLocalizedString(@"Add Point", nil) forState:UIControlStateNormal]; - [addPointBtn addTarget:self action:@selector(addPointAction) forControlEvents:UIControlEventTouchUpInside]; + + [self.picker selectRow:0 inComponent:1 animated:false]; - UIButton *removePointBtn = [UIButton buttonWithType:UIButtonTypeSystem]; - [removePointBtn setTitle:NSLocalizedString(@"Remove Point", nil) forState:UIControlStateNormal]; - [removePointBtn addTarget:self action:@selector(removePointAction) forControlEvents:UIControlEventTouchUpInside]; - - FlexChart *chart = [[FlexChart alloc] init]; + FlexChart *chart = self.chart; XuniSeries *value = [[XuniSeries alloc] initForChart:chart binding:@"value" name:@"value"]; [chart.series addObject:value]; @@ -93,47 +119,16 @@ - (void)viewDidLoad { chart.axisY.axisLineVisible = NO; chart.axisY.majorTickWidth = 0; - chart.tag = 1; - chartTypePicker.tag = 2; - updatePositionPicker.tag = 3; - addPointBtn.tag = 4; - removePointBtn.tag = 5; - - [self.view addSubview:chartTypePicker]; - [self.view addSubview:updatePositionPicker]; - [self.view addSubview:addPointBtn]; - [self.view addSubview:removePointBtn]; - [self.view addSubview:chart]; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - UIPickerView *chartTypePicker = (UIPickerView*)[self.view viewWithTag:2]; - UIPickerView *updatePositionPicker = (UIPickerView*)[self.view viewWithTag:3]; - UIButton *addPointBtn = (UIButton*)[self.view viewWithTag:4]; - UIButton *removePointBtn = (UIButton*)[self.view viewWithTag:5]; - - chartTypePicker.frame = CGRectMake(0, 44, self.view.bounds.size.width / 2, 162); - updatePositionPicker.frame = CGRectMake(self.view.bounds.size.width / 2, 44, self.view.bounds.size.width / 2, 162); - addPointBtn.frame = CGRectMake(20, 206, 120, 40); - removePointBtn.frame = CGRectMake(160, 206, 150, 40); - chart.frame = CGRectMake(0, 206 + 40, self.view.bounds.size.width, self.view.bounds.size.height - 206 - 40); - [chart setNeedsDisplay]; -} - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ - return 1; + return 2; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ - if(pickerView.tag == 2){ + if(component == 0){ return [chartTypePickerData count]; } else{ @@ -142,9 +137,9 @@ - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSIn } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ - FlexChart *chart = (FlexChart *)[self.view viewWithTag:1]; + FlexChart *chart = self.chart; - if(pickerView.tag == 2) + if(component == 0) { if (row == 0) { chart.chartType = XuniChartTypeColumn; @@ -174,11 +169,11 @@ - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComp } - (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ - if(pickerView.tag == 2) + if(component == 0) { return [chartTypePickerData objectAtIndex:row]; } - else if(pickerView.tag == 3){ + else if(component == 1){ return [updatePositionPickerData objectAtIndex:row]; } else{ @@ -186,49 +181,5 @@ - (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row fo } } -- (void)addPointAction { - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - UIPickerView *updatePositionPicker = (UIPickerView*)[self.view viewWithTag:3]; - NSInteger row = [updatePositionPicker selectedRowInComponent:0]; - int num = 65 + rand() % (90 - 65 + 1); - UpdateData *data = [[UpdateData alloc] initWithXValue:[NSString stringWithFormat:@"%c", num] - y:[UpdateData randomNumberBetween:10 max:80]]; - - if (row == 0) { - [chart.collectionView insertObject:data atIndex:0]; - } - else if (row == 1) { - [chart.collectionView insertObject:data atIndex:chart.collectionView.itemCount / 2]; - } - else if (row == 2) { - [chart.collectionView addObject:data]; - } -} - -- (void)removePointAction { - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - UIPickerView *updatePositionPicker = (UIPickerView*)[self.view viewWithTag:3]; - NSInteger row = [updatePositionPicker selectedRowInComponent:0]; - - if (row == 0) { - [chart.collectionView removeAt:0]; - } - else if (row == 1) { - [chart.collectionView removeAt:chart.collectionView.itemCount / 2]; - } - else if (row == 2) { - [chart.collectionView removeAt:chart.collectionView.itemCount - 1]; - } -} - -/* - #pragma mark - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. - } - */ @end \ No newline at end of file diff --git a/ObjectiveC/FlexChart101/FlexChart101/ZoomingAndScrollingController.h b/ObjectiveC/FlexChart101/FlexChart101/ZoomingAndScrollingController.h index 63682e2..1084383 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/ZoomingAndScrollingController.h +++ b/ObjectiveC/FlexChart101/FlexChart101/ZoomingAndScrollingController.h @@ -7,5 +7,5 @@ #import -@interface ZoomingAndScrollingController : UIViewController +@interface ZoomingAndScrollingController : UIViewController @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/ZoomingAndScrollingController.m b/ObjectiveC/FlexChart101/FlexChart101/ZoomingAndScrollingController.m index 3bff376..23bd7cc 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/ZoomingAndScrollingController.m +++ b/ObjectiveC/FlexChart101/FlexChart101/ZoomingAndScrollingController.m @@ -6,33 +6,42 @@ // #import "ZoomingAndScrollingController.h" -#import "XuniFlexChartKit/XuniFlexChartKit.h" +@import XuniFlexChartDynamicKit; #import "ChartData.h" @interface ZoomingAndScrollingController (){ NSMutableArray *pickerData; } +@property (weak, nonatomic) IBOutlet UISegmentedControl *zoomModeSelector; +@property (weak, nonatomic) IBOutlet FlexChart *chart; @end @implementation ZoomingAndScrollingController +- (IBAction)zoomModeChanged:(id)sender { + int row = self.zoomModeSelector.selectedSegmentIndex; + if (row == 0) { + self.chart.zoomMode = XuniZoomModeX; + } + else if (row == 1){ + self.chart.zoomMode = XuniZoomModeY; + } + else if (row == 2){ + self.chart.zoomMode = XuniZoomModeXY; + } + else if (row == 3){ + self.chart.zoomMode = XuniZoomModeDisabled; + } + +} - (void)viewDidLoad { [super viewDidLoad]; - [self setTitle:NSLocalizedString(@"Zooming and Scrolling", nil)]; + + FlexChart *chart = self.chart; - // Do any additional setup after loading the view. - pickerData =[[NSMutableArray alloc] initWithObjects:@"X", @"Y", @"XY", @"Disabled", nil]; - UILabel *label = [[UILabel alloc] init]; - UIPickerView *pickerView = [[UIPickerView alloc] init]; - FlexChart *chart = [[FlexChart alloc] init]; - - label.text = @"Zoom Mode"; - - pickerView.delegate = self; - pickerView.showsSelectionIndicator = YES; - pickerView.hidden = false; - [pickerView selectRow:2 inComponent:0 animated:false]; + self.zoomModeSelector.selectedSegmentIndex = 2; + [self zoomModeChanged:nil]; XuniSeries *sales = [[XuniSeries alloc] initForChart:chart binding:@"y" name:@"Normal Distribution"]; [chart.series addObject:sales]; @@ -42,76 +51,13 @@ - (void)viewDidLoad { chart.chartType = XuniChartTypeScatter; chart.zoomMode = XuniZoomModeXY; chart.isAnimated = NO; - chart.header = NSLocalizedString(@"Drag to scroll/Pinch to zoom", nil); + chart.header = @"Drag to scroll/Pinch to zoom"; chart.headerFont = [UIFont systemFontOfSize:14]; chart.headerTextAlignment = XuniHorizontalAlignmentCenter; chart.palette = [XuniPalettes superhero]; chart.axisY.format = @"N2"; - - chart.tag = 1; - pickerView.tag = 2; - label.tag = 3; - - [self.view addSubview:label]; - [self.view addSubview:pickerView]; - [self.view addSubview:chart]; -} -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - - FlexChart *chart = (FlexChart*)[self.view viewWithTag:1]; - UIPickerView *pickerView = (UIPickerView*)[self.view viewWithTag:2]; - UILabel *label = (UILabel*)[self.view viewWithTag:3]; - - label.frame = CGRectMake(10, 110, 50, 25); - [label sizeToFit]; - pickerView.frame = CGRectMake(self.view.bounds.size.width/3, 44, self.view.bounds.size.width/2, 162); - chart.frame = CGRectMake(0, 206, self.view.bounds.size.width, self.view.bounds.size.height - 206); - [chart setNeedsDisplay]; } -- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ - return 1; -} - -- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ - return [pickerData count]; -} - -- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ - FlexChart *chart = (FlexChart *)[self.view viewWithTag:1]; - - if (row == 0) { - chart.zoomMode = XuniZoomModeX; - } - else if (row == 1){ - chart.zoomMode = XuniZoomModeY; - } - else if (row == 2){ - chart.zoomMode = XuniZoomModeXY; - } - else if (row == 3){ - chart.zoomMode = XuniZoomModeDisabled; - } -} - -- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ - return [pickerData objectAtIndex:row]; -} -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexChart101/FlexChart101/ja.lproj/LaunchScreen.strings b/ObjectiveC/FlexChart101/FlexChart101/ja.lproj/LaunchScreen.strings index 4d45781..5b79e70 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/ja.lproj/LaunchScreen.strings +++ b/ObjectiveC/FlexChart101/FlexChart101/ja.lproj/LaunchScreen.strings @@ -1,6 +1,6 @@ -/* Class = "UILabel"; text = " Copyright (c) 2015 GrapeCity. All rights reserved."; ObjectID = "8ie-xW-0ye"; */ -"8ie-xW-0ye.text" = " Copyright (c) 2015 GrapeCity. All rights reserved."; +/* Class = "UILabel"; text = "FlexChart101"; ObjectID = "NsB-Y2-PHc"; */ +"NsB-Y2-PHc.text" = "FlexChart101"; -/* Class = "UILabel"; text = "FlexChart101"; ObjectID = "kId-c2-rCX"; */ -"kId-c2-rCX.text" = "FlexChart101"; +/* Class = "UILabel"; text = " Copyright (c) 2016 GrapeCity. All rights reserved."; ObjectID = "vwq-n0-dls"; */ +"vwq-n0-dls.text" = " Copyright (c) 2016 GrapeCity. All rights reserved."; diff --git a/ObjectiveC/FlexChart101/FlexChart101/ja.lproj/Localizable.strings b/ObjectiveC/FlexChart101/FlexChart101/ja.lproj/Localizable.strings index c76b636..52ee2a8 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/ja.lproj/Localizable.strings +++ b/ObjectiveC/FlexChart101/FlexChart101/ja.lproj/Localizable.strings @@ -55,6 +55,9 @@ "Export Image" = "画像として保存"; +"Annotations" = "チャートの注釈"; + + // Samples Description "Shows a simple chart with tooltips." = "ツールチップを備えたチャート"; @@ -105,6 +108,9 @@ "Shows how to export an image of FlexChart." = "FlexChart を画像として保存する方法"; +"Shows how to display annotations on FlexChart." = "チャートに各種形状の注釈を表示する方法"; + + // Strings "Add Point" = "データ点の追加"; diff --git a/ObjectiveC/FlexChart101/FlexChart101/ja.lproj/Main.strings b/ObjectiveC/FlexChart101/FlexChart101/ja.lproj/Main.strings index 4511456..842a7da 100644 --- a/ObjectiveC/FlexChart101/FlexChart101/ja.lproj/Main.strings +++ b/ObjectiveC/FlexChart101/FlexChart101/ja.lproj/Main.strings @@ -1,6 +1,156 @@ -/* Class = "UIBarButtonItem"; title = "FlexChart101"; ObjectID = "agU-Ri-rsm"; */ -"agU-Ri-rsm.title" = "FlexChart101"; +/* Class = "UILabel"; text = "Downloads"; ObjectID = "1ma-Si-CBO"; */ +"1ma-Si-CBO.text" = "Downloads"; -/* Class = "UINavigationItem"; title = "FlexChart101"; ObjectID = "geB-Xl-WoV"; */ -"geB-Xl-WoV.title" = "FlexChart101"; +/* Class = "UISegmentedControl"; 1zT-tA-usj.segmentTitles[0] = "Candle"; ObjectID = "1zT-tA-usj"; */ +"1zT-tA-usj.segmentTitles[0]" = "Candle"; + +/* Class = "UISegmentedControl"; 1zT-tA-usj.segmentTitles[1] = "HLOC"; ObjectID = "1zT-tA-usj"; */ +"1zT-tA-usj.segmentTitles[1]" = "HLOC"; + +/* Class = "UINavigationItem"; title = "Mixed Chart Types"; ObjectID = "2mT-gA-nEZ"; */ +"2mT-gA-nEZ.title" = "Mixed Chart Types"; + +/* Class = "UILabel"; text = "Subtitle"; ObjectID = "3We-j7-APK"; */ +"3We-j7-APK.text" = "Subtitle"; + +/* Class = "UILabel"; text = "X Y Values"; ObjectID = "3Zb-aI-qhA"; */ +"3Zb-aI-qhA.text" = "X Y Values"; + +/* Class = "UISegmentedControl"; 3fn-CR-JhB.segmentTitles[0] = "X"; ObjectID = "3fn-CR-JhB"; */ +"3fn-CR-JhB.segmentTitles[0]" = "X"; + +/* Class = "UISegmentedControl"; 3fn-CR-JhB.segmentTitles[1] = "Y"; ObjectID = "3fn-CR-JhB"; */ +"3fn-CR-JhB.segmentTitles[1]" = "Y"; + +/* Class = "UISegmentedControl"; 3fn-CR-JhB.segmentTitles[2] = "XY"; ObjectID = "3fn-CR-JhB"; */ +"3fn-CR-JhB.segmentTitles[2]" = "XY"; + +/* Class = "UISegmentedControl"; 3fn-CR-JhB.segmentTitles[3] = "Disabled"; ObjectID = "3fn-CR-JhB"; */ +"3fn-CR-JhB.segmentTitles[3]" = "Disabled"; + +/* Class = "UINavigationItem"; title = "Selection Modes"; ObjectID = "3jf-fg-a1m"; */ +"3jf-fg-a1m.title" = "Selection Modes"; + +/* Class = "UINavigationItem"; title = "Custom Tooltips"; ObjectID = "4mt-3y-STV"; */ +"4mt-3y-STV.title" = "Custom Tooltips"; + +/* Class = "UILabel"; text = "Point Index"; ObjectID = "75d-9j-w5m"; */ +"75d-9j-w5m.text" = "Point Index"; + +/* Class = "UINavigationItem"; title = "Annotations"; ObjectID = "7WY-l1-EQK"; */ +"7WY-l1-EQK.title" = "Annotations"; + +/* Class = "UINavigationItem"; title = "Theming"; ObjectID = "8HY-5m-v7a"; */ +"8HY-5m-v7a.title" = "Theming"; + +/* Class = "UILabel"; text = "Zoom mode"; ObjectID = "8qC-od-0ts"; */ +"8qC-od-0ts.text" = "Zoom mode"; + +/* Class = "UISegmentedControl"; 8rk-86-cgC.segmentTitles[0] = "None"; ObjectID = "8rk-86-cgC"; */ +"8rk-86-cgC.segmentTitles[0]" = "None"; + +/* Class = "UISegmentedControl"; 8rk-86-cgC.segmentTitles[1] = "Left"; ObjectID = "8rk-86-cgC"; */ +"8rk-86-cgC.segmentTitles[1]" = "Left"; + +/* Class = "UISegmentedControl"; 8rk-86-cgC.segmentTitles[2] = "Top"; ObjectID = "8rk-86-cgC"; */ +"8rk-86-cgC.segmentTitles[2]" = "Top"; + +/* Class = "UISegmentedControl"; 8rk-86-cgC.segmentTitles[3] = "Right"; ObjectID = "8rk-86-cgC"; */ +"8rk-86-cgC.segmentTitles[3]" = "Right"; + +/* Class = "UISegmentedControl"; 8rk-86-cgC.segmentTitles[4] = "Bottom"; ObjectID = "8rk-86-cgC"; */ +"8rk-86-cgC.segmentTitles[4]" = "Bottom"; + +/* Class = "UISegmentedControl"; 8rk-86-cgC.segmentTitles[5] = "Center"; ObjectID = "8rk-86-cgC"; */ +"8rk-86-cgC.segmentTitles[5]" = "Center"; + +/* Class = "UILabel"; text = "Series"; ObjectID = "9xl-bu-qNV"; */ +"9xl-bu-qNV.text" = "Series"; + +/* Class = "UINavigationItem"; title = "Getting Started"; ObjectID = "AQM-7d-rGy"; */ +"AQM-7d-rGy.title" = "Getting Started"; + +/* Class = "UIBarButtonItem"; title = "Snapshot"; ObjectID = "DfF-89-8OJ"; */ +"DfF-89-8OJ.title" = "Snapshot"; + +/* Class = "UINavigationItem"; title = "Multiple Axes"; ObjectID = "Il8-E5-FBG"; */ +"Il8-E5-FBG.title" = "Multiple Axes"; + +/* Class = "UINavigationItem"; title = "Legend and TItles"; ObjectID = "JkL-T7-VtW"; */ +"JkL-T7-VtW.title" = "Legend and TItles"; + +/* Class = "UINavigationItem"; title = "Data Labels"; ObjectID = "KCT-aG-Rg4"; */ +"KCT-aG-Rg4.title" = "Data Labels"; + +/* Class = "UINavigationItem"; title = "Update Animation"; ObjectID = "KTI-ZM-zHy"; */ +"KTI-ZM-zHy.title" = "Update Animation"; + +/* Class = "UILabel"; text = "Chart Element"; ObjectID = "LWa-Kl-acd"; */ +"LWa-Kl-acd.text" = "Chart Element"; + +/* Class = "UINavigationItem"; title = "Basic Chart Types"; ObjectID = "NBt-FV-QtC"; */ +"NBt-FV-QtC.title" = "Basic Chart Types"; + +/* Class = "UINavigationItem"; title = "Conditional Formatting"; ObjectID = "NP2-Pc-gE0"; */ +"NP2-Pc-gE0.title" = "Conditional Formatting"; + +/* Class = "UINavigationItem"; title = "Export Image"; ObjectID = "PU8-Nc-hf9"; */ +"PU8-Nc-hf9.title" = "Export Image"; + +/* Class = "UILabel"; text = "Title"; ObjectID = "Qaz-W0-69e"; */ +"Qaz-W0-69e.text" = "Title"; + +/* Class = "UINavigationItem"; title = "Dynamic Charts"; ObjectID = "UMe-kt-zOT"; */ +"UMe-kt-zOT.title" = "Dynamic Charts"; + +/* Class = "UINavigationItem"; title = "Styling"; ObjectID = "Upi-Db-O1U"; */ +"Upi-Db-O1U.title" = "Styling"; + +/* Class = "UINavigationItem"; title = "Scrolling"; ObjectID = "VFR-EG-SYX"; */ +"VFR-EG-SYX.title" = "Scrolling"; + +/* Class = "UILabel"; text = "Expenses"; ObjectID = "W68-pQ-mxe"; */ +"W68-pQ-mxe.text" = "Expenses"; + +/* Class = "UINavigationItem"; title = "Load Animation"; ObjectID = "WEr-SH-6Ni"; */ +"WEr-SH-6Ni.title" = "Load Animation"; + +/* Class = "UINavigationItem"; title = "Line Marker"; ObjectID = "Wep-bA-SwB"; */ +"Wep-bA-SwB.title" = "Line Marker"; + +/* Class = "UINavigationItem"; title = "Customizing Axes"; ObjectID = "YF1-Hl-vBx"; */ +"YF1-Hl-vBx.title" = "Customizing Axes"; + +/* Class = "UISegmentedControl"; a4W-9s-xi7.segmentTitles[0] = "None"; ObjectID = "a4W-9s-xi7"; */ +"a4W-9s-xi7.segmentTitles[0]" = "None"; + +/* Class = "UISegmentedControl"; a4W-9s-xi7.segmentTitles[1] = "Move"; ObjectID = "a4W-9s-xi7"; */ +"a4W-9s-xi7.segmentTitles[1]" = "Move"; + +/* Class = "UISegmentedControl"; a4W-9s-xi7.segmentTitles[2] = "Drag"; ObjectID = "a4W-9s-xi7"; */ +"a4W-9s-xi7.segmentTitles[2]" = "Drag"; + +/* Class = "UINavigationItem"; title = "Hit Test"; ObjectID = "aPy-25-HQh"; */ +"aPy-25-HQh.title" = "Hit Test"; + +/* Class = "UINavigationItem"; title = "Financial Chart"; ObjectID = "bh7-Or-Iq1"; */ +"bh7-Or-Iq1.title" = "Financial Chart"; + +/* Class = "UINavigationItem"; title = "Custom Plot Elements"; ObjectID = "hna-U0-UrC"; */ +"hna-U0-UrC.title" = "Custom Plot Elements"; + +/* Class = "UINavigationItem"; title = "Bubble Chart"; ObjectID = "i8F-MK-1Fc"; */ +"i8F-MK-1Fc.title" = "Bubble Chart"; + +/* Class = "UINavigationItem"; title = "Zooming and Scrolling"; ObjectID = "txQ-Vd-QOC"; */ +"txQ-Vd-QOC.title" = "Zooming and Scrolling"; + +/* Class = "UINavigationItem"; title = "Toggle Series"; ObjectID = "vVz-HP-feV"; */ +"vVz-HP-feV.title" = "Toggle Series"; + +/* Class = "UILabel"; text = "Sales"; ObjectID = "wu0-uU-Fa0"; */ +"wu0-uU-Fa0.text" = "Sales"; + +/* Class = "UINavigationItem"; title = "FlexChart101"; ObjectID = "xGO-ok-ekk"; */ +"xGO-ok-ekk.title" = "FlexChart101"; diff --git a/ObjectiveC/FlexGrid101/FlexGrid101.xcodeproj/project.pbxproj b/ObjectiveC/FlexGrid101/FlexGrid101.xcodeproj/project.pbxproj index 1943ef4..28d1d05 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101.xcodeproj/project.pbxproj +++ b/ObjectiveC/FlexGrid101/FlexGrid101.xcodeproj/project.pbxproj @@ -7,6 +7,13 @@ objects = { /* Begin PBXBuildFile section */ + 4C06B2CB1D1F50F600363CF9 /* XuniCoreDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C06B2C81D1F50F600363CF9 /* XuniCoreDynamicKit.framework */; }; + 4C06B2CC1D1F50F600363CF9 /* XuniCoreDynamicKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4C06B2C81D1F50F600363CF9 /* XuniCoreDynamicKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4C06B2CD1D1F50F600363CF9 /* XuniFlexGridDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C06B2C91D1F50F600363CF9 /* XuniFlexGridDynamicKit.framework */; }; + 4C06B2CE1D1F50F600363CF9 /* XuniFlexGridDynamicKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4C06B2C91D1F50F600363CF9 /* XuniFlexGridDynamicKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4C06B2CF1D1F50F600363CF9 /* XuniGaugeDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C06B2CA1D1F50F600363CF9 /* XuniGaugeDynamicKit.framework */; }; + 4C06B2D01D1F50F600363CF9 /* XuniGaugeDynamicKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4C06B2CA1D1F50F600363CF9 /* XuniGaugeDynamicKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4C1C57061D26DED3007491EB /* flexgrid_headers.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C1C57051D26DED3007491EB /* flexgrid_headers.png */; }; 4C219E801C91B3240089B6B0 /* filter.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C219E711C91B3240089B6B0 /* filter.png */; }; 4C219E811C91B3240089B6B0 /* flexgrid_columns.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C219E721C91B3240089B6B0 /* flexgrid_columns.png */; }; 4C219E821C91B3240089B6B0 /* flexgrid_custom.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C219E731C91B3240089B6B0 /* flexgrid_custom.png */; }; @@ -24,29 +31,34 @@ 4C219E8E1C91B3240089B6B0 /* show.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C219E7F1C91B3240089B6B0 /* show.png */; }; 4C219E921C91C3FD0089B6B0 /* RowDetailsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C219E911C91C3FD0089B6B0 /* RowDetailsViewController.m */; }; 4C219E981C91C90D0089B6B0 /* CustomMergingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C219E971C91C90D0089B6B0 /* CustomMergingViewController.m */; }; + 4C26BAAA1D1305AA00F65D77 /* UnboundSampleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C26BAA91D1305AA00F65D77 /* UnboundSampleViewController.m */; }; + 4C393DCF1D2666BA0053B783 /* XuniCoreDesignTimeStoryboardSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C393DCE1D2666BA0053B783 /* XuniCoreDesignTimeStoryboardSupport.m */; }; + 4C393DD21D2667150053B783 /* XuniFlexGridDesignTimeStoryboardSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C393DD01D2667150053B783 /* XuniFlexGridDesignTimeStoryboardSupport.m */; }; + 4C393DD31D2667150053B783 /* XuniGaugeDesignTimeStoryboardSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C393DD11D2667150053B783 /* XuniGaugeDesignTimeStoryboardSupport.m */; }; 4C41F60E1BDE854900D3F97A /* OnDemandController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C41F60D1BDE854900D3F97A /* OnDemandController.m */; }; 4C435CA51BD7AA1E0099A651 /* StarSizingController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C435CA41BD7AA1D0099A651 /* StarSizingController.m */; }; 4C435CAA1BD7FD930099A651 /* FrozenCellsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C435CA91BD7FD930099A651 /* FrozenCellsController.m */; }; 4C435CB11BD8C5F20099A651 /* ConditionalFormattingController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C435CB01BD8C5F10099A651 /* ConditionalFormattingController.m */; }; 4C435CBC1BD8D92B0099A651 /* EditingFormController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C435CBB1BD8D92B0099A651 /* EditingFormController.m */; }; + 4C58D0581CAC305100A6DF33 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C58D0571CAC305100A6DF33 /* MapKit.framework */; }; + 4C58D05A1CAC324100A6DF33 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C58D0591CAC324100A6DF33 /* CoreLocation.framework */; }; 4C63EDBE1BD94F6E00209E09 /* CustomerObjectEditor.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C63EDBD1BD94F6E00209E09 /* CustomerObjectEditor.m */; }; 4C63EDC11BD95A2700209E09 /* ColumnLayoutController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C63EDC01BD95A2700209E09 /* ColumnLayoutController.m */; }; 4C63EDC61BDA1AED00209E09 /* ColumnReordererTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C63EDC51BDA1AED00209E09 /* ColumnReordererTableViewController.m */; }; 4CA291021C07BD78008EA95D /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4CA291041C07BD78008EA95D /* Localizable.strings */; }; + 4CA67B5B1CAFE64700A1EE91 /* YouTubeCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA67B5A1CAFE64700A1EE91 /* YouTubeCollectionView.m */; }; + 4CA67B5E1CAFE76700A1EE91 /* SampleData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA67B5D1CAFE76700A1EE91 /* SampleData.m */; }; + 4CE266B41CB43C6000FD8F3C /* FilterGridViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE266B31CB43C6000FD8F3C /* FilterGridViewController.m */; }; F235736B1B44608100F300D7 /* License.m in Sources */ = {isa = PBXBuildFile; fileRef = F235736A1B44608100F300D7 /* License.m */; }; F23675D31B59503000194040 /* EditConfirmationController.m in Sources */ = {isa = PBXBuildFile; fileRef = F23675D21B59503000194040 /* EditConfirmationController.m */; }; - F2BA19551B2883CF00F2B835 /* XuniGaugeKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F2BA19541B2883CF00F2B835 /* XuniGaugeKit.framework */; }; - F2BA19581B288F1600F2B835 /* EditingController.m in Sources */ = {isa = PBXBuildFile; fileRef = F2BA19571B288F1600F2B835 /* EditingController.m */; }; - F2BA19941B2B1E3200F2B835 /* FilterFormController.m in Sources */ = {isa = PBXBuildFile; fileRef = F2BA19931B2B1E3200F2B835 /* FilterFormController.m */; }; - F2CFF3BF1B7122BB00FE6FDF /* SharedFilterData.m in Sources */ = {isa = PBXBuildFile; fileRef = F2CFF3BE1B7122BB00FE6FDF /* SharedFilterData.m */; }; + F2BA19581B288F1600F2B835 /* GettingStartedController.m in Sources */ = {isa = PBXBuildFile; fileRef = F2BA19571B288F1600F2B835 /* GettingStartedController.m */; }; + F2CFF3BF1B7122BB00FE6FDF /* FilterData.m in Sources */ = {isa = PBXBuildFile; fileRef = F2CFF3BE1B7122BB00FE6FDF /* FilterData.m */; }; F2E2A9F31B27254E00AFEA5D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F2E2A9F21B27254E00AFEA5D /* main.m */; }; F2E2A9F61B27254E00AFEA5D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F2E2A9F51B27254E00AFEA5D /* AppDelegate.m */; }; - F2E2A9F91B27254E00AFEA5D /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F2E2A9F81B27254E00AFEA5D /* ViewController.m */; }; F2E2A9FC1B27254E00AFEA5D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F2E2A9FA1B27254E00AFEA5D /* Main.storyboard */; }; F2E2A9FE1B27254E00AFEA5D /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F2E2A9FD1B27254E00AFEA5D /* Images.xcassets */; }; F2E2AA011B27254E00AFEA5D /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = F2E2A9FF1B27254E00AFEA5D /* LaunchScreen.xib */; }; F2E2AA0D1B27254E00AFEA5D /* FlexGrid101Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = F2E2AA0C1B27254E00AFEA5D /* FlexGrid101Tests.m */; }; - F2E2AA261B27300A00AFEA5D /* GettingStartedController.m in Sources */ = {isa = PBXBuildFile; fileRef = F2E2AA251B27300A00AFEA5D /* GettingStartedController.m */; }; F2E2AA291B27302300AFEA5D /* ColumnDefinitionsController.m in Sources */ = {isa = PBXBuildFile; fileRef = F2E2AA281B27302300AFEA5D /* ColumnDefinitionsController.m */; }; F2E2AA2C1B27303700AFEA5D /* SelectionModesController.m in Sources */ = {isa = PBXBuildFile; fileRef = F2E2AA2B1B27303700AFEA5D /* SelectionModesController.m */; }; F2E2AA2F1B27304C00AFEA5D /* CustomCellsController.m in Sources */ = {isa = PBXBuildFile; fileRef = F2E2AA2E1B27304C00AFEA5D /* CustomCellsController.m */; }; @@ -54,8 +66,6 @@ F2E2AA351B27307300AFEA5D /* FilterController.m in Sources */ = {isa = PBXBuildFile; fileRef = F2E2AA341B27307300AFEA5D /* FilterController.m */; }; F2E2AA381B27308500AFEA5D /* FullTextFilterController.m in Sources */ = {isa = PBXBuildFile; fileRef = F2E2AA371B27308500AFEA5D /* FullTextFilterController.m */; }; F2E2AA3E1B2731B700AFEA5D /* CustomerData.m in Sources */ = {isa = PBXBuildFile; fileRef = F2E2AA3D1B2731B700AFEA5D /* CustomerData.m */; }; - F2E2AA401B27345900AFEA5D /* XuniCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F2E2AA3F1B27345900AFEA5D /* XuniCoreKit.framework */; settings = {ATTRIBUTES = (Required, ); }; }; - F2E2AA421B27346E00AFEA5D /* XuniFlexGridKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F2E2AA411B27346E00AFEA5D /* XuniFlexGridKit.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -68,7 +78,27 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + 4C6165221D18490E0044D30A /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 4C06B2CE1D1F50F600363CF9 /* XuniFlexGridDynamicKit.framework in Embed Frameworks */, + 4C06B2CC1D1F50F600363CF9 /* XuniCoreDynamicKit.framework in Embed Frameworks */, + 4C06B2D01D1F50F600363CF9 /* XuniGaugeDynamicKit.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ + 4C06B2C81D1F50F600363CF9 /* XuniCoreDynamicKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreDynamicKit.framework; path = ../../../Controls/XuniCoreDynamicKit.framework; sourceTree = ""; }; + 4C06B2C91D1F50F600363CF9 /* XuniFlexGridDynamicKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniFlexGridDynamicKit.framework; path = ../../../Controls/XuniFlexGridDynamicKit.framework; sourceTree = ""; }; + 4C06B2CA1D1F50F600363CF9 /* XuniGaugeDynamicKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniGaugeDynamicKit.framework; path = ../../../Controls/XuniGaugeDynamicKit.framework; sourceTree = ""; }; + 4C1C57051D26DED3007491EB /* flexgrid_headers.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = flexgrid_headers.png; sourceTree = ""; }; 4C219E711C91B3240089B6B0 /* filter.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = filter.png; sourceTree = ""; }; 4C219E721C91B3240089B6B0 /* flexgrid_columns.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = flexgrid_columns.png; sourceTree = ""; }; 4C219E731C91B3240089B6B0 /* flexgrid_custom.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = flexgrid_custom.png; sourceTree = ""; }; @@ -88,6 +118,11 @@ 4C219E911C91C3FD0089B6B0 /* RowDetailsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RowDetailsViewController.m; sourceTree = ""; }; 4C219E961C91C90D0089B6B0 /* CustomMergingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomMergingViewController.h; sourceTree = ""; }; 4C219E971C91C90D0089B6B0 /* CustomMergingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomMergingViewController.m; sourceTree = ""; }; + 4C26BAA81D1305AA00F65D77 /* UnboundSampleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnboundSampleViewController.h; sourceTree = ""; }; + 4C26BAA91D1305AA00F65D77 /* UnboundSampleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UnboundSampleViewController.m; sourceTree = ""; }; + 4C393DCE1D2666BA0053B783 /* XuniCoreDesignTimeStoryboardSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XuniCoreDesignTimeStoryboardSupport.m; path = ../../../Controls/XuniCoreDesignTimeStoryboardSupport.m; sourceTree = ""; }; + 4C393DD01D2667150053B783 /* XuniFlexGridDesignTimeStoryboardSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XuniFlexGridDesignTimeStoryboardSupport.m; path = ../../../Controls/XuniFlexGridDesignTimeStoryboardSupport.m; sourceTree = ""; }; + 4C393DD11D2667150053B783 /* XuniGaugeDesignTimeStoryboardSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XuniGaugeDesignTimeStoryboardSupport.m; path = ../../../Controls/XuniGaugeDesignTimeStoryboardSupport.m; sourceTree = ""; }; 4C41F60C1BDE854900D3F97A /* OnDemandController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OnDemandController.h; sourceTree = ""; }; 4C41F60D1BDE854900D3F97A /* OnDemandController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OnDemandController.m; sourceTree = ""; }; 4C435CA31BD7AA1D0099A651 /* StarSizingController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StarSizingController.h; sourceTree = ""; }; @@ -98,42 +133,43 @@ 4C435CB01BD8C5F10099A651 /* ConditionalFormattingController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ConditionalFormattingController.m; sourceTree = ""; }; 4C435CBA1BD8D92B0099A651 /* EditingFormController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EditingFormController.h; sourceTree = ""; }; 4C435CBB1BD8D92B0099A651 /* EditingFormController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EditingFormController.m; sourceTree = ""; }; + 4C58D04B1CA9B8EB00A6DF33 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Main.strings; sourceTree = ""; }; + 4C58D0571CAC305100A6DF33 /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = System/Library/Frameworks/MapKit.framework; sourceTree = SDKROOT; }; + 4C58D0591CAC324100A6DF33 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; 4C63EDBC1BD94F6E00209E09 /* CustomerObjectEditor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomerObjectEditor.h; sourceTree = ""; }; 4C63EDBD1BD94F6E00209E09 /* CustomerObjectEditor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomerObjectEditor.m; sourceTree = ""; }; 4C63EDBF1BD95A2700209E09 /* ColumnLayoutController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ColumnLayoutController.h; sourceTree = ""; }; 4C63EDC01BD95A2700209E09 /* ColumnLayoutController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ColumnLayoutController.m; sourceTree = ""; }; 4C63EDC41BDA1AED00209E09 /* ColumnReordererTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ColumnReordererTableViewController.h; sourceTree = ""; }; 4C63EDC51BDA1AED00209E09 /* ColumnReordererTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ColumnReordererTableViewController.m; sourceTree = ""; }; - 4CA291001C07BD6F008EA95D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Main.strings; sourceTree = ""; }; 4CA291011C07BD70008EA95D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/LaunchScreen.strings; sourceTree = ""; }; 4CA291031C07BD78008EA95D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; 4CA291051C07BD7A008EA95D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; + 4CA67B591CAFE64700A1EE91 /* YouTubeCollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YouTubeCollectionView.h; sourceTree = ""; }; + 4CA67B5A1CAFE64700A1EE91 /* YouTubeCollectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YouTubeCollectionView.m; sourceTree = ""; }; + 4CA67B5C1CAFE76700A1EE91 /* SampleData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SampleData.h; sourceTree = ""; }; + 4CA67B5D1CAFE76700A1EE91 /* SampleData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SampleData.m; sourceTree = ""; }; + 4CE266B21CB43C6000FD8F3C /* FilterGridViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FilterGridViewController.h; sourceTree = ""; }; + 4CE266B31CB43C6000FD8F3C /* FilterGridViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FilterGridViewController.m; sourceTree = ""; }; F23573691B44608100F300D7 /* License.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = License.h; sourceTree = ""; }; F235736A1B44608100F300D7 /* License.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = License.m; sourceTree = ""; }; F23675D11B59503000194040 /* EditConfirmationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EditConfirmationController.h; sourceTree = ""; }; F23675D21B59503000194040 /* EditConfirmationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EditConfirmationController.m; sourceTree = ""; }; - F2BA19541B2883CF00F2B835 /* XuniGaugeKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniGaugeKit.framework; path = "../../../Controls/XuniGaugeKit.framework"; sourceTree = ""; }; - F2BA19561B288F1600F2B835 /* EditingController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EditingController.h; sourceTree = ""; }; - F2BA19571B288F1600F2B835 /* EditingController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EditingController.m; sourceTree = ""; }; - F2BA19921B2B1E3200F2B835 /* FilterFormController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FilterFormController.h; sourceTree = ""; }; - F2BA19931B2B1E3200F2B835 /* FilterFormController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FilterFormController.m; sourceTree = ""; }; - F2CFF3BD1B7122BB00FE6FDF /* SharedFilterData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SharedFilterData.h; sourceTree = ""; }; - F2CFF3BE1B7122BB00FE6FDF /* SharedFilterData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SharedFilterData.m; sourceTree = ""; }; + F2BA19561B288F1600F2B835 /* GettingStartedController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GettingStartedController.h; sourceTree = ""; }; + F2BA19571B288F1600F2B835 /* GettingStartedController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GettingStartedController.m; sourceTree = ""; }; + F2CFF3BD1B7122BB00FE6FDF /* FilterData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FilterData.h; sourceTree = ""; }; + F2CFF3BE1B7122BB00FE6FDF /* FilterData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FilterData.m; sourceTree = ""; }; F2E2A9ED1B27254C00AFEA5D /* FlexGrid101.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FlexGrid101.app; sourceTree = BUILT_PRODUCTS_DIR; }; F2E2A9F11B27254E00AFEA5D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; F2E2A9F21B27254E00AFEA5D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; F2E2A9F41B27254E00AFEA5D /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; F2E2A9F51B27254E00AFEA5D /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - F2E2A9F71B27254E00AFEA5D /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - F2E2A9F81B27254E00AFEA5D /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; F2E2A9FB1B27254E00AFEA5D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; F2E2A9FD1B27254E00AFEA5D /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; F2E2AA001B27254E00AFEA5D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; F2E2AA061B27254E00AFEA5D /* FlexGrid101Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FlexGrid101Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; F2E2AA0B1B27254E00AFEA5D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; F2E2AA0C1B27254E00AFEA5D /* FlexGrid101Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FlexGrid101Tests.m; sourceTree = ""; }; - F2E2AA241B27300A00AFEA5D /* GettingStartedController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GettingStartedController.h; sourceTree = ""; }; - F2E2AA251B27300A00AFEA5D /* GettingStartedController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GettingStartedController.m; sourceTree = ""; }; F2E2AA271B27302300AFEA5D /* ColumnDefinitionsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ColumnDefinitionsController.h; sourceTree = ""; }; F2E2AA281B27302300AFEA5D /* ColumnDefinitionsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ColumnDefinitionsController.m; sourceTree = ""; }; F2E2AA2A1B27303700AFEA5D /* SelectionModesController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectionModesController.h; sourceTree = ""; }; @@ -148,8 +184,6 @@ F2E2AA371B27308500AFEA5D /* FullTextFilterController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FullTextFilterController.m; sourceTree = ""; }; F2E2AA3C1B2731B700AFEA5D /* CustomerData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomerData.h; sourceTree = ""; }; F2E2AA3D1B2731B700AFEA5D /* CustomerData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomerData.m; sourceTree = ""; }; - F2E2AA3F1B27345900AFEA5D /* XuniCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreKit.framework; path = "../../../Controls/XuniCoreKit.framework"; sourceTree = ""; }; - F2E2AA411B27346E00AFEA5D /* XuniFlexGridKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniFlexGridKit.framework; path = "../../../Controls/XuniFlexGridKit.framework"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -157,9 +191,11 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F2E2AA401B27345900AFEA5D /* XuniCoreKit.framework in Frameworks */, - F2BA19551B2883CF00F2B835 /* XuniGaugeKit.framework in Frameworks */, - F2E2AA421B27346E00AFEA5D /* XuniFlexGridKit.framework in Frameworks */, + 4C06B2CD1D1F50F600363CF9 /* XuniFlexGridDynamicKit.framework in Frameworks */, + 4C58D05A1CAC324100A6DF33 /* CoreLocation.framework in Frameworks */, + 4C06B2CB1D1F50F600363CF9 /* XuniCoreDynamicKit.framework in Frameworks */, + 4C06B2CF1D1F50F600363CF9 /* XuniGaugeDynamicKit.framework in Frameworks */, + 4C58D0581CAC305100A6DF33 /* MapKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -176,6 +212,7 @@ 4C219E701C91B30E0089B6B0 /* Images */ = { isa = PBXGroup; children = ( + 4C1C57051D26DED3007491EB /* flexgrid_headers.png */, 4C219E711C91B3240089B6B0 /* filter.png */, 4C219E721C91B3240089B6B0 /* flexgrid_columns.png */, 4C219E731C91B3240089B6B0 /* flexgrid_custom.png */, @@ -213,12 +250,197 @@ name = CustomMerging; sourceTree = ""; }; + 4C26BAA71D13058E00F65D77 /* Unbound */ = { + isa = PBXGroup; + children = ( + 4C26BAA81D1305AA00F65D77 /* UnboundSampleViewController.h */, + 4C26BAA91D1305AA00F65D77 /* UnboundSampleViewController.m */, + ); + name = Unbound; + sourceTree = ""; + }; + 4C58D0431CA9583200A6DF33 /* ColumnDefinitions */ = { + isa = PBXGroup; + children = ( + F2E2AA271B27302300AFEA5D /* ColumnDefinitionsController.h */, + F2E2AA281B27302300AFEA5D /* ColumnDefinitionsController.m */, + ); + name = ColumnDefinitions; + sourceTree = ""; + }; + 4C58D0441CA95E2F00A6DF33 /* Data Model */ = { + isa = PBXGroup; + children = ( + F2E2AA3C1B2731B700AFEA5D /* CustomerData.h */, + F2E2AA3D1B2731B700AFEA5D /* CustomerData.m */, + ); + name = "Data Model"; + sourceTree = ""; + }; + 4C58D0451CA95E3A00A6DF33 /* Samples */ = { + isa = PBXGroup; + children = ( + 4C26BAA71D13058E00F65D77 /* Unbound */, + 4CA67B651CB1CFA700A1EE91 /* Filter */, + 4CA67B641CB1CE9D00A1EE91 /* FullTextFilter */, + 4CA67B631CB1B29800A1EE91 /* Freezing&Merging */, + 4CA67B621CB1B09E00A1EE91 /* Star Sizing */, + 4CA67B611CB1A5A600A1EE91 /* ColumnLayout */, + 4CA67B551CAFE5EB00A1EE91 /* OnDemand */, + 4C58D0561CAAA3FD00A6DF33 /* Grouping */, + 4C58D04D1CAA998100A6DF33 /* CustomCells */, + 4C58D04C1CAA967200A6DF33 /* ConditionalFormatting */, + 4C58D0461CA9639C00A6DF33 /* GettingStarted */, + 4C58D0491CA9B02F00A6DF33 /* EditingForm */, + 4C58D0481CA9AD7200A6DF33 /* EditConfirmation */, + 4C58D0471CA99EB400A6DF33 /* SelectionModes */, + 4C58D0431CA9583200A6DF33 /* ColumnDefinitions */, + 4C219E8F1C91C3ED0089B6B0 /* RowDetails */, + 4C219E951C91C8FA0089B6B0 /* CustomMerging */, + ); + name = Samples; + sourceTree = ""; + }; + 4C58D0461CA9639C00A6DF33 /* GettingStarted */ = { + isa = PBXGroup; + children = ( + F2BA19561B288F1600F2B835 /* GettingStartedController.h */, + F2BA19571B288F1600F2B835 /* GettingStartedController.m */, + ); + name = GettingStarted; + sourceTree = ""; + }; + 4C58D0471CA99EB400A6DF33 /* SelectionModes */ = { + isa = PBXGroup; + children = ( + F2E2AA2A1B27303700AFEA5D /* SelectionModesController.h */, + F2E2AA2B1B27303700AFEA5D /* SelectionModesController.m */, + ); + name = SelectionModes; + sourceTree = ""; + }; + 4C58D0481CA9AD7200A6DF33 /* EditConfirmation */ = { + isa = PBXGroup; + children = ( + F23675D11B59503000194040 /* EditConfirmationController.h */, + F23675D21B59503000194040 /* EditConfirmationController.m */, + ); + name = EditConfirmation; + sourceTree = ""; + }; + 4C58D0491CA9B02F00A6DF33 /* EditingForm */ = { + isa = PBXGroup; + children = ( + 4C63EDBC1BD94F6E00209E09 /* CustomerObjectEditor.h */, + 4C63EDBD1BD94F6E00209E09 /* CustomerObjectEditor.m */, + 4C435CBA1BD8D92B0099A651 /* EditingFormController.h */, + 4C435CBB1BD8D92B0099A651 /* EditingFormController.m */, + ); + name = EditingForm; + sourceTree = ""; + }; + 4C58D04C1CAA967200A6DF33 /* ConditionalFormatting */ = { + isa = PBXGroup; + children = ( + 4C435CAF1BD8C5F10099A651 /* ConditionalFormattingController.h */, + 4C435CB01BD8C5F10099A651 /* ConditionalFormattingController.m */, + ); + name = ConditionalFormatting; + sourceTree = ""; + }; + 4C58D04D1CAA998100A6DF33 /* CustomCells */ = { + isa = PBXGroup; + children = ( + F2E2AA2D1B27304C00AFEA5D /* CustomCellsController.h */, + F2E2AA2E1B27304C00AFEA5D /* CustomCellsController.m */, + ); + name = CustomCells; + sourceTree = ""; + }; + 4C58D0561CAAA3FD00A6DF33 /* Grouping */ = { + isa = PBXGroup; + children = ( + F2E2AA301B27306300AFEA5D /* GroupingController.h */, + F2E2AA311B27306300AFEA5D /* GroupingController.m */, + ); + name = Grouping; + sourceTree = ""; + }; + 4CA67B551CAFE5EB00A1EE91 /* OnDemand */ = { + isa = PBXGroup; + children = ( + 4CA67B5C1CAFE76700A1EE91 /* SampleData.h */, + 4CA67B5D1CAFE76700A1EE91 /* SampleData.m */, + 4CA67B591CAFE64700A1EE91 /* YouTubeCollectionView.h */, + 4CA67B5A1CAFE64700A1EE91 /* YouTubeCollectionView.m */, + 4C41F60C1BDE854900D3F97A /* OnDemandController.h */, + 4C41F60D1BDE854900D3F97A /* OnDemandController.m */, + ); + name = OnDemand; + sourceTree = ""; + }; + 4CA67B611CB1A5A600A1EE91 /* ColumnLayout */ = { + isa = PBXGroup; + children = ( + 4C63EDC41BDA1AED00209E09 /* ColumnReordererTableViewController.h */, + 4C63EDC51BDA1AED00209E09 /* ColumnReordererTableViewController.m */, + 4C63EDBF1BD95A2700209E09 /* ColumnLayoutController.h */, + 4C63EDC01BD95A2700209E09 /* ColumnLayoutController.m */, + ); + name = ColumnLayout; + sourceTree = ""; + }; + 4CA67B621CB1B09E00A1EE91 /* Star Sizing */ = { + isa = PBXGroup; + children = ( + 4C435CA31BD7AA1D0099A651 /* StarSizingController.h */, + 4C435CA41BD7AA1D0099A651 /* StarSizingController.m */, + ); + name = "Star Sizing"; + sourceTree = ""; + }; + 4CA67B631CB1B29800A1EE91 /* Freezing&Merging */ = { + isa = PBXGroup; + children = ( + 4C435CA81BD7FD930099A651 /* FrozenCellsController.h */, + 4C435CA91BD7FD930099A651 /* FrozenCellsController.m */, + ); + name = "Freezing&Merging"; + sourceTree = ""; + }; + 4CA67B641CB1CE9D00A1EE91 /* FullTextFilter */ = { + isa = PBXGroup; + children = ( + F2E2AA361B27308500AFEA5D /* FullTextFilterController.h */, + F2E2AA371B27308500AFEA5D /* FullTextFilterController.m */, + ); + name = FullTextFilter; + sourceTree = ""; + }; + 4CA67B651CB1CFA700A1EE91 /* Filter */ = { + isa = PBXGroup; + children = ( + F2E2AA331B27307300AFEA5D /* FilterController.h */, + F2E2AA341B27307300AFEA5D /* FilterController.m */, + F2CFF3BD1B7122BB00FE6FDF /* FilterData.h */, + F2CFF3BE1B7122BB00FE6FDF /* FilterData.m */, + 4CE266B21CB43C6000FD8F3C /* FilterGridViewController.h */, + 4CE266B31CB43C6000FD8F3C /* FilterGridViewController.m */, + ); + name = Filter; + sourceTree = ""; + }; F2E2A9E41B27254C00AFEA5D = { isa = PBXGroup; children = ( - F2BA19541B2883CF00F2B835 /* XuniGaugeKit.framework */, - F2E2AA411B27346E00AFEA5D /* XuniFlexGridKit.framework */, - F2E2AA3F1B27345900AFEA5D /* XuniCoreKit.framework */, + 4C393DD01D2667150053B783 /* XuniFlexGridDesignTimeStoryboardSupport.m */, + 4C393DD11D2667150053B783 /* XuniGaugeDesignTimeStoryboardSupport.m */, + 4C393DCE1D2666BA0053B783 /* XuniCoreDesignTimeStoryboardSupport.m */, + 4C06B2C81D1F50F600363CF9 /* XuniCoreDynamicKit.framework */, + 4C06B2C91D1F50F600363CF9 /* XuniFlexGridDynamicKit.framework */, + 4C06B2CA1D1F50F600363CF9 /* XuniGaugeDynamicKit.framework */, + 4C58D0591CAC324100A6DF33 /* CoreLocation.framework */, + 4C58D0571CAC305100A6DF33 /* MapKit.framework */, F2E2A9EF1B27254C00AFEA5D /* FlexGrid101 */, F2E2AA091B27254E00AFEA5D /* FlexGrid101Tests */, F2E2A9EE1B27254C00AFEA5D /* Products */, @@ -237,59 +459,17 @@ F2E2A9EF1B27254C00AFEA5D /* FlexGrid101 */ = { isa = PBXGroup; children = ( - 4C219E951C91C8FA0089B6B0 /* CustomMerging */, - 4C219E8F1C91C3ED0089B6B0 /* RowDetails */, 4C219E701C91B30E0089B6B0 /* Images */, - F2CFF3BD1B7122BB00FE6FDF /* SharedFilterData.h */, - F2CFF3BE1B7122BB00FE6FDF /* SharedFilterData.m */, + 4C58D0441CA95E2F00A6DF33 /* Data Model */, + 4C58D0451CA95E3A00A6DF33 /* Samples */, F2E2A9F41B27254E00AFEA5D /* AppDelegate.h */, F2E2A9F51B27254E00AFEA5D /* AppDelegate.m */, - F2E2A9F71B27254E00AFEA5D /* ViewController.h */, - F2E2A9F81B27254E00AFEA5D /* ViewController.m */, + F23573691B44608100F300D7 /* License.h */, + F235736A1B44608100F300D7 /* License.m */, F2E2A9FA1B27254E00AFEA5D /* Main.storyboard */, F2E2A9FD1B27254E00AFEA5D /* Images.xcassets */, F2E2A9FF1B27254E00AFEA5D /* LaunchScreen.xib */, F2E2A9F01B27254E00AFEA5D /* Supporting Files */, - F2E2AA241B27300A00AFEA5D /* GettingStartedController.h */, - F2E2AA251B27300A00AFEA5D /* GettingStartedController.m */, - F2E2AA271B27302300AFEA5D /* ColumnDefinitionsController.h */, - F2E2AA281B27302300AFEA5D /* ColumnDefinitionsController.m */, - F2E2AA2A1B27303700AFEA5D /* SelectionModesController.h */, - F2E2AA2B1B27303700AFEA5D /* SelectionModesController.m */, - F2E2AA2D1B27304C00AFEA5D /* CustomCellsController.h */, - F2E2AA2E1B27304C00AFEA5D /* CustomCellsController.m */, - F2E2AA301B27306300AFEA5D /* GroupingController.h */, - F2E2AA311B27306300AFEA5D /* GroupingController.m */, - F2E2AA331B27307300AFEA5D /* FilterController.h */, - F2E2AA341B27307300AFEA5D /* FilterController.m */, - F2E2AA361B27308500AFEA5D /* FullTextFilterController.h */, - F2E2AA371B27308500AFEA5D /* FullTextFilterController.m */, - F2E2AA3C1B2731B700AFEA5D /* CustomerData.h */, - F2E2AA3D1B2731B700AFEA5D /* CustomerData.m */, - F2BA19561B288F1600F2B835 /* EditingController.h */, - F2BA19571B288F1600F2B835 /* EditingController.m */, - F2BA19921B2B1E3200F2B835 /* FilterFormController.h */, - F2BA19931B2B1E3200F2B835 /* FilterFormController.m */, - F23573691B44608100F300D7 /* License.h */, - F235736A1B44608100F300D7 /* License.m */, - F23675D11B59503000194040 /* EditConfirmationController.h */, - F23675D21B59503000194040 /* EditConfirmationController.m */, - 4C435CA31BD7AA1D0099A651 /* StarSizingController.h */, - 4C435CA41BD7AA1D0099A651 /* StarSizingController.m */, - 4C435CA81BD7FD930099A651 /* FrozenCellsController.h */, - 4C435CA91BD7FD930099A651 /* FrozenCellsController.m */, - 4C435CAF1BD8C5F10099A651 /* ConditionalFormattingController.h */, - 4C435CB01BD8C5F10099A651 /* ConditionalFormattingController.m */, - 4C435CBA1BD8D92B0099A651 /* EditingFormController.h */, - 4C435CBB1BD8D92B0099A651 /* EditingFormController.m */, - 4C63EDBC1BD94F6E00209E09 /* CustomerObjectEditor.h */, - 4C63EDBD1BD94F6E00209E09 /* CustomerObjectEditor.m */, - 4C63EDBF1BD95A2700209E09 /* ColumnLayoutController.h */, - 4C63EDC01BD95A2700209E09 /* ColumnLayoutController.m */, - 4C63EDC41BDA1AED00209E09 /* ColumnReordererTableViewController.h */, - 4C63EDC51BDA1AED00209E09 /* ColumnReordererTableViewController.m */, - 4C41F60C1BDE854900D3F97A /* OnDemandController.h */, - 4C41F60D1BDE854900D3F97A /* OnDemandController.m */, 4CA291041C07BD78008EA95D /* Localizable.strings */, ); path = FlexGrid101; @@ -331,6 +511,7 @@ F2E2A9E91B27254C00AFEA5D /* Sources */, F2E2A9EA1B27254C00AFEA5D /* Frameworks */, F2E2A9EB1B27254C00AFEA5D /* Resources */, + 4C6165221D18490E0044D30A /* Embed Frameworks */, ); buildRules = ( ); @@ -421,6 +602,7 @@ F2E2A9FE1B27254E00AFEA5D /* Images.xcassets in Resources */, 4C219E891C91B3240089B6B0 /* flexgrid_selection.png in Resources */, 4C219E8C1C91B3240089B6B0 /* input_form.png in Resources */, + 4C1C57061D26DED3007491EB /* flexgrid_headers.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -438,30 +620,34 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - F2E2A9F91B27254E00AFEA5D /* ViewController.m in Sources */, 4C41F60E1BDE854900D3F97A /* OnDemandController.m in Sources */, F23675D31B59503000194040 /* EditConfirmationController.m in Sources */, F2E2AA351B27307300AFEA5D /* FilterController.m in Sources */, F2E2AA291B27302300AFEA5D /* ColumnDefinitionsController.m in Sources */, 4C219E981C91C90D0089B6B0 /* CustomMergingViewController.m in Sources */, - F2CFF3BF1B7122BB00FE6FDF /* SharedFilterData.m in Sources */, + F2CFF3BF1B7122BB00FE6FDF /* FilterData.m in Sources */, 4C63EDBE1BD94F6E00209E09 /* CustomerObjectEditor.m in Sources */, + 4CA67B5E1CAFE76700A1EE91 /* SampleData.m in Sources */, 4C435CA51BD7AA1E0099A651 /* StarSizingController.m in Sources */, - F2BA19941B2B1E3200F2B835 /* FilterFormController.m in Sources */, F2E2A9F61B27254E00AFEA5D /* AppDelegate.m in Sources */, 4C219E921C91C3FD0089B6B0 /* RowDetailsViewController.m in Sources */, F235736B1B44608100F300D7 /* License.m in Sources */, F2E2AA3E1B2731B700AFEA5D /* CustomerData.m in Sources */, + 4C393DCF1D2666BA0053B783 /* XuniCoreDesignTimeStoryboardSupport.m in Sources */, + 4C26BAAA1D1305AA00F65D77 /* UnboundSampleViewController.m in Sources */, 4C435CBC1BD8D92B0099A651 /* EditingFormController.m in Sources */, F2E2AA2F1B27304C00AFEA5D /* CustomCellsController.m in Sources */, 4C63EDC11BD95A2700209E09 /* ColumnLayoutController.m in Sources */, 4C435CB11BD8C5F20099A651 /* ConditionalFormattingController.m in Sources */, + 4C393DD31D2667150053B783 /* XuniGaugeDesignTimeStoryboardSupport.m in Sources */, 4C63EDC61BDA1AED00209E09 /* ColumnReordererTableViewController.m in Sources */, - F2E2AA261B27300A00AFEA5D /* GettingStartedController.m in Sources */, F2E2A9F31B27254E00AFEA5D /* main.m in Sources */, F2E2AA381B27308500AFEA5D /* FullTextFilterController.m in Sources */, F2E2AA321B27306300AFEA5D /* GroupingController.m in Sources */, - F2BA19581B288F1600F2B835 /* EditingController.m in Sources */, + 4C393DD21D2667150053B783 /* XuniFlexGridDesignTimeStoryboardSupport.m in Sources */, + F2BA19581B288F1600F2B835 /* GettingStartedController.m in Sources */, + 4CA67B5B1CAFE64700A1EE91 /* YouTubeCollectionView.m in Sources */, + 4CE266B41CB43C6000FD8F3C /* FilterGridViewController.m in Sources */, F2E2AA2C1B27303700AFEA5D /* SelectionModesController.m in Sources */, 4C435CAA1BD7FD930099A651 /* FrozenCellsController.m in Sources */, ); @@ -499,7 +685,7 @@ isa = PBXVariantGroup; children = ( F2E2A9FB1B27254E00AFEA5D /* Base */, - 4CA291001C07BD6F008EA95D /* ja */, + 4C58D04B1CA9B8EB00A6DF33 /* ja */, ); name = Main.storyboard; sourceTree = ""; @@ -607,13 +793,10 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - ../../../Controls, - ../../../../Controls, - ); + ENABLE_BITCODE = YES; + FRAMEWORK_SEARCH_PATHS = ../../../Controls; INFOPLIST_FILE = FlexGrid101/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks $(CONFIGURATION_BUILD_DIR)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -623,13 +806,10 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - ../../../Controls, - ../../../../Controls, - ); + ENABLE_BITCODE = YES; + FRAMEWORK_SEARCH_PATHS = ../../../Controls; INFOPLIST_FILE = FlexGrid101/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks $(CONFIGURATION_BUILD_DIR)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/AppDelegate.m b/ObjectiveC/FlexGrid101/FlexGrid101/AppDelegate.m index 5b16806..7758f5f 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/AppDelegate.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/AppDelegate.m @@ -6,7 +6,7 @@ // #import "AppDelegate.h" -#import "XuniCoreKit/XuniCoreKit.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" #import "License.h" @interface AppDelegate () diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/Base.lproj/LaunchScreen.xib b/ObjectiveC/FlexGrid101/FlexGrid101/Base.lproj/LaunchScreen.xib index d3eac8d..930cf10 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/Base.lproj/LaunchScreen.xib +++ b/ObjectiveC/FlexGrid101/FlexGrid101/Base.lproj/LaunchScreen.xib @@ -1,8 +1,8 @@ - + - + diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/Base.lproj/Localizable.strings b/ObjectiveC/FlexGrid101/FlexGrid101/Base.lproj/Localizable.strings index 12c8d18..7ebedcf 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/Base.lproj/Localizable.strings +++ b/ObjectiveC/FlexGrid101/FlexGrid101/Base.lproj/Localizable.strings @@ -45,4 +45,11 @@ "Total" = "Total"; "Count" = "Count"; "Edit Columns" = "Edit Columns"; -"Done" = "Done"; \ No newline at end of file +"Done" = "Done"; +"Monday" = "Monday"; +"Tuesday" = "Tuesday"; +"Wednesday" = "Wednesday"; +"Thursday" = "Thursday"; +"Friday" = "Friday"; +"Saturday" = "Saturday"; +"Sunday" = "Sunday"; diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/Base.lproj/Main.storyboard b/ObjectiveC/FlexGrid101/FlexGrid101/Base.lproj/Main.storyboard index 3ea60c4..aaf966d 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/Base.lproj/Main.storyboard +++ b/ObjectiveC/FlexGrid101/FlexGrid101/Base.lproj/Main.storyboard @@ -1,8 +1,10 @@ - + - + + + @@ -16,33 +18,44 @@ + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + @@ -56,15 +69,15 @@ - + - + - + - - + + @@ -78,7 +91,7 @@ @@ -98,10 +111,9 @@ - - + @@ -116,7 +128,7 @@ - + @@ -129,13 +141,28 @@ + + + + + + + + + + + + + + + - + @@ -148,13 +175,27 @@ - + + + + + + + + + + + + + + + - + @@ -167,15 +208,30 @@ + + + + + + + + + + + + + + + - + - + @@ -186,36 +242,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + - + - - + + - + - - + + - - + + + + + + + + + + + + + + - + - + - + @@ -228,13 +352,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -247,18 +399,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + - + - + @@ -266,13 +457,27 @@ - + + + + + + + + + + + + + + + - + @@ -285,13 +490,33 @@ + + + + + + + + + + + + + + + + + + + + - + @@ -304,13 +529,28 @@ + + + + + + + + + + + + + + + - + @@ -323,14 +563,34 @@ + + + + + + + + + + + + + + + + + + + + - + @@ -344,6 +604,10 @@ + + + + @@ -658,9 +934,9 @@ - + - + @@ -672,13 +948,17 @@ - + + + + + - + @@ -701,20 +981,26 @@ + + + + - + + + - + @@ -729,7 +1015,7 @@ - + @@ -742,7 +1028,7 @@ - + @@ -755,13 +1041,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -794,7 +1124,7 @@ - + @@ -847,7 +1177,7 @@ - + @@ -900,7 +1230,7 @@ - + @@ -953,7 +1283,7 @@ - + @@ -1006,7 +1336,7 @@ - + @@ -1059,7 +1389,7 @@ - + @@ -1112,7 +1442,7 @@ - + @@ -1165,7 +1495,7 @@ - + @@ -1218,7 +1548,7 @@ - + @@ -1271,7 +1601,7 @@ - + @@ -1324,7 +1654,7 @@ - + @@ -1377,7 +1707,7 @@ - + @@ -1430,7 +1760,7 @@ - + @@ -1483,7 +1813,7 @@ - + @@ -1536,7 +1866,7 @@ - + @@ -1585,11 +1915,64 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -1665,27 +2048,89 @@ - - + + + + + + + + + + + + + + + + + + - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1696,6 +2141,7 @@ + @@ -1703,7 +2149,4 @@ - - - diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/ColumnDefinitionsController.m b/ObjectiveC/FlexGrid101/FlexGrid101/ColumnDefinitionsController.m index befdddf..941a319 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/ColumnDefinitionsController.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/ColumnDefinitionsController.m @@ -6,66 +6,68 @@ // #import "ColumnDefinitionsController.h" -#import "XuniFlexGridKit/XuniFlexGridKit.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" #import "CustomerData.h" @interface ColumnDefinitionsController () +@property (weak, nonatomic) IBOutlet FlexGrid *flex; @end @implementation ColumnDefinitionsController - + - (void)viewDidLoad { [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. - FlexGrid *flex = [[FlexGrid alloc] init]; - flex.columnHeaderFont = [UIFont boldSystemFontOfSize:flex.columnHeaderFont.pointSize]; - flex.autoGenerateColumns = false; - FlexColumn *c1 = [[FlexColumn alloc] init]; - c1.binding = @"customerID"; - c1.header = @"ID"; - c1.width = 100; - FlexColumn *c2 = [[FlexColumn alloc] init]; - c2.binding = @"firstName"; - c2.header = @"First Name"; - FlexColumn *c3 = [[FlexColumn alloc] init]; - c3.binding = @"lastName"; - c3.header = @"Last Name"; - FlexColumn *c4 = [[FlexColumn alloc] init]; - c4.binding = @"orderTotal"; - c4.header = @"Order Total"; - c4.format = @"N1"; + self.flex.columnHeaderFont = [UIFont boldSystemFontOfSize:self.flex.columnHeaderFont.pointSize]; + self.flex.autoGenerateColumns = false; + + GridColumn *active = [[GridColumn alloc] init]; + active.binding = @"active"; + active.widthType = GridColumnWidthPixel; + active.width = 70; + [self.flex.columns addObject:active]; - FlexColumn *c5 = [[FlexColumn alloc] init]; - c5.binding = @"countryID"; - c5.header = @"Country"; + GridColumn *identifier = [[GridColumn alloc] init]; + identifier.binding = @"customerID"; + identifier.isReadOnly = true; + identifier.widthType = GridColumnWidthPixel; + identifier.width = 100; + [self.flex.columns addObject:identifier]; + GridColumn *firstName = [[GridColumn alloc] init]; + firstName.binding = @"firstName"; + [self.flex.columns addObject:firstName]; - [flex.columns addObject:c5]; - [flex.columns addObject:c2]; - [flex.columns addObject:c3]; - [flex.columns addObject:c4]; - flex.itemsSource = [CustomerData getCustomerData:100]; - flex.isReadOnly = false; + GridColumn *lastName = [[GridColumn alloc] init]; + lastName.binding = @"lastName"; + [self.flex.columns addObject:lastName]; + GridColumn *orderTotal = [[GridColumn alloc] init]; + orderTotal.binding = @"orderTotal"; + orderTotal.format = @"C2"; + [self.flex.columns addObject:orderTotal]; + + GridColumn *countryID = [[GridColumn alloc] init]; + countryID.binding = @"countryID"; + countryID.header = @"Country"; + countryID.horizontalAlignment = NSTextAlignmentLeft; NSMutableArray *items = [NSMutableArray arrayWithArray:[CustomerData defaultCountries]]; - c5.dataMap = [[FlexDataMap alloc] initWithArray:items selectedValuePath:@"identifier" displayMemberPath:@"title"]; + countryID.dataMap = [[GridDataMap alloc] initWithArray:items selectedValuePath:@"identifier" displayMemberPath:@"title"]; + [self.flex.columns addObject:countryID]; - flex.tag = 1; - [self.view addSubview:flex]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -- (void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexGrid *flex = (FlexGrid*)[self.view viewWithTag:1]; + GridColumn *lastOrderDate = [[GridColumn alloc] init]; + lastOrderDate.binding = @"lastOrderDate"; + [self.flex.columns addObject:lastOrderDate]; - CGFloat ss = [UIApplication sharedApplication].statusBarFrame.size.height + self.navigationController.navigationBar.intrinsicContentSize.height; + GridColumn *lastOrderTime = [[GridColumn alloc] init]; + lastOrderTime.binding = @"lastOrderDate"; + lastOrderTime.header = @"Last Order Time"; + NSDateFormatter* datefmt = [[NSDateFormatter alloc] init]; + [datefmt setDateFormat:@"hh:mm a"]; + lastOrderTime.formatter = datefmt; + [self.flex.columns addObject:lastOrderTime]; - flex.frame = CGRectMake(0, ss, self.view.bounds.size.width, self.view.bounds.size.height - ss); - [flex setNeedsDisplay]; + self.flex.itemsSource = [CustomerData getCustomerData:100]; + self.flex.isReadOnly = false; } + @end \ No newline at end of file diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/ColumnLayoutController.h b/ObjectiveC/FlexGrid101/FlexGrid101/ColumnLayoutController.h index c8d5ce1..528ac47 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/ColumnLayoutController.h +++ b/ObjectiveC/FlexGrid101/FlexGrid101/ColumnLayoutController.h @@ -8,15 +8,12 @@ #import -#import "XuniFlexGridKit/XuniFlexGridKit.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" #import "CustomerData.h" #import "ColumnReordererTableViewController.h" @interface ColumnLayoutController : UIViewController -@property FlexGrid* flex; -@end - - -extern ColumnLayoutController* columnLayoutController; \ No newline at end of file +@property (weak, nonatomic) IBOutlet FlexGrid *flex; +@end \ No newline at end of file diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/ColumnLayoutController.m b/ObjectiveC/FlexGrid101/FlexGrid101/ColumnLayoutController.m index 0c6aa76..d250ff7 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/ColumnLayoutController.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/ColumnLayoutController.m @@ -12,37 +12,35 @@ @interface ColumnLayoutController () @end -ColumnLayoutController* columnLayoutController; - @implementation ColumnLayoutController { UIBarButtonItem *editButton; + UIBarButtonItem *restoreButton; + GridColumnCollection* columnsInitial; } - (void)viewDidLoad { - columnLayoutController = self; - [super viewDidLoad]; editButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Edit Columns", nil) style:UIBarButtonItemStylePlain target:self action:@selector(editColumns:)]; - self.navigationItem.rightBarButtonItem = editButton; + restoreButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Restore", nil) style:UIBarButtonItemStylePlain target:self action:@selector(restoreColumns:)]; + + self.navigationItem.rightBarButtonItems = [[NSArray alloc] initWithObjects:editButton, nil]; self.columnList.hidden = true; - // Do any additional setup after loading the view, typically from a nib. - _flex = [[FlexGrid alloc] init]; - _flex.columnHeaderFont = [UIFont boldSystemFontOfSize:_flex.columnHeaderFont.pointSize]; - _flex.isReadOnly = true; - _flex.itemsSource = [CustomerData getCustomerData:100]; - _flex.tag = 1; - [_flex autoSizeColumns:0 to:_flex.columns.count-1]; - [self.view addSubview:_flex]; - [self.view sendSubviewToBack:_flex]; + + self.flex.columnHeaderFont = [UIFont boldSystemFontOfSize:self.flex.columnHeaderFont.pointSize]; + self.flex.isReadOnly = true; + self.flex.itemsSource = [CustomerData getCustomerData:100]; + columnsInitial = [[GridColumnCollection alloc] init]; + for(int i = 0; i < self.flex.columns.count; i++) [columnsInitial addObject:self.flex.columns[i]]; + [self.flex autoSizeColumns:0 to:self.flex.columns.count-1]; } -(void)beginEditing { - [columnReorderTable.tableView reloadData]; + [((ColumnReordererTableViewController*)self.childViewControllers.firstObject).tableView reloadData]; self.columnList.alpha = 0; self.columnList.hidden = false; @@ -54,6 +52,7 @@ -(void)beginEditing editButton.title = NSLocalizedString(@"Done", nil); + self.navigationItem.rightBarButtonItems = [[NSArray alloc] initWithObjects:editButton, restoreButton, nil]; } -(void)endEditing @@ -66,8 +65,18 @@ -(void)endEditing editButton.title = NSLocalizedString(@"Edit Columns", nil); + self.navigationItem.rightBarButtonItems = [[NSArray alloc] initWithObjects:editButton, nil]; } +- (IBAction)restoreColumns:(id)sender +{ + [self.flex.columns removeAllObjects]; + for (int i = 0; i < columnsInitial.count; i++) { + [self.flex.columns addObject:columnsInitial[i]]; + } + + [((ColumnReordererTableViewController*)self.childViewControllers.firstObject).tableView reloadData]; +} - (IBAction)editColumns:(id)sender { @@ -82,18 +91,4 @@ - (IBAction)editColumns:(id)sender } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} -- (void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - - CGFloat ss = [UIApplication sharedApplication].statusBarFrame.size.height + self.navigationController.navigationBar.intrinsicContentSize.height; - - _flex.frame = CGRectMake(0, ss, self.view.bounds.size.width, self.view.bounds.size.height - ss); - [_flex setNeedsDisplay]; -} - - @end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/ColumnReordererTableViewController.h b/ObjectiveC/FlexGrid101/FlexGrid101/ColumnReordererTableViewController.h index c1f98ed..7b8f438 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/ColumnReordererTableViewController.h +++ b/ObjectiveC/FlexGrid101/FlexGrid101/ColumnReordererTableViewController.h @@ -11,5 +11,3 @@ @interface ColumnReordererTableViewController : UITableViewController @end - -extern ColumnReordererTableViewController* columnReorderTable; \ No newline at end of file diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/ColumnReordererTableViewController.m b/ObjectiveC/FlexGrid101/FlexGrid101/ColumnReordererTableViewController.m index 2e09fc3..4c9a93b 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/ColumnReordererTableViewController.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/ColumnReordererTableViewController.m @@ -11,31 +11,18 @@ @interface ColumnReordererTableViewController () @end -ColumnReordererTableViewController* columnReorderTable; @implementation ColumnReordererTableViewController - (void)viewDidLoad { - columnReorderTable = self; - [super viewDidLoad]; - - - // Uncomment the following line to preserve selection between presentations. - // self.clearsSelectionOnViewWillAppear = NO; - - // Uncomment the following line to display an Edit button in the navigation bar for this view controller. - // self.navigationItem.rightBarButtonItem = self.editButtonItem; - self.editing = true; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. } -#pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; @@ -43,7 +30,7 @@ - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - FlexGrid* fg = columnLayoutController.flex; + FlexGrid* fg = ((ColumnLayoutController*)self.parentViewController).flex; return fg.columns.count; } @@ -51,65 +38,34 @@ - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL" forIndexPath:indexPath]; - FlexGrid* fg = columnLayoutController.flex; - FlexColumn* col = [fg.columns objectAtIndex:indexPath.row]; + FlexGrid* fg = ((ColumnLayoutController*)self.parentViewController).flex; + GridColumn* col = [fg.columns objectAtIndex:indexPath.row]; cell.textLabel.text = col.header; - // Configure the cell... - return cell; } - -/* -// Override to support conditional editing of the table view. -- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { - // Return NO if you do not want the specified item to be editable. - return YES; -} -*/ - - -// Override to support editing the table view. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { - // Delete the row from the data source - FlexGrid* fg = columnLayoutController.flex; + FlexGrid* fg = ((ColumnLayoutController*)self.parentViewController).flex; [fg.columns removeObjectAtIndex:indexPath.row]; [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; } else if (editingStyle == UITableViewCellEditingStyleInsert) { - // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view } } - -// Override to support rearranging the table view. - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { - FlexGrid* fg = columnLayoutController.flex; - FlexColumn* fc = [fg.columns objectAtIndex:fromIndexPath.row]; + FlexGrid* fg = ((ColumnLayoutController*)self.parentViewController).flex; + GridColumn* fc = [fg.columns objectAtIndex:fromIndexPath.row]; [fg.columns removeObjectAtIndex:fromIndexPath.row]; [fg.columns insertObject:fc atIndex:toIndexPath.row]; } - -// Override to support conditional rearranging of the table view. - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { - // Return NO if you do not want the item to be re-orderable. return YES; } - -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ - @end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/ConditionalFormattingController.h b/ObjectiveC/FlexGrid101/FlexGrid101/ConditionalFormattingController.h index ae34c45..d00b8f8 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/ConditionalFormattingController.h +++ b/ObjectiveC/FlexGrid101/FlexGrid101/ConditionalFormattingController.h @@ -7,10 +7,9 @@ #import -#import "XuniFlexGridKit/XuniFlexGridKit.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" -@interface ConditionalFormattingController : UIViewController +@interface ConditionalFormattingController: UIViewController --(bool)formatItem:(FlexGrid *)sender panel:(FlexGridPanel *)panel forRange:(FlexCellRange *)range inContext:(CGContextRef)context; @end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/ConditionalFormattingController.m b/ObjectiveC/FlexGrid101/FlexGrid101/ConditionalFormattingController.m index a388e73..a8aa2c1 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/ConditionalFormattingController.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/ConditionalFormattingController.m @@ -10,6 +10,7 @@ @interface ConditionalFormattingController () +@property (weak, nonatomic) IBOutlet FlexGrid *flex; @end @@ -17,88 +18,88 @@ @implementation ConditionalFormattingController - (void)viewDidLoad { [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. - FlexGrid *flex = [[FlexGrid alloc] init]; - - flex.autoGenerateColumns = false; - FlexColumn *c1 = [[FlexColumn alloc] init]; + + self.flex.autoGenerateColumns = false; + GridColumn *c1 = [[GridColumn alloc] init]; c1.binding = @"firstName"; - c1.header = NSLocalizedString(@"First Name", nil); - c1.width = 100; - FlexColumn *c2 = [[FlexColumn alloc] init]; + c1.header = NSLocalizedString(@"First Name", nil); + c1.width = 100; + GridColumn *c2 = [[GridColumn alloc] init]; c2.binding = @"lastName"; - c2.header = NSLocalizedString(@"Last Name", nil); - FlexColumn *c3 = [[FlexColumn alloc] init]; + c2.header = NSLocalizedString(@"Last Name", nil); + GridColumn *c3 = [[GridColumn alloc] init]; c3.binding = @"orderTotal"; - c3.header = NSLocalizedString(@"Total", nil); - c3.format = @"C"; - FlexColumn *c4 = [[FlexColumn alloc] init]; + c3.header = NSLocalizedString(@"Total", nil); + c3.format = @"C"; + GridColumn *c4 = [[GridColumn alloc] init]; c4.binding = @"orderCount"; - c4.header = NSLocalizedString(@"Count", nil); - c4.format = @"N1"; - [flex.columns addObject:c1]; - [flex.columns addObject:c2]; - [flex.columns addObject:c3]; - [flex.columns addObject:c4]; + c4.header = NSLocalizedString(@"Count", nil); + c4.format = @"N1"; + [self.flex.columns addObject:c1]; + [self.flex.columns addObject:c2]; + [self.flex.columns addObject:c3]; + [self.flex.columns addObject:c4]; - flex.columnHeaderFont = [UIFont boldSystemFontOfSize:flex.columnHeaderFont.pointSize]; - flex.isReadOnly = true; - flex.itemsSource = [CustomerData getCustomerData:100]; - flex.tag = 1; - flex.delegate = self; + GridColumn *countryID = [[GridColumn alloc] init]; + countryID.binding = @"countryID"; + countryID.header = @"Country"; + countryID.horizontalAlignment = NSTextAlignmentLeft; + NSMutableArray *items = [NSMutableArray arrayWithArray:[CustomerData defaultCountries]]; + countryID.dataMap = [[GridDataMap alloc] initWithArray:items selectedValuePath:@"identifier" displayMemberPath:@"title"]; + [self.flex.columns addObject:countryID]; - [self.view addSubview:flex]; -} + GridColumn *lastOrderDate = [[GridColumn alloc] init]; + lastOrderDate.binding = @"lastOrderDate"; + [self.flex.columns addObject:lastOrderDate]; + + GridColumn *lastOrderTime = [[GridColumn alloc] init]; + lastOrderTime.binding = @"lastOrderDate"; + lastOrderTime.header = @"Last Order Time"; + NSDateFormatter* datefmt = [[NSDateFormatter alloc] init]; + [datefmt setDateFormat:@"hh:mm a"]; + lastOrderTime.formatter = datefmt; + [self.flex.columns addObject:lastOrderTime]; --(bool)formatItem:(FlexGrid *)sender panel:(FlexGridPanel *)panel forRange:(FlexCellRange *)range inContext:(CGContextRef)context { - if (panel.cellType == FlexCellTypeCell) { - FlexGrid *g = (FlexGrid*)[self.view viewWithTag:1]; - FlexColumn *col = [g.columns objectAtIndex:range.col]; - - if ([col.binding isEqualToString:@"orderCount"]) { - NSNumber *n = (NSNumber*)[panel getCellDataForRow:range.row inColumn:range.col formatted:NO]; - if (n != nil) { - if (n.integerValue >= 50) { - CGRect r = [panel getCellRectForRow:range.row inColumn:range.col]; - CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.15 green:0.31 blue:0.07 alpha:1.0].CGColor); - CGContextFillRect(context, r); - } - else if (n.integerValue < 50) { - CGRect r = [panel getCellRectForRow:range.row inColumn:range.col]; - CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor); - CGContextFillRect(context, r); + self.flex.columnHeaderFont = [UIFont boldSystemFontOfSize:self.flex.columnHeaderFont.pointSize]; + self.flex.isReadOnly = true; + self.flex.itemsSource = [CustomerData getCustomerData:100]; + + [self.flex.flexGridFormatItem addHandler:^(XuniEventContainer *eventContainer) { + if (eventContainer.eventArgs.panel.cellType == GridCellTypeCell) { + FlexGrid *g = _flex; + GridColumn *col = [g.columns objectAtIndex:eventContainer.eventArgs.col]; + + if ([col.binding isEqualToString:@"orderCount"]) { + NSNumber *n = (NSNumber *)[eventContainer.eventArgs.panel getCellDataForRow:eventContainer.eventArgs.row inColumn:eventContainer.eventArgs.col formatted:NO]; + if (n != nil) { + if (n.integerValue >= 50) { + CGRect r = [eventContainer.eventArgs.panel getCellRectForRow:eventContainer.eventArgs.row inColumn:eventContainer.eventArgs.col]; + CGContextSetFillColorWithColor(eventContainer.eventArgs.context, [UIColor colorWithRed:0.15 green:0.31 blue:0.07 alpha:1.0].CGColor); + CGContextFillRect(eventContainer.eventArgs.context, r); + } else if (n.integerValue < 50) { + CGRect r = [eventContainer.eventArgs.panel getCellRectForRow:eventContainer.eventArgs.row inColumn:eventContainer.eventArgs.col]; + CGContextSetFillColorWithColor(eventContainer.eventArgs.context, [UIColor redColor].CGColor); + CGContextFillRect(eventContainer.eventArgs.context, r); + } + [eventContainer.eventArgs.panel.textAttributes setValue:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; } - [panel.textAttributes setValue:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; } - } - - if ([col.binding isEqualToString:@"orderTotal"]) { - NSNumber *n = (NSNumber*)[panel getCellDataForRow:range.row inColumn:range.col formatted:NO]; - if (n != nil) { - if (n.integerValue >= 5000) { - [panel.textAttributes setValue:[UIColor colorWithRed:0.15 green:0.31 blue:0.07 alpha:1.0] forKey:NSForegroundColorAttributeName]; - } - else if (n.integerValue < 5000) { - [panel.textAttributes setValue:[UIColor redColor] forKey:NSForegroundColorAttributeName]; + + if ([col.binding isEqualToString:@"orderTotal"]) { + NSNumber *n = (NSNumber *)[eventContainer.eventArgs.panel getCellDataForRow:eventContainer.eventArgs.row inColumn:eventContainer.eventArgs.col formatted:NO]; + if (n != nil) { + if (n.integerValue >= 5000) { + [eventContainer.eventArgs.panel.textAttributes setValue:[UIColor colorWithRed:0.15 green:0.31 blue:0.07 alpha:1.0] forKey:NSForegroundColorAttributeName]; + } else if (n.integerValue < 5000) { + [eventContainer.eventArgs.panel.textAttributes setValue:[UIColor redColor] forKey:NSForegroundColorAttributeName]; + } } } } - } - return false; -} + eventContainer.eventArgs.cancel = false; + + } forObject:self]; -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} -- (void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexGrid *flex = (FlexGrid*)[self.view viewWithTag:1]; - - CGFloat ss = [UIApplication sharedApplication].statusBarFrame.size.height + self.navigationController.navigationBar.intrinsicContentSize.height; - - flex.frame = CGRectMake(0, ss, self.view.bounds.size.width, self.view.bounds.size.height - ss); - [flex setNeedsDisplay]; } @end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/CustomCellsController.h b/ObjectiveC/FlexGrid101/FlexGrid101/CustomCellsController.h index 7a3b998..8ab902a 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/CustomCellsController.h +++ b/ObjectiveC/FlexGrid101/FlexGrid101/CustomCellsController.h @@ -6,10 +6,8 @@ // #import -#import +#import -@interface CustomCellsController : UIViewController - --(bool)formatItem:(FlexGrid *)sender panel:(FlexGridPanel *)panel forRange:(FlexCellRange *)range inContext:(CGContextRef)context; +@interface CustomCellsController : UIViewController @end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/CustomCellsController.m b/ObjectiveC/FlexGrid101/FlexGrid101/CustomCellsController.m index de7cc1c..7e06cd9 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/CustomCellsController.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/CustomCellsController.m @@ -6,11 +6,12 @@ // #import "CustomCellsController.h" -#import "XuniFlexGridKit/XuniFlexGridKit.h" -#import "XuniGaugeKit/XuniGaugeKit.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" +#import "XuniGaugeDynamicKit/XuniGaugeDynamicKit.h" #import "CustomerData.h" @interface CustomCellsController () +@property (weak, nonatomic) IBOutlet FlexGrid *flex; @end @@ -18,109 +19,87 @@ @implementation CustomCellsController - (void)viewDidLoad { [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. - FlexGrid *flex = [[FlexGrid alloc] init]; - flex.autoGenerateColumns = false; - flex.isReadOnly = true; - flex.delegate = self; - flex.tag = 1; - - FlexColumn *c1 = [[FlexColumn alloc] init]; - c1.header = NSLocalizedString(@"First Name", nil); + self.flex.columnHeaderFont = [UIFont boldSystemFontOfSize:self.flex.columnHeaderFont.pointSize]; + self.flex.autoGenerateColumns = false; + self.flex.isReadOnly = true; + self.flex.selectionMode = GridSelectionModeRow; + + GridColumn *c1 = [[GridColumn alloc] init]; + c1.header = NSLocalizedString(@"First Name", nil); c1.binding = @"firstName"; - FlexColumn *c2 = [[FlexColumn alloc] init]; - c2.header = NSLocalizedString(@"Last Name", nil); + GridColumn *c2 = [[GridColumn alloc] init]; + c2.header = NSLocalizedString(@"Last Name", nil); c2.binding = @"lastName"; - FlexColumn *c3 = [[FlexColumn alloc] init]; - c3.header = NSLocalizedString(@"Total Orders", nil); + GridColumn *c3 = [[GridColumn alloc] init]; + c3.header = NSLocalizedString(@"Total Orders", nil); c3.binding = @"orderTotal"; - [flex.columns addObject:c1]; - [flex.columns addObject:c2]; - [flex.columns addObject:c3]; - - flex.selectionMode = FlexSelectionModeNone; - flex.itemsSource = [CustomerData getCustomerData:100]; - flex.tag = 1; - [self starSizing:flex]; - [self.view addSubview:flex]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} + [self.flex.columns addObject:c1]; + [self.flex.columns addObject:c2]; + [self.flex.columns addObject:c3]; -- (void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexGrid *flex = (FlexGrid*)[self.view viewWithTag:1]; + self.flex.itemsSource = [CustomerData getCustomerData:100]; + [self starSizing:self.flex]; - CGFloat ss = [UIApplication sharedApplication].statusBarFrame.size.height + self.navigationController.navigationBar.intrinsicContentSize.height; - - flex.frame = CGRectMake(0, ss, self.view.bounds.size.width, self.view.bounds.size.height - ss); - [flex setNeedsDisplay]; -} - --(void)starSizing:(FlexGrid*)g{ - for (int i = 0; i < g.columns.count; i++) { - FlexColumn *c = [g.columns objectAtIndex:i]; - c.widthType = FlexColumnWidthStar; - c.width = (i == 0) ? 5 : (i == 3) ? 3 : 4; - } -} --(bool)formatItem:(FlexGrid *)sender panel:(FlexGridPanel *)panel forRange:(FlexCellRange *)range inContext:(CGContextRef)context{ - bool result = NO; - FlexGrid *g = (FlexGrid*)[self.view viewWithTag:1]; - FlexColumn *col = [g.columns objectAtIndex:range.col]; + [self.flex.flexGridFormatItem addHandler:^(XuniEventContainer *eventContainer) { + eventContainer.eventArgs.cancel = NO; + FlexGrid *g = self.flex; + GridColumn *col = g.columns[eventContainer.eventArgs.col]; if ([col.binding isEqualToString:@"orderTotal"]) { - NSObject *v = [panel getCellDataForRow:range.row inColumn:range.col formatted:false]; + NSObject *v = [eventContainer.eventArgs.panel getCellDataForRow:eventContainer.eventArgs.row inColumn:eventContainer.eventArgs.col formatted:false]; if (v != nil) { - if (![v.description isEqual: NSLocalizedString(@"Total Orders", nil)]){ + if (![v.description isEqual:NSLocalizedString(@"Total Orders", nil)]) { XuniRadialGauge *radialGauge = [[XuniRadialGauge alloc] init]; - XuniGaugeRange *lower = [[XuniGaugeRange alloc] initWithGauge:radialGauge]; - lower.min = 0; - lower.max = 40; + XuniGaugeRange *lower = [[XuniGaugeRange alloc] initWithGauge:radialGauge]; + lower.min = 0; + lower.max = 40; lower.color = [UIColor colorWithRed:0.133 green:0.694 blue:0.298 alpha:1]; XuniGaugeRange *middle = [[XuniGaugeRange alloc] initWithGauge:radialGauge]; - middle.min = 40; - middle.max = 80; + middle.min = 40; + middle.max = 80; middle.color = [UIColor colorWithRed:1 green:0.502 blue:0.502 alpha:1]; XuniGaugeRange *upper = [[XuniGaugeRange alloc] initWithGauge:radialGauge]; - upper.min = 80; - upper.max = 100; + upper.min = 80; + upper.max = 100; upper.color = [UIColor colorWithRed:0 green:0.635 blue:0.91 alpha:1]; [radialGauge.ranges addObject:lower]; [radialGauge.ranges addObject:middle]; [radialGauge.ranges addObject:upper]; - radialGauge.showText = XuniShowTextNone; - radialGauge.thickness = 0.6; - radialGauge.min = 0; - radialGauge.max = 100; + radialGauge.backgroundColor = [UIColor clearColor]; + radialGauge.showText = XuniShowTextNone; + radialGauge.thickness = 0.6; + radialGauge.min = 0; + radialGauge.max = 100; radialGauge.loadAnimation = nil; - radialGauge.value =[v.description doubleValue]*(100.0/90000.0); - radialGauge.showRanges = false; + radialGauge.value = [v.description doubleValue]*(100.0/90000.0); + radialGauge.showRanges = false; - CGRect r = [panel getCellRectForRow:range.row inColumn:range.col]; - - r.size.width-=4; - r.size.height-=4; - - r.origin.x+=2; - r.origin.y+=2; + CGRect r = [eventContainer.eventArgs.panel getCellRectForRow:eventContainer.eventArgs.row inColumn:eventContainer.eventArgs.col]; XuniRect *t = [[XuniRect alloc] initLeft:0 top:0 width:r.size.width height:r.size.height]; radialGauge.rectGauge = t; - radialGauge.frame = CGRectMake(0, 0, r.size.width, r.size.height); - + radialGauge.frame = CGRectMake(0, 0, r.size.width, r.size.height); + UIImage *image = [[UIImage alloc] init]; image = [UIImage imageWithData:[radialGauge getImage]]; [image drawInRect:r]; - result = YES; + eventContainer.eventArgs.cancel = YES; } } } - return result; + + } forObject:self]; + } + +- (void)starSizing:(FlexGrid *)g { + for (int i = 0; i < g.columns.count; i++) { + GridColumn *c = [g.columns objectAtIndex:i]; + c.widthType = GridColumnWidthStar; + c.width = (i == 0) ? 5 : (i == 3) ? 3 : 4; + } +} + @end \ No newline at end of file diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/CustomMergingViewController.m b/ObjectiveC/FlexGrid101/FlexGrid101/CustomMergingViewController.m index ab3e499..cf45009 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/CustomMergingViewController.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/CustomMergingViewController.m @@ -5,7 +5,7 @@ // Copyright © 2016 GrapeCity. All rights reserved. // -#import "XuniFlexGridKit/XuniFlexGridKit.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" #import "CustomMergingViewController.h" @interface CustomMergingViewController () @@ -15,38 +15,141 @@ @interface CustomMergingViewController () @end +@interface CustomMergingFlexGrid: FlexGrid + +@end + +@implementation CustomMergingFlexGrid + +- (void)prepareForInterfaceBuilder { + self.columnHeaderFont = [UIFont boldSystemFontOfSize:self.columnHeaderFont.pointSize]; + + NSArray* weekdays = @[@"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday", @"Sunday"]; + + for (NSString* dayName in weekdays) { + GridColumn *c1 = [[GridColumn alloc] init]; + c1.header = dayName; + c1.widthType = GridColumnWidthStar; + c1.width = 1; + c1.dataType = XuniDataTypeString; + c1.minWidth = 120; + c1.horizontalAlignment = NSTextAlignmentCenter; + c1.headerHorizontalAlignment = NSTextAlignmentCenter; + c1.allowMerging = true; + [self.columns addObject:c1]; + } + + NSArray* timespans = @[@"12", @"13", @"14", @"15", @"16", @"17", @"18"]; + for (NSString* timeSpan in timespans) { + GridRow* r1 = [[GridRow alloc] init]; + [self.rows addObject:r1]; + + [self.rowHeaders setCellData:[NSString stringWithFormat:@"%@:00", timeSpan] forRow:(int)[self.rows indexOfObject:r1] inColumn:0]; + } + + [self.columnHeaders.rows insertObject:[[GridRow alloc]init] atIndex:0]; + + self.columnHeaders.rows[0].allowMerging = true; + + self.columnHeaders[0][0] = @"Weekday"; + self.columnHeaders[0][1] = @"Weekday"; + self.columnHeaders[0][2] = @"Weekday"; + self.columnHeaders[0][3] = @"Weekday"; + self.columnHeaders[0][4] = @"Weekday"; + self.columnHeaders[0][5] = @"Weekend"; + self.columnHeaders[0][6] = @"Weekend"; + + [self setCellData:@"Walker" forRow:0 inColumn:0]; + [self setCellData:@"Morning Show" forRow:0 inColumn:1]; + [self setCellData:@"Morning Show" forRow:0 inColumn:2]; + [self setCellData:@"Sports" forRow:0 inColumn:3]; + [self setCellData:@"Weather" forRow:0 inColumn:4]; + [self setCellData:@"N/A" forRow:0 inColumn:5]; + [self setCellData:@"N/A" forRow:0 inColumn:6]; + [self setCellData:@"N/A" forRow:1 inColumn:5]; + [self setCellData:@"N/A" forRow:1 inColumn:6]; + [self setCellData:@"N/A" forRow:2 inColumn:5]; + [self setCellData:@"N/A" forRow:2 inColumn:6]; + [self setCellData:@"N/A" forRow:3 inColumn:5]; + [self setCellData:@"N/A" forRow:3 inColumn:6]; + [self setCellData:@"N/A" forRow:4 inColumn:5]; + [self setCellData:@"N/A" forRow:4 inColumn:6]; + [self setCellData:@"Today Show" forRow:1 inColumn:0]; + [self setCellData:@"Today Show" forRow:1 inColumn:1]; + [self setCellData:@"Today Show" forRow:2 inColumn:0]; + [self setCellData:@"Today Show" forRow:2 inColumn:1]; + [self setCellData:@"Sesame Street" forRow:1 inColumn:2]; + [self setCellData:@"Football" forRow:1 inColumn:3]; + [self setCellData:@"Football" forRow:2 inColumn:3]; + [self setCellData:@"Market Watch" forRow:1 inColumn:4]; + [self setCellData:@"Kids Zone" forRow:2 inColumn:2]; + [self setCellData:@"Soap Opera" forRow:2 inColumn:4]; + [self setCellData:@"News" forRow:3 inColumn:0]; + [self setCellData:@"News" forRow:3 inColumn:1]; + [self setCellData:@"News" forRow:3 inColumn:2]; + [self setCellData:@"News" forRow:3 inColumn:3]; + [self setCellData:@"News" forRow:3 inColumn:4]; + [self setCellData:@"News" forRow:4 inColumn:0]; + [self setCellData:@"News" forRow:4 inColumn:1]; + [self setCellData:@"News" forRow:4 inColumn:2]; + [self setCellData:@"News" forRow:4 inColumn:3]; + [self setCellData:@"News" forRow:4 inColumn:4]; + [self setCellData:@"Weel of Fortune" forRow:5 inColumn:0]; + [self setCellData:@"Weel of Fortune" forRow:5 inColumn:1]; + [self setCellData:@"Weel of Fortune" forRow:5 inColumn:2]; + [self setCellData:@"Jeopardy" forRow:5 inColumn:3]; + [self setCellData:@"Jeopardy" forRow:5 inColumn:4]; + [self setCellData:@"Movie" forRow:5 inColumn:5]; + [self setCellData:@"Movie" forRow:6 inColumn:5]; + [self setCellData:@"Golf" forRow:5 inColumn:6]; + [self setCellData:@"Golf" forRow:6 inColumn:6]; + [self setCellData:@"Night Show" forRow:6 inColumn:0]; + [self setCellData:@"Night Show" forRow:6 inColumn:1]; + [self setCellData:@"Sports" forRow:6 inColumn:2]; + [self setCellData:@"Big Brother" forRow:6 inColumn:3]; + [self setCellData:@"Big Brother" forRow:6 inColumn:4]; + + self.allowMerging = GridAllowMergingAll; + + [self autoSizeColumn:0 header:true]; + +} +@end + @implementation CustomMergingViewController - (void)viewDidLoad { [super viewDidLoad]; - self.grid.selectionMode = FlexSelectionModeCell; + self.grid.selectionMode = GridSelectionModeCell; self.grid.isReadOnly = true; + self.grid.columnHeaderFont = [UIFont boldSystemFontOfSize:self.grid.columnHeaderFont.pointSize]; NSArray* weekdays = @[@"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday", @"Sunday"]; for (NSString* dayName in weekdays) { - FlexColumn *c1 = [[FlexColumn alloc] init]; + GridColumn *c1 = [[GridColumn alloc] init]; c1.header = dayName; - c1.widthType = FlexColumnWidthStar; + c1.widthType = GridColumnWidthStar; c1.width = 1; c1.dataType = XuniDataTypeString; c1.minWidth = 120; + c1.horizontalAlignment = NSTextAlignmentCenter; + c1.headerHorizontalAlignment = NSTextAlignmentCenter; c1.allowMerging = true; [self.grid.columns addObject:c1]; } NSArray* timespans = @[@"12", @"13", @"14", @"15", @"16", @"17", @"18"]; for (NSString* timeSpan in timespans) { - FlexRow* r1 = [[FlexRow alloc] init]; + GridRow* r1 = [[GridRow alloc] init]; [self.grid.rows addObject:r1]; [self.grid.rowHeaders setCellData:[NSString stringWithFormat:@"%@:00", timeSpan] forRow:(int)[self.grid.rows indexOfObject:r1] inColumn:0]; } - [self.grid.flexGridSelectionChanged addHandler:^(NSObject *sender, XuniEventArgs *args) { - FlexCellRangeEventArgs *e = (FlexCellRangeEventArgs *)args; - int r = e.row; - int c = e.col; + [self.grid.flexGridSelectionChanged addHandler:^(XuniEventContainer *eventContainer) { + int r = eventContainer.eventArgs.row; + int c = eventContainer.eventArgs.col; NSString* thisShow = [self.grid getCellDataForRow:r inColumn:c formatted:YES].description; @@ -56,7 +159,7 @@ - (void)viewDidLoad { for(int cc = 0; cc<7; cc++) { - NSString* day = ((FlexColumn*)[self.grid.columns objectAtIndex:cc]).header; + NSString* day = ((GridColumn*)[self.grid.columns objectAtIndex:cc]).header; NSString* spanStart = nil, *spanEnd = nil; for(int cr = 0; cr < 7; cr++) { @@ -81,9 +184,21 @@ - (void)viewDidLoad { } self.showTimetable.text = timetable; - + } forObject:self]; + [self.grid.columnHeaders.rows insertObject:[[GridRow alloc]init] atIndex:0]; + + self.grid.columnHeaders.rows[0].allowMerging = true; + + self.grid.columnHeaders[0][0] = @"Weekday"; + self.grid.columnHeaders[0][1] = @"Weekday"; + self.grid.columnHeaders[0][2] = @"Weekday"; + self.grid.columnHeaders[0][3] = @"Weekday"; + self.grid.columnHeaders[0][4] = @"Weekday"; + self.grid.columnHeaders[0][5] = @"Weekend"; + self.grid.columnHeaders[0][6] = @"Weekend"; + [self.grid setCellData:@"Walker" forRow:0 inColumn:0]; [self.grid setCellData:@"Morning Show" forRow:0 inColumn:1]; [self.grid setCellData:@"Morning Show" forRow:0 inColumn:2]; @@ -119,9 +234,9 @@ - (void)viewDidLoad { [self.grid setCellData:@"News" forRow:4 inColumn:2]; [self.grid setCellData:@"News" forRow:4 inColumn:3]; [self.grid setCellData:@"News" forRow:4 inColumn:4]; - [self.grid setCellData:@"Weel of Fortune" forRow:5 inColumn:0]; - [self.grid setCellData:@"Weel of Fortune" forRow:5 inColumn:1]; - [self.grid setCellData:@"Weel of Fortune" forRow:5 inColumn:2]; + [self.grid setCellData:@"Wheel of Fortune" forRow:5 inColumn:0]; + [self.grid setCellData:@"Wheel of Fortune" forRow:5 inColumn:1]; + [self.grid setCellData:@"Wheel of Fortune" forRow:5 inColumn:2]; [self.grid setCellData:@"Jeopardy" forRow:5 inColumn:3]; [self.grid setCellData:@"Jeopardy" forRow:5 inColumn:4]; [self.grid setCellData:@"Movie" forRow:5 inColumn:5]; @@ -134,25 +249,12 @@ - (void)viewDidLoad { [self.grid setCellData:@"Big Brother" forRow:6 inColumn:3]; [self.grid setCellData:@"Big Brother" forRow:6 inColumn:4]; - self.grid.allowMerging = FlexGridAllowMergingCells; + self.grid.allowMerging = GridAllowMergingAll; [self.grid autoSizeColumn:0 header:true]; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -/* -#pragma mark - Navigation -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/CustomerData.h b/ObjectiveC/FlexGrid101/FlexGrid101/CustomerData.h index 12032ec..fff676b 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/CustomerData.h +++ b/ObjectiveC/FlexGrid101/FlexGrid101/CustomerData.h @@ -14,12 +14,15 @@ @interface CustomerData : NSObject @property NSUInteger customerID; -@property NSString *firstName, *lastName, *address, *city; +@property NSString *firstName, *lastName; +@property (nonatomic, readonly) NSString *name; +@property NSString *address, *city; @property NSUInteger countryID; @property NSString *country, *postalCode, *email; @property NSDate *lastOrderDate; @property NSUInteger orderCount; @property double orderTotal; +@property (nonatomic, readonly) double orderAverage; @property BOOL active; -(id)initWithCustomerID:(NSUInteger)customerID countryID:(NSUInteger)countryID firstName:(NSString *)first lastName:(NSString *) last address:(NSString *) address city:(NSString *) city country:(NSString *) country postalCode:(NSString *) postalCode lastOrderDate:(NSDate *) lastOrderDate orderCount:(NSUInteger) orderCount orderTotal:(double)orderTotal active: (BOOL) active; diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/CustomerData.m b/ObjectiveC/FlexGrid101/FlexGrid101/CustomerData.m index f7b1edf..ec906e6 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/CustomerData.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/CustomerData.m @@ -33,6 +33,16 @@ -(id)initWithCustomerID:(NSUInteger)customerID countryID:(NSUInteger)countryID f return self; } +-(double)orderAverage +{ + return self.orderTotal / ((double)self.orderCount); +} + +-(NSString *)name +{ + return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName]; +} + +(NSUInteger) generateRandom: (NSUInteger) max{ return arc4random()% max; @@ -87,7 +97,7 @@ +(NSMutableArray *) getCustomerData: (NSInteger) total{ NSMutableArray *array = [[NSMutableArray alloc] init]; for (int i = 0; i < total; i++) { - dateComps.day = ([CustomerData generateRandom:1000] * -1); + dateComps.second = ([CustomerData generateRandom:100000000] * -1); previousDate = [calendar dateByAddingComponents:dateComps toDate:now options:false]; CustomerData *customer = [[CustomerData alloc] init]; customer.customerID = i; @@ -96,11 +106,11 @@ +(NSMutableArray *) getCustomerData: (NSInteger) total{ customer.firstName = [firstNamesArray objectAtIndex:[CustomerData generateRandom:[firstNamesArray count]]]; customer.lastName = [lastNamesArray objectAtIndex:[CustomerData generateRandom:[lastNamesArray count]]]; customer.city = [citiesArray objectAtIndex:[CustomerData generateRandom:[citiesArray count]]]; - customer.address = [streetsArray objectAtIndex:[CustomerData generateRandom:[streetsArray count]]]; + customer.address = [NSString stringWithFormat:@"%i %@", (int)[CustomerData generateRandom:500], [streetsArray objectAtIndex:[CustomerData generateRandom:[streetsArray count]]]]; customer.postalCode = [NSString stringWithFormat:@"%lu%lu%lu%lu%lu", [self generateRandom:9], [self generateRandom:9],[self generateRandom:9],[self generateRandom:9],[self generateRandom:9]]; customer.lastOrderDate = previousDate; customer.email = [emailsArray objectAtIndex:[CustomerData generateRandom:[emailsArray count]]]; - customer.orderCount = [self generateRandom:100]; + customer.orderCount = [self generateRandom:100]+1; customer.orderTotal = [self generateRandom:100]/100.0+[self generateRandom:90000]; customer.active = [CustomerData generateRandomBool]; [array addObject:customer]; diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/CustomerObjectEditor.h b/ObjectiveC/FlexGrid101/FlexGrid101/CustomerObjectEditor.h index 1415229..f9cb727 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/CustomerObjectEditor.h +++ b/ObjectiveC/FlexGrid101/FlexGrid101/CustomerObjectEditor.h @@ -10,5 +10,3 @@ @interface CustomerObjectEditor : UITableViewController -(void) initObject; @end - -extern CustomerObjectEditor* objEdit; \ No newline at end of file diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/CustomerObjectEditor.m b/ObjectiveC/FlexGrid101/FlexGrid101/CustomerObjectEditor.m index ea290f3..e6ccf9d 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/CustomerObjectEditor.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/CustomerObjectEditor.m @@ -7,7 +7,6 @@ #import "CustomerObjectEditor.h" #import "EditingFormController.h" -CustomerObjectEditor* objEdit; @interface CustomerObjectEditor () @property (weak, nonatomic) IBOutlet UITextField *firstNameEdit; @@ -16,138 +15,53 @@ @interface CustomerObjectEditor () @property (weak, nonatomic) IBOutlet UITextField *cityEdit; @property (weak, nonatomic) IBOutlet UITextField *addressEdit; @property (weak, nonatomic) IBOutlet UITextField *emailEdit; - @end @implementation CustomerObjectEditor --(void) initObject -{ - self.firstNameEdit.text = edited.firstName; - - self.secondNameEdit.text = edited.lastName; - self.countryEdit.text = edited.country; - self.cityEdit.text = edited.city; - self.addressEdit.text = edited.address; - self.emailEdit.text = edited.email; +- (void)initObject { + EditingFormController* efc = (EditingFormController*)self.parentViewController; - self.firstNameEdit.placeholder = self.firstNameEdit.text; + self.firstNameEdit.text = efc.edited.firstName; + + self.secondNameEdit.text = efc.edited.lastName; + self.countryEdit.text = efc.edited.country; + self.cityEdit.text = efc.edited.city; + self.addressEdit.text = efc.edited.address; + self.emailEdit.text = efc.edited.email; + + self.firstNameEdit.placeholder = self.firstNameEdit.text; self.secondNameEdit.placeholder = self.secondNameEdit.text; - self.countryEdit.placeholder = self.countryEdit.text; - self.cityEdit.placeholder = self.cityEdit.text; - self.addressEdit.placeholder = self.addressEdit.text; - self.emailEdit.placeholder = self.emailEdit.text; + self.countryEdit.placeholder = self.countryEdit.text; + self.cityEdit.placeholder = self.cityEdit.text; + self.addressEdit.placeholder = self.addressEdit.text; + self.emailEdit.placeholder = self.emailEdit.text; } --(void)tableView:(UITableView *)tableView -willDisplayCell:(UITableViewCell *)cell -forRowAtIndexPath:(NSIndexPath *)indexPath -{ +- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { [cell setBackgroundColor:[UIColor clearColor]]; } -- (void)viewDidLoad { - [super viewDidLoad]; +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - objEdit = self; + EditingFormController* efc = (EditingFormController*)self.parentViewController; - // Uncomment the following line to preserve selection between presentations. - // self.clearsSelectionOnViewWillAppear = NO; - - // Uncomment the following line to display an Edit button in the navigation bar for this view controller. - // self.navigationItem.rightBarButtonItem = self.editButtonItem; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - --(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath -{ - if (indexPath.row == [self tableView:tableView numberOfRowsInSection:indexPath.section]-2) - { + if (indexPath.row == [self tableView:tableView numberOfRowsInSection:indexPath.section]-2) { [efc cancel]; - } else if (indexPath.row == [self tableView:tableView numberOfRowsInSection:indexPath.section]-3) - { - edited.firstName = objEdit.firstNameEdit.text; - edited.lastName = objEdit.secondNameEdit.text; - edited.country = objEdit.countryEdit.text; - edited.city = objEdit.cityEdit.text; - edited.address = objEdit.addressEdit.text; - edited.email = objEdit.emailEdit.text; + } else if (indexPath.row == [self tableView:tableView numberOfRowsInSection:indexPath.section]-3) { + efc.edited.firstName = self.firstNameEdit.text; + efc.edited.lastName = self.secondNameEdit.text; + efc.edited.country = self.countryEdit.text; + efc.edited.city = self.cityEdit.text; + efc.edited.address = self.addressEdit.text; + efc.edited.email = self.emailEdit.text; [efc confirm]; } [self.tableView deselectRowAtIndexPath:indexPath animated:false]; } + - (IBAction)endEdit:(id)sender { [self resignFirstResponder]; } -#pragma mark - Table view data source - -/*- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { -#warning Incomplete implementation, return the number of sections - return 0; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { -#warning Incomplete implementation, return the number of rows - return 0; -}*/ - -/* -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:<#@"reuseIdentifier"#> forIndexPath:indexPath]; - - // Configure the cell... - - return cell; -} -*/ - -/* -// Override to support conditional editing of the table view. -- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { - // Return NO if you do not want the specified item to be editable. - return YES; -} -*/ - -/* -// Override to support editing the table view. -- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { - if (editingStyle == UITableViewCellEditingStyleDelete) { - // Delete the row from the data source - [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; - } else if (editingStyle == UITableViewCellEditingStyleInsert) { - // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view - } -} -*/ - -/* -// Override to support rearranging the table view. -- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { -} -*/ - -/* -// Override to support conditional rearranging of the table view. -- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { - // Return NO if you do not want the item to be re-orderable. - return YES; -} -*/ - -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ - @end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/EditConfirmationController.h b/ObjectiveC/FlexGrid101/FlexGrid101/EditConfirmationController.h index debc5e6..7a29265 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/EditConfirmationController.h +++ b/ObjectiveC/FlexGrid101/FlexGrid101/EditConfirmationController.h @@ -7,12 +7,7 @@ #import -#import "XuniFlexGridKit/XuniFlexGridKit.h" -@interface EditConfirmationController : UIViewController - - --(bool)beginningEdit:(FlexGrid *)sender panel:(FlexGridPanel *)panel forRange:(FlexCellRange *)range; --(bool)cellEditEnding:(FlexGrid *)sender panel:(FlexGridPanel *)panel forRange:(FlexCellRange *)range cancel:(BOOL)cancel; - +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" +@interface EditConfirmationController : UIViewController @end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/EditConfirmationController.m b/ObjectiveC/FlexGrid101/FlexGrid101/EditConfirmationController.m index dba8e82..f8f1f10 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/EditConfirmationController.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/EditConfirmationController.m @@ -7,71 +7,89 @@ #import "EditConfirmationController.h" #import "CustomerData.h" -#import "XuniFlexGridKit/XuniFlexGridKit.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" -@interface EditConfirmationController (){ - NSObject *_temp; -} +@interface EditConfirmationController () +@property (weak, nonatomic) IBOutlet FlexGrid *flex; @end @implementation EditConfirmationController - (void)viewDidLoad { [super viewDidLoad]; - // Do any additional setup after loading the view. - FlexGrid *flex = [[FlexGrid alloc] init]; - _temp = [[NSObject alloc] init]; - flex.tag = 1; - flex.delegate = self; - flex.isReadOnly = false; - flex.itemsSource = [CustomerData getCustomerData:100]; - [flex.columns removeObjectAtIndex:1]; - [self.view addSubview:flex]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} -- (void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexGrid *flex = (FlexGrid*)[self.view viewWithTag:1]; - flex.frame = CGRectMake(0, 65, self.view.bounds.size.width, self.view.bounds.size.height - 65); - [flex setNeedsDisplay]; -} - --(bool)beginningEdit:(FlexGrid *)sender panel:(FlexGridPanel *)panel forRange:(FlexCellRange *)range{ - FlexGrid *flex = (FlexGrid*)[self.view viewWithTag:1]; - _temp = [flex.cells getCellDataForRow:range.row inColumn:range.col formatted:false]; - return false; -} - --(bool)cellEditEnding:(FlexGrid *)sender panel:(FlexGridPanel *)panel forRange:(FlexCellRange *)range cancel:(BOOL)cancel{ - dispatch_async(dispatch_get_main_queue(), ^{ - - FlexGrid *flex = (FlexGrid*)[self.view viewWithTag:1]; + self.flex.isReadOnly = false; - if([[flex.cells getCellDataForRow:range.row inColumn:range.col formatted:false] isEqual:_temp]) - { - return; - } + self.flex.columnHeaderFont = [UIFont boldSystemFontOfSize:self.flex.columnHeaderFont.pointSize]; + self.flex.autoGenerateColumns = false; - NSString *title = [[NSString alloc] init]; - NSString *message = [[NSString alloc] init]; - title = NSLocalizedString(@"Edit Confirmation", nil); - message = NSLocalizedString(@"Do you want to commit the edit?", nil); - UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert]; - UIAlertAction *okAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Ok", nil) style:UIAlertActionStyleDefault handler:nil]; - UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) style:UIAlertActionStyleCancel handler:^(UIAlertAction *action){ - [flex.cells setCellData:_temp forRow:range.row inColumn:range.col]; - [flex invalidate]; - }]; - [alertController addAction:okAction]; - [alertController addAction:cancelAction]; - [self presentViewController:alertController animated:true completion:nil]; - - }); + GridColumn *identifier = [[GridColumn alloc] init]; + identifier.binding = @"customerID"; + identifier.isReadOnly = true; + identifier.widthType = GridColumnWidthPixel; + identifier.width = 100; + [self.flex.columns addObject:identifier]; + + GridColumn *firstName = [[GridColumn alloc] init]; + firstName.binding = @"firstName"; + [self.flex.columns addObject:firstName]; + + GridColumn *lastName = [[GridColumn alloc] init]; + lastName.binding = @"lastName"; + [self.flex.columns addObject:lastName]; + + GridColumn *address = [[GridColumn alloc] init]; + address.binding = @"address"; + [self.flex.columns addObject:address]; + + GridColumn *city = [[GridColumn alloc] init]; + city.binding = @"city"; + [self.flex.columns addObject:city]; - return false; + GridColumn *postalCode = [[GridColumn alloc] init]; + postalCode.binding = @"postalCode"; + [self.flex.columns addObject:postalCode]; + + GridColumn *active = [[GridColumn alloc] init]; + active.binding = @"active"; + active.widthType = GridColumnWidthPixel; + active.width = 70; + [self.flex.columns addObject:active]; + + self.flex.itemsSource = [CustomerData getCustomerData:100]; + + [self.flex.flexGridCellEditEnding addHandler:^(XuniEventContainer *eventContainer) { + NSObject* activeEditorValue = self.flex.activeEditorValue; + + if(activeEditorValue == nil) activeEditorValue = @""; + + if([[self.flex.cells getCellDataForRow:eventContainer.eventArgs.row inColumn:eventContainer.eventArgs.col formatted:false] isEqual:activeEditorValue]) + { + eventContainer.eventArgs.cancel = true; + return; + } + + NSObject* prev = [self.flex.cells getCellDataForRow:eventContainer.eventArgs.row inColumn:eventContainer.eventArgs.col formatted:false]; + + NSString *title = [[NSString alloc] init]; + NSString *message = [[NSString alloc] init]; + title = NSLocalizedString(@"Edit Confirmation", nil); + message = NSLocalizedString(@"Do you want to commit the edit?", nil); + UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert]; + UIAlertAction *okAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Ok", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){ + }]; + UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) style:UIAlertActionStyleCancel handler:^(UIAlertAction *action){ + [self.flex.cells setCellData:prev forRow:eventContainer.eventArgs.row inColumn:eventContainer.eventArgs.col]; + }]; + + + [alertController addAction:okAction]; + [alertController addAction:cancelAction]; + [self presentViewController:alertController animated:true completion:nil]; + + eventContainer.eventArgs.cancel = false; + + } forObject:self]; } + + @end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/EditingFormController.h b/ObjectiveC/FlexGrid101/FlexGrid101/EditingFormController.h index 1038e06..421032a 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/EditingFormController.h +++ b/ObjectiveC/FlexGrid101/FlexGrid101/EditingFormController.h @@ -7,14 +7,14 @@ #import -#import "XuniFlexGridKit/XuniFlexGridKit.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" #import "CustomerData.h" -@interface EditingFormController : UIViewController +@interface EditingFormController : UIViewController + +@property CustomerData* edited; + -(void)cancel; -(void)confirm; -@end - -extern EditingFormController* efc; -extern CustomerData* edited; \ No newline at end of file +@end \ No newline at end of file diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/EditingFormController.m b/ObjectiveC/FlexGrid101/FlexGrid101/EditingFormController.m index 052f951..8486613 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/EditingFormController.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/EditingFormController.m @@ -7,77 +7,60 @@ #import "EditingFormController.h" #import "CustomerData.h" -#import "XuniFlexGridKit/XuniFlexGridKit.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" #import "CustomerObjectEditor.h" -EditingFormController* efc; -CustomerData* edited; - @interface EditingFormController () @property (weak, nonatomic) IBOutlet UIVisualEffectView *editpanel; +@property (weak, nonatomic) IBOutlet FlexGrid *flex; +@property (weak, nonatomic) IBOutlet UIBarButtonItem *editaction; @end @implementation EditingFormController -{ - FlexGrid *flex; -} - (void)viewDidLoad { [super viewDidLoad]; - efc = self; - // Do any additional setup after loading the view, typically from a nib. - flex = [[FlexGrid alloc] init]; - flex.columnHeaderFont = [UIFont boldSystemFontOfSize:flex.columnHeaderFont.pointSize]; - flex.isReadOnly = true; - flex.delegate = self; - flex.itemsSource = [CustomerData getCustomerData:100]; - flex.tag = 1; - [flex autoSizeColumns:0 to:flex.columns.count-1]; - [self.view addSubview:flex]; - [self.view sendSubviewToBack:flex]; -} - --(void)cancel -{ - [objEdit resignFirstResponder]; - [UIView animateWithDuration:0.7 animations:^{ - _editpanel.alpha = 0; - } completion:^(BOOL finished){ - _editpanel.hidden = true; - }]; + self.flex.columnHeaderFont = [UIFont boldSystemFontOfSize:self.flex.columnHeaderFont.pointSize]; + self.flex.isReadOnly = true; + self.flex.itemsSource = [CustomerData getCustomerData:100]; + + [self.flex.flexGridSelectionChanged addHandler:^(XuniEventContainer *eventContainer) { + self.editaction.enabled = true; + } forObject:self]; + + + [self.flex.flexGridTapped addHandler:^(XuniEventContainer *eventContainer) { + [self cancel]; + } forObject:self]; + + [self.flex.flexGridCellDoubleTapped addHandler:^(XuniEventContainer *eventContainer) { + if(!_editpanel.hidden) + { + [self cancel]; + return; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + [self beginEditing]; + }); + + } forObject:self]; + + [self.flex autoSizeColumns:0 to:self.flex.columns.count-1]; } --(void)confirm -{ - [flex.collectionView raiseCollectionChanged]; - [self cancel]; +- (IBAction)doedit:(id)sender { + [self beginEditing]; } --(BOOL)tapped:(FlexGrid *)sender point:(XuniPoint *)point -{ - [self cancel]; - - return false; -} --(bool)cellDoubleTapped:(FlexGrid *)sender panel:(FlexGridPanel *)panel forRange:(FlexCellRange *)range +-(void)beginEditing { - /*int i = args.row; - - CustomerData* dt = [[CustomerData alloc] initWithCustomerID:999 countryID:90 firstName:@"21" lastName:@"22" address:@"343" city:@"34243" country:@"hohland" postalCode:@"02222" lastOrderDate:nil orderCount:0 orderTotal:0 active:false]; + self.edited = [self.flex.collectionView.items objectAtIndex:self.flex.selection.row]; - [flex.itemsSource setObject:dt atIndexedSubscript:i]; - [flex.collectionView raiseCollectionChanged];*/ - - if(!_editpanel.hidden) - { - [self tapped:nil point:nil]; - return false; - } - - edited = [flex.collectionView.items objectAtIndex:range.row]; + CustomerObjectEditor* objEdit = (CustomerObjectEditor*)self.childViewControllers[0]; [objEdit initObject]; @@ -89,19 +72,25 @@ -(bool)cellDoubleTapped:(FlexGrid *)sender panel:(FlexGridPanel *)panel forRange } completion:^(BOOL finished){ _editpanel.alpha = 1; }]; - return false; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} -- (void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - - CGFloat ss = [UIApplication sharedApplication].statusBarFrame.size.height + self.navigationController.navigationBar.intrinsicContentSize.height; +-(void)cancel +{ + CustomerObjectEditor* objEdit = (CustomerObjectEditor*)self.childViewControllers[0]; + [objEdit resignFirstResponder]; + [UIView animateWithDuration:0.7 animations:^{ + _editpanel.alpha = 0; + } completion:^(BOOL finished){ + _editpanel.hidden = true; + }]; - flex.frame = CGRectMake(0, ss, self.view.bounds.size.width, self.view.bounds.size.height - ss); - [flex setNeedsDisplay]; } + +-(void)confirm +{ + [self.flex.collectionView raiseCollectionChanged]; + [self cancel]; +} + + @end \ No newline at end of file diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/FilterController.h b/ObjectiveC/FlexGrid101/FlexGrid101/FilterController.h index 46827cf..666086e 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/FilterController.h +++ b/ObjectiveC/FlexGrid101/FlexGrid101/FilterController.h @@ -6,6 +6,8 @@ // #import +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" @interface FilterController : UIViewController +@property (weak, nonatomic) IBOutlet FlexGrid *flex; @end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/FilterController.m b/ObjectiveC/FlexGrid101/FlexGrid101/FilterController.m index 74deca6..7e7ea52 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/FilterController.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/FilterController.m @@ -7,260 +7,122 @@ #import "FilterController.h" #import "CustomerData.h" -#import "XuniFlexGridKit/XuniFlexGridKit.h" -#import "FilterFormController.h" -#import "SharedFilterData.h" +#import "FilterData.h" +#import "FilterGridViewController.h" -@interface FilterController (){ - SharedFilterData *sharedData; -} +@interface FilterController () + +@property (weak, nonatomic) IBOutlet UIBarButtonItem *filterButton; +@property (weak, nonatomic) IBOutlet UIBarButtonItem *removeFilterButton; +@property (weak, nonatomic) IBOutlet UIVisualEffectView *filterPane; @end @implementation FilterController -- (void)viewDidLoad { - [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. - sharedData = [SharedFilterData sharedInstance]; - UIButton *filterButton = [UIButton buttonWithType:UIButtonTypeSystem]; - UIButton *removeButton = [UIButton buttonWithType:UIButtonTypeSystem]; - FlexGrid *flex = [[FlexGrid alloc] init]; - flex.isReadOnly = true; - flex.itemsSource = [CustomerData getCustomerData:100]; - [filterButton setTitle:NSLocalizedString(@"Filter", nil) forState:UIControlStateNormal]; - [removeButton setTitle:NSLocalizedString(@"Remove", nil) forState:UIControlStateNormal]; - [filterButton addTarget:self action:@selector(filterButtonClicked) forControlEvents:UIControlEventTouchUpInside]; - [removeButton addTarget:self action:@selector(removeButtonClicked) forControlEvents:UIControlEventTouchUpInside]; - - flex.tag = 1; - filterButton.tag = 2; - removeButton.tag = 3; - - [self.view addSubview:filterButton]; - [self.view addSubview:removeButton]; - [self.view addSubview:flex]; - - +- (void)doDropFilter { + self.filterButton.title = NSLocalizedString(@"Filter", nil); + self.removeFilterButton.enabled = false; + self.filterPane.hidden = true; + self.flex.collectionView.filter = ^BOOL (NSObject *item){ + return true; + }; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. +- (void)doApplyFilter { + self.filterButton.title = NSLocalizedString(@"Change", nil); + self.filterPane.hidden = true; + self.removeFilterButton.enabled = true; + + self.flex.collectionView.filter = ^BOOL (NSObject *item){ + NSMutableArray *shared = [FilterData sharedFilterData]; + bool result = true; + for (int i = 0; i < shared.count; i++) { + FilterData *fd = [shared objectAtIndex:i]; + + GridColumn *col = (GridColumn *)[self.flex.columns objectAtIndex:i]; + NSString *thisprop = [col getBoundValue:item].description.lowercaseString; + NSString *filterstr = fd.filterString.lowercaseString; + + if(filterstr.length>0){ + if (fd.filterOperation == 0) { + //contains + if (![thisprop containsString:filterstr]) { + result = false; + break; + } + + } else if (fd.filterOperation == 1) { + //starts + if (![thisprop hasPrefix:filterstr]) { + result = false; + break; + } + } else if (fd.filterOperation == 2) { + //ends + if (![thisprop hasSuffix:filterstr]) { + result = false; + break; + } + } else if (fd.filterOperation == 3) { + //equalstext + if (![thisprop isEqualToString:filterstr]) { + result = false; + break; + } + } + } + } + return result; + }; } --(void) viewDidAppear:(BOOL)animated{ - [super viewDidAppear:true]; - - if (sharedData.filterSet == true) { - - if (sharedData.filterOperation == 0) { - [self containsFilter]; - } - else if ([sharedData.filterOperation isEqual: @(1)]){ - [self beginsWithFilter]; - } - else if ([sharedData.filterOperation isEqual: @(2)]){ - [self endsWithFilter]; - } - else if ([sharedData.filterOperation isEqual: @(3)]){ - [self equalsFilter]; + +- (void)doStartEditingFilter { + if ([self.filterButton.title isEqualToString:NSLocalizedString(@"Filter", nil)]) { + NSMutableArray *shared = [FilterData sharedFilterData]; + [shared removeAllObjects]; + for (int i = 0; i < self.flex.columns.count; i++) { + GridColumn *c = [self.flex.columns objectAtIndex:i]; + FilterData *fd = [[FilterData alloc]init]; + fd.filterColumn = c.header; + fd.filterOperation = 0; + fd.filterString = nil; + [shared addObject:fd]; } } -} --(void) viewDidDisappear:(BOOL)animated{ - [super viewDidDisappear:true]; - sharedData.filterSet = false; - sharedData.filterString = @""; - sharedData.filterOperation = 0; -} + FilterGridViewController *filterController = (FilterGridViewController *)self.childViewControllers.firstObject; + filterController.flex.itemsSource = [FilterData sharedFilterData]; -- (void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexGrid *flex = (FlexGrid*)[self.view viewWithTag:1]; - UIButton *filterButton = (UIButton*)[self.view viewWithTag:2]; - UIButton *removeButton = (UIButton*)[self.view viewWithTag:3]; - filterButton.frame = CGRectMake(0, 60, self.view.bounds.size.width/2, 50); - - removeButton.frame = CGRectMake(self.view.bounds.size.width/2, 60, self.view.bounds.size.width/2, 50); - - flex.frame = CGRectMake(0, 110, self.view.bounds.size.width, self.view.bounds.size.height-110); -} + GridColumn *operID = (GridColumn *)[filterController.flex.columns objectAtIndex:1]; + NSMutableArray *items = [NSMutableArray arrayWithArray:[FilterOperation defaultOperations]]; + operID.dataMap = [[GridDataMap alloc] initWithArray:items selectedValuePath:@"identifier" displayMemberPath:@"title"]; --(void)filterButtonClicked{ - [self performSegueWithIdentifier:@"FilterFormSegue" sender:self]; + self.filterButton.title = NSLocalizedString(@"Done", nil); + self.filterPane.hidden = false; + self.removeFilterButton.enabled = true; } --(void)containsFilter{ - FlexGrid *flex = (FlexGrid *)[self.view viewWithTag:1]; - NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; - [dateFormat setDateFormat:@"M/d/yy"]; - flex.collectionView.filter = ^ BOOL (NSObject *item){ - CustomerData *d = (CustomerData*)item; - if ([[NSString stringWithFormat:@"%lu", d.customerID] rangeOfString:sharedData.filterString].location != NSNotFound) { - return true; - } - else if ([[NSString stringWithFormat:@"%lu", d.countryID] rangeOfString:sharedData.filterString].location != NSNotFound) { - return true; - } - else if ([[NSString stringWithFormat:@"%@",d.email] rangeOfString:sharedData.filterString].location != NSNotFound) { - return true; - } - else if ([[d.firstName lowercaseString] rangeOfString:[sharedData.filterString lowercaseString]].location != NSNotFound) { - return true; - } - else if ([[d.lastName lowercaseString] rangeOfString:[sharedData.filterString lowercaseString]].location != NSNotFound) - { - return true; - } - else if ([[d.country lowercaseString] rangeOfString:[sharedData.filterString lowercaseString]].location != NSNotFound){ - return true; - } - else if ([[d.address lowercaseString] rangeOfString:[sharedData.filterString lowercaseString]].location != NSNotFound){ - return true; - } - else if ([[d.city lowercaseString] rangeOfString:[sharedData.filterString lowercaseString]].location != NSNotFound){ - return true; - } - else if ([[dateFormat stringFromDate:d.lastOrderDate] rangeOfString:sharedData.filterString].location != NSNotFound) { - return true; - } - else { - return false; - } - }; +- (IBAction)doFilter:(id)sender { + if ([self.filterButton.title isEqualToString:NSLocalizedString(@"Done", nil)]) { + [self doApplyFilter]; + } else { + [self doStartEditingFilter]; + } } --(void)equalsFilter{ - FlexGrid *flex = (FlexGrid *)[self.view viewWithTag:1]; - NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; - [dateFormat setDateFormat:@"M/d/yy"]; - flex.collectionView.filter = ^ BOOL (NSObject *item){ - CustomerData *d = (CustomerData*)item; - - if ([[NSString stringWithFormat:@"%lu", d.customerID] isEqualToString:sharedData.filterString]) { - return true; - } - else if ([[NSString stringWithFormat:@"%lu", d.countryID] isEqualToString:sharedData.filterString]) { - return true; - } - else if ([[NSString stringWithFormat:@"%@", d.email] isEqualToString:sharedData.filterString]) { - return true; - } - else if ([d.firstName isEqualToString:sharedData.filterString]) { - return true; - } - else if ([d.lastName isEqualToString:sharedData.filterString]) - { - return true; - } - else if ([d.country isEqualToString:sharedData.filterString]){ - return true; - } - else if ([d.address isEqualToString:sharedData.filterString]){ - return true; - } - else if ([d.city isEqualToString:sharedData.filterString]){ - return true; - } - else if ([[dateFormat stringFromDate:d.lastOrderDate] isEqualToString:sharedData.filterString]) { - return true; - } - else { - return false; - } - }; +- (IBAction)removeFilter:(id)sender { + [self doDropFilter]; } --(void)beginsWithFilter{ - FlexGrid *flex = (FlexGrid *)[self.view viewWithTag:1]; - NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; - [dateFormat setDateFormat:@"M/d/yy"]; - flex.collectionView.filter = ^ BOOL (NSObject *item){ - CustomerData *d = (CustomerData*)item; - if ([[NSString stringWithFormat:@"%lu", d.customerID] hasPrefix:sharedData.filterString]) { - return true; - } - else if ([[NSString stringWithFormat:@"%lu", d.countryID] hasPrefix:sharedData.filterString]) { - return true; - } - else if ([[NSString stringWithFormat:@"%@",d.email] hasPrefix:sharedData.filterString]) { - return true; - } - - else if ([[d.firstName lowercaseString] hasPrefix:[sharedData.filterString lowercaseString]]) { - return true; - } - else if ([[d.lastName lowercaseString] hasPrefix:[sharedData.filterString lowercaseString]]) - { - return true; - } - else if ([[d.country lowercaseString] hasPrefix:[sharedData.filterString lowercaseString]]){ - return true; - } - else if ([[d.address lowercaseString] hasPrefix:[sharedData.filterString lowercaseString]]){ - return true; - } - else if ([[d.city lowercaseString] hasPrefix:[sharedData.filterString lowercaseString]]){ - return true; - } - else if ([[dateFormat stringFromDate:d.lastOrderDate] hasPrefix:sharedData.filterString]) { - return true; - } - else { - return false; - } - }; -} +- (void)viewDidLoad { + [super viewDidLoad]; --(void)endsWithFilter{ - FlexGrid *flex = (FlexGrid *)[self.view viewWithTag:1]; - NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; - [dateFormat setDateFormat:@"M/d/yy"]; - flex.collectionView.filter = ^ BOOL (NSObject *item){ - CustomerData *d = (CustomerData*)item; - if ([[NSString stringWithFormat:@"%lu", d.customerID] hasSuffix:sharedData.filterString]) { - return true; - } - else if ([[NSString stringWithFormat:@"%lu", d.countryID] hasSuffix:sharedData.filterString]) { - return true; - } - else if ([[NSString stringWithFormat:@"%@",d.email] hasSuffix:sharedData.filterString]) { - return true; - } - - else if ([[d.firstName lowercaseString] hasSuffix:[sharedData.filterString lowercaseString]]) { - return true; - } - else if ([[d.lastName lowercaseString] hasSuffix:[sharedData.filterString lowercaseString]]) - { - return true; - } - else if ([[d.country lowercaseString] hasSuffix:[sharedData.filterString lowercaseString]]){ - return true; - } - else if ([[d.address lowercaseString] hasSuffix:[sharedData.filterString lowercaseString]]){ - return true; - } - else if ([[d.city lowercaseString] hasSuffix:[sharedData.filterString lowercaseString]]){ - return true; - } - else if ([[dateFormat stringFromDate:d.lastOrderDate] hasSuffix:sharedData.filterString]) { - return true; - } - else { - return false; - } - }; -} + self.flex.columnHeaderFont = [UIFont boldSystemFontOfSize:self.flex.columnHeaderFont.pointSize]; + + self.flex.isReadOnly = true; + self.flex.itemsSource = [CustomerData getCustomerData:100]; --(void)removeButtonClicked{ - sharedData.filterSet = false; - sharedData.filterString = @""; - sharedData.filterOperation = 0; - FlexGrid *flex = (FlexGrid *)[self.view viewWithTag:1]; - flex.collectionView.filter = ^ BOOL (NSObject *item){ - return true; - }; } + @end \ No newline at end of file diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/FilterData.h b/ObjectiveC/FlexGrid101/FlexGrid101/FilterData.h new file mode 100644 index 0000000..cb739e4 --- /dev/null +++ b/ObjectiveC/FlexGrid101/FlexGrid101/FilterData.h @@ -0,0 +1,25 @@ +// +// SharedFilterData.h +// FlexGrid101 +// +// Copyright (c) 2015 GrapeCity. All rights reserved. +// + +#import + +@interface FilterOperation: NSObject +@property NSString* title; +@property int identifier; + ++ (NSArray *)defaultOperations; +@end + +@interface FilterData : NSObject + +@property NSString *filterColumn; +@property int filterOperation; +@property NSString *filterString; + ++(NSMutableArray *) sharedFilterData; + +@end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/FilterData.m b/ObjectiveC/FlexGrid101/FlexGrid101/FilterData.m new file mode 100644 index 0000000..f49458a --- /dev/null +++ b/ObjectiveC/FlexGrid101/FlexGrid101/FilterData.m @@ -0,0 +1,41 @@ +// +// SharedFilterData.m +// FlexGrid101 +// +// Copyright (c) 2015 GrapeCity. All rights reserved. +// + +#import "FilterData.h" + +@implementation FilterData + ++(NSMutableArray *)sharedFilterData{ + static NSMutableArray *sharedInstance = nil; + + @synchronized(self){ + if(!sharedInstance){ + sharedInstance = [[NSMutableArray alloc] init]; + } + } + return sharedInstance; +} + +@end + +@implementation FilterOperation ++ (NSArray *)defaultOperations { + NSString *operations = @"Contains|StartsWith|EndsWith|EqualsText"; + NSArray *operationsArray = [operations componentsSeparatedByString:@"|"]; + + NSMutableArray* result = [[NSMutableArray alloc]init]; + for (NSString* operation in operationsArray) { + FilterOperation* oper = [[FilterOperation alloc]init]; + oper.title = operation; + oper.identifier = [operationsArray indexOfObject:operation]; + [result addObject:oper]; + } + + return result; +} +@end + diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/FilterGridViewController.h b/ObjectiveC/FlexGrid101/FlexGrid101/FilterGridViewController.h new file mode 100644 index 0000000..b1aa1c3 --- /dev/null +++ b/ObjectiveC/FlexGrid101/FlexGrid101/FilterGridViewController.h @@ -0,0 +1,13 @@ +// +// FilterGridViewController.h +// FlexGrid101 +// +// Copyright © 2016 GrapeCity. All rights reserved. +// + +#import +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" + +@interface FilterGridViewController : UIViewController +@property (weak, nonatomic) IBOutlet FlexGrid *flex; +@end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/FilterGridViewController.m b/ObjectiveC/FlexGrid101/FlexGrid101/FilterGridViewController.m new file mode 100644 index 0000000..26e505d --- /dev/null +++ b/ObjectiveC/FlexGrid101/FlexGrid101/FilterGridViewController.m @@ -0,0 +1,24 @@ +// +// FilterGridViewController.m +// FlexGrid101 +// +// Copyright © 2016 GrapeCity. All rights reserved. +// + +#import "FilterGridViewController.h" +#import "FilterData.h" + +@interface FilterGridViewController () + + +@end + +@implementation FilterGridViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.flex.columnHeaderFont = [UIFont boldSystemFontOfSize:self.flex.columnHeaderFont.pointSize]; +} + + +@end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/FrozenCellsController.m b/ObjectiveC/FlexGrid101/FlexGrid101/FrozenCellsController.m index f4b1493..bc85929 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/FrozenCellsController.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/FrozenCellsController.m @@ -7,9 +7,10 @@ #import "FrozenCellsController.h" #import "CustomerData.h" -#import "XuniFlexGridKit/XuniFlexGridKit.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" @interface FrozenCellsController () +@property (weak, nonatomic) IBOutlet FlexGrid *flex; @end @@ -17,42 +18,23 @@ @implementation FrozenCellsController - (void)viewDidLoad { [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. - FlexGrid *flex = [[FlexGrid alloc] init]; - flex.columnHeaderFont = [UIFont boldSystemFontOfSize:flex.columnHeaderFont.pointSize]; - flex.isReadOnly = true; - flex.itemsSource = [CustomerData getCustomerData:100]; - flex.tag = 1; - flex.frozenColumns = 1; - flex.frozenRows = 1; + self.flex.columnHeaderFont = [UIFont boldSystemFontOfSize:self.flex.columnHeaderFont.pointSize]; + self.flex.isReadOnly = true; + self.flex.itemsSource = [CustomerData getCustomerData:100]; - flex.allowMerging = FlexGridAllowMergingCells; + self.flex.frozenColumns = 1; + self.flex.frozenRows = 1; - for(int i = 0; i -@interface FullTextFilterController : UIViewController +@interface FullTextFilterController : UIViewController @end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/FullTextFilterController.m b/ObjectiveC/FlexGrid101/FlexGrid101/FullTextFilterController.m index eda6f8b..d26eaaf 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/FullTextFilterController.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/FullTextFilterController.m @@ -7,10 +7,12 @@ #import "FullTextFilterController.h" #import "CustomerData.h" -#import "XuniFlexGridKit/XuniFlexGridKit.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" @interface FullTextFilterController () +@property (weak, nonatomic) IBOutlet UITextField *filterField; +@property (weak, nonatomic) IBOutlet FlexGrid *flex; @end @@ -18,100 +20,127 @@ @implementation FullTextFilterController - (void)viewDidLoad { [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. - UITextField *filterField = [[UITextField alloc] init]; - filterField.delegate = self; - filterField.text = NSLocalizedString(@"Enter text to Filter", nil); - filterField.returnKeyType = UIReturnKeyDone; - filterField.keyboardType = UIKeyboardTypeDefault; - filterField.backgroundColor = [UIColor lightGrayColor]; - - FlexGrid *flex = [[FlexGrid alloc] init]; - flex.isReadOnly = true; - flex.itemsSource = [CustomerData getCustomerData:100]; - flex.tag = 1; - filterField.tag = 2; - [self.view addSubview:flex]; - [self.view addSubview:filterField]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - - -- (void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexGrid *flex = (FlexGrid*)[self.view viewWithTag:1]; - UITextField *filterField = (UITextField*)[self.view viewWithTag:2]; + + self.filterField.returnKeyType = UIReturnKeyDone; + self.filterField.keyboardType = UIKeyboardTypeDefault; + self.flex.columnHeaderFont = [UIFont boldSystemFontOfSize:self.flex.columnHeaderFont.pointSize]; + self.flex.isReadOnly = true; + self.flex.itemsSource = [CustomerData getCustomerData:100]; + + + [self.flex.flexGridFormatItem addHandler:^(XuniEventContainer *eventContainer) { + if(eventContainer.eventArgs.panel == self.flex.cells) + { + if([self.flex.editRange intersects:eventContainer.eventArgs.cellRange]) return; + if(self.flex.columns[eventContainer.eventArgs.col].dataType==XuniDataTypeBoolean) return; + + NSError *error; + NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern: self.filterField.text options:NSRegularExpressionCaseInsensitive error:&error]; + + NSString* data = [self.flex getCellDataForRow:eventContainer.eventArgs.row inColumn:eventContainer.eventArgs.col formatted:true].description; + + if (!error) + { + NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:data]; + NSArray *allMatches = [regex matchesInString:data options:0 range:NSMakeRange(0, [data length])]; + for (NSTextCheckingResult *aMatch in allMatches) + { + NSRange matchRange = [aMatch range]; + [attributedString setAttributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:self.flex.font.pointSize],NSForegroundColorAttributeName:[UIColor redColor]} range: matchRange]; + } + + CGRect t = [eventContainer.eventArgs.panel getCellRectForRow:eventContainer.eventArgs.row inColumn:eventContainer.eventArgs.col]; + + GridColumn *col = [self.flex.columns objectAtIndex:eventContainer.eventArgs.col]; + + CGSize sz = [attributedString size]; + + NSTextAlignment align = col.horizontalAlignment; + + + if (align == NSTextAlignmentRight) { + double mod = t.size.width - sz.width - 4; + if (mod < 4) mod = 4; + t.origin.x += mod; + } else if (align == NSTextAlignmentCenter) { + double mod = (t.size.width - sz.width) / 2; + if (mod < 4) mod = 4; + t.origin.x += mod; + } else { + t.origin.x += 4; + } + + double mod = (t.size.height - sz.height) / 2; + if (mod < 4) mod = 4; + + t.origin.y += mod; + + [attributedString drawInRect:t]; + eventContainer.eventArgs.cancel = true; + } + } - filterField.frame = CGRectMake(0, 65, self.view.bounds.size.width, 50); - flex.frame = CGRectMake(0, 115, self.view.bounds.size.width, self.view.bounds.size.height-115); - [flex setNeedsDisplay]; + } forObject:self]; + } --(BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ - return true; -} --(void)textFieldDidBeginEditing:(UITextField *)textField{ - [textField selectAll:nil]; -} --(BOOL)textFieldShouldEndEditing:(UITextField *)textField{ - return true; -} --(void)textFieldDidEndEditing:(UITextField *)textField{ - FlexGrid *flex = (FlexGrid *)[self.view viewWithTag:1]; +- (IBAction)onTextChange:(UITextField *)sender { + UITextField* textField = sender; + FlexGrid *flex = self.flex; NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"M/d/yy"]; if(textField.text.length) { - flex.collectionView.filter = ^ BOOL (NSObject *item){ - CustomerData *d = (CustomerData*)item; - - if ([[NSString stringWithFormat:@"%lu", d.customerID] isEqualToString:textField.text]) { - return true; - } - else if ([[NSString stringWithFormat:@"%lu", d.countryID] isEqualToString:textField.text]) { - return true; - } - else if ([[NSString stringWithFormat:@"%@", d.email] isEqualToString:textField.text]) { - return true; - } - else if ([d.firstName isEqualToString:textField.text]) { - return true; - } - else if ([d.lastName isEqualToString:textField.text]) - { - return true; - } - else if ([d.country isEqualToString:textField.text]){ - return true; - } - else if ([d.city isEqualToString:textField.text]){ - return true; - } - else if ([d.address isEqualToString:textField.text]){ - return true; - } - else if ([[dateFormat stringFromDate:d.lastOrderDate] isEqualToString:textField.text]) { - return true; - } - else { - return false; - } - }; + flex.collectionView.filter = ^ BOOL (NSObject *item){ + CustomerData *d = (CustomerData*)item; + + if ([[NSString stringWithFormat:@"%lu", d.customerID].lowercaseString containsString:textField.text.lowercaseString]) { + return true; + } + else if ([[NSString stringWithFormat:@"%lu", d.countryID].lowercaseString containsString:textField.text.lowercaseString]) { + return true; + } + else if ([[NSString stringWithFormat:@"%@", d.email].lowercaseString containsString:textField.text.lowercaseString]) { + return true; + } + else if ([d.firstName.lowercaseString containsString:textField.text.lowercaseString]) { + return true; + } + else if ([d.lastName.lowercaseString containsString:textField.text.lowercaseString]) + { + return true; + } + else if ([d.country.lowercaseString containsString:textField.text.lowercaseString]){ + return true; + } + else if ([d.city.lowercaseString containsString:textField.text.lowercaseString]){ + return true; + } + else if ([d.address.lowercaseString containsString:textField.text.lowercaseString]){ + return true; + } + else if ([[dateFormat stringFromDate:d.lastOrderDate].lowercaseString containsString:textField.text.lowercaseString]) { + return true; + } + else { + return false; + } + }; } else { flex.collectionView.filter = nil; } + } --(BOOL)textFieldShouldReturn:(UITextField *)textField{ - [textField resignFirstResponder]; - return true; + + +- (IBAction)finishedit:(UITextField *)sender { + [sender resignFirstResponder]; } + + @end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/GettingStartedController.h b/ObjectiveC/FlexGrid101/FlexGrid101/GettingStartedController.h index f444823..ef241ff 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/GettingStartedController.h +++ b/ObjectiveC/FlexGrid101/FlexGrid101/GettingStartedController.h @@ -1,12 +1,14 @@ // -// GettingStartedController.h +// EditingController.h // FlexGrid101 // // Copyright (c) 2015 GrapeCity. All rights reserved. // #import +#import -@interface GettingStartedController : UIViewController + +@interface GettingStartedController : UIViewController @end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/GettingStartedController.m b/ObjectiveC/FlexGrid101/FlexGrid101/GettingStartedController.m index 487dd6b..f9a33b6 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/GettingStartedController.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/GettingStartedController.m @@ -1,5 +1,5 @@ // -// GettingStartedController.m +// EditingController.m // FlexGrid101 // // Copyright (c) 2015 GrapeCity. All rights reserved. @@ -7,9 +7,12 @@ #import "GettingStartedController.h" #import "CustomerData.h" -#import "XuniFlexGridKit/XuniFlexGridKit.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" + + @interface GettingStartedController () +@property (weak, nonatomic) IBOutlet FlexGrid *flex; @end @@ -17,27 +20,75 @@ @implementation GettingStartedController - (void)viewDidLoad { [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. - FlexGrid *flex = [[FlexGrid alloc] init]; - flex.columnHeaderFont = [UIFont boldSystemFontOfSize:flex.columnHeaderFont.pointSize]; - flex.isReadOnly = true; - flex.itemsSource = [CustomerData getCustomerData:100]; - flex.tag = 1; - [flex autoSizeColumns:0 to:flex.columns.count-1]; - [self.view addSubview:flex]; + + self.flex.columnHeaderFont = [UIFont boldSystemFontOfSize:self.flex.columnHeaderFont.pointSize]; + self.flex.isReadOnly = false; + self.flex.delegate = self; + + [self.flex.flexGridAutoGeneratingColumn addHandler:^(XuniEventContainer *eventContainer) { + if ([eventContainer.eventArgs.propertyInfo.name isEqualToString:@"country"] || [eventContainer.eventArgs.propertyInfo.name isEqualToString:@"name"] || [eventContainer.eventArgs.propertyInfo.name isEqualToString:@"orderAverage"]) { + eventContainer.eventArgs.cancel = true; + } else if ([eventContainer.eventArgs.propertyInfo.name isEqualToString:@"customerID"]) { + eventContainer.eventArgs.column.isReadOnly = true; + } else if ([eventContainer.eventArgs.propertyInfo.name isEqualToString:@"countryID"]) { + eventContainer.eventArgs.column.header = @"Country"; + eventContainer.eventArgs.column.horizontalAlignment = NSTextAlignmentLeft; + NSMutableArray *items = [NSMutableArray arrayWithArray:[CustomerData defaultCountries]]; + eventContainer.eventArgs.column.dataMap = [[GridDataMap alloc] initWithArray:items selectedValuePath:@"identifier" displayMemberPath:@"title"]; + + } else if ([eventContainer.eventArgs.propertyInfo.name isEqualToString:@"orderTotal"]) { + eventContainer.eventArgs.column.format = @"C2"; + } else if ([eventContainer.eventArgs.propertyInfo.name isEqualToString:@"address"]) { + eventContainer.eventArgs.column.wordWrap = true; + } + } forObject:self]; + + + self.flex.itemsSource = [CustomerData getCustomerData:100]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -- (void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexGrid *flex = (FlexGrid*)[self.view viewWithTag:1]; - - CGFloat ss = [UIApplication sharedApplication].statusBarFrame.size.height + self.navigationController.navigationBar.intrinsicContentSize.height; - - flex.frame = CGRectMake(0, ss, self.view.bounds.size.width, self.view.bounds.size.height - ss); - [flex setNeedsDisplay]; + +- (bool)prepareCellForEdit:(FlexGrid *)sender panel:(GridPanel *)panel forRange:(GridCellRange *)range { + FlexGrid *flex = self.flex; + GridColumn *col = [flex.columns objectAtIndex:range.col]; + if ([col.binding isEqualToString:@"lastOrderDate"]) { + UITextField *editor = (UITextField *)flex.activeEditor; + UIDatePicker *picker = [[UIDatePicker alloc] init]; + NSDate *d = (NSDate *)[flex.cells getCellDataForRow:range.row inColumn:range.col formatted:NO]; + picker.opaque = true; + picker.datePickerMode = UIDatePickerModeDate; + picker.date = d; + [picker addTarget:self action:@selector(onDatePickerChanged:) forControlEvents:UIControlEventValueChanged]; + editor.inputView = picker; + UIToolbar *toolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, flex.frame.size.width, 44)]; + toolbar.barStyle = UIBarStyleDefault; + UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(endEditDatePicker:)]; + UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; + [toolbar setItems:@[space, done]]; + editor.inputAccessoryView = toolbar; + editor.clearButtonMode = UITextFieldViewModeNever; + } + return false; +} + +- (void)onDatePickerChanged:(UIDatePicker *)sender { + FlexGrid *flex = self.flex; + UITextField *editor = (UITextField *)flex.activeEditor; + GridColumn *c = [flex.columns objectAtIndex:flex.editRange.col]; + editor.text = (NSString *)[c getFormattedValue:sender.date]; } -@end \ No newline at end of file + +- (BOOL)endEditDatePicker:(UITextField *)textField { + FlexGrid *flex = self.flex; + UITextField *editor = (UITextField *)flex.activeEditor; + UIDatePicker *picker = (UIDatePicker *)editor.inputView; + [flex.cells setCellData:picker.date forRow:flex.editRange.row inColumn:flex.editRange.col]; + [flex finishEditing:true]; + return true; +} + +@end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/GroupingController.m b/ObjectiveC/FlexGrid101/FlexGrid101/GroupingController.m index 15aadb5..dda6a8d 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/GroupingController.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/GroupingController.m @@ -7,9 +7,12 @@ #import "GroupingController.h" #import "CustomerData.h" -#import "XuniFlexGridKit/XuniFlexGridKit.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" @interface GroupingController () +@property (weak, nonatomic) IBOutlet FlexGrid *flex; +@property (weak, nonatomic) IBOutlet UIBarButtonItem *sortButton; +@property (weak, nonatomic) IBOutlet UIBarButtonItem *collapseButton; @end @@ -17,60 +20,43 @@ @implementation GroupingController - (void)viewDidLoad { [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. + self.flex.columnHeaderFont = [UIFont boldSystemFontOfSize:self.flex.columnHeaderFont.pointSize]; + self.flex.isReadOnly = true; + self.flex.autoGenerateColumns = false; - UIButton *sortAscendingButton = [UIButton buttonWithType:UIButtonTypeSystem]; - - UIButton *sortDescendingButton = [UIButton buttonWithType:UIButtonTypeSystem]; - - [sortAscendingButton setTitle:NSLocalizedString(@"Ascending", nil) forState:UIControlStateNormal]; - [sortDescendingButton setTitle:NSLocalizedString(@"Descending", nil) forState:UIControlStateNormal]; - [sortAscendingButton addTarget:self action:@selector(sortAscendingButtonClicked) forControlEvents:UIControlEventTouchUpInside]; - [sortDescendingButton addTarget:self action:@selector(sortDescendingButtonClicked) forControlEvents:UIControlEventTouchUpInside]; - [sortAscendingButton.titleLabel setTextAlignment:NSTextAlignmentCenter]; - [sortAscendingButton.titleLabel setTextAlignment:NSTextAlignmentCenter]; - FlexGrid *flex = [[FlexGrid alloc] init]; - flex.isReadOnly = true; + GridColumn *c1 = [[GridColumn alloc] init]; + c1.binding = @"active"; + c1.header = NSLocalizedString(@"Active", nil); + c1.width = 100; - flex.autoGenerateColumns = false; - FlexColumn *c1 = [[FlexColumn alloc] init]; - c1.binding = @"firstName"; - c1.header = NSLocalizedString(@"First Name", nil); + GridColumn *c2 = [[GridColumn alloc] init]; + c2.binding = @"firstName"; + c2.header = NSLocalizedString(@"Name", nil); - c1.width = 100; - FlexColumn *c2 = [[FlexColumn alloc] init]; - c2.binding = @"lastName"; - c2.header = NSLocalizedString(@"Last Name", nil); - FlexColumn *c3 = [[FlexColumn alloc] init]; + GridColumn *c3 = [[GridColumn alloc] init]; c3.binding = @"orderTotal"; c3.header = NSLocalizedString(@"Order Total", nil); c3.format = @"C"; c3.aggregate = XuniAggregateSum; - [flex.columns addObject:c1]; - [flex.columns addObject:c2]; - [flex.columns addObject:c3]; + + [self.flex.columns addObject:c1]; + [self.flex.columns addObject:c2]; + [self.flex.columns addObject:c3]; XuniPropertyGroupDescription *gd = [[XuniPropertyGroupDescription alloc]initWithProperty:@"country"]; - XuniSortDescription *sd =[[XuniSortDescription alloc] initWithProperty:@"country" ascending:true]; - flex.itemsSource = [CustomerData getCustomerData:100]; - [flex.collectionView.groupDescriptions addObject:gd]; - [flex.collectionView.sortDescriptions addObject:sd]; - flex.tag = 1; - sortAscendingButton.tag = 2; - sortDescendingButton.tag = 3; - [self.view addSubview:sortAscendingButton]; - [self.view addSubview:sortDescendingButton]; - [self starSizing:flex]; - [self.view addSubview:flex]; + self.flex.itemsSource = [CustomerData getCustomerData:100]; + [self.flex.collectionView.groupDescriptions addObject:gd]; + + [self starSizing:self.flex]; } -(void)starSizing:(FlexGrid*)g{ for (int i = 0; i < g.columns.count; i++) { - FlexColumn *c = [g.columns objectAtIndex:i]; - c.widthType = FlexColumnWidthStar; - c.width = (i == 0) ? 3 : (i == 3) ? 3 : 4; + GridColumn *c = [g.columns objectAtIndex:i]; + c.widthType = GridColumnWidthStar; + c.width = (i == 0) ? 2 : (i == 3) ? 3 : 4; } } @@ -79,31 +65,55 @@ - (void)didReceiveMemoryWarning { // Dispose of any resources that can be recreated. } -- (void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexGrid *flex = (FlexGrid*)[self.view viewWithTag:1]; - UIButton *sortAscendingButton = (UIButton*)[self.view viewWithTag:2]; - UIButton *sortDescendingButton = (UIButton*)[self.view viewWithTag:3]; - sortAscendingButton.frame = CGRectMake(0, 60, self.view.bounds.size.width/2, 50); - - sortDescendingButton.frame = CGRectMake(self.view.bounds.size.width/2, 60, self.view.bounds.size.width/2, 50); +- (IBAction)doSort:(id)sender { + UIBarButtonItem* btn = (UIBarButtonItem*)sender; + if([btn.title isEqualToString:NSLocalizedString(@"Z-A", nil)]) + { + [self sortDescendingButtonClicked]; + btn.title = NSLocalizedString(@"A-Z", nil); + } + else + { + [self sortAscendingButtonClicked]; + btn.title = NSLocalizedString(@"Z-A", nil); + } +} - flex.frame = CGRectMake(0, 110, self.view.bounds.size.width, self.view.bounds.size.height-110); - [flex setNeedsDisplay]; +- (IBAction)doCollapse:(id)sender { + UIBarButtonItem* btn = (UIBarButtonItem*)sender; + if([btn.title isEqualToString:NSLocalizedString(@"Collapse", nil)]) + { + [self.flex collapseGroupsToLevel:0]; + btn.title = NSLocalizedString(@"Expand", nil); + + } + else + { + if ([self.flex finishEditing:NO]) { + for (int i = 0; i < self.flex.rows.count; i++) { + GridRow *row = (GridRow *)[self.flex.rows objectAtIndex:i]; + if ([row isKindOfClass:[GridGroupRow class]]) { + GridGroupRow *group = (GridGroupRow *)row; + group.isCollapsed = false; + } + } + } + btn.title = NSLocalizedString(@"Collapse", nil); + } } -(void)sortAscendingButtonClicked{ - FlexGrid *flex = (FlexGrid *)[self.view viewWithTag:1]; - [flex.collectionView.sortDescriptions removeAllObjects]; + [self.flex.collectionView.sortDescriptions removeAllObjects]; XuniSortDescription *sd =[[XuniSortDescription alloc] initWithProperty:@"country" ascending:true]; - [flex.collectionView.sortDescriptions addObject:sd]; + [self.flex.collectionView.sortDescriptions addObject:sd]; + self.collapseButton.title = NSLocalizedString(@"Collapse", nil); } -(void)sortDescendingButtonClicked{ - FlexGrid *flex = (FlexGrid *)[self.view viewWithTag:1]; - [flex.collectionView.sortDescriptions removeAllObjects]; + [self.flex.collectionView.sortDescriptions removeAllObjects]; XuniSortDescription *sd =[[XuniSortDescription alloc] initWithProperty:@"country" ascending:false]; - [flex.collectionView.sortDescriptions addObject:sd]; + [self.flex.collectionView.sortDescriptions addObject:sd]; + self.collapseButton.title = NSLocalizedString(@"Collapse", nil); } @end \ No newline at end of file diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/OnDemandController.m b/ObjectiveC/FlexGrid101/FlexGrid101/OnDemandController.m index d7ec9ba..5649f3e 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/OnDemandController.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/OnDemandController.m @@ -7,67 +7,122 @@ #import "OnDemandController.h" #import "CustomerData.h" -#import "XuniFlexGridKit/XuniFlexGridKit.h" -#import - -@interface DemoCursorCollectionView: XuniCursorCollectionView - -@end - +#import "YouTubeCollectionView.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" +#import @interface OnDemandController () +@property (weak, nonatomic) IBOutlet FlexGrid *flex; +@property (weak, nonatomic) IBOutlet UITextField *textInput; +@property (weak, nonatomic) IBOutlet UISegmentedControl *sortSelect; @end -@implementation DemoCursorCollectionView --(id)init -{ - DemoCursorCollectionView * coll = [super init]; - - coll.sourceCollection = [CustomerData getCustomerData:100]; - - return coll; +@implementation OnDemandController + +- (IBAction)startSearching:(id)sender { + [self.textInput resignFirstResponder]; + [self updateSearch]; } --(NSMutableArray *)itemGetter:(NSNumber *)desiredNumber -{ - return [CustomerData getCustomerData:desiredNumber==nil?100:desiredNumber.intValue]; +- (IBAction)searchModeChanged:(id)sender { + [self updateSearch]; } --(bool) hasMoreItems +-(void) updateSearch { - return self.sourceCollection.count < 400; + NSArray* selArray = @[@"relevance",@"date",@"viewCount",@"rating",@"title"]; + + YouTubeCollectionView* cv = [[YouTubeCollectionView alloc] initWithQuery:self.textInput.text orderBy:[selArray objectAtIndex:self.sortSelect.selectedSegmentIndex]]; + self.flex.collectionView = cv; + + + [cv loadMoreItems:@(50) completion:^{ + }]; } -@end -@implementation OnDemandController - (void)viewDidLoad { [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. - FlexGrid *flex = [[FlexGrid alloc] init]; - flex.columnHeaderFont = [UIFont boldSystemFontOfSize:flex.columnHeaderFont.pointSize]; - flex.isReadOnly = true; - flex.collectionView = [[DemoCursorCollectionView alloc] init]; - flex.tag = 1; - [flex autoSizeColumns:0 to:flex.columns.count-1]; - [self.view addSubview:flex]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} -- (void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexGrid *flex = (FlexGrid*)[self.view viewWithTag:1]; + NSMutableDictionary* dic = [[NSMutableDictionary alloc]init]; + + self.flex.columnHeaderFont = [UIFont boldSystemFontOfSize:self.flex.columnHeaderFont.pointSize]; + self.flex.isReadOnly = true; + + self.flex.autoGenerateColumns = false; - CGFloat ss = [UIApplication sharedApplication].statusBarFrame.size.height + self.navigationController.navigationBar.intrinsicContentSize.height; + GridColumn *thumbnail = [[GridColumn alloc] init]; + thumbnail.binding = @"thumbnail"; + thumbnail.width = 150; + [self.flex.columns addObject:thumbnail]; - flex.frame = CGRectMake(0, ss, self.view.bounds.size.width, self.view.bounds.size.height - ss); - [flex setNeedsDisplay]; + GridColumn *title = [[GridColumn alloc] init]; + title.binding = @"title"; + title.wordWrap = true; + [self.flex.columns addObject:title]; + + GridColumn *channel = [[GridColumn alloc] init]; + channel.binding = @"channelTitle"; + channel.wordWrap = true; + [self.flex.columns addObject:channel]; + + [self.flex.flexGridLoadedRows addHandler:^(XuniEventContainer *eventContainer) { + for(int i = 0; i *eventContainer) { + + GridColumn* col = self.flex.columns[eventContainer.eventArgs.col]; + if([col.binding isEqualToString:@"thumbnail"] && eventContainer.eventArgs.panel == self.flex.cells) + { + NSString* url = (NSString*)[self.flex getCellDataForRow:eventContainer.eventArgs.row inColumn:eventContainer.eventArgs.col formatted:false]; + NSData* imgdata = [dic objectForKey:url]; + if(imgdata == nil) + { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ + NSData* imgdata = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; + dispatch_async(dispatch_get_main_queue(), ^{ + [dic setObject:imgdata forKey:url]; + [self.flex invalidate]; + }); + }); + + eventContainer.eventArgs.cancel = true; + return; + } + + UIImage *image = [UIImage imageWithData:imgdata]; + CGRect r = [eventContainer.eventArgs.panel getCellRectForRow:eventContainer.eventArgs.row inColumn:eventContainer.eventArgs.col]; + + CGSize imageSize = image.size; + CGSize viewSize = r.size; + + float hfactor = imageSize.width / viewSize.width; + float vfactor = imageSize.height / viewSize.height; + + float factor = fmax(hfactor, vfactor); + + float newWidth = imageSize.width / factor; + float newHeight = imageSize.height / factor; + + CGRect newRect = CGRectMake(r.origin.x+(r.size.width-newWidth)/2,r.origin.y+(r.size.height-newHeight)/2, newWidth, newHeight); + + [image drawInRect:newRect]; + + eventContainer.eventArgs.cancel = true; + } + + } forObject:self]; + + + [self updateSearch]; } + @end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/RowDetailsViewController.m b/ObjectiveC/FlexGrid101/FlexGrid101/RowDetailsViewController.m index 40da7f1..989ff70 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/RowDetailsViewController.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/RowDetailsViewController.m @@ -6,50 +6,101 @@ // #import "CustomerData.h" -#import "XuniFlexGridKit/XuniFlexGridKit.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" #import "RowDetailsViewController.h" +#import +#import @interface RowDetailsViewController () -@property (weak, nonatomic) IBOutlet FlexGrid *grid; +@property (weak, nonatomic) IBOutlet FlexGrid *grid; +@property (weak, nonatomic) IBOutlet UISegmentedControl *detailMode; @end @implementation RowDetailsViewController +- (IBAction)detailModeChange:(id)sender { + switch (self.detailMode.selectedSegmentIndex) { + case 0: + self.grid.detailProvider.detailVisibilityMode = GridDetailVisibilityModeExpandSingle; + break; + case 1: + self.grid.detailProvider.detailVisibilityMode = GridDetailVisibilityModeExpandMultiple; + break; + case 2: + self.grid.detailProvider.detailVisibilityMode = GridDetailVisibilityModeSelection; + break; + } +} - (void)viewDidLoad { [super viewDidLoad]; - self.grid.isReadOnly = true; - self.grid.itemsSource = [CustomerData getCustomerData:100]; + self.grid.isReadOnly = true; + self.grid.selectionMode = GridSelectionModeRow; + self.grid.columnHeaderFont = [UIFont boldSystemFontOfSize:self.grid.columnHeaderFont.pointSize]; + self.grid.autoGenerateColumns = false; + + GridColumn *identifier = [[GridColumn alloc] init]; + identifier.binding = @"customerID"; + identifier.header = @"ID"; + identifier.isReadOnly = true; + identifier.widthType = GridColumnWidthPixel; + identifier.width = 45; + [self.grid.columns addObject:identifier]; + + GridColumn *firstName = [[GridColumn alloc] init]; + firstName.binding = @"firstName"; + firstName.widthType = GridColumnWidthStar; + firstName.width = 1; + [self.grid.columns addObject:firstName]; + + GridColumn *lastName = [[GridColumn alloc] init]; + lastName.binding = @"lastName"; + lastName.widthType = GridColumnWidthStar; + lastName.width = 1; + [self.grid.columns addObject:lastName]; - IXuniEventHandler rowHeaderLoadingEventHandler = ^(NSObject *sender, XuniEventArgs *args) - { - FlexGridRowHeaderLoadingEventArgs *e=(FlexGridRowHeaderLoadingEventArgs*)args; - UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom]; + + + [self.grid.detailProvider.gridRowHeaderLoading addHandler:^(XuniEventContainer *eventContainer) { + UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; [btn setImage:[UIImage imageNamed:@"show"] forState:(UIControlStateNormal)]; [btn setImage:[UIImage imageNamed:@"hide"] forState:(UIControlStateSelected)]; + btn.imageView.contentMode = UIViewContentModeScaleAspectFit; - e.button=btn; - }; - - [self.grid.detailProvider.gridRowHeaderLoading addHandler:rowHeaderLoadingEventHandler forObject:self]; - - - IXuniEventHandler detailCellCreatingHandler = ^(NSObject *sender, XuniEventArgs *args) - { - FlexGridDetailCellCreatingEventArgs *e = (FlexGridDetailCellCreatingEventArgs *)args; - FlexGrid *flex = [[FlexGrid alloc] init]; - flex.itemsSource = [NSMutableArray arrayWithArray: [XuniReflector getProperties:e.row.dataItem]]; - e.view = flex; - }; - - [self.grid.detailProvider.detailCellCreating addHandler:detailCellCreatingHandler forObject:self]; - + eventContainer.eventArgs.button = btn; + + } forObject:self]; + - self.grid.detailProvider.detailVisibilityMode = FlexGridDetailVisibilityModeExpandMultiple; -} + [self.grid.detailProvider.detailCellCreating addHandler:^(XuniEventContainer *eventContainer) { + MKMapView *mapView = [[MKMapView alloc] init]; + eventContainer.eventArgs.view = mapView; + mapView.userInteractionEnabled = false; + + CLGeocoder *geocoder = [[CLGeocoder alloc] init]; + [geocoder geocodeAddressString:((CustomerData*)eventContainer.eventArgs.row.dataItem).city completionHandler:^(NSArray *placemarks, NSError *error) { + if (error) { + NSLog(@"%@", error); + } else { + CLPlacemark *placemark = [placemarks lastObject]; + float spanX = 0.0725; + float spanY = 0.0725; + MKCoordinateRegion region; + region.center.latitude = placemark.location.coordinate.latitude; + region.center.longitude = placemark.location.coordinate.longitude; + region.span = MKCoordinateSpanMake(spanX, spanY); + [mapView setRegion:region animated:NO]; + } + }]; + + } forObject:self]; + + + [self detailModeChange:self]; + + self.grid.itemsSource = [CustomerData getCustomerData:100]; -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; } + @end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/SampleData.h b/ObjectiveC/FlexGrid101/FlexGrid101/SampleData.h new file mode 100644 index 0000000..62bdde7 --- /dev/null +++ b/ObjectiveC/FlexGrid101/FlexGrid101/SampleData.h @@ -0,0 +1,20 @@ +// +// SampleData.h +// CollectionView101 +// +// Copyright © 2016 GrapeCity. All rights reserved. +// + +#import + +@interface SampleData : NSObject + +@property NSString* title; +@property NSString* subtitle; +@property NSString* thumbnail; +@property NSString* link; +@property NSString* channelTitle; + +- (id)initWithTitle:(NSString*)title subtitle:(NSString*)subtitle; + +@end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/SampleData.m b/ObjectiveC/FlexGrid101/FlexGrid101/SampleData.m new file mode 100644 index 0000000..b6c2f66 --- /dev/null +++ b/ObjectiveC/FlexGrid101/FlexGrid101/SampleData.m @@ -0,0 +1,21 @@ +// +// SampleData.m +// CollectionView101 +// +// Copyright © 2016 GrapeCity. All rights reserved. +// + +#import "SampleData.h" + +@implementation SampleData +- (id)initWithTitle:(NSString*)title subtitle:(NSString*)subtitle +{ + self = [super init]; + if(self) + { + self.title = title; + self.subtitle = subtitle; + } + return self; +} +@end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/SelectionModesController.h b/ObjectiveC/FlexGrid101/FlexGrid101/SelectionModesController.h index 3bbfa30..aefdf14 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/SelectionModesController.h +++ b/ObjectiveC/FlexGrid101/FlexGrid101/SelectionModesController.h @@ -7,6 +7,6 @@ #import -@interface SelectionModesController : UIViewController +@interface SelectionModesController : UIViewController @end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/SelectionModesController.m b/ObjectiveC/FlexGrid101/FlexGrid101/SelectionModesController.m index 9a4ca53..7dc9a3a 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/SelectionModesController.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/SelectionModesController.m @@ -7,88 +7,46 @@ #import "SelectionModesController.h" #import "CustomerData.h" -#import "XuniFlexGridKit/XuniFlexGridKit.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" -@interface SelectionModesController (){ - NSMutableArray *pickerData; -} -@end - -@implementation SelectionModesController - -- (void)viewDidLoad { - [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. - pickerData =[[NSMutableArray alloc] initWithObjects:NSLocalizedString(@"None", nil), NSLocalizedString(@"Cell", nil), NSLocalizedString(@"Cell Range", nil), NSLocalizedString(@"Row", nil), NSLocalizedString(@"Row Range", nil), nil]; - UIPickerView *selectionModePicker = [[UIPickerView alloc] init]; - FlexGrid *flex = [[FlexGrid alloc] init]; - flex.isReadOnly = true; - flex.selectionMode = FlexSelectionModeNone; - flex.itemsSource = [CustomerData getCustomerData:100]; - - selectionModePicker.delegate = self; - selectionModePicker.showsSelectionIndicator = YES; - selectionModePicker.hidden = false; - [selectionModePicker selectRow:0 inComponent:0 animated:false]; - - flex.tag = 1; - selectionModePicker.tag = 2; - - [self.view addSubview:selectionModePicker]; - [self.view addSubview:flex]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} +@interface SelectionModesController () -- (void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - - CGFloat ss = [UIApplication sharedApplication].statusBarFrame.size.height + self.navigationController.navigationBar.intrinsicContentSize.height; - - FlexGrid *flex = (FlexGrid*)[self.view viewWithTag:1]; - UIPickerView *selectionModePicker = (UIPickerView*)[self.view viewWithTag:2]; - selectionModePicker.frame = CGRectMake(self.view.bounds.size.width/4, ss, self.view.bounds.size.width/2, 162); - - flex.frame = CGRectMake(0, selectionModePicker.frame.origin.y+selectionModePicker.frame.size.height, self.view.bounds.size.width, (self.view.bounds.size.height-selectionModePicker.frame.origin.y-selectionModePicker.frame.size.height)); - [flex setNeedsDisplay]; - [selectionModePicker setNeedsDisplay]; -} +@property (weak, nonatomic) IBOutlet FlexGrid *flex; +@property (weak, nonatomic) IBOutlet UISegmentedControl *modeSwitch; +@property (weak, nonatomic) IBOutlet UIBarButtonItem *selected; +@property (weak, nonatomic) IBOutlet UIBarButtonItem *selectedCount; -- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ - return 1; -} +@end -- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ - return [pickerData count]; -} +@implementation SelectionModesController +- (IBAction)modeSwitched:(id)sender { + NSInteger row = self.modeSwitch.selectedSegmentIndex; -- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ - FlexGrid *flex = (FlexGrid *)[self.view viewWithTag:1]; - - if (row == 0) { - flex.selectionMode = FlexSelectionModeNone; - } - else if (row == 1){ - flex.selectionMode = FlexSelectionModeCell; - } - else if (row == 2){ - flex.selectionMode = FlexSelectionModeCellRange; - } - else if (row == 3){ - flex.selectionMode = FlexSelectionModeRow; - } - else if (row == 4){ - flex.selectionMode = FlexSelectionModeRowRange; + self.flex.selectionMode = GridSelectionModeNone; + } else if (row == 1) { + self.flex.selectionMode = GridSelectionModeCell; + } else if (row == 2) { + self.flex.selectionMode = GridSelectionModeCellRange; + } else if (row == 3) { + self.flex.selectionMode = GridSelectionModeRow; + } else if (row == 4) { + self.flex.selectionMode = GridSelectionModeRowRange; } } -- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ - - return [pickerData objectAtIndex:row]; - +- (void)viewDidLoad { + [super viewDidLoad]; + self.flex.isReadOnly = true; + self.flex.columnHeaderFont = [UIFont boldSystemFontOfSize:self.flex.columnHeaderFont.pointSize]; + self.flex.selectionMode = GridSelectionModeNone; + self.flex.itemsSource = [CustomerData getCustomerData:100]; + + [self.flex.flexGridSelectionChanged addHandler:^(XuniEventContainer *eventContainer) { + int selected = self.flex.selection.columnSpan * self.flex.selection.rowSpan; + + self.selectedCount.title = [NSString stringWithFormat:@"%i selected", selected]; + } forObject:self]; } + @end \ No newline at end of file diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/StarSizingController.m b/ObjectiveC/FlexGrid101/FlexGrid101/StarSizingController.m index 7654c24..394e348 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/StarSizingController.m +++ b/ObjectiveC/FlexGrid101/FlexGrid101/StarSizingController.m @@ -7,9 +7,10 @@ #import "StarSizingController.h" #import "CustomerData.h" -#import "XuniFlexGridKit/XuniFlexGridKit.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" @interface StarSizingController () +@property (weak, nonatomic) IBOutlet FlexGrid *flex; @end @@ -17,69 +18,46 @@ @implementation StarSizingController - (void)viewDidLoad { [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. - FlexGrid *flex = [[FlexGrid alloc] init]; - flex.columnHeaderFont = [UIFont boldSystemFontOfSize:flex.columnHeaderFont.pointSize]; - flex.autoGenerateColumns = false; - FlexColumn *c1 = [[FlexColumn alloc] init]; - c1.binding = @"customerID"; - c1.header = NSLocalizedString(@"ID", nil); - c1.widthType = FlexColumnWidthStar; - c1.width = 1; + self.flex.columnHeaderFont = [UIFont boldSystemFontOfSize:self.flex.columnHeaderFont.pointSize]; + self.flex.autoGenerateColumns = false; - FlexColumn *c2 = [[FlexColumn alloc] init]; - c2.binding = @"firstName"; - c2.header = NSLocalizedString(@"First Name", nil); - c2.widthType = FlexColumnWidthStar; + GridColumn *c1 = [[GridColumn alloc] init]; + c1.binding = @"firstName"; + c1.header = NSLocalizedString(@"First Name", nil); + c1.widthType = GridColumnWidthStar; + c1.width = 3; + + GridColumn *c2 = [[GridColumn alloc] init]; + c2.binding = @"lastName"; + c2.header = NSLocalizedString(@"Last Name", nil); + c2.widthType = GridColumnWidthStar; c2.width = 3; - FlexColumn *c3 = [[FlexColumn alloc] init]; - c3.binding = @"lastName"; - c3.header = NSLocalizedString(@"Last Name", nil); - c3.widthType = FlexColumnWidthStar; - c3.width = 3; + GridColumn *c3 = [[GridColumn alloc] init]; + c3.binding = @"lastOrderDate"; + c3.header = NSLocalizedString(@"Last Date", nil); + c3.widthType = GridColumnWidthStar; + c3.width = 2; - FlexColumn *c4 = [[FlexColumn alloc] init]; + GridColumn *c4 = [[GridColumn alloc] init]; c4.binding = @"orderTotal"; c4.header = NSLocalizedString(@"Total", nil); c4.format = @"C"; - c4.widthType = FlexColumnWidthStar; + c4.headerHorizontalAlignment = NSTextAlignmentLeft; + c4.widthType = GridColumnWidthStar; c4.width = 2; - [flex.columns addObject:c1]; - [flex.columns addObject:c2]; - [flex.columns addObject:c3]; - [flex.columns addObject:c4]; - flex.itemsSource = [CustomerData getCustomerData:100]; - flex.isReadOnly = true; - flex.tag = 1; - [self.view addSubview:flex]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} -- (void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexGrid *flex = (FlexGrid*)[self.view viewWithTag:1]; - CGFloat ss = [UIApplication sharedApplication].statusBarFrame.size.height + self.navigationController.navigationBar.intrinsicContentSize.height; + [self.flex.columns addObject:c1]; + [self.flex.columns addObject:c2]; + [self.flex.columns addObject:c3]; + [self.flex.columns addObject:c4]; - flex.frame = CGRectMake(0, ss, self.view.bounds.size.width, self.view.bounds.size.height - ss); - [flex setNeedsDisplay]; + self.flex.itemsSource = [CustomerData getCustomerData:100]; + self.flex.isReadOnly = true; } -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/UnboundSampleViewController.h b/ObjectiveC/FlexGrid101/FlexGrid101/UnboundSampleViewController.h new file mode 100644 index 0000000..7506a4e --- /dev/null +++ b/ObjectiveC/FlexGrid101/FlexGrid101/UnboundSampleViewController.h @@ -0,0 +1,13 @@ +// +// UnboundSampleViewController.h +// FlexGrid101 +// +// Created by Mykola Kotyuck on 16.06.16. +// Copyright © 2016 GrapeCity. All rights reserved. +// + +#import + +@interface UnboundSampleViewController : UIViewController + +@end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/UnboundSampleViewController.m b/ObjectiveC/FlexGrid101/FlexGrid101/UnboundSampleViewController.m new file mode 100644 index 0000000..29d400a --- /dev/null +++ b/ObjectiveC/FlexGrid101/FlexGrid101/UnboundSampleViewController.m @@ -0,0 +1,81 @@ +// +// UnboundSampleViewController.m +// FlexGrid101 +// +// Created by Mykola Kotyuck on 16.06.16. +// Copyright © 2016 GrapeCity. All rights reserved. +// + +#import "UnboundSampleViewController.h" +#import "XuniFlexGridDynamicKit/XuniFlexGridDynamicKit.h" + +@interface UnboundSampleViewController () +@property (weak, nonatomic) IBOutlet FlexGrid *grid; + +@end + +@implementation UnboundSampleViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + // allow merging + _grid.allowMerging = GridAllowMergingAll; + + // add rows/columns to the unbound grid + for (int i = 0; i < 12; i++) // three years, four quarters per year + { + [_grid.columns addObject:[[GridColumn alloc] init]]; + } + for (int i = 0; i < 500; i++) + { + [_grid.rows addObject:[[GridRow alloc] init]]; + } + + // populate the unbound grid with some stuff + for (int r = 0; r < _grid.rows.count; r++) + { + for (int c = 0; c < _grid.columns.count; c++) + { + _grid[r][c] = [NSString stringWithFormat:@"cell [%i, %i]", r, c]; + } + } + + // set unbound column headers + GridPanel* ch = _grid.columnHeaders; + [ch.rows addObject:[[GridRow alloc] init]]; // one header row for years, one for quarters + for (int c = 0; c < ch.columns.count; c++) + { + ch[0][c] = @(2016 + c / 4); // year + ch[1][c] = [NSString stringWithFormat:@"Q %i", c%4+1]; // quarter + } + + // allow merging the first fixed row + ch.rows[0].allowMerging = true; + + // set unbound row headers + GridPanel* rh = _grid.rowHeaders; + [rh.columns addObject:[[GridColumn alloc] init]]; + for (int c = 0; c < rh.columns.count; c++) + { + rh.columns[c].width = 60; + for (int r = 0; r < rh.rows.count; r++) + { + rh[r][c] = [NSString stringWithFormat:@"hdr %i, %i", c == 0 ? r / 2 : r, c]; + } + } + + // allow merging the first fixed column + rh.columns[0].allowMerging = true; + + [_grid autoSizeColumns:0 to:1 header:true]; + [_grid autoSizeColumns]; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; +} + + + +@end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/YouTubeCollectionView.h b/ObjectiveC/FlexGrid101/FlexGrid101/YouTubeCollectionView.h new file mode 100644 index 0000000..94b2795 --- /dev/null +++ b/ObjectiveC/FlexGrid101/FlexGrid101/YouTubeCollectionView.h @@ -0,0 +1,17 @@ +// +// YouTubeCollectionView.h +// CollectionView101 +// +// Copyright © 2016 GrapeCity. All rights reserved. +// + +#import +#import + +@interface YouTubeCollectionView : XuniCursorCollectionView + +@property (readonly) NSString* query; +@property (readonly) NSString* orderBy; +-(id)initWithQuery:(NSString*)query orderBy:(NSString*)orderBy; + +@end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/YouTubeCollectionView.m b/ObjectiveC/FlexGrid101/FlexGrid101/YouTubeCollectionView.m new file mode 100644 index 0000000..776e567 --- /dev/null +++ b/ObjectiveC/FlexGrid101/FlexGrid101/YouTubeCollectionView.m @@ -0,0 +1,70 @@ +// +// YouTubeCollectionView.m +// CollectionView101 +// +// Copyright © 2016 GrapeCity. All rights reserved. +// + +#import "YouTubeCollectionView.h" +#import "SampleData.h" + +@interface YouTubeCollectionView () +@property NSString *pageToken; +@end + +@implementation YouTubeCollectionView + +- (id)initWithQuery:(NSString *)query orderBy:(NSString *)orderBy { + self = [super init]; + if (self) { + _query = query; + _orderBy = orderBy; + _pageToken = @""; + } + return self; +} + +- (bool)hasMoreItems { + return true; +} + +- (NSMutableArray *)itemGetter:(NSNumber *)desiredNumber { + NSMutableArray* dataToAppend = [[NSMutableArray alloc]init]; + + NSString *urlAddress = [NSString stringWithFormat:@"https://www.googleapis.com/youtube/v3/search?part=snippet&type=video&q=%@&order=%@&maxResults=%@%@&key=%@", [_query stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]], _orderBy, desiredNumber, _pageToken.length ? [NSString stringWithFormat:@"&pageToken=%@", _pageToken] : @"", @"AIzaSyDFz8V9U0ccKXQ5oSrcRSoHqpaursqOudo"]; + + NSData *dataResult = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlAddress]]; + NSError *error = nil; + id object = [NSJSONSerialization + JSONObjectWithData:dataResult + options:0 + error:&error]; + + if (error) { + } + + if ([object isKindOfClass:[NSDictionary class]]) { + NSDictionary *results = object; + self.pageToken = [results objectForKey:@"nextPageToken"]; + + NSArray* items = [results objectForKey:@"items"]; + for (NSDictionary* dict in items) { + NSString* title = [[dict objectForKey:@"snippet"] objectForKey:@"title"]; + NSString* description = [[dict objectForKey:@"snippet"] objectForKey:@"description"]; + + SampleData* sample = [[SampleData alloc] initWithTitle:title subtitle:description]; + sample.channelTitle = [[dict objectForKey:@"snippet"] objectForKey:@"channelTitle"]; + sample.link = [NSString stringWithFormat:@"http://www.youtube.com/watch?v=%@", [[dict objectForKey:@"id"] objectForKey:@"videoId"]]; + + sample.thumbnail = [[[[dict objectForKey:@"snippet"] objectForKey:@"thumbnails"] objectForKey:@"default"] objectForKey:@"url"]; + [dataToAppend addObject:sample]; + + } + } else { + } + + + return dataToAppend; +} + +@end diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/flexgrid_headers.png b/ObjectiveC/FlexGrid101/FlexGrid101/flexgrid_headers.png new file mode 100644 index 0000000000000000000000000000000000000000..5ff47b307686656ac6c54e53fa64d59c664b995b GIT binary patch literal 2787 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 PT`IuX?oYez8Itf1mpXoR literal 0 HcmV?d00001 diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/ja.lproj/LaunchScreen.strings b/ObjectiveC/FlexGrid101/FlexGrid101/ja.lproj/LaunchScreen.strings index 4c3f625..6ce77da 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/ja.lproj/LaunchScreen.strings +++ b/ObjectiveC/FlexGrid101/FlexGrid101/ja.lproj/LaunchScreen.strings @@ -1,6 +1,6 @@ -/* Class = "UILabel"; text = " Copyright (c) 2015 GrapeCity. All rights reserved."; ObjectID = "8ie-xW-0ye"; */ -"8ie-xW-0ye.text" = " Copyright (c) 2015 GrapeCity. All rights reserved."; +/* Class = "UILabel"; text = "FlexGrid101"; ObjectID = "9OV-Zx-N0E"; */ +"9OV-Zx-N0E.text" = "FlexGrid101"; -/* Class = "UILabel"; text = "FlexGrid101"; ObjectID = "kId-c2-rCX"; */ -"kId-c2-rCX.text" = "FlexGrid101"; +/* Class = "UILabel"; text = " Copyright (c) 2016 GrapeCity. All rights reserved."; ObjectID = "yI0-Lc-fAb"; */ +"yI0-Lc-fAb.text" = " Copyright (c) 2016 GrapeCity. All rights reserved."; diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/ja.lproj/Localizable.strings b/ObjectiveC/FlexGrid101/FlexGrid101/ja.lproj/Localizable.strings index 7137ac2..2623252 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/ja.lproj/Localizable.strings +++ b/ObjectiveC/FlexGrid101/FlexGrid101/ja.lproj/Localizable.strings @@ -44,4 +44,11 @@ "Total" = "合計"; "Count" = "件数"; "Edit Columns" = "表示列の構成を編集"; -"Done" = "完了"; \ No newline at end of file +"Done" = "完了"; +"Monday" = "月曜日"; +"Tuesday" = "火曜日"; +"Wednesday" = "水曜日"; +"Thursday" = "木曜日"; +"Friday" = "金曜日"; +"Saturday" = "土曜日"; +"Sunday" = "日曜日"; diff --git a/ObjectiveC/FlexGrid101/FlexGrid101/ja.lproj/Main.strings b/ObjectiveC/FlexGrid101/FlexGrid101/ja.lproj/Main.strings index 42ca519..fdce41c 100644 --- a/ObjectiveC/FlexGrid101/FlexGrid101/ja.lproj/Main.strings +++ b/ObjectiveC/FlexGrid101/FlexGrid101/ja.lproj/Main.strings @@ -1,39 +1,273 @@ +/* Class = "UILabel"; text = "Display, edit and aggregate your data all at once with FlexGrid"; ObjectID = "04q-Qk-1Uw"; */ +"04q-Qk-1Uw.text" = "FlexGrid でデータを表示、編集、集計"; + +/* Class = "UILabel"; text = "Expand and collapse row details"; ObjectID = "06n-gc-HrI"; */ +"06n-gc-HrI.text" = "グリッドを展開/折りたたみして詳細を表示"; + /* Class = "UILabel"; text = "Address"; ObjectID = "1eT-oW-hrf"; */ "1eT-oW-hrf.text" = "住所(Address)"; /* Class = "UILabel"; text = "Cancel"; ObjectID = "27j-QJ-v3z"; */ "27j-QJ-v3z.text" = "キャンセル"; +/* Class = "UIBarButtonItem"; title = "Collapse"; ObjectID = "2Eb-oV-Hai"; */ +"2Eb-oV-Hai.title" = "折りたたみ"; + +/* Class = "UILabel"; text = "Filter"; ObjectID = "2LZ-vR-psM"; */ +"2LZ-vR-psM.text" = "フィルター"; + +/* Class = "UILabel"; text = "Custom Cells"; ObjectID = "2Th-7C-8LJ"; */ +"2Th-7C-8LJ.text" = "カスタムセル"; + +/* Class = "UILabel"; text = "Cell Freezing&Merging"; ObjectID = "2gG-ng-mWe"; */ +"2gG-ng-mWe.text" = "セルの固定と結合"; + +/* Class = "UINavigationItem"; title = "Star Sizing"; ObjectID = "3qT-IC-ym1"; */ +"3qT-IC-ym1.title" = "スターサイズ機能"; + /* Class = "UILabel"; text = "City"; ObjectID = "3zE-V2-2FJ"; */ "3zE-V2-2FJ.text" = "都市(City)"; -/* Class = "UINavigationItem"; title = "FlexGrid101"; ObjectID = "Gnw-bn-nSm"; */ -"Gnw-bn-nSm.title" = "FlexGrid101"; +/* Class = "UILabel"; text = "Shows the various cell selection modes"; ObjectID = "4tS-YM-9aG"; */ +"4tS-YM-9aG.text" = "各種セル選択モードを表示"; + +/* Class = "UILabel"; text = ">"; ObjectID = "AA4-TE-lHv"; */ +"AA4-TE-lHv.text" = ">"; + +/* Class = "UILabel"; text = ">"; ObjectID = "BGo-Hy-EXj"; */ +"BGo-Hy-EXj.text" = ">"; + +/* Class = "UINavigationItem"; title = "On Demand"; ObjectID = "BlD-bH-UCJ"; */ +"BlD-bH-UCJ.title" = "データオンデマンド"; + +/* Class = "UINavigationItem"; title = "Getting Started"; ObjectID = "Bmk-c4-cSH"; */ +"Bmk-c4-cSH.title" = "FlexGridの基本機能"; + +/* Class = "UILabel"; text = "Groups and aggregates a collection of videos"; ObjectID = "DJX-fJ-Pwm"; */ +"DJX-fJ-Pwm.text" = "コレクションをグループ化して集計"; + +/* Class = "UISegmentedControl"; DNg-23-xSo.segmentTitles[0] = "None"; ObjectID = "DNg-23-xSo"; */ +"DNg-23-xSo.segmentTitles[0]" = "なし"; + +/* Class = "UISegmentedControl"; DNg-23-xSo.segmentTitles[1] = "Cell"; ObjectID = "DNg-23-xSo"; */ +"DNg-23-xSo.segmentTitles[1]" = "セル"; + +/* Class = "UISegmentedControl"; DNg-23-xSo.segmentTitles[2] = "CellRange"; ObjectID = "DNg-23-xSo"; */ +"DNg-23-xSo.segmentTitles[2]" = "セル範囲"; + +/* Class = "UISegmentedControl"; DNg-23-xSo.segmentTitles[3] = "Row"; ObjectID = "DNg-23-xSo"; */ +"DNg-23-xSo.segmentTitles[3]" = "行"; + +/* Class = "UISegmentedControl"; DNg-23-xSo.segmentTitles[4] = "RowRange"; ObjectID = "DNg-23-xSo"; */ +"DNg-23-xSo.segmentTitles[4]" = "行範囲"; + +/* Class = "UISegmentedControl"; EGj-kt-ixf.segmentTitles[0] = "Single"; ObjectID = "EGj-kt-ixf"; */ +"EGj-kt-ixf.segmentTitles[0]" = "単一"; + +/* Class = "UISegmentedControl"; EGj-kt-ixf.segmentTitles[1] = "Multiple"; ObjectID = "EGj-kt-ixf"; */ +"EGj-kt-ixf.segmentTitles[1]" = "複数"; + +/* Class = "UISegmentedControl"; EGj-kt-ixf.segmentTitles[2] = "Selection"; ObjectID = "EGj-kt-ixf"; */ +"EGj-kt-ixf.segmentTitles[2]" = "選択"; -/* Class = "UIBarButtonItem"; title = "FlexGrid101"; ObjectID = "Kll-7W-u7d"; */ -"Kll-7W-u7d.title" = "FlexGrid101"; +/* Class = "UIBarButtonItem"; title = "Sort"; ObjectID = "Fwd-0m-rRb"; */ +"Fwd-0m-rRb.title" = "ソート"; + +/* Class = "UILabel"; text = ">"; ObjectID = "GPg-el-nwa"; */ +"GPg-el-nwa.text" = ">"; + +/* Class = "UILabel"; text = ">"; ObjectID = "Hgo-7Q-HXe"; */ +"Hgo-7Q-HXe.text" = ">"; + +/* Class = "UINavigationItem"; title = "Freezing&Merging"; ObjectID = "I2u-HG-HDn"; */ +"I2u-HG-HDn.title" = "セルの固定と結合"; + +/* Class = "UILabel"; text = "Shows a grid with custom cell merging"; ObjectID = "IHh-tS-Qvb"; */ +"IHh-tS-Qvb.text" = "隣接セルを結合(マージ)してグリッドをレイアウトする"; + +/* Class = "UILabel"; text = "Edit cells by input form rather than inline"; ObjectID = "Jnc-m9-pHa"; */ +"Jnc-m9-pHa.text" = "入力フォームでセルの内容を編集"; + +/* Class = "UILabel"; text = "Customizes a cell by displaying a numeric value in a gauge"; ObjectID = "Jqb-XX-nWX"; */ +"Jqb-XX-nWX.text" = "値をゲージで表現した独自形式のセルを表示"; + +/* Class = "UILabel"; text = ">"; ObjectID = "LUH-fq-7yE"; */ +"LUH-fq-7yE.text" = ">"; /* Class = "UILabel"; text = "E-Mail"; ObjectID = "MSp-cY-cG9"; */ "MSp-cY-cG9.text" = "メール(E-Mail)"; +/* Class = "UILabel"; text = "Edit Confirmation"; ObjectID = "Mh8-MY-tUv"; */ +"Mh8-MY-tUv.text" = "編集の確認"; + +/* Class = "UILabel"; text = "Shows how to prompt the user with a confirmation dialog before committing changes to a cell"; ObjectID = "N9S-vR-gzU"; */ +"N9S-vR-gzU.text" = "セルの内容を変更する前にダイアログを表示"; + +/* Class = "UILabel"; text = "Column Layout"; ObjectID = "NDk-U5-GbB"; */ +"NDk-U5-GbB.text" = "列のレイアウト"; + +/* Class = "UILabel"; text = ">"; ObjectID = "NbF-kJ-Na8"; */ +"NbF-kJ-Na8.text" = ">"; + +/* Class = "UINavigationItem"; title = "Custom Merging"; ObjectID = "PAA-vu-4Dw"; */ +"PAA-vu-4Dw.title" = "セル結合の応用"; + +/* Class = "UILabel"; text = "Selection Modes"; ObjectID = "Pgu-0Z-VMV"; */ +"Pgu-0Z-VMV.text" = "選択モード"; + +/* Class = "UILabel"; text = "Filters and highlights the data across all columns"; ObjectID = "Qk7-tT-4qi"; */ +"Qk7-tT-4qi.text" = "列のデータをフィルタリングして強調表示"; + +/* Class = "UILabel"; text = "Rotate the device to see star-sizing in action"; ObjectID = "QkN-hJ-IoU"; */ +"QkN-hJ-IoU.text" = "デバイスを回転させてスターサイズ機能を確認"; + +/* Class = "UIBarButtonItem"; title = "Edit"; ObjectID = "QoG-Dk-6QL"; */ +"QoG-Dk-6QL.title" = "編集"; + +/* Class = "UITableViewController"; title = "FlexGrid101"; ObjectID = "Qz0-jK-VdE"; */ +"Qz0-jK-VdE.title" = "FlexGrid101"; + /* Class = "UILabel"; text = "Country"; ObjectID = "R1X-wj-bQr"; */ "R1X-wj-bQr.text" = "国(Country)"; /* Class = "UILabel"; text = "First Name"; ObjectID = "R5M-4S-gmw"; */ "R5M-4S-gmw.text" = "名(First Name)"; +/* Class = "UILabel"; text = "Here you will see the timetable"; ObjectID = "VU5-qF-FzC"; */ +"VU5-qF-FzC.text" = "タイムテーブルが確認できます"; + +/* Class = "UILabel"; text = ">"; ObjectID = "WQg-a8-FOy"; */ +"WQg-a8-FOy.text" = ">"; + +/* Class = "UILabel"; text = "On Demand"; ObjectID = "WUb-mq-rHk"; */ +"WUb-mq-rHk.text" = "データオンデマンド"; + /* Class = "UILabel"; text = "Confirm editing"; ObjectID = "ZXh-Mv-kdZ"; */ "ZXh-Mv-kdZ.text" = "編集の完了"; +/* Class = "UINavigationItem"; title = "Edit Confirmation"; ObjectID = "Zhz-qw-39u"; */ +"Zhz-qw-39u.title" = "編集の確認"; + /* Class = "UILabel"; text = "Last Name"; ObjectID = "at8-vu-Ft0"; */ "at8-vu-Ft0.text" = "姓(Last Name)"; +/* Class = "UILabel"; text = "Select TV show"; ObjectID = "b5w-4m-Jz3"; */ +"b5w-4m-Jz3.text" = "テレビ番組を選択"; + +/* Class = "UILabel"; text = ">"; ObjectID = "bil-EV-iKd"; */ +"bil-EV-iKd.text" = ">"; + +/* Class = "UILabel"; text = "Star Sizing"; ObjectID = "cCB-Mg-zy9"; */ +"cCB-Mg-zy9.text" = "スターサイズ機能"; + +/* Class = "UILabel"; text = ">"; ObjectID = "cKR-sR-jnu"; */ +"cKR-sR-jnu.text" = ">"; + +/* Class = "UILabel"; text = "Detail Visibility Mode:"; ObjectID = "ddh-EW-zce"; */ +"ddh-EW-zce.text" = "詳細の表示モード:"; + +/* Class = "UILabel"; text = "Row Details"; ObjectID = "dsU-dQ-3PQ"; */ +"dsU-dQ-3PQ.text" = "詳細行"; + /* Class = "UILabel"; text = ">"; ObjectID = "ein-f6-TS0"; */ "ein-f6-TS0.text" = ">"; +/* Class = "UILabel"; text = ">"; ObjectID = "fAw-eT-abh"; */ +"fAw-eT-abh.text" = ">"; + +/* Class = "UINavigationItem"; title = "Row Details"; ObjectID = "fPn-ol-nxW"; */ +"fPn-ol-nxW.title" = "詳細行"; + +/* Class = "UINavigationItem"; title = "FlexGrid101"; ObjectID = "fQI-FH-RiG"; */ +"fQI-FH-RiG.title" = "FlexGrid101"; + +/* Class = "UINavigationItem"; title = "Conditional Formatting"; ObjectID = "gGM-lt-hc6"; */ +"gGM-lt-hc6.title" = "条件付き書式"; + +/* Class = "UILabel"; text = "Uses a CellFactory to apply conditional formatting"; ObjectID = "gcv-bk-jWC"; */ +"gcv-bk-jWC.text" = "条件付き書式(CellFactory 機能)"; + +/* Class = "UINavigationItem"; title = "Column Definitions"; ObjectID = "htf-Gy-By7"; */ +"htf-Gy-By7.title" = "列の定義"; + +/* Class = "UIBarButtonItem"; title = "0 selected"; ObjectID = "iIA-Df-AaM"; */ +"iIA-Df-AaM.title" = "選択無し"; + +/* Class = "UILabel"; text = "Conditional Formatting"; ObjectID = "if5-fG-b6E"; */ +"if5-fG-b6E.text" = "条件付き書式"; + +/* Class = "UINavigationItem"; title = "Editing Form"; ObjectID = "ig5-aS-Vgh"; */ +"ig5-aS-Vgh.title" = "編集画面"; + +/* Class = "UILabel"; text = "Shows frozen columns, rows and cell merging"; ObjectID = "iwq-wR-ahB"; */ +"iwq-wR-ahB.text" = "行、列のセルを結合して固定表示する方法"; + +/* Class = "UILabel"; text = ">"; ObjectID = "jaL-e6-fOw"; */ +"jaL-e6-fOw.text" = ">"; + +/* Class = "UILabel"; text = ">"; ObjectID = "k2d-IG-BPG"; */ +"k2d-IG-BPG.text" = ">"; + +/* Class = "UILabel"; text = "Filters the data by columns through a generated form"; ObjectID = "kcb-VB-G0j"; */ +"kcb-VB-G0j.text" = "列のフィルタ条件をフォームで指定"; + +/* Class = "UILabel"; text = "Getting Started"; ObjectID = "lev-La-dSM"; */ +"lev-La-dSM.text" = "FlexGrid の基本機能"; + +/* Class = "UILabel"; text = "Grouping"; ObjectID = "mTY-Nq-vjh"; */ +"mTY-Nq-vjh.text" = "グループ化"; + +/* Class = "UILabel"; text = ">"; ObjectID = "nLJ-ZY-wYK"; */ +"nLJ-ZY-wYK.text" = ">"; + +/* Class = "UILabel"; text = "Editing Form"; ObjectID = "oUW-Ec-gDn"; */ +"oUW-Ec-gDn.text" = "編集画面"; + +/* Class = "UILabel"; text = ">"; ObjectID = "pBF-A7-DwK"; */ +"pBF-A7-DwK.text" = ">"; + +/* Class = "UINavigationItem"; title = "Custom Cells"; ObjectID = "qfI-an-dEx"; */ +"qfI-an-dEx.title" = "カスタムセル"; + /* Class = "UILabel"; text = ">"; ObjectID = "r46-Kv-t99"; */ "r46-Kv-t99.text" = ">"; +/* Class = "UILabel"; text = ">"; ObjectID = "sIH-X3-Yo3"; */ +"sIH-X3-Yo3.text" = ">"; + +/* Class = "UILabel"; text = "Column Definitions"; ObjectID = "sYt-Cd-lig"; */ +"sYt-Cd-lig.text" = "列の定義"; + /* Class = "UILabel"; text = "Edit the Object"; ObjectID = "syX-hS-ICg"; */ "syX-hS-ICg.text" = "内容を編集"; + +/* Class = "UILabel"; text = "Custom Merging"; ObjectID = "tmz-Ut-Msh"; */ +"tmz-Ut-Msh.text" = "セルのマージ"; + +/* Class = "UINavigationItem"; title = "Selection Modes"; ObjectID = "ump-jf-AN4"; */ +"ump-jf-AN4.title" = "選択モード"; + +/* Class = "UINavigationController"; title = "FlexGrid101"; ObjectID = "vQy-oz-8OE"; */ +"vQy-oz-8OE.title" = "FlexGrid101"; + +/* Class = "UINavigationItem"; title = "Grouping"; ObjectID = "vfQ-bd-Mgq"; */ +"vfQ-bd-Mgq.title" = "グループ化"; + +/* Class = "UILabel"; text = "Shows a custom column manager to modify column layout"; ObjectID = "wKr-Ae-bKg"; */ +"wKr-Ae-bKg.text" = "列管理機能を利用してレイアウトを変更"; + +/* Class = "UILabel"; text = ">"; ObjectID = "wZw-ZU-IA6"; */ +"wZw-ZU-IA6.text" = ">"; + +/* Class = "UILabel"; text = "Load items on demand as the user scrolls down the grid"; ObjectID = "xhb-NF-nFn"; */ +"xhb-NF-nFn.text" = "スクロールの終端で表示データをロード"; + +/* Class = "UINavigationItem"; title = "Full Text Filter"; ObjectID = "yEw-h4-u6W"; */ +"yEw-h4-u6W.title" = "全テキストフィルタ"; + +/* Class = "UILabel"; text = "Shows how to specify and format columns"; ObjectID = "ycB-vo-am7"; */ +"ycB-vo-am7.text" = "列を指定して書式設定する方法"; + +/* Class = "UILabel"; text = "Full Text Filter"; ObjectID = "zKl-cD-EzG"; */ +"zKl-cD-EzG.text" = "全テキストフィルタ"; diff --git a/ObjectiveC/FlexPie101/FlexPie101.xcodeproj/project.pbxproj b/ObjectiveC/FlexPie101/FlexPie101.xcodeproj/project.pbxproj index 5182d30..55f2dcf 100644 --- a/ObjectiveC/FlexPie101/FlexPie101.xcodeproj/project.pbxproj +++ b/ObjectiveC/FlexPie101/FlexPie101.xcodeproj/project.pbxproj @@ -7,16 +7,28 @@ objects = { /* Begin PBXBuildFile section */ - EDE368A21C029C3000B51400 /* XuniChartCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EDE3689F1C029C3000B51400 /* XuniChartCoreKit.framework */; }; - EDE368A31C029C3000B51400 /* XuniCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EDE368A01C029C3000B51400 /* XuniCoreKit.framework */; }; - EDE368A41C029C3000B51400 /* XuniFlexPieKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EDE368A11C029C3000B51400 /* XuniFlexPieKit.framework */; }; - EDE368A91C02A2DE00B51400 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = EDE368AB1C02A2DE00B51400 /* Localizable.strings */; }; + 4C87CE681D259D09009781F5 /* XuniChartCoreDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CE661D259D09009781F5 /* XuniChartCoreDynamicKit.framework */; }; + 4C87CE691D259D09009781F5 /* XuniFlexPieDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CE671D259D09009781F5 /* XuniFlexPieDynamicKit.framework */; }; + 4C87CE6B1D259D46009781F5 /* XuniCoreDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CE6A1D259D46009781F5 /* XuniCoreDynamicKit.framework */; }; + 4C87CE6C1D259D4C009781F5 /* XuniCoreDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CE6A1D259D46009781F5 /* XuniCoreDynamicKit.framework */; }; + 4C87CE6D1D259D4C009781F5 /* XuniCoreDynamicKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CE6A1D259D46009781F5 /* XuniCoreDynamicKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4C87CE6E1D259D4C009781F5 /* XuniChartCoreDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CE661D259D09009781F5 /* XuniChartCoreDynamicKit.framework */; }; + 4C87CE6F1D259D4C009781F5 /* XuniChartCoreDynamicKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CE661D259D09009781F5 /* XuniChartCoreDynamicKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4C87CE701D259D4C009781F5 /* XuniFlexPieDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CE671D259D09009781F5 /* XuniFlexPieDynamicKit.framework */; }; + 4C87CE711D259D4C009781F5 /* XuniFlexPieDynamicKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4C87CE671D259D09009781F5 /* XuniFlexPieDynamicKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4C8978D91D2688E9004E468B /* XuniFlexPieDesignTimeStoryboardSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8978D81D2688E9004E468B /* XuniFlexPieDesignTimeStoryboardSupport.m */; }; + 4CA1F2511CCE89C7004B1C98 /* pie_doughnut.png in Resources */ = {isa = PBXBuildFile; fileRef = 4CA1F24A1CCE89C7004B1C98 /* pie_doughnut.png */; }; + 4CA1F2521CCE89C7004B1C98 /* pie_labels.png in Resources */ = {isa = PBXBuildFile; fileRef = 4CA1F24B1CCE89C7004B1C98 /* pie_labels.png */; }; + 4CA1F2531CCE89C7004B1C98 /* pie_load.png in Resources */ = {isa = PBXBuildFile; fileRef = 4CA1F24C1CCE89C7004B1C98 /* pie_load.png */; }; + 4CA1F2541CCE89C7004B1C98 /* pie_selection.png in Resources */ = {isa = PBXBuildFile; fileRef = 4CA1F24D1CCE89C7004B1C98 /* pie_selection.png */; }; + 4CA1F2551CCE89C7004B1C98 /* pie_title.png in Resources */ = {isa = PBXBuildFile; fileRef = 4CA1F24E1CCE89C7004B1C98 /* pie_title.png */; }; + 4CA1F2561CCE89C7004B1C98 /* pie.png in Resources */ = {isa = PBXBuildFile; fileRef = 4CA1F24F1CCE89C7004B1C98 /* pie.png */; }; + 4CA1F2571CCE89C7004B1C98 /* themes.png in Resources */ = {isa = PBXBuildFile; fileRef = 4CA1F2501CCE89C7004B1C98 /* themes.png */; }; F23573651B445AAB00F300D7 /* License.m in Sources */ = {isa = PBXBuildFile; fileRef = F23573641B445AAB00F300D7 /* License.m */; }; F24016291B1646A000D4D296 /* PieChartData.m in Sources */ = {isa = PBXBuildFile; fileRef = F24016281B1646A000D4D296 /* PieChartData.m */; }; F254FABC1B31E10D009CD853 /* SnapshotController.m in Sources */ = {isa = PBXBuildFile; fileRef = F254FABB1B31E10D009CD853 /* SnapshotController.m */; }; F2A870671B15FEFF001C957B /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A870661B15FEFF001C957B /* main.m */; }; F2A8706A1B15FEFF001C957B /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A870691B15FEFF001C957B /* AppDelegate.m */; }; - F2A8706D1B15FEFF001C957B /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A8706C1B15FEFF001C957B /* ViewController.m */; }; F2A870701B15FEFF001C957B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F2A8706E1B15FEFF001C957B /* Main.storyboard */; }; F2A870721B15FEFF001C957B /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F2A870711B15FEFF001C957B /* Images.xcassets */; }; F2A870751B15FEFF001C957B /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = F2A870731B15FEFF001C957B /* LaunchScreen.xib */; }; @@ -38,15 +50,36 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + 4C87CE721D259D4C009781F5 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 4C87CE711D259D4C009781F5 /* XuniFlexPieDynamicKit.framework in Embed Frameworks */, + 4C87CE6D1D259D4C009781F5 /* XuniCoreDynamicKit.framework in Embed Frameworks */, + 4C87CE6F1D259D4C009781F5 /* XuniChartCoreDynamicKit.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ - EDE3689F1C029C3000B51400 /* XuniChartCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniChartCoreKit.framework; path = "../../../../../../../Desktop/培训材料/XuniChartCoreKit.framework"; sourceTree = ""; }; - EDE368A01C029C3000B51400 /* XuniCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreKit.framework; path = "../../../../../../../Desktop/培训材料/XuniCoreKit.framework"; sourceTree = ""; }; - EDE368A11C029C3000B51400 /* XuniFlexPieKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniFlexPieKit.framework; path = "../../../../../../../Desktop/培训材料/XuniFlexPieKit.framework"; sourceTree = ""; }; - EDE368A51C029E6300B51400 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Main.strings; sourceTree = ""; }; - EDE368A61C029E6300B51400 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/LaunchScreen.strings; sourceTree = ""; }; - EDE368AA1C02A2DE00B51400 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; - EDE368AC1C02A30100B51400 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; - EDE368AD1C02A30200B51400 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; + 4C37D42D1CD30E4E009113A8 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Main.strings; sourceTree = ""; }; + 4C37D42E1CD30E4E009113A8 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/LaunchScreen.strings; sourceTree = ""; }; + 4C87CE661D259D09009781F5 /* XuniChartCoreDynamicKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniChartCoreDynamicKit.framework; path = ../../../Controls/XuniChartCoreDynamicKit.framework; sourceTree = ""; }; + 4C87CE671D259D09009781F5 /* XuniFlexPieDynamicKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniFlexPieDynamicKit.framework; path = ../../../Controls/XuniFlexPieDynamicKit.framework; sourceTree = ""; }; + 4C87CE6A1D259D46009781F5 /* XuniCoreDynamicKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreDynamicKit.framework; path = ../../../Controls/XuniCoreDynamicKit.framework; sourceTree = ""; }; + 4C8978D81D2688E9004E468B /* XuniFlexPieDesignTimeStoryboardSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XuniFlexPieDesignTimeStoryboardSupport.m; path = ../../../Controls/XuniFlexPieDesignTimeStoryboardSupport.m; sourceTree = ""; }; + 4CA1F24A1CCE89C7004B1C98 /* pie_doughnut.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pie_doughnut.png; sourceTree = ""; }; + 4CA1F24B1CCE89C7004B1C98 /* pie_labels.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pie_labels.png; sourceTree = ""; }; + 4CA1F24C1CCE89C7004B1C98 /* pie_load.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pie_load.png; sourceTree = ""; }; + 4CA1F24D1CCE89C7004B1C98 /* pie_selection.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pie_selection.png; sourceTree = ""; }; + 4CA1F24E1CCE89C7004B1C98 /* pie_title.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pie_title.png; sourceTree = ""; }; + 4CA1F24F1CCE89C7004B1C98 /* pie.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pie.png; sourceTree = ""; }; + 4CA1F2501CCE89C7004B1C98 /* themes.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = themes.png; sourceTree = ""; }; F23573631B445AAB00F300D7 /* License.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = License.h; sourceTree = ""; }; F23573641B445AAB00F300D7 /* License.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = License.m; sourceTree = ""; }; F24016271B1646A000D4D296 /* PieChartData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PieChartData.h; sourceTree = ""; }; @@ -58,8 +91,6 @@ F2A870661B15FEFF001C957B /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; F2A870681B15FEFF001C957B /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; F2A870691B15FEFF001C957B /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - F2A8706B1B15FEFF001C957B /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - F2A8706C1B15FEFF001C957B /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; F2A8706F1B15FEFF001C957B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; F2A870711B15FEFF001C957B /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; F2A870741B15FEFF001C957B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; @@ -83,9 +114,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - EDE368A21C029C3000B51400 /* XuniChartCoreKit.framework in Frameworks */, - EDE368A31C029C3000B51400 /* XuniCoreKit.framework in Frameworks */, - EDE368A41C029C3000B51400 /* XuniFlexPieKit.framework in Frameworks */, + 4C87CE6B1D259D46009781F5 /* XuniCoreDynamicKit.framework in Frameworks */, + 4C87CE681D259D09009781F5 /* XuniChartCoreDynamicKit.framework in Frameworks */, + 4C87CE6E1D259D4C009781F5 /* XuniChartCoreDynamicKit.framework in Frameworks */, + 4C87CE701D259D4C009781F5 /* XuniFlexPieDynamicKit.framework in Frameworks */, + 4C87CE6C1D259D4C009781F5 /* XuniCoreDynamicKit.framework in Frameworks */, + 4C87CE691D259D09009781F5 /* XuniFlexPieDynamicKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -99,12 +133,46 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 4CA1F2481CCE899C004B1C98 /* Images */ = { + isa = PBXGroup; + children = ( + 4CA1F24A1CCE89C7004B1C98 /* pie_doughnut.png */, + 4CA1F24B1CCE89C7004B1C98 /* pie_labels.png */, + 4CA1F24C1CCE89C7004B1C98 /* pie_load.png */, + 4CA1F24D1CCE89C7004B1C98 /* pie_selection.png */, + 4CA1F24E1CCE89C7004B1C98 /* pie_title.png */, + 4CA1F24F1CCE89C7004B1C98 /* pie.png */, + 4CA1F2501CCE89C7004B1C98 /* themes.png */, + ); + name = Images; + sourceTree = ""; + }; + 4CA1F2491CCE89A0004B1C98 /* Samples */ = { + isa = PBXGroup; + children = ( + F2A870991B16152D001C957B /* SelectionSampleController.h */, + F2A8709A1B16152D001C957B /* SelectionSampleController.m */, + F2A8709C1B16153F001C957B /* ThemingController.h */, + F2A8709D1B16153F001C957B /* ThemingController.m */, + F2A870961B16150C001C957B /* LegendAndTitlesController.h */, + F2A870971B16150C001C957B /* LegendAndTitlesController.m */, + F2A870931B1614F2001C957B /* BasicFeaturesController.h */, + F2A870941B1614F2001C957B /* BasicFeaturesController.m */, + F2A870901B1614C2001C957B /* GettingStartedController.h */, + F2A870911B1614C2001C957B /* GettingStartedController.m */, + F254FABA1B31E10D009CD853 /* SnapshotController.h */, + F254FABB1B31E10D009CD853 /* SnapshotController.m */, + ); + name = Samples; + sourceTree = ""; + }; F2A870581B15FEFF001C957B = { isa = PBXGroup; children = ( - EDE3689F1C029C3000B51400 /* XuniChartCoreKit.framework */, - EDE368A01C029C3000B51400 /* XuniCoreKit.framework */, - EDE368A11C029C3000B51400 /* XuniFlexPieKit.framework */, + 4C8978D81D2688E9004E468B /* XuniFlexPieDesignTimeStoryboardSupport.m */, + 4C87CE6A1D259D46009781F5 /* XuniCoreDynamicKit.framework */, + 4C87CE661D259D09009781F5 /* XuniChartCoreDynamicKit.framework */, + 4C87CE671D259D09009781F5 /* XuniFlexPieDynamicKit.framework */, F2A870631B15FEFF001C957B /* FlexPie101 */, F2A8707D1B15FF00001C957B /* FlexPie101Tests */, F2A870621B15FEFF001C957B /* Products */, @@ -123,28 +191,16 @@ F2A870631B15FEFF001C957B /* FlexPie101 */ = { isa = PBXGroup; children = ( + 4CA1F2491CCE89A0004B1C98 /* Samples */, + 4CA1F2481CCE899C004B1C98 /* Images */, F2A870681B15FEFF001C957B /* AppDelegate.h */, F2A870691B15FEFF001C957B /* AppDelegate.m */, - F2A8706B1B15FEFF001C957B /* ViewController.h */, - F2A8706C1B15FEFF001C957B /* ViewController.m */, F2A8706E1B15FEFF001C957B /* Main.storyboard */, F2A870711B15FEFF001C957B /* Images.xcassets */, F2A870731B15FEFF001C957B /* LaunchScreen.xib */, F2A870641B15FEFF001C957B /* Supporting Files */, - F2A870901B1614C2001C957B /* GettingStartedController.h */, - F2A870911B1614C2001C957B /* GettingStartedController.m */, - F2A870931B1614F2001C957B /* BasicFeaturesController.h */, - F2A870941B1614F2001C957B /* BasicFeaturesController.m */, - F2A870961B16150C001C957B /* LegendAndTitlesController.h */, - F2A870971B16150C001C957B /* LegendAndTitlesController.m */, - F2A870991B16152D001C957B /* SelectionSampleController.h */, - F2A8709A1B16152D001C957B /* SelectionSampleController.m */, - F2A8709C1B16153F001C957B /* ThemingController.h */, - F2A8709D1B16153F001C957B /* ThemingController.m */, F24016271B1646A000D4D296 /* PieChartData.h */, F24016281B1646A000D4D296 /* PieChartData.m */, - F254FABA1B31E10D009CD853 /* SnapshotController.h */, - F254FABB1B31E10D009CD853 /* SnapshotController.m */, F23573631B445AAB00F300D7 /* License.h */, F23573641B445AAB00F300D7 /* License.m */, ); @@ -154,7 +210,6 @@ F2A870641B15FEFF001C957B /* Supporting Files */ = { isa = PBXGroup; children = ( - EDE368AB1C02A2DE00B51400 /* Localizable.strings */, F2A870651B15FEFF001C957B /* Info.plist */, F2A870661B15FEFF001C957B /* main.m */, ); @@ -188,6 +243,7 @@ F2A8705D1B15FEFF001C957B /* Sources */, F2A8705E1B15FEFF001C957B /* Frameworks */, F2A8705F1B15FEFF001C957B /* Resources */, + 4C87CE721D259D4C009781F5 /* Embed Frameworks */, ); buildRules = ( ); @@ -258,10 +314,16 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4CA1F2531CCE89C7004B1C98 /* pie_load.png in Resources */, F2A870701B15FEFF001C957B /* Main.storyboard in Resources */, - EDE368A91C02A2DE00B51400 /* Localizable.strings in Resources */, F2A870751B15FEFF001C957B /* LaunchScreen.xib in Resources */, + 4CA1F2511CCE89C7004B1C98 /* pie_doughnut.png in Resources */, F2A870721B15FEFF001C957B /* Images.xcassets in Resources */, + 4CA1F2571CCE89C7004B1C98 /* themes.png in Resources */, + 4CA1F2521CCE89C7004B1C98 /* pie_labels.png in Resources */, + 4CA1F2561CCE89C7004B1C98 /* pie.png in Resources */, + 4CA1F2541CCE89C7004B1C98 /* pie_selection.png in Resources */, + 4CA1F2551CCE89C7004B1C98 /* pie_title.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -280,12 +342,12 @@ buildActionMask = 2147483647; files = ( F2A870951B1614F2001C957B /* BasicFeaturesController.m in Sources */, - F2A8706D1B15FEFF001C957B /* ViewController.m in Sources */, F2A8706A1B15FEFF001C957B /* AppDelegate.m in Sources */, F2A870921B1614C2001C957B /* GettingStartedController.m in Sources */, F2A870671B15FEFF001C957B /* main.m in Sources */, F254FABC1B31E10D009CD853 /* SnapshotController.m in Sources */, F23573651B445AAB00F300D7 /* License.m in Sources */, + 4C8978D91D2688E9004E468B /* XuniFlexPieDesignTimeStoryboardSupport.m in Sources */, F24016291B1646A000D4D296 /* PieChartData.m in Sources */, F2A8709B1B16152D001C957B /* SelectionSampleController.m in Sources */, F2A8709E1B16153F001C957B /* ThemingController.m in Sources */, @@ -312,22 +374,11 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ - EDE368AB1C02A2DE00B51400 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - EDE368AA1C02A2DE00B51400 /* ja */, - EDE368AC1C02A30100B51400 /* en */, - EDE368AD1C02A30200B51400 /* Base */, - ); - name = Localizable.strings; - path = ..; - sourceTree = ""; - }; F2A8706E1B15FEFF001C957B /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( F2A8706F1B15FEFF001C957B /* Base */, - EDE368A51C029E6300B51400 /* ja */, + 4C37D42D1CD30E4E009113A8 /* ja */, ); name = Main.storyboard; sourceTree = ""; @@ -336,7 +387,7 @@ isa = PBXVariantGroup; children = ( F2A870741B15FEFF001C957B /* Base */, - EDE368A61C029E6300B51400 /* ja */, + 4C37D42E1CD30E4E009113A8 /* ja */, ); name = LaunchScreen.xib; sourceTree = ""; @@ -436,9 +487,9 @@ FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", ../../../Controls, + ../../../../Controls, ); INFOPLIST_FILE = FlexPie101/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; "OTHER_LDFLAGS[arch=*]" = "-all_load"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -455,9 +506,9 @@ FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", ../../../Controls, + ../../../../Controls, ); INFOPLIST_FILE = FlexPie101/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; "OTHER_LDFLAGS[arch=*]" = "-all_load"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/ObjectiveC/FlexPie101/FlexPie101/AppDelegate.m b/ObjectiveC/FlexPie101/FlexPie101/AppDelegate.m index 65d8665..e82e9e2 100644 --- a/ObjectiveC/FlexPie101/FlexPie101/AppDelegate.m +++ b/ObjectiveC/FlexPie101/FlexPie101/AppDelegate.m @@ -6,7 +6,7 @@ // #import "AppDelegate.h" -#import "XuniCoreKit/XuniCoreKit.h" +@import XuniCoreDynamicKit; #import "License.h" @interface AppDelegate () diff --git a/ObjectiveC/FlexPie101/FlexPie101/Base.lproj/LaunchScreen.xib b/ObjectiveC/FlexPie101/FlexPie101/Base.lproj/LaunchScreen.xib index d51c34e..ca288e4 100644 --- a/ObjectiveC/FlexPie101/FlexPie101/Base.lproj/LaunchScreen.xib +++ b/ObjectiveC/FlexPie101/FlexPie101/Base.lproj/LaunchScreen.xib @@ -1,41 +1,39 @@ - + - + + - - + + - - + - - - - - - + + + + + + - - - diff --git a/ObjectiveC/FlexPie101/FlexPie101/Base.lproj/Main.storyboard b/ObjectiveC/FlexPie101/FlexPie101/Base.lproj/Main.storyboard index 63b7c0b..5087f69 100644 --- a/ObjectiveC/FlexPie101/FlexPie101/Base.lproj/Main.storyboard +++ b/ObjectiveC/FlexPie101/FlexPie101/Base.lproj/Main.storyboard @@ -1,64 +1,12 @@ - + - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -69,14 +17,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -87,14 +64,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -105,14 +178,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -123,14 +254,35 @@ + + + + + + + + + + + + + + + + + + + + + - + - + @@ -141,14 +293,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -159,12 +340,455 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ObjectiveC/FlexPie101/FlexPie101/BasicFeaturesController.m b/ObjectiveC/FlexPie101/FlexPie101/BasicFeaturesController.m index 16a73e4..0bc915c 100644 --- a/ObjectiveC/FlexPie101/FlexPie101/BasicFeaturesController.m +++ b/ObjectiveC/FlexPie101/FlexPie101/BasicFeaturesController.m @@ -6,9 +6,16 @@ // #import "BasicFeaturesController.h" -#import "XuniFlexPieKit/XuniFlexPieKit.h" +@import XuniFlexPieDynamicKit; #import "PieChartData.h" + @interface BasicFeaturesController () +@property (weak, nonatomic) IBOutlet UIStepper *stepper; +@property (weak, nonatomic) IBOutlet UILabel *innerRadiusLabel; +@property (weak, nonatomic) IBOutlet UISlider *offsetSlider; +@property (weak, nonatomic) IBOutlet UISlider *startAngleSlider; +@property (weak, nonatomic) IBOutlet UISwitch *reversedSwitch; +@property (weak, nonatomic) IBOutlet FlexPie *pieChart; @end @@ -16,136 +23,43 @@ @implementation BasicFeaturesController - (void)viewDidLoad { [super viewDidLoad]; - self.edgesForExtendedLayout = UIRectEdgeNone; - UILabel *innerRadiusLabel =[[UILabel alloc] init]; - UIStepper *stepper=[[UIStepper alloc] init]; - UILabel *offsetLabel =[[UILabel alloc] init]; - UISlider *offsetSlider = [[UISlider alloc]init]; - UILabel *startAngleLabel =[[UILabel alloc] init]; - UISlider *startAngleSlider = [[UISlider alloc]init]; - UILabel *reversedLabel =[[UILabel alloc] init]; - UISwitch *reversedSwitch = [[UISwitch alloc]init]; - FlexPie *pieChart = [[FlexPie alloc] init]; - NSMutableArray *pieData = [PieChartData demoData]; - - pieChart.binding = @"value"; - pieChart.bindingName = @"name"; - pieChart.itemsSource = pieData; - - stepper.maximumValue = .99; - stepper.minimumValue = 0; - stepper.value = 0; - stepper.stepValue = .1; - [stepper addTarget:self action:@selector(stepperClicked:) forControlEvents:UIControlEventValueChanged]; - - innerRadiusLabel.text = [NSLocalizedString(@"inner radius", nil) stringByAppendingString:[NSString stringWithFormat:@"%1.1f", stepper.value]]; - [innerRadiusLabel sizeToFit]; - - offsetLabel.text = NSLocalizedString(@"offset", nil); - [offsetSlider addTarget:self action:@selector(offsetSliderChanged:) forControlEvents:UIControlEventValueChanged]; - offsetSlider.minimumValue = 0.0; - offsetSlider.maximumValue = 1.0; - - startAngleLabel.text = NSLocalizedString(@"start angle", nil); - - [startAngleSlider addTarget:self action:@selector(startAngleSliderChanged:) forControlEvents:UIControlEventValueChanged]; - startAngleSlider.minimumValue = 0.0; - startAngleSlider.maximumValue = 360.0; - - reversedLabel.text = NSLocalizedString(@"Reversed?", nil); - [reversedSwitch addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged]; + NSMutableArray *pieData = [PieChartData demoData]; - pieChart.tag = 1; - innerRadiusLabel.tag = 2; - stepper.tag = 3; - offsetLabel.tag = 4; - offsetSlider.tag = 5; - startAngleLabel.tag = 6; - startAngleSlider.tag = 7; - reversedLabel.tag = 8; - reversedSwitch.tag = 9; + self.pieChart.binding = @"value"; + self.pieChart.bindingName = @"name"; + self.pieChart.itemsSource = pieData; - [self.view addSubview:pieChart]; - [self.view addSubview:stepper]; - [self.view addSubview:innerRadiusLabel]; - [self.view addSubview:reversedLabel]; - [self.view addSubview:reversedSwitch]; - [self.view addSubview:offsetLabel]; - [self.view addSubview:offsetSlider]; - [self.view addSubview:startAngleLabel]; - [self.view addSubview:startAngleSlider]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. } - --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexPie *pieChart = (FlexPie*)[self.view viewWithTag:1]; - UILabel *innerRadiusLabel = (UILabel*)[self.view viewWithTag:2]; - UIStepper *stepper = (UIStepper*)[self.view viewWithTag:3]; - UILabel *offsetLabel = (UILabel*)[self.view viewWithTag:4]; - UISlider *offsetSlider = (UISlider*)[self.view viewWithTag:5]; - UILabel *startAngleLabel = (UILabel*)[self.view viewWithTag:6]; - UISlider *startAngleSlider = (UISlider*)[self.view viewWithTag:7]; - UILabel *reversedLabel = (UILabel*)[self.view viewWithTag:8]; - UISwitch *reversedSwitch = (UISwitch*)[self.view viewWithTag:9]; - innerRadiusLabel.frame = CGRectMake(5, 5, 100, 50); - [innerRadiusLabel sizeToFit]; - stepper.frame = CGRectMake(self.view.bounds.size.width/2 - 25, 5, 50, 50); - offsetLabel.frame = CGRectMake(5, self.view.bounds.size.height/8, 100, 50); - offsetSlider.frame = CGRectMake(self.view.bounds.size.width/2, self.view.bounds.size.height/8, self.view.bounds.size.width/2 -5, 50); - startAngleLabel.frame = CGRectMake(5, self.view.bounds.size.height/4, 100, 50); - startAngleSlider.frame = CGRectMake(self.view.bounds.size.width/2, self.view.bounds.size.height/4, self.view.bounds.size.width/2 -5, 50); - reversedLabel.frame = CGRectMake(5, self.view.bounds.size.height*3/8, 100, 50); - reversedSwitch.frame = CGRectMake(self.view.bounds.size.width/2, self.view.bounds.size.height*3/8, 50, 50); - pieChart.frame = CGRectMake(0, self.view.bounds.size.height/2, self.view.bounds.size.width, self.view.bounds.size.height/2); -} - --(void)stepperClicked:(id) sender{ - UIStepper *stepper =(UIStepper*)sender; - FlexPie *pie = (FlexPie*) [self.view viewWithTag:1]; - UILabel *innerRadiusLabel = (UILabel*) [self.view viewWithTag:2]; +- (IBAction)switchValueChanged:(id)sender { - pie.innerRadius = stepper.value; - innerRadiusLabel.text = [NSLocalizedString(@"inner radius", nil) stringByAppendingString:[NSString stringWithFormat:@"%1.1f", stepper.value]]; - [innerRadiusLabel sizeToFit]; -} - --(void)switchChanged:(UISwitch *) switchState{ - FlexPie *pie = (FlexPie*) [self.view viewWithTag:1]; - + UISwitch* switchState = (UISwitch*)sender; if ([switchState isOn]) { - pie.reversed = true; + self.pieChart.reversed = true; } else { - pie.reversed = false; + self.pieChart.reversed = false; } } --(void)offsetSliderChanged:(id) sender{ - UISlider *slider =(UISlider*)sender; - FlexPie *pie = (FlexPie*) [self.view viewWithTag:1]; - pie.offset = slider.value; +- (IBAction)valueChanged:(id)sender { + UIStepper *stepper =(UIStepper*)sender; + + self.pieChart.innerRadius = stepper.value; + self.innerRadiusLabel.text = [NSString stringWithFormat:@"%1.1f", stepper.value]; + [self.innerRadiusLabel sizeToFit]; } --(void)startAngleSliderChanged:(id) sender{ + +- (IBAction)offsetChanged:(id)sender { UISlider *slider =(UISlider*)sender; - FlexPie *pie = (FlexPie*) [self.view viewWithTag:1]; - pie.startAngle = slider.value; + self.pieChart.offset = slider.value; } -/* -#pragma mark - Navigation -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. +- (IBAction)startAngleChanged:(id)sender { + UISlider *slider =(UISlider*)sender; + self.pieChart.startAngle = slider.value; } -*/ @end diff --git a/ObjectiveC/FlexPie101/FlexPie101/GettingStartedController.m b/ObjectiveC/FlexPie101/FlexPie101/GettingStartedController.m index 705f2d6..c363476 100644 --- a/ObjectiveC/FlexPie101/FlexPie101/GettingStartedController.m +++ b/ObjectiveC/FlexPie101/FlexPie101/GettingStartedController.m @@ -6,10 +6,12 @@ // #import "GettingStartedController.h" -#import "XuniFlexPieKit/XuniFlexPieKit.h" +@import XuniFlexPieDynamicKit; #import "PieChartData.h" @interface GettingStartedController () +@property (weak, nonatomic) IBOutlet FlexPie *pieChart; +@property (weak, nonatomic) IBOutlet FlexPie *donutChart; @end @@ -20,24 +22,17 @@ - (void)viewDidLoad { self.edgesForExtendedLayout = UIRectEdgeNone; // Do any additional setup after loading the view. - FlexPie *pieChart = [[FlexPie alloc] init]; - FlexPie *donutChart = [[FlexPie alloc] init]; NSMutableArray *pieData = [PieChartData demoData]; - pieChart.binding = @"value"; - pieChart.bindingName = @"name"; - pieChart.itemsSource = pieData; - pieChart.tooltip.isVisible = true; - donutChart.binding = @"value"; - donutChart.bindingName = @"name"; - donutChart.itemsSource = pieData; - donutChart.tooltip.isVisible = true; - donutChart.innerRadius = 0.6; - pieChart.tag = 1; - donutChart.tag = 2; - - [self.view addSubview:pieChart]; - [self.view addSubview:donutChart]; + self.pieChart.binding = @"value"; + self.pieChart.bindingName = @"name"; + self.pieChart.itemsSource = pieData; + self.pieChart.tooltip.isVisible = true; + self.donutChart.binding = @"value"; + self.donutChart.bindingName = @"name"; + self.donutChart.itemsSource = pieData; + self.donutChart.tooltip.isVisible = true; + self.donutChart.innerRadius = 0.6; } @@ -46,20 +41,5 @@ - (void)didReceiveMemoryWarning { // Dispose of any resources that can be recreated. } --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexPie *pieChart= (FlexPie*)[self.view viewWithTag:1]; - FlexPie *donutChart = (FlexPie*)[self.view viewWithTag:2]; - pieChart.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height/3); - donutChart.frame = CGRectMake(0, self.view.bounds.size.height/2, self.view.bounds.size.width, self.view.bounds.size.height/3); -}/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexPie101/FlexPie101/Images.xcassets/AppIcon.appiconset/Contents.json b/ObjectiveC/FlexPie101/FlexPie101/Images.xcassets/AppIcon.appiconset/Contents.json index f16c8c3..c4071ec 100644 --- a/ObjectiveC/FlexPie101/FlexPie101/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/ObjectiveC/FlexPie101/FlexPie101/Images.xcassets/AppIcon.appiconset/Contents.json @@ -67,6 +67,11 @@ "idiom" : "ipad", "filename" : "Icon-76@2x.png", "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" } ], "info" : { diff --git a/ObjectiveC/FlexPie101/FlexPie101/LegendAndTitlesController.h b/ObjectiveC/FlexPie101/FlexPie101/LegendAndTitlesController.h index b639561..c1c891a 100644 --- a/ObjectiveC/FlexPie101/FlexPie101/LegendAndTitlesController.h +++ b/ObjectiveC/FlexPie101/FlexPie101/LegendAndTitlesController.h @@ -7,6 +7,6 @@ #import -@interface LegendAndTitlesController : UIViewController +@interface LegendAndTitlesController : UIViewController @end diff --git a/ObjectiveC/FlexPie101/FlexPie101/LegendAndTitlesController.m b/ObjectiveC/FlexPie101/FlexPie101/LegendAndTitlesController.m index 832fe57..1559dc3 100644 --- a/ObjectiveC/FlexPie101/FlexPie101/LegendAndTitlesController.m +++ b/ObjectiveC/FlexPie101/FlexPie101/LegendAndTitlesController.m @@ -6,111 +6,22 @@ // #import "LegendAndTitlesController.h" -#import "XuniFlexPieKit/XuniFlexPieKit.h" +@import XuniFlexPieDynamicKit; #import "PieChartData.h" -@interface LegendAndTitlesController (){ - NSMutableArray *pickerData; - UITextField *_headerField; - UITextField *_footerField; -} +@interface LegendAndTitlesController () +@property (weak, nonatomic) IBOutlet UITextField *footerField; +@property (weak, nonatomic) IBOutlet UITextField *headerField; +@property (weak, nonatomic) IBOutlet UISegmentedControl *legendModeSelector; +@property (weak, nonatomic) IBOutlet FlexPie *flexPie; + @end @implementation LegendAndTitlesController -- (void)viewDidLoad { - [super viewDidLoad]; - // Do any additional setup after loading the view. - UIPickerView *pickerView; - - UILabel *headerLabel = [[UILabel alloc] init]; - _headerField = [[UITextField alloc] init]; - - UILabel *footerLabel = [[UILabel alloc] init]; - _footerField = [[UITextField alloc] init]; - pickerData =[[NSMutableArray alloc] initWithObjects:NSLocalizedString(@"None", nil),NSLocalizedString(@"Left", nil) , NSLocalizedString(@"Top", nil),NSLocalizedString(@"Right", nil), NSLocalizedString(@"Bottom", nil), nil]; - - UILabel *legendlabel = [[UILabel alloc] init]; - pickerView = [[UIPickerView alloc] init]; - - pickerView.delegate = self; - pickerView.showsSelectionIndicator = YES; - pickerView.hidden = false; - [pickerView selectRow:3 inComponent:0 animated:false]; - - headerLabel.text = NSLocalizedString(@"header", nil); - footerLabel.text = NSLocalizedString(@"footer", nil);; - legendlabel.text = NSLocalizedString(@"legend position", nil); - - _headerField.delegate = self; - _headerField.text = NSLocalizedString(@"Fruit By Value", nil); - _headerField.returnKeyType = UIReturnKeyDone; - _headerField.keyboardType = UIKeyboardTypeDefault; - _headerField.backgroundColor = [UIColor lightGrayColor]; - - _footerField.delegate = self; - _footerField.text = NSLocalizedString(@"GrapeCity inc.", nil); - _footerField.returnKeyType = UIReturnKeyDone; - _footerField.keyboardType = UIKeyboardTypeDefault; - _footerField.backgroundColor = [UIColor lightGrayColor]; - - FlexPie *pieChart = [[FlexPie alloc] init]; - NSMutableArray *pieData = [PieChartData demoData]; - pieChart.legend.position = XuniChartLegendPositionRight; - pieChart.binding = @"value"; - pieChart.bindingName = @"name"; - pieChart.itemsSource = pieData; - pieChart.tooltip.isVisible = true; - pieChart.header = _headerField.text; - pieChart.footer = _footerField.text; - [pieChart sizeToFit]; - - pieChart.tag = 1; - headerLabel.tag = 2; - footerLabel.tag = 3; - legendlabel.tag = 4; - pickerView.tag = 5; - - [self.view addSubview:pieChart]; - [self.view addSubview:headerLabel]; - [self.view addSubview:footerLabel]; - [self.view addSubview:legendlabel]; - [self.view addSubview:pickerView]; - [self.view addSubview:_headerField]; - [self.view addSubview:_footerField]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexPie *pieChart = (FlexPie*)[self.view viewWithTag:1]; - UILabel *headerLabel = (UILabel*)[self.view viewWithTag:2]; - UILabel *footerLabel = (UILabel*)[self.view viewWithTag:3]; - UILabel *legendLabel = (UILabel*)[self.view viewWithTag:4]; - UIPickerView *pickerView = (UIPickerView*)[self.view viewWithTag:5]; - _headerField. frame = CGRectMake(0, 115, self.view.bounds.size.width/2 - 10, 50); - _footerField.frame = CGRectMake(self.view.bounds.size.width/2, 115, self.view.bounds.size.width/2 - 10, 50); - pieChart.frame = CGRectMake(self.view.bounds.size.width/4, 215, self.view.bounds.size.width*3/4, self.view.bounds.size.height - 215); - headerLabel.frame = CGRectMake(0, 65, self.view.bounds.size.width/2 , 50); - footerLabel.frame = CGRectMake(self.view.bounds.size.width/2, 65, self.view.bounds.size.width/2, 50); - legendLabel.frame = CGRectMake(0, 165, self.view.bounds.size.width/2, 50); - pickerView.frame = CGRectMake(0, 215, self.view.bounds.size.width/4, 162); -} - -- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ - return 1; -} - -- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ - return [pickerData count]; -} - -- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ - FlexPie *pie = (FlexPie*)[self.view viewWithTag:1]; +- (IBAction)changeLegendMode:(id)sender { + FlexPie *pie = self.flexPie; + int row = self.legendModeSelector.selectedSegmentIndex; if (row == 0) { pie.legend.position = XuniChartLegendPositionNone; } @@ -128,41 +39,33 @@ - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComp } } -- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ - return [pickerData objectAtIndex:row]; -} --(BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ - return true; -} --(void)textFieldDidBeginEditing:(UITextField *)textField{ +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view. + + + self.legendModeSelector.selectedSegmentIndex = 3; + + NSMutableArray *pieData = [PieChartData demoData]; + self.flexPie.legend.position = XuniChartLegendPositionRight; + self.flexPie.binding = @"value"; + self.flexPie.bindingName = @"name"; + self.flexPie.itemsSource = pieData; + self.flexPie.tooltip.isVisible = true; + self.flexPie.header = self.headerField.text; + self.flexPie.footer = self.footerField.text; -} --(BOOL)textFieldShouldEndEditing:(UITextField *)textField{ - return true; -} --(void)textFieldDidEndEditing:(UITextField *)textField{ - FlexPie *pie = (FlexPie*) [self.view viewWithTag:1]; - pie.header = _headerField.text; - pie.footer = _footerField.text; } --(BOOL)textFieldShouldReturn:(UITextField *)textField{ - [textField resignFirstResponder]; - return true; +- (IBAction)endEdit:(id)sender { + [(UITextField*)sender resignFirstResponder]; } --(void)headerFieldChanged:(id) sender{ - UITextField *headerField =(UITextField*)sender; - FlexPie *pie = (FlexPie*) [self.view viewWithTag:1]; - pie.header = headerField.text; + +- (IBAction)edited:(id)sender { + self.flexPie.header = self.headerField.text; + self.flexPie.footer = self.footerField.text; } -/* -#pragma mark - Navigation -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ + @end \ No newline at end of file diff --git a/ObjectiveC/FlexPie101/FlexPie101/SelectionSampleController.h b/ObjectiveC/FlexPie101/FlexPie101/SelectionSampleController.h index 10b6ac2..880486d 100644 --- a/ObjectiveC/FlexPie101/FlexPie101/SelectionSampleController.h +++ b/ObjectiveC/FlexPie101/FlexPie101/SelectionSampleController.h @@ -7,6 +7,6 @@ #import -@interface SelectionSampleController : UIViewController +@interface SelectionSampleController : UIViewController @end diff --git a/ObjectiveC/FlexPie101/FlexPie101/SelectionSampleController.m b/ObjectiveC/FlexPie101/FlexPie101/SelectionSampleController.m index 27de5fe..4137425 100644 --- a/ObjectiveC/FlexPie101/FlexPie101/SelectionSampleController.m +++ b/ObjectiveC/FlexPie101/FlexPie101/SelectionSampleController.m @@ -6,109 +6,22 @@ // #import "SelectionSampleController.h" -#import "XuniFlexPieKit/XuniFlexPieKit.h" +@import XuniFlexPieDynamicKit; #import "PieChartData.h" @interface SelectionSampleController (){ NSMutableArray *pickerData; } +@property (weak, nonatomic) IBOutlet UILabel *offsetLabel; +@property (weak, nonatomic) IBOutlet UISwitch *isAnimatedSwitch; +@property (weak, nonatomic) IBOutlet UISegmentedControl *positionSelector; +@property (weak, nonatomic) IBOutlet FlexPie *flexPie; +@property (weak, nonatomic) IBOutlet UIStepper *stepper; @end @implementation SelectionSampleController - -- (void)viewDidLoad { - [super viewDidLoad]; - // Do any additional setup after loading the view. - UIPickerView *pickerView = [[UIPickerView alloc] init]; - pickerData =[[NSMutableArray alloc] initWithObjects:NSLocalizedString(@"None", nil),NSLocalizedString(@"Left", nil) , NSLocalizedString(@"Top", nil),NSLocalizedString(@"Right", nil), NSLocalizedString(@"Bottom", nil), nil]; - UILabel *offsetLabel = [[UILabel alloc] init]; - UILabel *positionLabel = [[UILabel alloc] init]; - UILabel *isAnimatedLabel = [[UILabel alloc] init]; - UIStepper *stepper = [[UIStepper alloc] init]; - UISwitch *isAnimatedSwitch = [[UISwitch alloc]init]; - - pickerView.delegate = self; - pickerView.showsSelectionIndicator = YES; - pickerView.hidden = false; - [pickerView selectRow:4 inComponent:0 animated:false]; - - [isAnimatedSwitch addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged]; - stepper.maximumValue = .5; - stepper.minimumValue = 0; - stepper.value = .2; - stepper.stepValue = .1; - [stepper addTarget:self action:@selector(stepperClicked:) forControlEvents:UIControlEventValueChanged]; - - FlexPie *pieChart = [[FlexPie alloc] init]; - NSMutableArray *pieData = [PieChartData demoData]; - - offsetLabel.tag = 2; - offsetLabel.text = [NSLocalizedString(@"Selected Item offset", nil) stringByAppendingString:[NSString stringWithFormat:@"%1.1f", stepper.value]]; - - positionLabel.text = NSLocalizedString(@"position", nil); - - isAnimatedLabel.text = NSLocalizedString(@"animation", nil); - - pieChart.binding = @"value"; - pieChart.bindingName = @"name"; - pieChart.itemsSource = pieData; - pieChart.tooltip.isVisible = true; - pieChart.selectedItemOffset = stepper.value; - pieChart.selectedItemPosition = XuniPositionBottom; - pieChart.isAnimated = false; - - pieChart.tag = 1; - offsetLabel.tag = 2; - positionLabel.tag = 3; - isAnimatedLabel.tag = 4; - stepper.tag = 5; - pickerView.tag = 6; - isAnimatedSwitch.tag = 7; - - [self.view addSubview:pickerView]; - [self.view addSubview:isAnimatedSwitch]; - [self.view addSubview:stepper]; - [self.view addSubview:pieChart]; - [self.view addSubview:offsetLabel]; - [self.view addSubview:positionLabel]; - [self.view addSubview:isAnimatedLabel]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexPie *pieChart = (FlexPie*)[self.view viewWithTag:1]; - UILabel *offsetLabel = (UILabel*)[self.view viewWithTag:2]; - UILabel *positionLabel = (UILabel*)[self.view viewWithTag:3]; - UILabel *isAnimatedLabel = (UILabel*)[self.view viewWithTag:4]; - UIStepper *stepper = (UIStepper*)[self.view viewWithTag:5]; - UIPickerView *pickerView = (UIPickerView*)[self.view viewWithTag:6]; - UISwitch *isAnimatedSwitch = (UISwitch*)[self.view viewWithTag:7]; - offsetLabel.frame = CGRectMake(0, 65, self.view.bounds.size.width/2, 50); - [offsetLabel sizeToFit]; - positionLabel.frame = CGRectMake(0, 115, self.view.bounds.size.width/4, 50); - [positionLabel sizeToFit]; - isAnimatedLabel.frame = CGRectMake(self.view.bounds.size.width/2, 115, self.view.bounds.size.width/4, 50); - [isAnimatedLabel sizeToFit]; - stepper.frame = CGRectMake(self.view.bounds.size.width * 5/8, 65, self.view.bounds.size.width/4, 50); - pickerView.frame = CGRectMake(0, 165, self.view.bounds.size.width/4, 162); - isAnimatedSwitch.frame = CGRectMake((self.view.bounds.size.width * 3/4) + 5, 115, 50, 50); - pieChart.frame = CGRectMake(self.view.bounds.size.width/4, 165, self.view.bounds.size.width*3/4, self.view.bounds.size.height-165); -} - -- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ - return 1; -} - -- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ - return [pickerData count]; -} - -- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ - FlexPie *pie = (FlexPie*)[self.view viewWithTag:1]; +- (IBAction)positionChanged:(id)sender { + FlexPie *pie = self.flexPie; + int row = self.positionSelector.selectedSegmentIndex; if (row == 0) { pie.selectedItemPosition = XuniPositionNone; } @@ -126,38 +39,41 @@ - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComp } } -- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ - return [pickerData objectAtIndex:row]; -} - --(void)stepperClicked:(id) sender{ - UIStepper *stepper =(UIStepper*)sender; - FlexPie *pie = (FlexPie*) [self.view viewWithTag:1]; - UILabel *offsetLabel = (UILabel*) [self.view viewWithTag:2]; +- (void)viewDidLoad { + [super viewDidLoad]; + self.positionSelector.selectedSegmentIndex = 4; + + NSMutableArray *pieData = [PieChartData demoData]; + + self.offsetLabel.text = [NSString stringWithFormat:@"%1.1f", self.stepper.value]; - pie.selectedItemOffset = stepper.value; - offsetLabel.text = [NSLocalizedString(@"offset", nil) stringByAppendingString:[NSString stringWithFormat:@"%1.1f", stepper.value]]; - [offsetLabel sizeToFit]; + self.flexPie.binding = @"value"; + self.flexPie.bindingName = @"name"; + self.flexPie.itemsSource = pieData; + self.flexPie.tooltip.isVisible = true; + self.flexPie.selectedItemOffset = self.stepper.value; + self.flexPie.selectedItemPosition = XuniPositionBottom; + self.flexPie.isAnimated = false; + } --(void)switchChanged:(UISwitch *) switchState{ - FlexPie *pie = (FlexPie*) [self.view viewWithTag:1]; + +- (IBAction)switchAnimation:(id)sender { - if ([switchState isOn]) { - pie.isAnimated = true; + if ([self.isAnimatedSwitch isOn]) { + self.flexPie.isAnimated = true; } else { - pie.isAnimated = false; + self.flexPie.isAnimated = false; } } -/* -#pragma mark - Navigation -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. +-(IBAction)stepperClicked:(id) sender{ + UIStepper *stepper =(UIStepper*)sender; + self.flexPie.selectedItemOffset = stepper.value; + self.offsetLabel.text = [NSString stringWithFormat:@"%1.1f", stepper.value]; + [self.offsetLabel sizeToFit]; } -*/ + @end diff --git a/ObjectiveC/FlexPie101/FlexPie101/SnapshotController.m b/ObjectiveC/FlexPie101/FlexPie101/SnapshotController.m index 2c90759..1268154 100644 --- a/ObjectiveC/FlexPie101/FlexPie101/SnapshotController.m +++ b/ObjectiveC/FlexPie101/FlexPie101/SnapshotController.m @@ -6,75 +6,48 @@ // #import "SnapshotController.h" -#import "XuniFlexPieKit/XuniFlexPieKit.h" +@import XuniFlexPieDynamicKit; #import "PieChartData.h" @interface SnapshotController () +@property (weak, nonatomic) IBOutlet FlexPie *flexPie; @end @implementation SnapshotController +- (IBAction)doTakeSnapshot:(id)sender { + UIImage *image = [[UIImage alloc] init]; + image = [UIImage imageWithData:[self.flexPie getImage]]; + UIImageWriteToSavedPhotosAlbum(image, self, @selector(imageSavedToPhotoAlbum:finishedSavingWithError:contextInfo:), nil); +} - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. - - UIButton *snapshotButton = [UIButton buttonWithType:UIButtonTypeSystem]; - [snapshotButton setTitle:NSLocalizedString(@"Take a snapshot", nil) forState:UIControlStateNormal]; - [snapshotButton addTarget:self action:@selector(snapshotButtonClicked) forControlEvents:UIControlEventTouchUpInside]; - FlexPie *pieChart = [[FlexPie alloc] init]; + + NSMutableArray *pieData = [PieChartData demoData]; - pieChart.binding = @"value"; - pieChart.bindingName = @"name"; - pieChart.itemsSource = pieData; - pieChart.tooltip.isVisible = true; - pieChart.tag = 1; - snapshotButton.tag = 2; - [self.view addSubview:snapshotButton]; - [self.view addSubview:pieChart]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. + self.flexPie.binding = @"value"; + self.flexPie.bindingName = @"name"; + self.flexPie.itemsSource = pieData; + self.flexPie.tooltip.isVisible = true; + } --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexPie *pieChart= (FlexPie*)[self.view viewWithTag:1]; - UIButton *snapshotButton = (UIButton*)[self.view viewWithTag:2]; - pieChart.frame = CGRectMake(5, self.view.bounds.size.height/3, self.view.bounds.size.width-10, self.view.bounds.size.height/2); - snapshotButton.frame = CGRectMake(0, 65, self.view.bounds.size.width, 50); -} --(void)snapshotButtonClicked{ - FlexPie *pie = (FlexPie*)[self.view viewWithTag:1]; - UIImage *image = [[UIImage alloc] init]; - image = [UIImage imageWithData:[pie getImage]]; - UIImageWriteToSavedPhotosAlbum(image, self, @selector(imageSavedToPhotoAlbum:finishedSavingWithError:contextInfo:), nil); -} -(void)imageSavedToPhotoAlbum:(UIImage *)image finishedSavingWithError: (NSError *)error contextInfo:(void *)contextInfo{ NSString *message; NSString *title; if (!error) { - title = NSLocalizedString(@"Success", nil); - message = NSLocalizedString(@"Image was saved to Camera Roll successfully", nil); + title = @"Success"; + message = @"Image was saved to Camera Roll succesfully"; } else{ - title = NSLocalizedString(@"Failure", nil); + title = @"Failure"; message = [error description]; } - UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", nil) otherButtonTitles:nil]; + UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexPie101/FlexPie101/ThemingController.m b/ObjectiveC/FlexPie101/FlexPie101/ThemingController.m index 39d51cd..1e682dc 100644 --- a/ObjectiveC/FlexPie101/FlexPie101/ThemingController.m +++ b/ObjectiveC/FlexPie101/FlexPie101/ThemingController.m @@ -6,57 +6,38 @@ // #import "ThemingController.h" -#import "XuniFlexPieKit/XuniFlexPieKit.h" +@import XuniFlexPieDynamicKit; #import "PieChartData.h" @interface ThemingController (){ NSMutableArray *pickerData; } +@property (weak, nonatomic) IBOutlet UIPickerView *pickerView; +@property (weak, nonatomic) IBOutlet FlexPie *pieChart; @end @implementation ThemingController - (void)viewDidLoad { [super viewDidLoad]; - // Do any additional setup after loading the view. - UIPickerView *pickerView; + pickerData =[[NSMutableArray alloc] initWithObjects:@"Standard", @"Cocoa", @"Coral", @"Dark", @"HighContrast", @"Light", @"Midnight", @"Minimal", @"Modern", @"Organic", @"Slate", @"Zen", @"Cyborg", @"Superhero", @"Flatly", @"Darkly", @"Cerulean", nil]; - - pickerView = [[UIPickerView alloc] init]; - pickerView.delegate = self; - pickerView.showsSelectionIndicator = YES; - pickerView.hidden = false; + self.pickerView.delegate = self; + self.pickerView.showsSelectionIndicator = YES; + self.pickerView.hidden = false; - FlexPie *pieChart = [[FlexPie alloc] init]; NSMutableArray *pieData = [PieChartData demoData]; - pieChart.binding = @"value"; - pieChart.bindingName = @"name"; - pieChart.itemsSource = pieData; - pieChart.tooltip.isVisible = true; + self.pieChart.binding = @"value"; + self.pieChart.bindingName = @"name"; + self.pieChart.itemsSource = pieData; + self.pieChart.tooltip.isVisible = true; - pieChart.tag = 1; - pickerView.tag = 2; - [self.view addSubview:pieChart]; - [self.view addSubview:pickerView]; - -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. } --(void)viewDidLayoutSubviews{ - [super viewDidLayoutSubviews]; - FlexPie *pieChart= (FlexPie*)[self.view viewWithTag:1]; - UIPickerView *pickerView = (UIPickerView*)[self.view viewWithTag:2]; - pieChart.frame = CGRectMake(0, 227, self.view.bounds.size.width, (self.view.bounds.size.height-227)); - pickerView.frame = CGRectMake(self.view.bounds.size.width/4, 65, self.view.bounds.size.width/2, 162); -} - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ return 1; @@ -68,7 +49,7 @@ - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSIn - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ - FlexPie *chart = (FlexPie*)[self.view viewWithTag:1]; + FlexPie *chart = self.pieChart; switch (row) { case 0: chart.palette = [XuniPalettes standard]; @@ -131,14 +112,5 @@ - (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row fo } -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/FlexPie101/FlexPie101/ja.lproj/LaunchScreen.strings b/ObjectiveC/FlexPie101/FlexPie101/ja.lproj/LaunchScreen.strings index b4cb146..5d273f0 100644 --- a/ObjectiveC/FlexPie101/FlexPie101/ja.lproj/LaunchScreen.strings +++ b/ObjectiveC/FlexPie101/FlexPie101/ja.lproj/LaunchScreen.strings @@ -1,6 +1,6 @@ -/* Class = "UILabel"; text = " Copyright (c) 2015 GrapeCity. All rights reserved."; ObjectID = "8ie-xW-0ye"; */ -"8ie-xW-0ye.text" = " Copyright (c) 2015 GrapeCity. All rights reserved."; +/* Class = "UILabel"; text = " Copyright (c) 2016 GrapeCity. All rights reserved."; ObjectID = "Ewm-Nq-Jr5"; */ +"Ewm-Nq-Jr5.text" = " Copyright (c) 2016 GrapeCity. All rights reserved."; -/* Class = "UILabel"; text = "FlexPie101"; ObjectID = "kId-c2-rCX"; */ -"kId-c2-rCX.text" = "FlexPie101"; +/* Class = "UILabel"; text = "FlexPie101"; ObjectID = "R6A-MA-tzU"; */ +"R6A-MA-tzU.text" = "FlexPie101"; diff --git a/ObjectiveC/FlexPie101/FlexPie101/ja.lproj/Main.strings b/ObjectiveC/FlexPie101/FlexPie101/ja.lproj/Main.strings index ec4ead1..86904eb 100644 --- a/ObjectiveC/FlexPie101/FlexPie101/ja.lproj/Main.strings +++ b/ObjectiveC/FlexPie101/FlexPie101/ja.lproj/Main.strings @@ -1,6 +1,147 @@ -/* Class = "UINavigationItem"; title = "FlexPie101"; ObjectID = "CxN-2v-3D3"; */ -"CxN-2v-3D3.title" = "FlexPie101"; +/* Class = "UISegmentedControl"; 2us-aM-jrr.segmentTitles[0] = "None"; ObjectID = "2us-aM-jrr"; */ +"2us-aM-jrr.segmentTitles[0]" = "None"; -/* Class = "UIBarButtonItem"; title = "FlexPie101"; ObjectID = "QaC-o2-yIE"; */ -"QaC-o2-yIE.title" = "FlexPie101"; +/* Class = "UISegmentedControl"; 2us-aM-jrr.segmentTitles[1] = "Left"; ObjectID = "2us-aM-jrr"; */ +"2us-aM-jrr.segmentTitles[1]" = "Left"; + +/* Class = "UISegmentedControl"; 2us-aM-jrr.segmentTitles[2] = "Top"; ObjectID = "2us-aM-jrr"; */ +"2us-aM-jrr.segmentTitles[2]" = "Top"; + +/* Class = "UISegmentedControl"; 2us-aM-jrr.segmentTitles[3] = "Right"; ObjectID = "2us-aM-jrr"; */ +"2us-aM-jrr.segmentTitles[3]" = "Right"; + +/* Class = "UISegmentedControl"; 2us-aM-jrr.segmentTitles[4] = "Bottom"; ObjectID = "2us-aM-jrr"; */ +"2us-aM-jrr.segmentTitles[4]" = "Bottom"; + +/* Class = "UINavigationItem"; title = "Getting Started"; ObjectID = "3Mg-95-lOi"; */ +"3Mg-95-lOi.title" = "Getting Started"; + +/* Class = "UITextField"; placeholder = "Footer"; ObjectID = "4Ll-o1-7jf"; */ +"4Ll-o1-7jf.placeholder" = "Footer"; + +/* Class = "UITextField"; placeholder = "Header"; ObjectID = "5Se-IW-ha4"; */ +"5Se-IW-ha4.placeholder" = "Header"; + +/* Class = "UILabel"; text = "Selection Sample"; ObjectID = "8Om-IZ-3gS"; */ +"8Om-IZ-3gS.text" = "Selection Sample"; + +/* Class = "UILabel"; text = "Shows inner radius, offset, and start angle"; ObjectID = "AGA-yF-HJh"; */ +"AGA-yF-HJh.text" = "Shows inner radius, offset, and start angle"; + +/* Class = "UILabel"; text = ">"; ObjectID = "D6b-d8-OFZ"; */ +"D6b-d8-OFZ.text" = ">"; + +/* Class = "UISegmentedControl"; EYX-qw-RJW.segmentTitles[0] = "None"; ObjectID = "EYX-qw-RJW"; */ +"EYX-qw-RJW.segmentTitles[0]" = "None"; + +/* Class = "UISegmentedControl"; EYX-qw-RJW.segmentTitles[1] = "Left"; ObjectID = "EYX-qw-RJW"; */ +"EYX-qw-RJW.segmentTitles[1]" = "Left"; + +/* Class = "UISegmentedControl"; EYX-qw-RJW.segmentTitles[2] = "Top"; ObjectID = "EYX-qw-RJW"; */ +"EYX-qw-RJW.segmentTitles[2]" = "Top"; + +/* Class = "UISegmentedControl"; EYX-qw-RJW.segmentTitles[3] = "Right"; ObjectID = "EYX-qw-RJW"; */ +"EYX-qw-RJW.segmentTitles[3]" = "Right"; + +/* Class = "UISegmentedControl"; EYX-qw-RJW.segmentTitles[4] = "Bottom"; ObjectID = "EYX-qw-RJW"; */ +"EYX-qw-RJW.segmentTitles[4]" = "Bottom"; + +/* Class = "UIBarButtonItem"; title = "Take snapshot"; ObjectID = "Erp-aX-XoL"; */ +"Erp-aX-XoL.title" = "Take snapshot"; + +/* Class = "UILabel"; text = "Reversed:"; ObjectID = "GRX-8V-bkz"; */ +"GRX-8V-bkz.text" = "Reversed:"; + +/* Class = "UITableViewController"; title = "FlexPie101"; ObjectID = "GYf-gL-MhM"; */ +"GYf-gL-MhM.title" = "FlexPie101"; + +/* Class = "UILabel"; text = "Snapshot"; ObjectID = "HJ7-vQ-Xkx"; */ +"HJ7-vQ-Xkx.text" = "Snapshot"; + +/* Class = "UIBarButtonItem"; title = "Select theme"; ObjectID = "ILU-It-HiN"; */ +"ILU-It-HiN.title" = "Select theme"; + +/* Class = "UINavigationItem"; title = "FlexPie101"; ObjectID = "JGg-u3-6cT"; */ +"JGg-u3-6cT.title" = "FlexPie101"; + +/* Class = "UILabel"; text = "Offset:"; ObjectID = "KID-dH-6qs"; */ +"KID-dH-6qs.text" = "Offset:"; + +/* Class = "UINavigationItem"; title = "Selection"; ObjectID = "KMD-mC-9eY"; */ +"KMD-mC-9eY.title" = "Selection"; + +/* Class = "UINavigationController"; title = "FlexPie101"; ObjectID = "MVE-nJ-8ld"; */ +"MVE-nJ-8ld.title" = "FlexPie101"; + +/* Class = "UILabel"; text = "Shows basic header, footer, and legend positioning"; ObjectID = "Mbx-xV-h8M"; */ +"Mbx-xV-h8M.text" = "Shows basic header, footer, and legend positioning"; + +/* Class = "UILabel"; text = "Shows selection animation, offset, and position"; ObjectID = "Mis-r9-zsr"; */ +"Mis-r9-zsr.text" = "Shows selection animation, offset, and position"; + +/* Class = "UINavigationItem"; title = "Basic Features"; ObjectID = "N7m-He-yJE"; */ +"N7m-He-yJE.title" = "Basic Features"; + +/* Class = "UILabel"; text = "0"; ObjectID = "Ptj-NJ-8Is"; */ +"Ptj-NJ-8Is.text" = "0"; + +/* Class = "UINavigationItem"; title = "Snapshot"; ObjectID = "T09-pu-mNC"; */ +"T09-pu-mNC.title" = "Snapshot"; + +/* Class = "UILabel"; text = "Getting Started"; ObjectID = "Xsl-3n-wli"; */ +"Xsl-3n-wli.text" = "Getting Started"; + +/* Class = "UINavigationItem"; title = "Theming"; ObjectID = "Yxl-Um-f5M"; */ +"Yxl-Um-f5M.title" = "Theming"; + +/* Class = "UILabel"; text = "Animated:"; ObjectID = "aU9-bd-QKe"; */ +"aU9-bd-QKe.text" = "Animated:"; + +/* Class = "UILabel"; text = ">"; ObjectID = "aZK-8n-hQQ"; */ +"aZK-8n-hQQ.text" = ">"; + +/* Class = "UILabel"; text = "Inner radius:"; ObjectID = "aa7-fa-dS8"; */ +"aa7-fa-dS8.text" = "Inner radius:"; + +/* Class = "UILabel"; text = "Basic Features"; ObjectID = "ar7-cq-3jx"; */ +"ar7-cq-3jx.text" = "Basic Features"; + +/* Class = "UILabel"; text = "Shows how to export an image of FlexPie"; ObjectID = "bbC-jR-HrU"; */ +"bbC-jR-HrU.text" = "Shows how to export an image of FlexPie"; + +/* Class = "UILabel"; text = "Start Angle:"; ObjectID = "eYn-3l-CDx"; */ +"eYn-3l-CDx.text" = "Start Angle:"; + +/* Class = "UILabel"; text = ">"; ObjectID = "ec8-fm-Cbr"; */ +"ec8-fm-Cbr.text" = ">"; + +/* Class = "UILabel"; text = ">"; ObjectID = "fbZ-TF-gFZ"; */ +"fbZ-TF-gFZ.text" = ">"; + +/* Class = "UILabel"; text = "Selected item offset:"; ObjectID = "go0-qT-YIN"; */ +"go0-qT-YIN.text" = "Selected item offset:"; + +/* Class = "UILabel"; text = ">"; ObjectID = "iGn-QC-e2I"; */ +"iGn-QC-e2I.text" = ">"; + +/* Class = "UILabel"; text = ">"; ObjectID = "icA-SV-8Jm"; */ +"icA-SV-8Jm.text" = ">"; + +/* Class = "UILabel"; text = "Legend And Titles"; ObjectID = "lqF-vC-dJD"; */ +"lqF-vC-dJD.text" = "Legend And Titles"; + +/* Class = "UILabel"; text = "Theming"; ObjectID = "p1E-12-g72"; */ +"p1E-12-g72.text" = "Theming"; + +/* Class = "UILabel"; text = "Shows available palettes"; ObjectID = "sQz-H9-2Wx"; */ +"sQz-H9-2Wx.text" = "Shows available palettes"; + +/* Class = "UILabel"; text = "0"; ObjectID = "uNC-aY-ZRX"; */ +"uNC-aY-ZRX.text" = "0"; + +/* Class = "UINavigationItem"; title = "Legend and Titles"; ObjectID = "vgv-dq-uvm"; */ +"vgv-dq-uvm.title" = "Legend and Titles"; + +/* Class = "UILabel"; text = "Shows a simple pie chart with tooltips"; ObjectID = "wlQ-YC-Ll7"; */ +"wlQ-YC-Ll7.text" = "Shows a simple pie chart with tooltips"; diff --git a/ObjectiveC/FlexPie101/FlexPie101/pie.png b/ObjectiveC/FlexPie101/FlexPie101/pie.png new file mode 100644 index 0000000000000000000000000000000000000000..5addd542d9948c1c2ac72d316a869e50ae039750 GIT binary patch literal 7359 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

8|qYPJ5Nmh)8vDK-R+-s{BtwuSLyX&~y?xPIQ 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 literal 0 HcmV?d00001 diff --git a/ObjectiveC/FlexPie101/FlexPie101/pie_load.png b/ObjectiveC/FlexPie101/FlexPie101/pie_load.png new file mode 100644 index 0000000000000000000000000000000000000000..09edd515a683a0745ab5b9292bef470e4760b5f0 GIT binary patch literal 11184 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 literal 0 HcmV?d00001 diff --git a/ObjectiveC/FlexPie101/FlexPie101/pie_title.png b/ObjectiveC/FlexPie101/FlexPie101/pie_title.png new file mode 100644 index 0000000000000000000000000000000000000000..12777e1c6dcba05ee22d8a2261b2c0a65ade1233 GIT binary patch literal 7054 zcmaKRcR1B?8}}LZ7TK~Q+cC0dW@TiP%!m+K8Ob3;M#rf{B$bS^XJj2xj$I*SWoKlM z!&&dw^Ssyf{_|Y#ALpFw{Kj|O_vilH_x<@kzGiOBNXJ75fj}59n;2Mu-}k2<8W{L~ zF?NOn{7`u7ndw0wl~@(ZlvVJbJJir2)H?81Xt;Z@7evo9(8Ejc@*Q_?FDoy1&&Z%2 zFHH!9SMaido=wDWkEvdPE(Dzs6@*5x=!YPe8bmPGNaQ{RG#0{>zQIZXf%z!a7_&fV z-u%Fx)BArnJ>Dk1eaOLc%g;|jWd*-5c7ezf({_U3v9N(cpa##dw>)p%T3&wha3MmC zo6C41*%!R(b7q2pOfJ|a5s1Niw1{{T{vb*JO0tDLtJ!fbJc~pm4D@$=6B6w&m!#w* zAFa&#Fj%reC|KyrWpJd$fiEv7UHr9o{&idxw4dthk8o7W$*D#2BiqRo3bCuYvOQ*E zKhcll!;}I_m>{s^1~hSRDQP`(FHWA3(|x(as-<=}L|+&`yo9$;^@fHtMdxse4ExZU zdqG%q>+YoMI0yY%`t|JnD1=O!U3JFq5b}OBzEuZy;W0Wyac;Q;Xi%nUT3sYX5qCzP zC<=C0ryVkUpanB2zwM!sjBB5Y*j-w--erhD&VQ@?l%K6SZgev_<#gXx-pFP=!D#xO zMb;*nw4JEQrv0k*L47C_y-Ih!#jLT&s@s4gVk zE=7a}Lh;?l6D0`NT7cGi2+@U9Gtk=CJl?KOr6rM#Q9rE3IF@x>k?5PW7YF>_4+3=CMNvLlW{Qte;7@=BCV|CN9Ph5}&7@-0^ zASx%e<{2v?JLlbz7CspNIK4tfY}q{r2kxFL4{~$5K5mz5mf$)vq1$CCU>)Zhshah! ztGJIjMjLq)wME%~_~R3PXg0sGLpT5DYxL@RUhx-&8YnCo&BTk3|pXDW@o|#|NU|VROnNjfqzTFiGU`||FKN_+>*QOCeoJLFKS8AW&i7VuGk)>#A5OyT= zfFy=7?KahRinyT1+|ptO%b6er9C>}{lX0a>fYw3qYc{?0e!)fk%1Us=Q_pE8jUk$9)h&^dkF5Ql6hY7z!r;WTgD z&rNK2z-oeI`K&t6zh~B#6}oEX?&Pd2bk6MqX=QI)jS=AaQKU|8V$!p#maiDnr#@PJ z%w(ksp)b62C&|nQfEiI)>qr?no^Xu)#ne9^{h1C^gwK1DIeV^+XYDQYbfw-Qy)@P? z%2)$+F1b>cBL&|7T#uLcjz2Lhlg2z!DixF~u0!OC>r~;p#QOWXItKfDzV&}4f#3mP zAP^7Nx3ad{XQBx^^Tc8)=9pGe@&x;e)${i$&m!uV4!oD9^ILW{yBNtagmdrEj4ZnG zqBY!(*^Z5B4!B0#K_)KU_PA~-QpqzG&6tKT5)%{bfp{V=F;Bzd$Yed@9Fj~Tkp zR%v0atG{}ji*I#putc(@%=-vc+ukotqn;I+L&SsS;cIFBz)yd$RNttZ8wF7xpJ$Xm zsj645tbi$^z4PT29?s`Ie#sgtKHr`%H*<6K_T8Eg36pD|uxPplXv22pi+)n@UQb5q z=^$0uyd}G|s7-=-KG<6&E`KHf* zs6f|qk5?S-)a2n(gt=Cb5_cL8*DGpvL*OAoW-V?d3}u~iD`w=o%ZDr}V3K!!p7hxt zA2;QiP&ovbnppmD=x=pr!4wLbYqW3s_Nz01bx$&oq1 zJ*k#so^J4e>(eU^Qem=Qmvf?0?5&ypRtm9CfV{AWy~Q@4X|ea5uEDTPI5y?a>`}f0 zs@lWDYq`kFlT5~M%`B!{jPaej^i>tmj&hACK_+t#j!U=k@usX$?2FY3TeIU3e-U#W zQ|fhG5UD{Xo+u`q(wWcM3Cs(0a8Q-$dwA8lsWmeJzeB&SE5;^8pY@JH#-HNeUVxHx zOvBoDGE(1v`Sgu56PJGd&bdR2IZ0zWhub^Gqr3yFmA(Q{8XkWLm>$y@s$d_Ay1%`9 zjn4*3BPeOC%*LB)TK6oMRsz;t4O1#6@f}A&LO;^dXc0XIm=P z#1XF-5+F;Rx?OL?$~(y9*-dvH&*x5#DWB2A!|lwz7QUjuI3aQ^J@RPAU|rM(>2nx8#jQFZh{;rX}IXz8_E2Hs<2`~mNMyPKYi zcJIvF>Bs5rD|vShEEj%p>!AZ<3f07=yG&np>{R}}A5LtaMYhd+3r;&L!X{#S;*4x3 zH4e8flj;WaOH&i+L5?jvrSGEYOie-g0m!+tPSHDTzr2mU2 z&LtVjQKmVNm~| zHY(nNBPgm*166hw)uM!pjK^&P2A{RaqRgE(5%TWoG^A@7lzUij&SHk-LZ4 zy*<3dnp49H?=AzMS5Zqz)mlBt_cc^y+hEXHz1u7|CNP~>^*S1bQ0O&K^KH1GV14g) zURC*%Sak1k*9@@6O%o`(ja(fzhp^{Ed7M#xC=T#Enq9Lky#XSq*#pEG`3DI zjU#^VM%LfGyk_BNBTLKCFeW-F;{Q-{{&i9Rb5{#2mL`;{y;@Q>G8Q6yp(gU;QfyBK zda6vn9!okBurJGyf5uq0eQsbnQvSiup{#L@;f;Bidh6{g$I$Ga=8iw0flj1j+}RLA3Go7&J*c1c&(99CF*E;Mnf=jo zYo_pZ%GM8R5y}kP>k^WjPa_e3k#30w<*DhwO11K=g0UtQwM*8T)D4zY)UKPFc=C$C zuVnXS;W^BhC9bz}l4EYB`_l?n!f?^VADNwwTNXFEC%&cx+XN;H#f%D9$xHLD zT(a!rn~_irJsu#XW+=c*A0l;-a4G9m6YBYOXZ|47j%V{H##P(ZLKor`3f&DYxIKjD8e}i_A&$Qr64~w(1xe z$6YoULZiDjMRg(atoh}XW~0;=rf?@)hroMoXa7Kj3I9ef^c}jI=HiH~ht4nkg`3XZSFoQVsP;x-f|G_feP0HO9+dXu%?E`mc#o=1DBB|od#kCeNk?hau!#Y@!)v{2l#-caM6)C$sZeb9JabG;+2ywO|>lpRXh*5W=!c^|J}Y|JnQ zcdAZv6zdazJ$lBs(42~IlUq?w!i-Q?_4sN(LmMXLyv$=7mT6>%&l6-AS2(UUwzHHk zbA-vqzG_#F0PM+{?C*x5o&1}jequts&ENf&GdppmxbH~rmMKiRJ&0SBckAPDK2urw zhxJSH%+}X8gbFDDpyH@_vRWD&vsT?wS9S8+h*2mn4(4$scthcjsM0aX<(Q^KB9*q- zJ-f_#x37FU^Tt!j)F9koMv{$D;cytBKHWj82FHjIFDfTblA_Bk>;y@q;q$+u}(?tK@*Umt4MiD8=xf?ek}?qvWpJ=Zs3%2)R0cMdw} zyWwGc77`dE3Dh(!O5U@%bvx!mJZ{{vt#w%}KR2%y9=uc)K8)HBj-JI{?-HJWb3{H8 z(2QgDueobN`%I~ljzt$Ioa>z6I&Pljz8weLMLtgPl6`7@oy#Etrax!b7p!^pQj=|A z=!xRrDw8t~#dk|h(BVZdk_)t}>JtL_{^|VveXZ;Wy#Rwi6D%Z>(!^0Y`)+9)#+B6- zii=iH37|?Hou9CH@vnPALcwx0@0H;qH0wEBFC<-sS{5DDd(np?{r6-R1V-~IC@l?E zH|2ZPeefHPI!Zh_W4^(3~H1)RN9~CQZO@2fyr1NDhD7Yy4N2uIQ$;Sku zN&{sW#$}#(+v)D+q?_mS^f0?hRM8?vUjdR|A*`r^&zFn$P@x5;OY;{qSB`-%>2Xcy zyly*AyhFD*i<)hGQUGsII;$9M)2qLl-!uLdr*=LusNAnW5p;55n&pZf=4I+%-}ze)acH+D5*rxt4w)6|eaE ze(@eJQ*m^3C8jb>E8syt#>AaTyYiTR8Q=!fGE*BD`0 zARIQa9E<#~(CI5>^kT{!P3Obw*G%S1<<%kIZ(#pqy8_!y#Y@IZw6NrDaBd-6zs#_E zpIx++rLpNh&?93);Zgh?1s;9S5c^S4?a%5tUZfT9!pL3it8-T-A8{__Rj z#R~*3jaG;RVIkdkzfOmXi^_S6ex#PJ8mb&w0dmc6X=IDf5XjU@PV=-I^lwFQ#2qQ_ zukSO`mBmLDG!rKv&iy{_X2jnjzo*_Q3>+?Ct3xe7g|DdG(*oA2Dv28K2`YYgAUbik;aD9p8~+MgIH1& z(&tsZw9i|2L@{KHV`8j%$l2s2A~w7Twzt3H7w@HU;WV5!^cok~Isd3!Q_jvCDo!Pi zKMM!_W^Z=FI*Uxsr$LtoxE;bjL0WO($q8Nj&IW&#o;FQ*q&p=h`&WKuIH*aAuO3x* z9qp`RPMna}Wzz!$JK?dLLV;bdY@=DeMvB(NGk&wU?m%;H)>Rtnd2jhscn)2|WUZqp zWR#Mwkd{ZEE55R)D0>e?fH(>K+?ivw% zRo@#LIHxD0{K1MG)8Ne?1s?tO;=;V(scNMv`&!)_qlx6qKG1P#F&@Kehdpa4Qk7r1 zk)e(R-DP9aRV4BF?wZ(_YjDi#?2cELzTc%#-acOYLf=CSZPsNQ|00GrXZ zr!T(*_-dq5m-RC12;qa<_HJ8nZZUsEfEEOXr_g!btUt$n45t}4z=evvznU~Tm$KET zW_>%nVx#Y$_cq^}jv%OUX$%gtCM{gInlT7ZXf7h(&RC&JF-2=n3mFc|+*Gp*B>{3( zk@&+uUS${R83jRj!_Y)LkyA749Rn>!5?e6(@_g3D6UDYv?>RM-$NlHVdU)AqO3nHi zaLAV8)SIX2zGWIu+*#N6`OAJkdN0IJsjIg*(j$|2aI#R}8yRsg?3wkWKrKUe4Z^I2 z@Sx2xDfK-T#BZnd?CfTHMAHJpQc@6;wAD-$O^QbWTj<(|CUnL_+)mQ1BhR#y_r(ke9iK<^Hv&lI4Gu3fb(`|YAnhdkI z$IYhUW+ufpy(H&fvaoNTEs;5CmL273X}ZR+XJY1EgICsm zbexu3o^ZvZVOwgwKEFrWZl3OTk~B7zsBcmC)DhmZ0j`n7-ZJRshw|{Xo?ZBRDt3|A zO)@oBw6fg5dWV{?k1hnl=tCa4L%CjZomG4gYo=Uw;U{zfZ$9KJD16g*clt-Er}BPD z*d`QF6r?f%q9x%=*5=T-!nLaqAC|c^%xA|^E!On}Erb(T#=r}&^I^~92DUWvO0it= zFgt1u)<#;eJSTT2er0#< zYrloVtf3+cr=sLk1mV`Kp=KegE(Cq=F)yNU*5Bn@;QLF2f5!0wCRC1a`1caGfQYe(y#;ZV8;})KRYi4)@Pf){ z=VMQcMik>Z_hTT?5$=%_L7B9ismpvTpjpLT>kC=vk1=rLg&J-WksLaAt_mT*Fji@$ z*p?}Jyq`J4-}bOx_f)nS%e6@S7wV9q?tj_`T7HTs>4(87SRB!en=;W&I|kz};oJT% z-qZbg%C<0OA019m|E13!r)BY`(s1LzAwqYDIJfc7uP~(Qb&iHA5Ejtf6AXWPIzXyP zY2vk>d$H9)0pvUi)6p6J_D2V*Q-MdXk!`!W<9b`&&pv@174wh+Fq1D)po)- z%6ltTf`9$m-ginM-ocDMZdpus{T2XJAX-IFiaKgKx{x%!<^)tA@fsnSEFehHGk4=S zYJQzWAN)XFaG?5()O?_ka3xR`07~+eE!p!pZhe$K21)2ev_ODnnE!-ucNaL)a>e5z z5Fl^#z9{)Ag}q{!Lm=ezoAl8CFk=C@g&=tbIS!6PX4NonO{y~|7u3h4s-<-uZ<MY-V$)S+4TGR;7xk!3bMBTm%33?{m8Kx=kPi~!w$p!WfZc#J1k>L8H>0&z|XaSz!>*k0)2b(>w?OE=a% z1bV+7-dSS2^5P8;6V(i|D+Dt62yY>HLL|{6T>tOEiF`U$2Ns-1De+AFj{}r+qeF0t f_P=k&LLmWak0CwbEA`+&4RYDg+@Ru;+r$3@ULsG_ literal 0 HcmV?d00001 diff --git a/ObjectiveC/FlexPie101/FlexPie101/themes.png b/ObjectiveC/FlexPie101/FlexPie101/themes.png new file mode 100644 index 0000000000000000000000000000000000000000..62fc1fc91a04634b02b30d95efa439ed91a0634f GIT binary patch literal 8673 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 #import "License.h" @interface AppDelegate () diff --git a/ObjectiveC/Gauges101/Gauges101/Base.lproj/Main.storyboard b/ObjectiveC/Gauges101/Gauges101/Base.lproj/Main.storyboard index 097c7ac..916c05a 100644 --- a/ObjectiveC/Gauges101/Gauges101/Base.lproj/Main.storyboard +++ b/ObjectiveC/Gauges101/Gauges101/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + @@ -39,7 +39,7 @@ - + @@ -92,7 +92,7 @@ - + @@ -145,7 +145,7 @@ - + @@ -198,7 +198,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -304,7 +304,7 @@ - + @@ -357,7 +357,7 @@ - + @@ -410,7 +410,7 @@ - + @@ -538,10 +538,39 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -616,10 +645,22 @@ - + + + + + + + + + + + + + @@ -642,10 +683,31 @@ - + + + + + + + + + + + + + + + + + + + + + + - + @@ -680,7 +742,25 @@ - + + + + + + + + + + + + + + + + + + + @@ -693,7 +773,7 @@ - + @@ -836,14 +916,100 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -961,7 +1127,52 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1029,11 +1240,53 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1042,11 +1295,62 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1132,14 +1436,78 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1222,6 +1590,23 @@ + + + + + + + + + + + + + + + + + @@ -1272,16 +1657,93 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ObjectiveC/Gauges101/Gauges101/XGAnimationViewController.m b/ObjectiveC/Gauges101/Gauges101/XGAnimationViewController.m index 2327900..2fd11d7 100644 --- a/ObjectiveC/Gauges101/Gauges101/XGAnimationViewController.m +++ b/ObjectiveC/Gauges101/Gauges101/XGAnimationViewController.m @@ -6,7 +6,7 @@ // #import "XGAnimationViewController.h" -#import +@import XuniGaugeDynamicKit; @interface XGAnimationViewController () @property (weak, nonatomic) IBOutlet XuniLinearGauge *linearGauge; @@ -19,37 +19,15 @@ @implementation XGAnimationViewController - (void)viewDidLoad { [super viewDidLoad]; - _radialGauge.thickness = 0.6; - _radialGauge.min = 0; - _radialGauge.max = 100; - _radialGauge.value = 25; _radialGauge.loadAnimation.duration = 2; _radialGauge.updateAnimation.duration = 2.5; - _radialGauge.isReadOnly = true; - _linearGauge.min = 0; - _linearGauge.max = 100; - _linearGauge.value = 25; _linearGauge.loadAnimation.duration = 2; _linearGauge.updateAnimation.duration = 2.5; - _linearGauge.isReadOnly = true; - _linearGauge.backgroundColor = [UIColor clearColor]; - _radialGauge.backgroundColor = _linearGauge.backgroundColor = [UIColor clearColor]; - _radialGauge.pointerColor = _linearGauge.pointerColor = [UIColor whiteColor]; - _radialGauge.faceBorderWidth = _linearGauge.faceBorderWidth = 1; - _radialGauge.faceBorderColor = _linearGauge.faceBorderColor = [UIColor whiteColor]; - _radialGauge.faceColor = _linearGauge.faceColor = [UIColor clearColor]; - _radialGauge.valueFontColor = [UIColor whiteColor]; - _linearGauge.valueFontColor = [UIColor blueColor]; - _radialGauge.minFontColor = _linearGauge.minFontColor = [UIColor whiteColor]; - _radialGauge.maxFontColor = _linearGauge.maxFontColor = [UIColor whiteColor]; - _radialGauge.valueFont = _linearGauge.valueFont = [UIFont fontWithName:@"Optima" size:19]; - - // Create ranges. XuniGaugeRange* lower = [[XuniGaugeRange alloc] initWithGauge:_linearGauge]; lower.min = 0; diff --git a/ObjectiveC/Gauges101/Gauges101/XGAutomaticScalingViewController.m b/ObjectiveC/Gauges101/Gauges101/XGAutomaticScalingViewController.m index 202fee7..4dd0dd8 100644 --- a/ObjectiveC/Gauges101/Gauges101/XGAutomaticScalingViewController.m +++ b/ObjectiveC/Gauges101/Gauges101/XGAutomaticScalingViewController.m @@ -6,7 +6,7 @@ // #import "XGAutomaticScalingViewController.h" -#import +@import XuniGaugeDynamicKit; @interface XGAutomaticScalingViewController () @property (weak, nonatomic) IBOutlet UIStepper *startAngleStepper; @@ -30,25 +30,9 @@ - (IBAction)angleChanged:(id)sender { - (void)viewDidLoad { [super viewDidLoad]; - _radialGauge.thickness = 0.6; - _radialGauge.min = 0; - _radialGauge.max = 200; - _radialGauge.value = 25; + _radialGauge.loadAnimation.duration = 2; _radialGauge.updateAnimation.duration = 3.5; - _radialGauge.isReadOnly = true; - _radialGauge.startAngle = 90; - _radialGauge.sweepAngle = 90; - - _radialGauge.backgroundColor = [UIColor clearColor]; - _radialGauge.pointerColor = [UIColor whiteColor]; - _radialGauge.faceBorderWidth = 1; - _radialGauge.faceBorderColor = [UIColor whiteColor]; - _radialGauge.faceColor = [UIColor clearColor]; - _radialGauge.valueFontColor = [UIColor whiteColor]; - _radialGauge.minFontColor = [UIColor whiteColor]; - _radialGauge.maxFontColor = [UIColor whiteColor]; - _radialGauge.valueFont = [UIFont fontWithName:@"Optima" size:19]; [self angleChanged:nil]; diff --git a/ObjectiveC/Gauges101/Gauges101/XGBulletGraphViewController.m b/ObjectiveC/Gauges101/Gauges101/XGBulletGraphViewController.m index 94595e9..a64b37c 100644 --- a/ObjectiveC/Gauges101/Gauges101/XGBulletGraphViewController.m +++ b/ObjectiveC/Gauges101/Gauges101/XGBulletGraphViewController.m @@ -5,8 +5,10 @@ // Copyright © 2016 GrapeCity. All rights reserved. // +@import XuniGaugeDynamicKit; + #import "XGBulletGraphViewController.h" -#import + @interface XGBulletGraphViewController () @property (weak, nonatomic) IBOutlet UILabel *badDisplay; @@ -37,19 +39,9 @@ - (void)viewDidLoad { [super viewDidLoad]; - _bulletGraph.showText = XuniShowTextNone; - _bulletGraph.min = 0; - _bulletGraph.max = 100; - _bulletGraph.value = 30; _bulletGraph.loadAnimation.duration = 2; _bulletGraph.updateAnimation.duration = 0.5; - _bulletGraph.isReadOnly = false; - _bulletGraph.bad = 45; - _bulletGraph.good = 80; - _bulletGraph.target = 90; - - _bulletGraph.pointer.thickness = 0.33; - _bulletGraph.pointerColor = [UIColor blackColor]; + [self stepperChanged:nil]; } diff --git a/ObjectiveC/Gauges101/Gauges101/XGDirectionViewController.m b/ObjectiveC/Gauges101/Gauges101/XGDirectionViewController.m index eadf2ce..a1cc42c 100644 --- a/ObjectiveC/Gauges101/Gauges101/XGDirectionViewController.m +++ b/ObjectiveC/Gauges101/Gauges101/XGDirectionViewController.m @@ -5,7 +5,7 @@ // Copyright © 2016 GrapeCity. All rights reserved. // -#import +@import XuniGaugeDynamicKit; #import "XGDirectionViewController.h" @interface XGDirectionViewController () @@ -101,37 +101,11 @@ - (void)viewDidLoad { [super viewDidLoad]; _linearGauge.isReadOnly = _bulletGraph.isReadOnly = false; - - _linearGauge.backgroundColor = _bulletGraph.backgroundColor = [UIColor clearColor]; - - _linearGauge.showText = _bulletGraph.showText = XuniShowTextAll; - - _bulletGraph.backgroundColor = _linearGauge.backgroundColor = [UIColor clearColor]; - _bulletGraph.pointerColor = _linearGauge.pointerColor = [UIColor whiteColor]; - _bulletGraph.faceBorderWidth = _linearGauge.faceBorderWidth = 1; - _bulletGraph.faceBorderColor = _linearGauge.faceBorderColor = [UIColor whiteColor]; - _linearGauge.faceColor = [UIColor clearColor]; - _bulletGraph.faceColor = [UIColor whiteColor]; - _bulletGraph.valueFontColor = _linearGauge.valueFontColor = [UIColor blueColor]; - _bulletGraph.minFontColor = _linearGauge.minFontColor = [UIColor whiteColor]; - _bulletGraph.maxFontColor = _linearGauge.maxFontColor = [UIColor whiteColor]; - _bulletGraph.valueFont = _linearGauge.valueFont = [UIFont fontWithName:@"Optima" size:19]; - - _bulletGraph.thickness = 0.6; - _bulletGraph.min = 0; - _bulletGraph.max = 100; - _bulletGraph.bad = 45; - _bulletGraph.good = 80; - _bulletGraph.target = 90; - _bulletGraph.value = 80; + _bulletGraph.pointer.thickness = 0.5; _bulletGraph.loadAnimation.duration = 2; _bulletGraph.updateAnimation.duration = 0.5; - _linearGauge.thickness = 0.6; - _linearGauge.min = 0; - _linearGauge.max = 100; - _linearGauge.value = 80; _linearGauge.loadAnimation.duration = 2; _linearGauge.updateAnimation.duration = 0.5; diff --git a/ObjectiveC/Gauges101/Gauges101/XGDisplayingValuesViewController.m b/ObjectiveC/Gauges101/Gauges101/XGDisplayingValuesViewController.m index fd69ae8..97442ae 100644 --- a/ObjectiveC/Gauges101/Gauges101/XGDisplayingValuesViewController.m +++ b/ObjectiveC/Gauges101/Gauges101/XGDisplayingValuesViewController.m @@ -6,7 +6,7 @@ // #import "XGDisplayingValuesViewController.h" -#import "XuniGaugeKit/XuniGaugeKit.h" +@import XuniGaugeDynamicKit; @interface XGDisplayingValuesViewController () @property (weak, nonatomic) IBOutlet UILabel *valueDisplay; @@ -55,49 +55,26 @@ - (void)viewDidLoad { [self modeSelected:nil]; - _radialGauge.thickness = 0.6; - _radialGauge.min = _valueStepper.minimumValue; - _radialGauge.max = _valueStepper.maximumValue; - _radialGauge.value = _valueStepper.value; _radialGauge.loadAnimation.duration = 2; _radialGauge.updateAnimation.duration = 0.5; - _radialGauge.isReadOnly = false; - _radialGauge.startAngle = 90; - _radialGauge.sweepAngle = 90; - [_radialGauge.gaugeValueChanged addHandler:^(NSObject* sender, XuniEventArgs* args) + [_radialGauge.gaugeValueChanged addHandler:^(XuniEventContainer *eventContainer) { _valueStepper.value = _radialGauge.value; [self stepperValueChanged:nil]; } forObject:self]; - _linearGauge.min = _valueStepper.minimumValue; - _linearGauge.max = _valueStepper.maximumValue; - _linearGauge.value = _valueStepper.value; _linearGauge.loadAnimation.duration = 2; _linearGauge.updateAnimation.duration = 0.5; - _linearGauge.isReadOnly = false; - _linearGauge.backgroundColor = [UIColor clearColor]; - [_linearGauge.gaugeValueChanged addHandler:^(NSObject* sender, XuniEventArgs* args) + + [_linearGauge.gaugeValueChanged addHandler:^(XuniEventContainer *eventContainer) { _valueStepper.value = _linearGauge.value; [self stepperValueChanged:nil]; } forObject:self]; - - - _radialGauge.backgroundColor = _linearGauge.backgroundColor = [UIColor clearColor]; - _radialGauge.pointerColor = _linearGauge.pointerColor = [UIColor whiteColor]; - _radialGauge.faceBorderWidth = _linearGauge.faceBorderWidth = 1; - _radialGauge.faceBorderColor = _linearGauge.faceBorderColor = [UIColor whiteColor]; - _radialGauge.faceColor = _linearGauge.faceColor = [UIColor clearColor]; - _radialGauge.valueFontColor = [UIColor whiteColor]; - _linearGauge.valueFontColor = [UIColor blueColor]; - _radialGauge.minFontColor = _linearGauge.minFontColor = [UIColor whiteColor]; - _radialGauge.maxFontColor = _linearGauge.maxFontColor = [UIColor whiteColor]; - _radialGauge.valueFont = _linearGauge.valueFont = [UIFont fontWithName:@"Optima" size:19]; } diff --git a/ObjectiveC/Gauges101/Gauges101/XGExportImageViewController.m b/ObjectiveC/Gauges101/Gauges101/XGExportImageViewController.m index ab3c5ef..5f64df5 100644 --- a/ObjectiveC/Gauges101/Gauges101/XGExportImageViewController.m +++ b/ObjectiveC/Gauges101/Gauges101/XGExportImageViewController.m @@ -6,7 +6,7 @@ // #import "XGExportImageViewController.h" -#import +@import XuniGaugeDynamicKit; #define LOC(A) NSLocalizedString(A, nil) @@ -20,17 +20,9 @@ @implementation XGExportImageViewController - (void)viewDidLoad { [super viewDidLoad]; - - - _radialGauge.showText = XuniShowTextNone; - _radialGauge.thickness = 0.6; - _radialGauge.min = 0; - _radialGauge.max = 100; - _radialGauge.value = 25; + _radialGauge.loadAnimation.duration = 2; _radialGauge.updateAnimation.duration = 2.5; - _radialGauge.isReadOnly = true; - _radialGauge.showText = XuniShowTextAll; [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(animateNextStep:) userInfo:nil repeats:true]; @@ -72,6 +64,8 @@ -(void)imageSavedToPhotoAlbum:(UIImage *)image finishedSavingWithError: (NSError } UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:nil cancelButtonTitle:LOC(@"OK") otherButtonTitles:nil]; [alert show]; + _radialGauge.hidden = false; + _snapshotDisplay.hidden = true; } - (IBAction)takeSnapshot:(id)sender { diff --git a/ObjectiveC/Gauges101/Gauges101/XGGettingStartedViewController.m b/ObjectiveC/Gauges101/Gauges101/XGGettingStartedViewController.m index 6422c2f..598c1c5 100644 --- a/ObjectiveC/Gauges101/Gauges101/XGGettingStartedViewController.m +++ b/ObjectiveC/Gauges101/Gauges101/XGGettingStartedViewController.m @@ -6,7 +6,8 @@ // #import "XGGettingStartedViewController.h" -#import "XuniGaugeKit/XuniGaugeKit.h" + +@import XuniGaugeDynamicKit; @interface XGGettingStartedViewController () @property (weak, nonatomic) IBOutlet XuniRadialGauge *radialGauge; @@ -32,50 +33,32 @@ - (void)viewDidLoad { _valueDisplay.text = [NSString stringWithFormat:@"%i", (int)_valueStepper.value]; - _radialGauge.showText = XuniShowTextNone; - _radialGauge.thickness = 0.6; - _radialGauge.min = _valueStepper.minimumValue; - _radialGauge.max = _valueStepper.maximumValue; - _radialGauge.value = _valueStepper.value; _radialGauge.loadAnimation.duration = 2; _radialGauge.updateAnimation.duration = 0.5; - _radialGauge.isReadOnly = false; - _radialGauge.showText = XuniShowTextNone; + [_radialGauge.gaugeValueChanged addHandler:^(XuniEventContainer *eventContainer) { + _valueStepper.value = _radialGauge.value; + [self stepperValueChanged:nil]; + } forObject:self]; - [_radialGauge.gaugeValueChanged addHandler:^(NSObject* sender, XuniEventArgs* args) - { - _valueStepper.value = _radialGauge.value; - [self stepperValueChanged:nil]; - } - forObject:self]; - _linearGauge.showText = XuniShowTextNone; - _linearGauge.min = _valueStepper.minimumValue; - _linearGauge.max = _valueStepper.maximumValue; - _linearGauge.value = _valueStepper.value; _linearGauge.loadAnimation.duration = 2; _linearGauge.updateAnimation.duration = 0.5; - _linearGauge.isReadOnly = false; - [_linearGauge.gaugeValueChanged addHandler:^(NSObject* sender, XuniEventArgs* args) + + + [_linearGauge.gaugeValueChanged addHandler:^(XuniEventContainer *eventContainer) { _valueStepper.value = _linearGauge.value; [self stepperValueChanged:nil]; } forObject:self]; - _bulletGraph.showText = XuniShowTextNone; - _bulletGraph.min = _valueStepper.minimumValue; - _bulletGraph.max = _valueStepper.maximumValue; - _bulletGraph.value = _valueStepper.value; + _bulletGraph.loadAnimation.duration = 2; _bulletGraph.updateAnimation.duration = 0.5; - _bulletGraph.isReadOnly = false; - _bulletGraph.bad = 45; - _bulletGraph.good = 80; - _bulletGraph.target = 90; - [_bulletGraph.gaugeValueChanged addHandler:^(NSObject* sender, XuniEventArgs* args) + + [_bulletGraph.gaugeValueChanged addHandler:^(XuniEventContainer *eventContainer) { _valueStepper.value = _bulletGraph.value; [self stepperValueChanged:nil]; diff --git a/ObjectiveC/Gauges101/Gauges101/XGUsingRangesViewController.m b/ObjectiveC/Gauges101/Gauges101/XGUsingRangesViewController.m index 9930b31..613c4ad 100644 --- a/ObjectiveC/Gauges101/Gauges101/XGUsingRangesViewController.m +++ b/ObjectiveC/Gauges101/Gauges101/XGUsingRangesViewController.m @@ -6,7 +6,7 @@ // #import "XGUsingRangesViewController.h" -#import +@import XuniGaugeDynamicKit; @interface XGUsingRangesViewController () @property (weak, nonatomic) IBOutlet UIStepper *valueStepper; @@ -43,30 +43,22 @@ - (void)viewDidLoad { _valueDisplay.text = [NSString stringWithFormat:@"%i", (int)_valueStepper.value]; - _radialGauge.thickness = 0.6; - _radialGauge.min = _valueStepper.minimumValue; - _radialGauge.max = _valueStepper.maximumValue; - _radialGauge.value = _valueStepper.value; _radialGauge.loadAnimation.duration = 2; _radialGauge.updateAnimation.duration = 0.5; - _radialGauge.isReadOnly = false; - [_radialGauge.gaugeValueChanged addHandler:^(NSObject* sender, XuniEventArgs* args) + [_radialGauge.gaugeValueChanged addHandler:^(XuniEventContainer *eventContainer) { _valueStepper.value = _radialGauge.value; [self stepperValueChanged:nil]; } forObject:self]; - _linearGauge.min = _valueStepper.minimumValue; - _linearGauge.max = _valueStepper.maximumValue; - _linearGauge.value = _valueStepper.value; + _linearGauge.loadAnimation.duration = 2; _linearGauge.updateAnimation.duration = 0.5; - _linearGauge.isReadOnly = false; - _linearGauge.backgroundColor = [UIColor clearColor]; - [_linearGauge.gaugeValueChanged addHandler:^(NSObject* sender, XuniEventArgs* args) + + [_linearGauge.gaugeValueChanged addHandler:^(XuniEventContainer *eventContainer) { _valueStepper.value = _linearGauge.value; [self stepperValueChanged:nil]; @@ -74,18 +66,6 @@ - (void)viewDidLoad { forObject:self]; - _radialGauge.backgroundColor = _linearGauge.backgroundColor = [UIColor clearColor]; - _radialGauge.pointerColor = _linearGauge.pointerColor = [UIColor whiteColor]; - _radialGauge.faceBorderWidth = _linearGauge.faceBorderWidth = 1; - _radialGauge.faceBorderColor = _linearGauge.faceBorderColor = [UIColor whiteColor]; - _radialGauge.faceColor = _linearGauge.faceColor = [UIColor clearColor]; - _radialGauge.valueFontColor = [UIColor whiteColor]; - _linearGauge.valueFontColor = [UIColor blueColor]; - _radialGauge.minFontColor = _linearGauge.minFontColor = [UIColor whiteColor]; - _radialGauge.maxFontColor = _linearGauge.maxFontColor = [UIColor whiteColor]; - _radialGauge.valueFont = _linearGauge.valueFont = [UIFont fontWithName:@"Optima" size:19]; - - // Create ranges. XuniGaugeRange* lower = [[XuniGaugeRange alloc] initWithGauge:_linearGauge]; lower.min = 0; @@ -105,6 +85,7 @@ - (void)viewDidLoad { upper.color = [UIColor colorWithRed:0 green:0.635 blue:0.91 alpha:1]; upper.borderColor = [UIColor whiteColor]; upper.borderWidth = 1; + // Add ranges. [_linearGauge.ranges addObject:lower]; [_linearGauge.ranges addObject:middle]; @@ -118,19 +99,5 @@ - (void)viewDidLoad { [self rangesValueChanged:nil]; } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ @end diff --git a/ObjectiveC/Gauges101/Gauges101/ja.lproj/LaunchScreen.strings b/ObjectiveC/Gauges101/Gauges101/ja.lproj/LaunchScreen.strings index ea141d8..3687668 100644 --- a/ObjectiveC/Gauges101/Gauges101/ja.lproj/LaunchScreen.strings +++ b/ObjectiveC/Gauges101/Gauges101/ja.lproj/LaunchScreen.strings @@ -1,6 +1,6 @@ /* Class = "UILabel"; text = " Copyright (c) 2015 GrapeCity. All rights reserved."; ObjectID = "8ie-xW-0ye"; */ -"8ie-xW-0ye.text" = " Copyright (c) 2015 GrapeCity. All rights reserved."; +"8ie-xW-0ye.text" = " Copyright (c) 2016 GrapeCity. All rights reserved."; /* Class = "UILabel"; text = "Gauges101"; ObjectID = "kId-c2-rCX"; */ "kId-c2-rCX.text" = "Gauges101"; diff --git a/ObjectiveC/Gauges101/Gauges101/ja.lproj/Main.strings b/ObjectiveC/Gauges101/Gauges101/ja.lproj/Main.strings index 1ccab45..9dd8bcd 100644 --- a/ObjectiveC/Gauges101/Gauges101/ja.lproj/Main.strings +++ b/ObjectiveC/Gauges101/Gauges101/ja.lproj/Main.strings @@ -1,18 +1,18 @@ - + /* Class = "UIViewController"; title = "Displaying Values"; ObjectID = "08v-Js-otx"; */ -"08v-Js-otx.title" = "Displaying Values"; +"08v-Js-otx.title" = "値の表示"; /* Class = "UILabel"; text = "Getting Started"; ObjectID = "1ee-Cf-CWG"; */ -"1ee-Cf-CWG.text" = "Getting Started"; +"1ee-Cf-CWG.text" = "Gaugeの基本機能"; /* Class = "UILabel"; text = "Target:"; ObjectID = "3ED-w9-Ppg"; */ -"3ED-w9-Ppg.text" = "Target:"; +"3ED-w9-Ppg.text" = "目標値:"; /* Class = "UILabel"; text = "Using Ranges"; ObjectID = "7J6-GK-aNv"; */ -"7J6-GK-aNv.text" = "Using Ranges"; +"7J6-GK-aNv.text" = "範囲の使用"; /* Class = "UIViewController"; title = "Direction"; ObjectID = "8HJ-fh-1SY"; */ -"8HJ-fh-1SY.title" = "Direction"; +"8HJ-fh-1SY.title" = "ポインタの方向"; /* Class = "UINavigationItem"; title = "Gauges101"; ObjectID = "8Wf-a8-DaP"; */ "8Wf-a8-DaP.title" = "Gauges101"; @@ -21,25 +21,25 @@ "90n-xp-2bQ.text" = ">"; /* Class = "UIViewController"; title = "Using Ranges"; ObjectID = "97A-vA-PeO"; */ -"97A-vA-PeO.title" = "Using Ranges"; +"97A-vA-PeO.title" = "範囲の使用"; /* Class = "UILabel"; text = "Automatic Scaling"; ObjectID = "9Cb-yd-23P"; */ -"9Cb-yd-23P.text" = "Automatic Scaling"; +"9Cb-yd-23P.text" = "自動スケーリング"; /* Class = "UILabel"; text = ">"; ObjectID = "9NI-Dt-7eP"; */ "9NI-Dt-7eP.text" = ">"; /* Class = "UILabel"; text = "BulletGraph"; ObjectID = "9el-8a-fhh"; */ -"9el-8a-fhh.text" = "BulletGraph"; +"9el-8a-fhh.text" = "ブレットグラフ"; /* Class = "UITableViewController"; title = "Gauges101"; ObjectID = "AU1-cr-RgQ"; */ "AU1-cr-RgQ.title" = "Gauges101"; /* Class = "UILabel"; text = "Shows custom animation techniques"; ObjectID = "Alq-na-nFv"; */ -"Alq-na-nFv.text" = "Shows custom animation techniques"; +"Alq-na-nFv.text" = "カスタマイズしたアニメーション効果"; /* Class = "UIBarButtonItem"; title = "Save"; ObjectID = "FBK-za-8GA"; */ -"FBK-za-8GA.title" = "Save"; +"FBK-za-8GA.title" = "保存"; /* Class = "UILabel"; text = "25"; ObjectID = "FxO-w8-ck0"; */ "FxO-w8-ck0.text" = "25"; @@ -51,10 +51,10 @@ "HBI-Dp-7R8.text" = "25"; /* Class = "UIViewController"; title = "Getting Started"; ObjectID = "K37-G5-oNb"; */ -"K37-G5-oNb.title" = "Getting Started"; +"K37-G5-oNb.title" = "Gaugeの基本機能"; /* Class = "UILabel"; text = "Value:"; ObjectID = "L1J-cb-T1O"; */ -"L1J-cb-T1O.text" = "Value:"; +"L1J-cb-T1O.text" = "値:"; /* Class = "UILabel"; text = "25"; ObjectID = "MY9-fZ-afe"; */ "MY9-fZ-afe.text" = "25"; @@ -63,70 +63,70 @@ "OGj-UI-bB3.text" = "25"; /* Class = "UILabel"; text = "Bad:"; ObjectID = "Pub-T4-qcT"; */ -"Pub-T4-qcT.text" = "Bad:"; +"Pub-T4-qcT.text" = "不良値:"; /* Class = "UILabel"; text = "Direction"; ObjectID = "SAF-Yp-pdT"; */ -"SAF-Yp-pdT.text" = "Direction"; +"SAF-Yp-pdT.text" = "ポインタの方向"; /* Class = "UINavigationItem"; title = "Export Image"; ObjectID = "SNe-ez-n5s"; */ -"SNe-ez-n5s.title" = "Export Image"; +"SNe-ez-n5s.title" = "画像のエクスポート"; /* Class = "UIBarButtonItem"; title = "Take"; ObjectID = "SfY-tf-4K4"; */ -"SfY-tf-4K4.title" = "Take"; +"SfY-tf-4K4.title" = "画像を取得"; /* Class = "UILabel"; text = "25"; ObjectID = "V8W-Od-sjy"; */ "V8W-Od-sjy.text" = "25"; /* Class = "UILabel"; text = "Shows a radial gauge with different sweep angles"; ObjectID = "Van-sG-8er"; */ -"Van-sG-8er.text" = "Shows a radial gauge with different sweep angles"; +"Van-sG-8er.text" = "角度が異なる円形ゲージを表示"; /* Class = "UIViewController"; title = "Export Image"; ObjectID = "WDz-EX-ieM"; */ -"WDz-EX-ieM.title" = "Export Image"; +"WDz-EX-ieM.title" = "画像へのエクスポート"; /* Class = "UILabel"; text = "Displaying Values"; ObjectID = "Wge-Jg-8BX"; */ -"Wge-Jg-8BX.text" = "Displaying Values"; +"Wge-Jg-8BX.text" = "値ラベルの表示"; /* Class = "UILabel"; text = "Export Image"; ObjectID = "XMx-92-4cz"; */ -"XMx-92-4cz.text" = "Export Image"; +"XMx-92-4cz.text" = "画像へのエクスポート"; /* Class = "UILabel"; text = "Bullet Graph"; ObjectID = "XNt-pY-JQX"; */ -"XNt-pY-JQX.text" = "Bullet Graph"; +"XNt-pY-JQX.text" = "ブレットグラフ"; /* Class = "UILabel"; text = "Shows how to export an image of a gauge"; ObjectID = "XWe-Ze-WII"; */ -"XWe-Ze-WII.text" = "Shows how to export an image of a gauge"; +"XWe-Ze-WII.text" = "ゲージを画像として表示する方法"; /* Class = "UILabel"; text = "Animation"; ObjectID = "Xl9-rg-7Sy"; */ -"Xl9-rg-7Sy.text" = "Animation"; +"Xl9-rg-7Sy.text" = "アニメーション"; /* Class = "UISegmentedControl"; YMs-gj-yEm.segmentTitles[0] = "Right"; ObjectID = "YMs-gj-yEm"; */ -"YMs-gj-yEm.segmentTitles[0]" = "Right"; +"YMs-gj-yEm.segmentTitles[0]" = "右(Right)"; /* Class = "UISegmentedControl"; YMs-gj-yEm.segmentTitles[1] = "Left"; ObjectID = "YMs-gj-yEm"; */ -"YMs-gj-yEm.segmentTitles[1]" = "Left"; +"YMs-gj-yEm.segmentTitles[1]" = "左(Left)"; /* Class = "UISegmentedControl"; YMs-gj-yEm.segmentTitles[2] = "Down"; ObjectID = "YMs-gj-yEm"; */ -"YMs-gj-yEm.segmentTitles[2]" = "Down"; +"YMs-gj-yEm.segmentTitles[2]" = "下(Down)"; /* Class = "UISegmentedControl"; YMs-gj-yEm.segmentTitles[3] = "Up"; ObjectID = "YMs-gj-yEm"; */ -"YMs-gj-yEm.segmentTitles[3]" = "Up"; +"YMs-gj-yEm.segmentTitles[3]" = "上(Up)"; /* Class = "UILabel"; text = "Radial Gauge:"; ObjectID = "aG3-kp-5yy"; */ -"aG3-kp-5yy.text" = "Radial Gauge:"; +"aG3-kp-5yy.text" = "円形ゲージ"; /* Class = "UILabel"; text = ">"; ObjectID = "bGa-Ca-sVM"; */ "bGa-Ca-sVM.text" = ">"; /* Class = "UILabel"; text = "Linear Gauge"; ObjectID = "bSF-Vv-iOI"; */ -"bSF-Vv-iOI.text" = "Linear Gauge"; +"bSF-Vv-iOI.text" = "線形ゲージ"; /* Class = "UILabel"; text = "Direction:"; ObjectID = "dkS-jp-MbA"; */ -"dkS-jp-MbA.text" = "Direction:"; +"dkS-jp-MbA.text" = "方向:"; /* Class = "UILabel"; text = "Shows customized ranges behind the pointer"; ObjectID = "eFO-oh-g7u"; */ -"eFO-oh-g7u.text" = "Shows customized ranges behind the pointer"; +"eFO-oh-g7u.text" = "範囲の設定領域をポインタの背後に表示"; /* Class = "UILabel"; text = "Good:"; ObjectID = "fKb-LG-Ipi"; */ -"fKb-LG-Ipi.text" = "Good:"; +"fKb-LG-Ipi.text" = "良 値:"; /* Class = "UILabel"; text = "25"; ObjectID = "fXK-Pj-z2I"; */ "fXK-Pj-z2I.text" = "25"; @@ -135,7 +135,7 @@ "gM7-nb-edl.text" = "25"; /* Class = "UILabel"; text = "Shows a bulletgraph with good, bad and target ranges"; ObjectID = "i1t-bi-tIj"; */ -"i1t-bi-tIj.text" = "Shows a bulletgraph with good, bad and target ranges"; +"i1t-bi-tIj.text" = "「良値/不良値/目標値」の範囲を設定して表示"; /* Class = "UILabel"; text = ">"; ObjectID = "ip3-22-hTU"; */ "ip3-22-hTU.text" = ">"; @@ -144,40 +144,40 @@ "jKi-Lt-4No.title" = "Gauges101"; /* Class = "UILabel"; text = "Show ranges:"; ObjectID = "kWE-Ws-VUg"; */ -"kWE-Ws-VUg.text" = "Show ranges:"; +"kWE-Ws-VUg.text" = "範囲の表示:"; /* Class = "UIViewController"; title = "Automatic Scaling"; ObjectID = "lsw-OR-pPQ"; */ -"lsw-OR-pPQ.title" = "Automatic Scaling"; +"lsw-OR-pPQ.title" = "自動スケーリング"; /* Class = "UILabel"; text = "Sweep Angle:"; ObjectID = "ox7-O5-nN1"; */ -"ox7-O5-nN1.text" = "Sweep Angle:"; +"ox7-O5-nN1.text" = "移動角度:"; /* Class = "UILabel"; text = "Shows linear gauges at different directions"; ObjectID = "qT9-gI-3dF"; */ -"qT9-gI-3dF.text" = "Shows linear gauges at different directions"; +"qT9-gI-3dF.text" = "方向が異なる線形ゲージを表示"; /* Class = "UISegmentedControl"; qsf-cb-II0.segmentTitles[0] = "All"; ObjectID = "qsf-cb-II0"; */ -"qsf-cb-II0.segmentTitles[0]" = "All"; +"qsf-cb-II0.segmentTitles[0]" = "すべて表示"; /* Class = "UISegmentedControl"; qsf-cb-II0.segmentTitles[1] = "MinMax"; ObjectID = "qsf-cb-II0"; */ -"qsf-cb-II0.segmentTitles[1]" = "MinMax"; +"qsf-cb-II0.segmentTitles[1]" = "最小値と最大値"; /* Class = "UISegmentedControl"; qsf-cb-II0.segmentTitles[2] = "Value"; ObjectID = "qsf-cb-II0"; */ -"qsf-cb-II0.segmentTitles[2]" = "Value"; +"qsf-cb-II0.segmentTitles[2]" = "現在の値"; /* Class = "UISegmentedControl"; qsf-cb-II0.segmentTitles[3] = "None"; ObjectID = "qsf-cb-II0"; */ -"qsf-cb-II0.segmentTitles[3]" = "None"; +"qsf-cb-II0.segmentTitles[3]" = "表示なし"; /* Class = "UIViewController"; title = "BulletGraph"; ObjectID = "qxu-TE-WXN"; */ -"qxu-TE-WXN.title" = "BulletGraph"; +"qxu-TE-WXN.title" = "ブレットグラフ"; /* Class = "UILabel"; text = ">"; ObjectID = "rSe-fm-Gxe"; */ "rSe-fm-Gxe.text" = ">"; /* Class = "UILabel"; text = "Value:"; ObjectID = "rZc-UW-ghl"; */ -"rZc-UW-ghl.text" = "Value:"; +"rZc-UW-ghl.text" = "現在の値:"; /* Class = "UILabel"; text = "Start Angle:"; ObjectID = "t1k-Of-tJc"; */ -"t1k-Of-tJc.text" = "Start Angle:"; +"t1k-Of-tJc.text" = "開始角度:"; /* Class = "UILabel"; text = ">"; ObjectID = "uWs-YC-BOy"; */ "uWs-YC-BOy.text" = ">"; @@ -186,16 +186,16 @@ "v4P-ZC-9ef.text" = ">"; /* Class = "UIViewController"; title = "Animation"; ObjectID = "yDK-XO-7Ae"; */ -"yDK-XO-7Ae.title" = "Animation"; +"yDK-XO-7Ae.title" = "アニメーション"; /* Class = "UILabel"; text = "Shows simple gauge controls with interaction"; ObjectID = "yEl-vp-kjt"; */ -"yEl-vp-kjt.text" = "Shows simple gauge controls with interaction"; +"yEl-vp-kjt.text" = "インタラクション機能を持つゲージ"; /* Class = "UILabel"; text = "Shows value labels on the gauges"; ObjectID = "yWQ-mg-ImF"; */ -"yWQ-mg-ImF.text" = "Shows value labels on the gauges"; +"yWQ-mg-ImF.text" = "値ラベルをゲージに表示"; /* Class = "UILabel"; text = "Value:"; ObjectID = "z2t-xN-ZFN"; */ -"z2t-xN-ZFN.text" = "Value:"; +"z2t-xN-ZFN.text" = "現在の値:"; /* Class = "UILabel"; text = ">"; ObjectID = "zUw-ej-Vj6"; */ "zUw-ej-Vj6.text" = ">"; diff --git a/ObjectiveC/Gauges101/ja.lproj/Localizable.strings b/ObjectiveC/Gauges101/ja.lproj/Localizable.strings index e5fe2c0..49dba9d 100644 --- a/ObjectiveC/Gauges101/ja.lproj/Localizable.strings +++ b/ObjectiveC/Gauges101/ja.lproj/Localizable.strings @@ -39,4 +39,6 @@ "Success" = "成功"; "Failure" = "失敗"; "Image was saved to Camera Roll succesfully" = "画像はカメラロールに正常に保存されました。"; -"OK" = "OK"; \ No newline at end of file +"OK" = "OK"; +"Warning" = "注意"; +"You should take the snapshot before saving it to Camera Roll" = "カメラロールに保存する前に、画像を取得する必要があります"; \ No newline at end of file diff --git a/ObjectiveC/Input101/Input101.xcodeproj/project.pbxproj b/ObjectiveC/Input101/Input101.xcodeproj/project.pbxproj new file mode 100644 index 0000000..615e60a --- /dev/null +++ b/ObjectiveC/Input101/Input101.xcodeproj/project.pbxproj @@ -0,0 +1,422 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 4C03A2081D257DF50002EB08 /* XuniInputDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C0A768F1D257CB90020670C /* XuniInputDynamicKit.framework */; }; + 4C03A2091D257DF50002EB08 /* XuniInputDynamicKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4C0A768F1D257CB90020670C /* XuniInputDynamicKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4C03A20A1D257DF50002EB08 /* XuniCoreDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C0A76901D257CB90020670C /* XuniCoreDynamicKit.framework */; }; + 4C03A20B1D257DF50002EB08 /* XuniCoreDynamicKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4C0A76901D257CB90020670C /* XuniCoreDynamicKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4C03A2641D2581E70002EB08 /* XuniCalendarDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C03A2631D2581E70002EB08 /* XuniCalendarDynamicKit.framework */; }; + 4C03A2651D2581EA0002EB08 /* XuniCalendarDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C03A2631D2581E70002EB08 /* XuniCalendarDynamicKit.framework */; }; + 4C03A2661D2581EA0002EB08 /* XuniCalendarDynamicKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4C03A2631D2581E70002EB08 /* XuniCalendarDynamicKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4C0A76911D257CB90020670C /* XuniInputDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C0A768F1D257CB90020670C /* XuniInputDynamicKit.framework */; }; + 4C0A76921D257CB90020670C /* XuniCoreDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C0A76901D257CB90020670C /* XuniCoreDynamicKit.framework */; }; + 4C393DD61D266C230053B783 /* XuniCoreDesignTimeStoryboardSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C393DD41D266C230053B783 /* XuniCoreDesignTimeStoryboardSupport.m */; }; + 4C393DD71D266C230053B783 /* XuniInputDesignTimeStoryboardSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C393DD51D266C230053B783 /* XuniInputDesignTimeStoryboardSupport.m */; }; + 844FD0DF1CED8F6E0011DEA1 /* ComboBoxController.m in Sources */ = {isa = PBXBuildFile; fileRef = 844FD0DE1CED8F6E0011DEA1 /* ComboBoxController.m */; }; + 84837B031CE574FC0008468B /* License.m in Sources */ = {isa = PBXBuildFile; fileRef = 84837B021CE574FC0008468B /* License.m */; }; + 84BD21811D13E35900CCE1BF /* input_autocomplete.png in Resources */ = {isa = PBXBuildFile; fileRef = 84BD217D1D13E35900CCE1BF /* input_autocomplete.png */; }; + 84BD21821D13E35900CCE1BF /* input_combobox.png in Resources */ = {isa = PBXBuildFile; fileRef = 84BD217E1D13E35900CCE1BF /* input_combobox.png */; }; + 84BD21831D13E35900CCE1BF /* input_dropdown.png in Resources */ = {isa = PBXBuildFile; fileRef = 84BD217F1D13E35900CCE1BF /* input_dropdown.png */; }; + 84BD21841D13E35900CCE1BF /* input_mask.png in Resources */ = {isa = PBXBuildFile; fileRef = 84BD21801D13E35900CCE1BF /* input_mask.png */; }; + 84D383511CD8431C004C1DBF /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D383501CD8431C004C1DBF /* main.m */; }; + 84D383541CD8431C004C1DBF /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D383531CD8431C004C1DBF /* AppDelegate.m */; }; + 84D3835A1CD8431C004C1DBF /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84D383581CD8431C004C1DBF /* Main.storyboard */; }; + 84D3835C1CD8431C004C1DBF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 84D3835B1CD8431C004C1DBF /* Assets.xcassets */; }; + 84D3835F1CD8431C004C1DBF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84D3835D1CD8431C004C1DBF /* LaunchScreen.storyboard */; }; + 84D383731CD87859004C1DBF /* MaskedInputController.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D383721CD87859004C1DBF /* MaskedInputController.m */; }; + ED7284E21CE960E2006768D6 /* DropDownController.m in Sources */ = {isa = PBXBuildFile; fileRef = ED7284E11CE960E2006768D6 /* DropDownController.m */; }; + ED79E2D21CF2915900FB4F4B /* AutoCompleteController.m in Sources */ = {isa = PBXBuildFile; fileRef = ED79E2CF1CF2915900FB4F4B /* AutoCompleteController.m */; }; + ED79E2D31CF2915900FB4F4B /* AutoCompleteData.m in Sources */ = {isa = PBXBuildFile; fileRef = ED79E2D11CF2915900FB4F4B /* AutoCompleteData.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 4C03A20C1D257DF60002EB08 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 4C03A2661D2581EA0002EB08 /* XuniCalendarDynamicKit.framework in Embed Frameworks */, + 4C03A20B1D257DF50002EB08 /* XuniCoreDynamicKit.framework in Embed Frameworks */, + 4C03A2091D257DF50002EB08 /* XuniInputDynamicKit.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 4C03A2631D2581E70002EB08 /* XuniCalendarDynamicKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCalendarDynamicKit.framework; path = ../../../Controls/XuniCalendarDynamicKit.framework; sourceTree = ""; }; + 4C0A768F1D257CB90020670C /* XuniInputDynamicKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniInputDynamicKit.framework; path = ../../../Controls/XuniInputDynamicKit.framework; sourceTree = ""; }; + 4C0A76901D257CB90020670C /* XuniCoreDynamicKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreDynamicKit.framework; path = ../../../Controls/XuniCoreDynamicKit.framework; sourceTree = ""; }; + 4C393DD41D266C230053B783 /* XuniCoreDesignTimeStoryboardSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XuniCoreDesignTimeStoryboardSupport.m; path = ../../../Controls/XuniCoreDesignTimeStoryboardSupport.m; sourceTree = ""; }; + 4C393DD51D266C230053B783 /* XuniInputDesignTimeStoryboardSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XuniInputDesignTimeStoryboardSupport.m; path = ../../../Controls/XuniInputDesignTimeStoryboardSupport.m; sourceTree = ""; }; + 844FD0DD1CED8F6E0011DEA1 /* ComboBoxController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ComboBoxController.h; path = Samples/ComboBoxController.h; sourceTree = ""; }; + 844FD0DE1CED8F6E0011DEA1 /* ComboBoxController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ComboBoxController.m; path = Samples/ComboBoxController.m; sourceTree = ""; }; + 84837B011CE574FC0008468B /* License.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = License.h; sourceTree = ""; }; + 84837B021CE574FC0008468B /* License.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = License.m; sourceTree = ""; }; + 84BD217D1D13E35900CCE1BF /* input_autocomplete.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = input_autocomplete.png; path = Images/input_autocomplete.png; sourceTree = ""; }; + 84BD217E1D13E35900CCE1BF /* input_combobox.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = input_combobox.png; path = Images/input_combobox.png; sourceTree = ""; }; + 84BD217F1D13E35900CCE1BF /* input_dropdown.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = input_dropdown.png; path = Images/input_dropdown.png; sourceTree = ""; }; + 84BD21801D13E35900CCE1BF /* input_mask.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = input_mask.png; path = Images/input_mask.png; sourceTree = ""; }; + 84D3834C1CD8431C004C1DBF /* Input101.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Input101.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 84D383501CD8431C004C1DBF /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 84D383521CD8431C004C1DBF /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 84D383531CD8431C004C1DBF /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 84D383591CD8431C004C1DBF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 84D3835B1CD8431C004C1DBF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 84D3835E1CD8431C004C1DBF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 84D383601CD8431C004C1DBF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 84D383711CD87859004C1DBF /* MaskedInputController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MaskedInputController.h; path = Samples/MaskedInputController.h; sourceTree = ""; }; + 84D383721CD87859004C1DBF /* MaskedInputController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MaskedInputController.m; path = Samples/MaskedInputController.m; sourceTree = ""; }; + ED7284E01CE960E2006768D6 /* DropDownController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DropDownController.h; path = Samples/DropDownController.h; sourceTree = ""; }; + ED7284E11CE960E2006768D6 /* DropDownController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DropDownController.m; path = Samples/DropDownController.m; sourceTree = ""; }; + ED79E2CE1CF2915900FB4F4B /* AutoCompleteController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AutoCompleteController.h; path = Samples/AutoCompleteController.h; sourceTree = ""; }; + ED79E2CF1CF2915900FB4F4B /* AutoCompleteController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AutoCompleteController.m; path = Samples/AutoCompleteController.m; sourceTree = ""; }; + ED79E2D01CF2915900FB4F4B /* AutoCompleteData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AutoCompleteData.h; path = Samples/AutoCompleteData.h; sourceTree = ""; }; + ED79E2D11CF2915900FB4F4B /* AutoCompleteData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AutoCompleteData.m; path = Samples/AutoCompleteData.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 84D383491CD8431C004C1DBF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4C03A2651D2581EA0002EB08 /* XuniCalendarDynamicKit.framework in Frameworks */, + 4C03A2641D2581E70002EB08 /* XuniCalendarDynamicKit.framework in Frameworks */, + 4C03A20A1D257DF50002EB08 /* XuniCoreDynamicKit.framework in Frameworks */, + 4C0A76911D257CB90020670C /* XuniInputDynamicKit.framework in Frameworks */, + 4C0A76921D257CB90020670C /* XuniCoreDynamicKit.framework in Frameworks */, + 4C03A2081D257DF50002EB08 /* XuniInputDynamicKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 84D383431CD8431C004C1DBF = { + isa = PBXGroup; + children = ( + 4C393DD41D266C230053B783 /* XuniCoreDesignTimeStoryboardSupport.m */, + 4C393DD51D266C230053B783 /* XuniInputDesignTimeStoryboardSupport.m */, + 4C03A2631D2581E70002EB08 /* XuniCalendarDynamicKit.framework */, + 4C0A768F1D257CB90020670C /* XuniInputDynamicKit.framework */, + 4C0A76901D257CB90020670C /* XuniCoreDynamicKit.framework */, + 84D3834E1CD8431C004C1DBF /* Input101 */, + 84D3834D1CD8431C004C1DBF /* Products */, + ); + sourceTree = ""; + }; + 84D3834D1CD8431C004C1DBF /* Products */ = { + isa = PBXGroup; + children = ( + 84D3834C1CD8431C004C1DBF /* Input101.app */, + ); + name = Products; + sourceTree = ""; + }; + 84D3834E1CD8431C004C1DBF /* Input101 */ = { + isa = PBXGroup; + children = ( + 84D383521CD8431C004C1DBF /* AppDelegate.h */, + 84D383531CD8431C004C1DBF /* AppDelegate.m */, + 84D3835B1CD8431C004C1DBF /* Assets.xcassets */, + 84D3836E1CD876F7004C1DBF /* Images */, + 84D383601CD8431C004C1DBF /* Info.plist */, + 84D3835D1CD8431C004C1DBF /* LaunchScreen.storyboard */, + 84837B011CE574FC0008468B /* License.h */, + 84837B021CE574FC0008468B /* License.m */, + 84D383581CD8431C004C1DBF /* Main.storyboard */, + 84D3836D1CD876F1004C1DBF /* Samples */, + 84D3834F1CD8431C004C1DBF /* Supporting Files */, + ); + path = Input101; + sourceTree = ""; + }; + 84D3834F1CD8431C004C1DBF /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 84D383501CD8431C004C1DBF /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 84D3836D1CD876F1004C1DBF /* Samples */ = { + isa = PBXGroup; + children = ( + ED79E2CE1CF2915900FB4F4B /* AutoCompleteController.h */, + ED79E2CF1CF2915900FB4F4B /* AutoCompleteController.m */, + ED79E2D01CF2915900FB4F4B /* AutoCompleteData.h */, + ED79E2D11CF2915900FB4F4B /* AutoCompleteData.m */, + 844FD0DD1CED8F6E0011DEA1 /* ComboBoxController.h */, + 844FD0DE1CED8F6E0011DEA1 /* ComboBoxController.m */, + ED7284E01CE960E2006768D6 /* DropDownController.h */, + ED7284E11CE960E2006768D6 /* DropDownController.m */, + 84D383711CD87859004C1DBF /* MaskedInputController.h */, + 84D383721CD87859004C1DBF /* MaskedInputController.m */, + ); + name = Samples; + sourceTree = ""; + }; + 84D3836E1CD876F7004C1DBF /* Images */ = { + isa = PBXGroup; + children = ( + 84BD217D1D13E35900CCE1BF /* input_autocomplete.png */, + 84BD217E1D13E35900CCE1BF /* input_combobox.png */, + 84BD217F1D13E35900CCE1BF /* input_dropdown.png */, + 84BD21801D13E35900CCE1BF /* input_mask.png */, + ); + name = Images; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 84D3834B1CD8431C004C1DBF /* Input101 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 84D383631CD8431C004C1DBF /* Build configuration list for PBXNativeTarget "Input101" */; + buildPhases = ( + 84D383481CD8431C004C1DBF /* Sources */, + 84D383491CD8431C004C1DBF /* Frameworks */, + 84D3834A1CD8431C004C1DBF /* Resources */, + 4C03A20C1D257DF60002EB08 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Input101; + productName = Input101; + productReference = 84D3834C1CD8431C004C1DBF /* Input101.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 84D383441CD8431C004C1DBF /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0720; + ORGANIZATIONNAME = ComponentOne; + TargetAttributes = { + 84D3834B1CD8431C004C1DBF = { + CreatedOnToolsVersion = 7.2; + }; + }; + }; + buildConfigurationList = 84D383471CD8431C004C1DBF /* Build configuration list for PBXProject "Input101" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 84D383431CD8431C004C1DBF; + productRefGroup = 84D3834D1CD8431C004C1DBF /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 84D3834B1CD8431C004C1DBF /* Input101 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 84D3834A1CD8431C004C1DBF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84BD21811D13E35900CCE1BF /* input_autocomplete.png in Resources */, + 84D3835F1CD8431C004C1DBF /* LaunchScreen.storyboard in Resources */, + 84BD21831D13E35900CCE1BF /* input_dropdown.png in Resources */, + 84D3835C1CD8431C004C1DBF /* Assets.xcassets in Resources */, + 84BD21841D13E35900CCE1BF /* input_mask.png in Resources */, + 84BD21821D13E35900CCE1BF /* input_combobox.png in Resources */, + 84D3835A1CD8431C004C1DBF /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 84D383481CD8431C004C1DBF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84D383541CD8431C004C1DBF /* AppDelegate.m in Sources */, + 4C393DD61D266C230053B783 /* XuniCoreDesignTimeStoryboardSupport.m in Sources */, + ED79E2D31CF2915900FB4F4B /* AutoCompleteData.m in Sources */, + 84D383511CD8431C004C1DBF /* main.m in Sources */, + 844FD0DF1CED8F6E0011DEA1 /* ComboBoxController.m in Sources */, + ED7284E21CE960E2006768D6 /* DropDownController.m in Sources */, + 4C393DD71D266C230053B783 /* XuniInputDesignTimeStoryboardSupport.m in Sources */, + 84D383731CD87859004C1DBF /* MaskedInputController.m in Sources */, + 84837B031CE574FC0008468B /* License.m in Sources */, + ED79E2D21CF2915900FB4F4B /* AutoCompleteController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 84D383581CD8431C004C1DBF /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 84D383591CD8431C004C1DBF /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 84D3835D1CD8431C004C1DBF /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 84D3835E1CD8431C004C1DBF /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 84D383611CD8431C004C1DBF /* 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 = 8.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 84D383621CD8431C004C1DBF /* 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 = 8.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 84D383641CD8431C004C1DBF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + FRAMEWORK_SEARCH_PATHS = ../../../Controls; + INFOPLIST_FILE = Input101/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = GrapeCity.Input101; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 84D383651CD8431C004C1DBF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + FRAMEWORK_SEARCH_PATHS = ../../../Controls; + INFOPLIST_FILE = Input101/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = GrapeCity.Input101; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 84D383471CD8431C004C1DBF /* Build configuration list for PBXProject "Input101" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84D383611CD8431C004C1DBF /* Debug */, + 84D383621CD8431C004C1DBF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 84D383631CD8431C004C1DBF /* Build configuration list for PBXNativeTarget "Input101" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84D383641CD8431C004C1DBF /* Debug */, + 84D383651CD8431C004C1DBF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 84D383441CD8431C004C1DBF /* Project object */; +} diff --git a/ObjectiveC/Input101/Input101.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ObjectiveC/Input101/Input101.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1fd20e1 --- /dev/null +++ b/ObjectiveC/Input101/Input101.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ObjectiveC/Input101/Input101/AppDelegate.h b/ObjectiveC/Input101/Input101/AppDelegate.h new file mode 100644 index 0000000..74ac888 --- /dev/null +++ b/ObjectiveC/Input101/Input101/AppDelegate.h @@ -0,0 +1,16 @@ +// +// AppDelegate.h +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +#import + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + + +@end + diff --git a/ObjectiveC/Input101/Input101/AppDelegate.m b/ObjectiveC/Input101/Input101/AppDelegate.m new file mode 100644 index 0000000..13d16a5 --- /dev/null +++ b/ObjectiveC/Input101/Input101/AppDelegate.m @@ -0,0 +1,53 @@ +// +// AppDelegate.m +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +@import XuniCoreDynamicKit; +@import XuniInputDynamicKit; + +#import "AppDelegate.h" +#import "License.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + // Override point for customization after application launch. + [XuniLicenseManager setKey:key]; + [XuniComboBox class]; + [XuniMaskedTextField class]; + [XuniDropDown class]; + [XuniAutoComplete class]; + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. +} + +- (void)applicationDidEnterBackground:(UIApplication *)application { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + +- (void)applicationWillEnterForeground:(UIApplication *)application { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. +} + +- (void)applicationDidBecomeActive:(UIApplication *)application { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. +} + +- (void)applicationWillTerminate:(UIApplication *)application { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + +@end diff --git a/ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Contents.json b/ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..c4071ec --- /dev/null +++ b/ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,81 @@ +{ + "images" : [ + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-Small@2x-1.png", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-Small-40@2x-1.png", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@2x.png", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small@2x-1-1.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-Small-40.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-Small-40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76@2x.png", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png b/ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6092bc74330d477f4b2ab16215d0600a4749b164 GIT binary patch literal 2715 zcmb7``9BkmAIF!FGv&zb<37fUh#bX++;b-68s7WV!p2u~Tzu_} zcsnWAYM+nF$9**Q$}W<>CR=4g4|4#M%elHTuuP!XeH+PLu%aE=IGgzO@gUY?=}9ye z5}S2X`pP8}(#5iJ(+ppQXju!+aubR`yRlH(Nf4K|x%ZE6xkvS{@?ef=+Bfac9~wUW znn6D%Eq0WqT{>h=Hbtb|2RNRy$9VrsX92a-{)azWNrL~9pSka}|6#qd?|+O1t1kJx zCEU&18-3w+#q~roBJ#TWM&SMQo72J~&$9DS$>x*7BDvX->%$~)l%nv@tYZIlr^d$o zY8CxXV(}{!?q)%=ZsVpafkfMOcA*6LoItP5K@};&--iO{k75dJk2Qjh^~0j(X6)e_ zWxeV%5ssd@7nA~&vaXdV@le6&MZJ<~^x|Q_$xskqd2}OD$vGHtdn=2WT_+Fmw8dnP zD>Yi0c>xYRTo`7OzY-As4{1C)rbH^s_qqMuhKaUd z;Y4^1#ixdH*LvY;p@3od2TN-Ok(%0yawd(#wJ>6&Hr?*a==}l_9n;^tT(GSCbNK4= zh8yeq{2%cL?2}d-&0;#Dx86y#3x5{DrpLZj&{6|_R5Plq$$70CMLm)E88HR84pB!@ z(-$R>%Vz_AYoP9A#h+`Nj|y=y|Lg0{xEu|_phw?W&2iJ69cgQrzP@)+gxoWc0-R$8 zRUJ&EyqccGG2>pSoZT8!_KS+_rrA0wC$uiGxQX+>qo=C?ici<9F3LJr6|4R=<8mig zdVY2>U*1=_m!!L~sYp#J_Gx8*lLRoA=n3n($&;+VZBOe0+R*H+x_)2Og~s!Xeg*tucTt$T~HaOI5^THq#E}4Z<-l) zVEb-oLlU%qy^Fm~u6g4vdaWvSRBXaO`0R?d6PXavr>xZC-62cUrd`y6`~%<$PE6+8 z4k10c(|1(D`IM^OuX`^QROr4oYh0hJpO@74y)CJweBKqtbY`tKY-9bKpLMFA|L!Pl zY0DBMmsA##Mr5)t;jkS3JD570)-Tr6Zg)EposZb{mQwPqYd34rgn}wUvRHS^D7ul* zPmgR|F(mHICKM|#@dn)PYGhL#i7q5pVewZ1BZBwdz_R~6N`m6-gY6d1x>l!JHV-@? zSpaZc{EZMTPBWJ!Qv~i4=Z2nQIc~~O|9I6ny({+Mcm+9Z#xPPMRy{2>((0%NAT$W;c00- z9;svZj+AMj>^VZEm}d;G8>3gBOCNE(BsS=yRm!P6hIbLz&~&oKs;?-O*_JYZ&?+h+ zK91%vlJhhb_#0QL#!=n9ThVuQwdBg10gEGnsBKa%O5OMSI0@$O`4k(jeikNmL^O+$Dfaz4o()I(&L)VD6ZHF;G1&LSG7Xa z<*acxewzLOcJ#v)CXFY}=?L|6#O)LqKGe}RstRAYKKZS=xq&YKQt1Pc!Jw*(cK>*% zMSd2&UUTw3_-u2xda8W{jG;EWUu<-b@nnDVsLM>FH6~d$nz<)xs#DrWytnwGw4JLK zvX`cq9*-apn4#=HJi|2ja@j78#k1F(T_9BG%|s&BkX&tt&udz=N{8k^8om)1R+e<-XeU z;hofqHhh4%Xu0O^2KaIh-=w2!&R{_QIu%=y%PRJQAhPIW1ZBB54TyhcOlI*g_V) zo+5WPb{U`((lh^ta)b)Px5(p|$02RhJ44mjq!eluhK)r9F!8yZ*5~9qg6)=^5X^mzO1yE}k6B);b2O zJDOfb-H_E2CdCCf>m{nnLyVSYwV<)eN2{5RXN8?KO((;p=uNsiLHkIl5TVQga9OsK zL{FO7#ohyA&ZB?_zf+jSH{&za7_nxfgJI-qsnxU?ck>|9p{Q-R>H+THyI#R(XmZ)} zc~mDgg=q+luP+O1Z8XdrM4xflP+`%E1FEcD)bkf|bgqDUUk?>+-%J>(woe7nv4TtnyHp67x5$b0cv2sa>GkmQnH*pO= zQupLy&9B{eMTQeB1vwtz{B(1Pw&0{_+nNvb+jz8~^O4xqOlEw})l{Uuhbpey{(S`Y zwjb8j{qPf`qwAB0AVo&UD?Nu!_Tsyii)6vg3%A~=IH(OA-g>{lV~zQdW*rSYm)R?8 zNi1+w8Aes|c}6X{!eALF(+06bU3WVYrj*c!OwLmfdL?MiQqynz`PZnzM9jdsYH|Of zGq7}&8H-xIM|~`rL*v4&Zsgo*Tvzs+U-0D4<@>yqN-b`A*R-LM9VvR6S2R_RahRET1k{Ih z05U~`no)kIOfIs;FS>LxuNTzaoRvwGaV3c;R2WRSYS@L9m`J#uBa yW=PhPVE&T;oBuqDBzWduQ$5V|l+Q80^I>PM5R zv_kVLW?|BVB$9}Yl>TyuH$6G`dSYuAlQ<|Y{AZ9sWMiL2cx(2 zbh1O{p#ucymuEy zm2SPvgsXKZZ`1k1DM*C{?i@L*i~uK%p1ohg?L;+Yn@;SbadqcWwE);)L<$+YH-8vj zE)!XjeC_;U-F~uHBe!_?VgW_P5R?Ump1sHKg|sUdEND8>PX8-g4hcmCv&-I-=_s7XjXlRke)=t8o2~xzT{E;0coM=@CgBGk2=>+=-z3M`$Yj!V9`uKk zLJHmI;>lzQn5l_KNRxc_*P0+?(IBl2 zEvczXXhO9nPDWw9+Xqj{BaL!nDl?EcB!JsYMO&w;l!s<36-51x>4=FFvDS9%LLl4& zHw_*|)}j!yGy)`umlEVqAk*~Nu+K5eLv*q{0RS`Ehd=K<&P_vzYIblTs${vQ8C~|U zQ~3jSnL7$~lEf5~%^sKbnvUI4ZJ?nMJUM+g5lZG{&aC`TzGCB~6*GxiL^%aEzpncE zcV2(cn+pP9fouFuKLd%MjG{mBt$z305)X-Qjx~-A=RRJvYPsnwZtVHeW%UAaGOSCo zb~De=5`kpQE_M(nLD+EFia}b_5H1L?tI4HHkf0|hmE78bs%ww+_K_$*=XSxUqKJ5@h+s7S=N9{>4Q~K9X21$rqHY%2KfX2Br2jHbv|KJgWFc zh#Z_5p5E9@*LH<7tOPat)xND6<9>|BLf}t&?m2igBV9}9A7a=E8-S4_G zL%=CPA`t!nX_RAnu8m_9PD`bi{#S$ZSL9yM6S*><{&=`_Xp063ytN&>)owvqrK@0W zrNuElH1ikln(RWPqHiY5*!I@Jlf^=vo6hB^f;r>h?vfD(nM%8!6}8sH%jAqAs0^IF zWDq-{wp2=xfw%nk7*+1Dq!ve{3>8$OZpv_%be|>6<5-FxX43qsWtRO4N(oUlrS8iQ z)CQkwqvD~ZqsXP7EJ$+)vS-32ER(3~^QBF39_n>;hJ+gAoasNbB^Po^3^Fi9my0pY zJl;Cm>Z4?QE@td=OLR*H(){HpuJnpu(VR1E1d|Ry)x13}mZ%%=Pi02eQ%K~wgtJ9i z<-ETJMz|jhjPPg*xAEL3W>mBeYjQmvozOl(a@PQj<<}m$UVMKmM;~eb{?+$`7p~7v z#^X|J*4kXbI=xvHc#{y>_(TV*Yy(v5O}fZ2Q^%vBIr(Q+IuxuI(jhrb8#dC9SpXS`cs2o{ zOBv28UKX{)QvwO!B6kbwcP}&w&PY-)`ON>pCS?eTiv(i8UqAbngTEOJTw+q-T?W~Z z^XsaUW6$h_kd+6vONBzp95b9v%OWM=>Jy2R&*0_%fzX5WAU#MA(u4FMJxCAIgY+Oh hNDtD3OmqDszyKg|L&2trb*!Rrj2c^ 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 X<+5p>HO`ynO7uwQu{KJ}F6w^(|Kmh? literal 0 HcmV?d00001 diff --git a/ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png b/ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png new file mode 100644 index 0000000000000000000000000000000000000000..abee98b110fe76e165ff87afcb187a20cf9d5b2b GIT binary patch literal 1071 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 literal 0 HcmV?d00001 diff --git a/ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png b/ObjectiveC/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..96950d00243a24c25fbaffb47fa53a4be1cc30f1 GIT binary patch literal 1491 zcmV;^1uXiBP)*RqJY`8>`S{VZkD#U5GBE11{Q)6%-T~$*!dZQ}BmM zY0`)UoFN$02@P#RT55y%%zcxOF~hO&yQZDHcZm82jE2cVVKG&UVpBH+1<{;nn>3_w;N^bvyfyZ+;@fAb-$u`AOU;%Q6^G#6^(Lj^a(upmiQAAVdt zvAr>aVggJ)Z<{{(g*@Sf(Gy#`Glp1L7bi;J_8*r6pj4kRk;IK)R^HUns{ZYnIiG52 z4-G!L)A!e3ckhA8wTL=*%QxpPT*YglIiQ%bTPl2#LOslE%k3qAe*5Y&Z(lq=!pt9D zd!Ge;Si$%6d!M3m7Gzobf7i$%A_1lFELN0VT3fp`0?t(Eb9QU2xO3!?ftFXuH5CB( z&-lK#+0yj^4E@vaS^1Bzxq;4(>>D?$!B*Dq%;&-==2B1I6aXMa9=?&T5L_1>#g<`3 z3_c0O>f5MT7^@)(yHwgf&=(fP%t3#){qA$enCbb(ijy$pPZJL(4r6F$wy#n?b7n(C zYK&l3m);}j#>fF{;-E&rbQsF1m>_ZpYiwakVe2rd8Y9w)L-Gg1GNcc&1S94Ypc<}; zmBlR(0UG8l!OWnxT#+wjmTm5Rns_J1BPbnOc%-cvp8j$06vOAv9A$|6LJrYMXZN`w zW@`A$M_(Hk)c{wKfhkoVv0Ur^=i!~@@bZASkN{=W()8?OJK8%AA3#-?_q`J#Bi2h1nH}os}nd9Vh}x6 zT?oiSJPqyR`%9u50Q9O z<%DHK7O}#>+@n5l6(Z3Uk20`i6JrR0<>82$rrN0<^qzsJkFI!B->6iunqf6*9gD7M zZ1K9m)j2t=;!*XeX-1!P%SzXhxYzX?M_;NUZD*l+<;??Y^(~=8sYq}+>IjeD&Qa_#b zU-syz6L@g1j$Ofx$zS(*r3V@kug*5rC2wFg!=Kf~uCOXc{JS@hfl-WGN7U535)H>$ zs?KnImsV&9gHA;jsfszKxeO3}YN$_%V_JD4x93JB9TekRQ#A%bMj1)W{a&LR+)t<_ tx917m1a1O1ft$ch;3ja_Mf+QT0RY3kiZJ>8(N6#X002ovPDHLkV1mMM+E@Sp literal 0 HcmV?d00001 diff --git a/ObjectiveC/Input101/Input101/Assets.xcassets/Australia.imageset/Australia.png b/ObjectiveC/Input101/Input101/Assets.xcassets/Australia.imageset/Australia.png new file mode 100644 index 0000000000000000000000000000000000000000..8937404587a4abb530151acddaae3da4583b7068 GIT binary patch literal 2623 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 Bs9pd7 literal 0 HcmV?d00001 diff --git a/ObjectiveC/Input101/Input101/Assets.xcassets/Brazil.imageset/Brazil.png b/ObjectiveC/Input101/Input101/Assets.xcassets/Brazil.imageset/Brazil.png new file mode 100644 index 0000000000000000000000000000000000000000..47a007f2dfe23c5a3296447c0b5a136b3f81fe3b GIT binary patch literal 2549 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 literal 0 HcmV?d00001 diff --git a/ObjectiveC/Input101/Input101/Assets.xcassets/France.imageset/Contents.json b/ObjectiveC/Input101/Input101/Assets.xcassets/France.imageset/Contents.json new file mode 100644 index 0000000..d011da7 --- /dev/null +++ b/ObjectiveC/Input101/Input101/Assets.xcassets/France.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "France.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ObjectiveC/Input101/Input101/Assets.xcassets/France.imageset/France.png b/ObjectiveC/Input101/Input101/Assets.xcassets/France.imageset/France.png new file mode 100644 index 0000000000000000000000000000000000000000..12318d45d0d0c596176975d6a50a8eadb3569839 GIT binary patch literal 941 zcmV;e15*5nP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZEW@eWZGh@glW8h^6U4(tQ@P>eo3ed&&mf67lzPP_vS&(GgocAf0QhdvB>pb@NKi|J`z)Mx- z?Ci&0R`bO#KX)2;`|%T>{+&H{z`iPkpj=m&zRfYOb@k68;MGXQ7&DRZ~&`>p&)m2Cqu31Qt8eD7>Dp0MR zxSqr)ia=TF)+J;`b@xSRSKnlL;jlYmqzJ7_96%M6qNpg+$+lIBqT86L7T4&iF924S z9at;Clsym!wF7(q9{^H1)4sJORCF3+L3ul3zXdR#7c3U#))~-+fBK-&2n&I~N){1- z;eEjSuzd;n4h)PuguvdxURFDC)guGmKP=OSB-`}691BV@Ewm1!S_ANYAQH+mEas1v zf!VBNKJOt4E&Tmef2?lufd~X!1~8u$cwf~Cq{+l93C3buHWPq4`+y=4l02Yl+)Ng| zZ05}SZey}6Wgt+Np%(z!B@+YU+%f}~m$$tDNOz+vCf*5k)gJ(Ne6;KXsy*Ewdi1`O z-EXE{mh47D2=sP?tK)Sob>a{LSteAKwv0Wt)me%_vH|-$FfT4gt0e|%fi;WqttoB8 zn>nn@8Du4qg-Ay)GU_a$6hNfI)E?ANb2<{)_--1y1P?VVL$ecu!T4=mYU+eOFtgx%usT9OY>c+86O{EA_p8 zfvSl@lZ%T&Rmt;cY=Yf*EZn3g@3rlJdK5xh>AB14v~o_#b4i@ozVj;9pA$C{YIP{W zV2TL33SekOqs<8e42pq9z5|v}bm9ZZrV-6}{A}yCWaERi#=B?x=+whx@}<)RS65eS z8E}1bv(|A!fY-n&@M>Uw{15P1s2?wlV?Ctefr;#%)b9Z70PFztTD}ed#HR|?5V(hK P00000NkvXXu0mjf1!1B3 literal 0 HcmV?d00001 diff --git a/ObjectiveC/Input101/Input101/Assets.xcassets/Germany.imageset/Contents.json b/ObjectiveC/Input101/Input101/Assets.xcassets/Germany.imageset/Contents.json new file mode 100644 index 0000000..c06bb39 --- /dev/null +++ b/ObjectiveC/Input101/Input101/Assets.xcassets/Germany.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Germany.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ObjectiveC/Input101/Input101/Assets.xcassets/Germany.imageset/Germany.png b/ObjectiveC/Input101/Input101/Assets.xcassets/Germany.imageset/Germany.png new file mode 100644 index 0000000000000000000000000000000000000000..77e9338bab888a9b1816f49547f1507e01a5876d GIT binary patch literal 808 zcmV+@1K0eCP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;u1Q2eRCwC#nZ0h?Fc8Oor!S{~gQRhbq8&N}=+GfUpCB)gckLS#$Wml4`V?(a z2M%J1=J7gEwxu|Z?Q{r;`UXiy9Yy|mA3UDK%t)Cs5~n?YJ%IlmKp`SIFaYvYCVh5x zRE$Pn^3&7PMu68B7Z*1vuKw)m+lK-;3L$WQexB6iFE1~-`hEYZ00tohRF&~~3_y2t z6A=)=VtXdS>ekl^v}9(8WQ(@QOHXv!L;7-=z@vL>lruAqkB|i`IOlNAB?G|w4gfPt4uF|affN9$O4Bq?1L*j{lWpsp*UD`xKc}W{ zP*pya3>E;U(Tt zYd9dE8rGzd+er=@4){2aLU_gQYiyc^34wri!>CuneT_BEG91{NOhGn8sK-Lf!{_x` z$ofdvxr>4M&Q5GWvB_;RiJZ9_BwGT&E0#zau~1Z5b^rt=+@y6R$lr|mK42lO`jBZa z8&$B76oAl+LaIoXW9@lhmuR*UDIR;bDeCN~d?^ZS1wc$ochuvWXP%hUwsM=O3t-Oh ztU9S}2;jTqr`wOw)4==hN?FJ=S3|aFmw&W)Sz%{h;WHE`C&R)*h?7sKQoT46A0CdX z5T?)brk9&Op$+@lf0QfVWkRYi5?|?JlZDN!E1^f`=@1?``o)R^{ mMD~B`_W&~Qe^>4R0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=0!c(cRCwC#nN4gPRS?I2FT4I~?bwMECnTsesZytqAaVdiDK}Dq#09D91tE|S zoRH{|0|zc}=D>yCkXm{{LZu=IA&}AnDM%3_CEzw~lBNkNZIaq1lW0*Uo?E|K7~JRU(3)r3If$6F?Kd{~ds-lrn%2VE9Gp;o-QMOpX}+{ryD~ zXw4maWz~;g|L~C$Jth!G3xU4JeWkoL_dREq*CQqn5;US6q>wK+S2{OUaW9*mYl(O? zu6iF8Zbi`KAYi(68nok?zQ9U43q%~qDzRj{J|e> zK{*6+0cZzo%PoEo+uC4@S%w6T1x~2}3aG!RS6ib)%`tVvDFH$dRM`R=u?xrsfbDL9 zB4~$!0HF#BmE7V7F-o8vrY#DlyM{Gl7ky;`5lt`}Y^kt7agznA?a7Vq=l3F8@Et8C zXou2TNh=^NA{kFVkfWKsl4at@MTQ1C8QR-PC}?^PSt&K>c{G}tTj8zu#>re-W@v9G zH}XZ^`QSUoPS5@$cJtH%=jT^Ae(D#Fy!05Ng{9x~+}E*_NF>OK&!%aMhdFd`aC=(7 zb~NuFpX7}fA7$}sjxWBw#FrEEjGdWd`rN`ojYl34KuK-jn!O% z2lsS%55SAVtw#pC82@2`aLC}{bc)_ojASB0MIy9?Cyz^Ohh<#>Sq$MF!5N}QveD`+qRuC3~zG! zvD26M`14;m^z1%*QZe%RBA<@W(2DtDVsUeIyeRZ^I$mCJ+b=ngHpeFQW}8*;e&bKs68s)k>omfRCzVrM1E=sgZV6 zj13qjhPV}GdwbN>B8VurztmB#(X}oO)XNsz+&Lw#gaisJG2-Ef?tl>1?P53 zd2?l@v_musgF7ZrbvRM&^r2o|qiLh6^X|Jjrz*G6)wMM{tlbV$lPj_XuE;&|Pqr{# zp|!4XWLl#Xz7eHdojvu$|N1H@>%0L#;U5zyR22X|;*e5z0GLr|x&06gMtnylGaNz# zA`{u}^eqs;EC=ZkXy O0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ zUfQFg*y`1T2T{-}6e{AuUPX$Ccrn^inzAbXA(Ud%(i*9fm}JfFY-ZlChn;OUYeX|M z>@qk%_%UxDZ{GWTXMXSd`_1nu5h2QwAmS1OhyncH0T@cDBwzx`s2Dvu+H3Upmy*R| z(KdihA~F}nw|{s`&tL-RjjH=x{9`$r@Z2YovH+==g<=3fX*Bd1wZ^&mD=RZMSh+R> z3Q{|EkSabv^1iL8WO!_y1{Ep*=hiIM$#1BC{}ayaEVwQJ)ue&3eGqeWn9QMr7=v3w zS#MVgQvth0WIE_%%jZ64;iHd1Yp+MOjgW>W4SJt{j@;qL0|QV>4Fv`uS~K_h8`LkA zTc`fFr$|3mqW{%bAmM)-ntAh~z%I1#_Iucq=Qqp;_T+gM@A-gD$Bz15yI!g5KmhEi zGJk#Y>3?|R>&xQVvzYtFF&}xj3oPWi{Q2fPNVOJ#ja?SrJ?{Dg{2gL1hY$;e+Qq3Z0jSkNh=nfoD_1+e2dWn? zq30Gu2uFf*?Rw{Pq14VIqE`?t0acSM^aTUpr?{0FFL}XL2UM5z$neI$n`g7pyipsZ zvCM%9k5ObT^Rx%!_ILBQaf4+kI!)h+7ZGthS7jD^k^n zN~J(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ@a7jc#RCwC#ntO0mR~^ScXZP+Sn@s}?B>}_-gccB^VC7*^s|>Z&nL1T#%M_eS zfVN;OC8eWzL3MdIQ3bZAKT9CF>hmKgZ2u3I|mOu&xF|n8j1W2-X@7~?}IR3F| zAefNsCOk6ZZ|2PGIwS4{h!jA*u zX1v$-A`qy#=+16r(0k8s-Z2MIx?2hba61T^&K{@E1y(&*_}0M<8(+Q$aCR2}w_(~C zrp?#Fm7J*+BTt-9-@P(_=PT<9el_%FNUL^>*tBd+%jS!b|L_C7j6qr*6?G}!sZa+T zT(f@L{86Judv0m~!>}+63!(;Tkp{l69%YhNj=x?_DX;GN^Sd9&KD0W&Xwr?Uj}AmY zVpjlz&1WX&#w2`LSV%VmIW=i@* zgG>vRF(>>Fde=AjOaAF!a9$2MoVRxK^y`sU9WG)_Gd2vf#cRW`2%9!TB6ZByN_Zf0 z0_~#gf3PC({QRZc_CB*>?U-x1~umn zjKl51D@|&JkKZW+_=9r*E+2YEFYV=2XYI1=?0FSH!rfzQ_Zmk8EQI0&%S37#I0WuH zM{~=vpWq&I2RNNrVI9qco`%XaXC=AXK|a-Z!CO|5oOS%-Ck`!KlK*&Dr&R}vIJS{t zn0UsG0mH=ED?rly-@y0CLpb~OC3)IpQszE^Yj6e_Cd&A`2!*0#1gpqV50a%HL9f+% zzgyWm|IzH14y?#qH@>TO^L7Dj+s3wSq;288`!1wqp=5p%t}Z z*?{Ys74d}WTT206srfzFHYtl2;2N0;mK7`BOBDt}VEp|E!R4!4I*J;Xnky`9;E^TRg)E1n{57vQT?i%J2u*Sr~9Ri6+4oX2s0W$gdVkG@lk zx_W)vDq=)qet{%u5)>|Wx(2e%Igm(_hoQHsyFb}8IPd92^NzKqRtW)o`H?N906VL9 zHRXzlv@Beo9gch4Se)s7uxic{-CvCP{>g;Wpi#IebPZ*nBaPI6D|CC`;M&Hs$5(Iq zb;0?|K@tKOH|51rfY+;5d$m};ShZ2yOk%>#&?MNfLq!q*hs*#91g`P z8Qd?rJ3Sz`Ec@A$+ohD|mDjbqsZ`ggF*&U{+vXe{c$7a=@2O{}XAmK+?8LbvFYE!L z3Cg5wa$B_zPTu*Y@oJM&#Sc*5sK)>r8e5-WS>SMh5In^`G;fG4j*KBGpLz0wVA(I0 z0+B@2@uNln2p{;%+l_6hQ@a3`Eic{ZN3IPsrkYL%BJ~!e8Uo8gMh%`d4`3(Rykrf& z&p#rkPAy$JGeL;UVMJR!lp~?wDhk4-VAnU0y5eb++Xf-^2*TqgBwVZt7xO*)B;f|{ zRR4&a0-!UGof5FS48T5Dhi}S*^eOohJqq&h-hVH?Dc>cnycpk<2eHrAp$ZqP!ha*n zK0zp$)D;k2cQWVy(JYkAVL1Aw;meu~fG=w@j(%wB$&wi}=y((Pf>W7&YeIGTLd`%$Y0slEyt=75ZQ3$l)?|8Ycn;xlBXzy`^IZKfGmLW7Mt_$= z#08+P-GH{S=&EzHjYa6ceG`%FL%3RY$+`MrW?09%6e2DFqvSoj6DM4Cj(6e&^ta!^ zK7TQ`!ChfjK;(B8A}#>oPexs{0j+3z>#JY19d*ryCeLlVZiWc@vpNeAw+d-neuH_W z9J{KvIi0kPMc7rfm`BP9=B(tMji%9k%bscFK&C=OXi>cF5 zR5h_kBnBV^!k2{bdXbSRG8jU5y)o5E;8)KWL>X!@C2ojLANdK7J9bjnNsHCQ(YPVv z25@3`*>GGoT0k^*T%9^x#5clZw4p^|cU=)*Cll_}EdPj{e1A$$Z=w;%0KN`n+<^Nx zfDeIpfnz{0ky8mjkPi57P!J5@Leq%E4bUCz|9|$l(e~c~0O!K;(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ>E=fc|RCwC#nQLqnMHI(>v-eT@uG9hsTC8x}A`eSbk%+_u1qo^dv_wK|An_4` zglgj>@X4eoUySc)G$A38KqP3Q0wz3-AJpn?+KRSmv7n_Ow52av?%lh)-ilnaHFt!D$k}B!K@r00B6F6!SijNC*5*AWKSl&8pPn zyVj2z1mC{-)l?^tos7`(MGuUN$$#JQ13^_JVes;OvpHK1w%TZ5*! zr;wjFlM9#sLNm0n0SKr_L;iOfkP!y5Y{C7M6)k4}i31Gzhobl*`4f>pprYH=fG^-n zivP*w>)5zr1J$3r&ZX{4arx3x(lDffPfgsvOLf@?;8*>YdDkyr%f=NO*n4arE$uC% z@}{{{d8OhdYWDA;aK@cvWn@y@^eeH>D{hBtEE=!|VBV}^Hm`mLRZ}_cJ(*DMx^ECq z!CXGr{tlY1@#<$gxe-Sj4u=y>x2=K1Di$bgUQ>xc(A?faM^{H&ClM$tz570@p4vvL zE0wgVX?*kJQ7&G+7`K0iP%!Lj;D+i?;C7PY{36QcmICl+N1G`VZ_kHQ^=I(5dilEM zFg*jk+%sn(S?Sqa>A4zriFCte9Pp{Ws8ACbs>(cN!M2u;bNE$Xbo7o)EmPBJY&%QU zN7WR~^l;Z5h5UWBJ*E#xB)YEI-9{7pK2;lGs_dK7tYAHB;yNoCp8b3!)Xt|wf@8dDayz}Z+_u?`Um^a^kk#&=sD5t z*}3+Pl!lZEOT)Q_Ab-KMe3q2lYe_D=7^Al9W-6h?N@Yh)6AYQK)HZv=WL~b=fm3l< zlC@S0bTbYl4?r5`>KFts8FH5f$GxY*WF9Ghm>1V=#gGOvgfCLgYEcwNa2HA%fFUJP z4xfyqVb-NtH?R704gAzp8z#4V%NuN2U5OFG7wjYSk|Xuptf@@DEpOzVITkP$4TMZs z#sFbR0$PCAKHU}NlOI>T&s)#ekdvN0Vh%FGJj~}M#pP74+5|$08V5-*7ZO0Rs;bQ{ zm&@ArwJIZK+8iseRaaE8=ee4wJ}!6v!{;XsaNK(mZ)+WcHwI0IFQB}njLMapD4OYE zS=B>y^+rcyx6_SNangUJvqS*Je!suj?RHxN;8>YH>ZTWYP<(IO+iZK{g|PE)DD__N zqi?VmAr$iSW+8;2z4IcE?p(_s7n))oHmA5!P*Avjth+=3FwDHdnhnJ+GDbndjt{GO zdUs{qye20jo7vN6Q!p(bAq0Dm?qkuj<@|oWDcDEo7{iD}&o#>nQV-lAD!_A{2)FL$qB!&ym{iICT0;8rm8y#W*80nM>A*?NC==7Y9#& zL1SAZi|3XyZ*~bOE;sF+9h^OX7H>;ES9-2kwt}#1G$|7r1Nl@Rb*=T(wbqaAgRT%r z^RtRFmQ}r#baT!V62PzqnCJj(`aot{=C}gmG=CJ()6-)~V4%N$Jk4Jhz;s|CkT=2n zxD)tInEwYdll@OH4#*D-h{-?olK>_GOai#2^zQ)K=%y{kgF0vc0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ@-bqA3RCwC#nOkfeR~g5D=j_bxI?l$i<1`LV($FSAo6tlekcZGxP=uB#~QCZ>+{X`KmY%CnRAS)vYdxynUC85ZUgv#2Vj64P-uQG zr{RG{0Ibr9PgR!X>W@4-6aWLDP`p3Gfo6!xV87KPdI4Y{NaZ7d=bL}aFY5aDh&n*E z!SsEghN$wdpZe}us$gvUo+=pAHmF$@cl@6Tr_l0?>BV zb^O(~u8BvyN1bQj0ZUR*W={$h)1*lk&QsI&*<=`3vyk-W?f&hCa1dr*P*C5JK^p)u ziSHH1uIGKlBZ*_v!yzb~{;e=~LT;*B`gd6Fel!OLPCTCgant8{0O~+8L18rO(wa1~diW!o~e0?xEQj)FH9w zKTpKnirr-JV~Ty7WXKYQ>D*H>=duge^r4#ppYLHl?(x(%fKEqN-eXvGpJn{CM>?GH znI)KKr?>(7w^$@r>SId%d^)EmdkY!xpmid5g8;OV0*G8IOg*svp^(ZkLDW;c(=hj@ zVguOn)d26Huqt)!;!z=2GHia(P=3X+cBjE75MP0}e&cYH+5+4i@AYgDdmy6W`g+j2 z1ORdPMjL=B8U{8A;|D!qN!kAOkjbM$|9S}43PBEB0znZ5Yl@qN*BvES=jLL z93!7o%7+9KDDedNa%XOh76Bj;k&CaxKqmKT167AaNlQNAYJ&|!;<<#`x0K139iw{< zIt#Nkhy{WWTm*QfKCbM1%yRrm$M_!v+h@3ZKrw@cb$cv>J1pmZ?~teifMfxv2dUHO z2_Whb0}arm#ee`IfDyEoVDiePHxf=AR^Izyj?oVprl+8K4RQhax)POz+NB)Zz6e)e zQ{tLZEE!AzlB#m*2Od+;NJ#3L7|=8Z>OBBxPYFdJ4yng2AsV%yLVYF%5BGc_&$UZR zW6q(8K~?F?L#_zbs&eHoj`BgJxYkg3mqBBQ%SuvJ?)XH&=w}UMzeq5h3etS04&Z<~ z4cF+=0Yyv1K#Y$Z7)@($Y(WGU#l%;YW8Y{nbYG6r7N`tZk_5actNRR5S%{|`R$=yn za_s^bljbPX5Bb56cv5kZ$0}g7nLYEME>nr6O2e=1!9cP^7D|w~9RqRAfKgm6h8ZO~ z0^=uP^lJfk^jYc(Q9~(O!{9Du#YTmCYHoP5C07vCLt)r(t(x%i=VOATT_@59Ra?oq z&44;0m)u|-XrP)PQTn}EV;J5SkTjIxhdmd6mSFo0dw!XxFygo}357iL6=1Fg!y~X_ zYe%7Q9j%r^aWxF>N~rwRFKm=ekck0*mCChV3{3ZUrKq4TA+E&DDr#uV1WZ&cI-pc5 zF?a0?ShXd9X=QXM(~TNhtG{UXSyW0JJeMo3yMy-y$gSxFAb=v;tM2O(_XU-7UUCJ- z|D^Qq&13IU)_nxl>;f9nwXy(SAh+ZTZJM&@t_UKMsmf_v-D*8l)7H1w4?Qnw8&k!o zqBBBcN(fONcrqln5l9r(^qPN8JyIwrl+sVpMeN7I^xu8Ue(OS-J~tUqbr@{Z$YPy; z4`x(Bn+zBbg~A$3;hIo>$rF4(WW+0i(h$f4xg3ar!jNI&b>Yk(9kn-<5AM%n^UA6f zCVlq_;nJ&0^^_x&tOjyuXBJZRU}1inQ5TT8l!WG2CgsytghC`-KIAwm%Ff3^P91Qp z+-TXj!$2M;URB=wmE+2D9wX`UOdt1b-e;MbP*$ymUj0oVNg0Q%?8kdfC5CCK`hv+ zGQK}1Pz6zp2=qbWPFQm}VxKJYc)Du3ag62?=Q?KcY=troWtl_x&hj^nOFwXE^<9$INk0zLf`*;)g9; zzYRc$7gb^%F!ZUu4r-jof2w|8=&EOo|UfipjjIsZ6# z2QmktcBh5-q;T$AF=u?b&^ZfZ378N}l!9E4SX8nAu9t1DAH<8+Qw2A!J@+*Lq@u(X zu9vhI1z=MN$vfUZ*nOzLzKJ3`pU&U(O}L#;=h-(=WcQ&$hlHdvh~N1!)97AHzGN6X zc=Pui#}0b(CBx`m+rfZ#N{IH>-;E4ytLx~u6Y6J`@}K=p-?N{5)^qsLn7+;P+moiH z+Mtc*#sQeT5aiN%V^6sM*@1&qxZ1^RTS93X_044Y<*^&x^dkU1eeTw6QU`#?z|>TA zIUW&s1FQqy53F5g&X+?UVZ30B!@g4d9lJ{|*3PTIm$)L*EVn O000014Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>A_ld`MjvE3l4Bq~ z1&ac`YR6@x4-YmwE}ui{k-$JU^K@|xu@GE4)tax#L7?sK)d>L!XIV9Ld!~j&LGA}!PZ&+uVdEl`=`RF_u%JULB5Y-3cykA3TBFWafz^+@sAhgr)m zKDMxPv{h{3zN*GNSw-={+I6pOn~W?r1RhY}FzI1d&_B@EutxI8FL8m3ITI&^PJ1f* zicw8+!7BxUzSkOEdId@oSgThvh5S~Z;GnUMxAxG(2Jc|m-*5N~c$}TRJYAP1?XLB6 z{wy8kq7pT0Szc&p_zb>;UlT50nB|a_&LF>|?1qKp5&oC8(R&it)McH}R1W25c=hMx zM7@7ORt|prfim?ezB$|Z+SM1B zJ==d^aRZN9?2{i^%rEUu8`+*OW?z1x^c&;tw(a$d`Ry;abUaxq{sWX4Jzf1=);T3K F0RXND6NUf) literal 0 HcmV?d00001 diff --git a/ObjectiveC/Input101/Input101/Assets.xcassets/tip.imageset/tip@2x.png b/ObjectiveC/Input101/Input101/Assets.xcassets/tip.imageset/tip@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..18facde766af967b0228d2151cdeb7c1649d50ff GIT binary patch literal 1739 zcmY*ae^k;}6#ojM32B~HI;%}WkC7pul_?@>LMDk2WI?k8Ny(N%f?{S$uB>c~N=#g# zSt_~XubMWeHtb9d4y0Fdei0Fu)H@Y)1P zo&!J<769~Y0Kh2#z)^6mem5QfELd@Sm?9=649DfiqdAB8(J|iV;28UG4DEki<(*`K=GIl*G7PbHE&><-e)G17_^6J)2a9+ zd~L|bS@#ZB%|x$_T>G78Q?locQ$6HdvV1SJBebu^mwe-!Z5pY-deC}X)A|j9uPj09 z{Ay_tnc%is>9ImFBa$23`gQG#oz8}Dhw{&ge^`i(wH;n^ttc;_&&$hW)b8(0@V=_9 z*n z=t|yzt3we1TAXnUO1>?XN@+gp{v0-=7kuR|Obdt-M#**_Ef>dvorUcsXi3 zgB11ZdmH_FeUQ9&&myuRYh~Uhh*PUZo!RP{17FKwQ?8CO9WHJ$#znLtA6YAZfT)NK zISs~N^%WBn@n_ES0SY#^$|7CnY_K%LY-ehNm0 z5wcnq^AAn{KhJKxcvs>r0F|qms5XGkR9L!QNYs`-#**4sKR{_04@!-Xt$k$1RfyY{ zmh2w>Oo#QXYX|~-CV=dfTUJnOyE1mzd)s?Uqb!O9oZixY?LOVq%fSn;R7gFE3f8+w zQX}M_bI#H)NA|jtlpEWoCX=$Ik4PWM9w8y$d}IxH5d- zR(Ja(uQU0uj^iWln$?or0C)7zF2xJh*P2@J?EHLPIFe5DJ3nc!{UXEFdH?lEmh1AN z$jC_4)WpQeb3_D5GGu{##D$cfHrfavIeN-bc3DVM*QEp>R2r)d9#QQhHWDjrpzMcM%Wb z7ZQEc*s|@wVAST>`nvAvtIwhaA?^XLIVV@42>ReotE7e0f;+4FDvKi*-v|OuVyAQa zj5EuSXUbH%(3egcZP7JZh_3$WAFfnYoocQ!E1jUWU2Wg5b;h!0xJ_(Y;fc-2h0WbH zelO6vG)?g&Qtxh;Y%^M)-5m$jcvrlK4+3Hz~tP<#u-F-&4~92><{9 literal 0 HcmV?d00001 diff --git a/ObjectiveC/Input101/Input101/Assets.xcassets/tip.imageset/tip@3x.png b/ObjectiveC/Input101/Input101/Assets.xcassets/tip.imageset/tip@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9a343d29834642edca03607484e535df37b60d36 GIT binary patch literal 2679 zcmY*bc|6ox8~^?6Ntei;8e_X-nHgl8W`@eX4P(-famO|&W5f(HVJ=E3TCS}yb&>5g zNXT+yQ1&jR=vs%eM@lHVc}MrY_kG{<`J8i}=X;*#`+c7C$N8KqF3vXl#FfMW0N7_| zYl-LY=-nwM!e3Ee{|M)ALV?Gejsd`f>wCZY2=jf2pDo@A0Ae%&fRzLQTYQK$4*(1# z04$RES=j&}AC}wb$|nLnf(b-A(a90zN29`h{As=c@MvlnKZCCkjpCcs0J;w(ni>)s zfr`dJzek|>_AZQoLcWL4&tjlNCl|;GT6h4&2z~^Pgkr@Z5C}TlpMt_$TK}ES_b|{P zIz0@9Ktx4F!J`b}wD3TLzL}XB0%?FSFwo;i=tZ0lrTawdg+{3TMe-jW%YX>K@Zd0d zFfA0a%j@GyW6&{B=&sN|I4jzs*!%}+(|q9|N=Z~$L< zmmjN-{vP>%*xx#6#IE@N6!TZ7-%)<6SaCGspKHU4JGN0GOsyMzxm(~r8ER?)u+^|SVtOxr?)VF~-3xyB00qhFd~ zoWu(dVU?RD^pi|VpiR?S&dS2df=96kR<$v5*|Vmq>PF6;J4(#$4XSEN{sRt&qtn#X zbP8YkGTWs9Cq{E~nJ$W1Cl@abR~DA{PfchOx%pTLN!6L) zku3)nM8&!dW+v|TqCR7Qi`P{j5);V&%#?6(Rgd~*5KId zZsNvP7@LMU?~?cf3|XX_;~wLjXJwg+g`NVR&M$8LuKF1o+ss2(4rXc?G%oUzM@dG^w2)% ze%ZEc8LG8bhW8|$_qY}|kTg-LMdf5t!3#UzV)xnq5L|SFF#F+6rxrjt&91u&pgVb~ zOkq+&hVN=#&ABg;q*E?j~QL-yW+?6E_Tt%E^J{wD@$hV9%#M-wI7Qj>7U$NO zw|QpyO}Z7g&&7PNs7^0K);+&f_PNbT+9K&|Q9*kBb;;%@67BQzL2$|7bcJmpNb|3B zQNK)|ADW-kwmz2oqxN4lfE{mCG+>28RtGkSS%H!1zC#O7N0i4nUe+0ia~L5AsT*bw-tnm- z=g@wP`Q|ZIF+G3A6MAy*6ptKC7#Rqom{ztr7YFqmEX#p-H;!u z`S!`B;H05fYmiT0V`Fddu%+>GCP19a%+775J1~mmq^vzuU&O5PelE>=4=M>rF0PI3 z+`|8q7b3pp+_SC5ApzZjNf|WLOI~eyRDm!Rp8nUgm@6+-ZXM0{cY6=-?kb;4C99A{ zerx9nl823_W}vUzXMZK?PN;7aDQZ4a26o%B(YcM}_PFe`TK9@ef2dLuwg4O%1s#H+ z-{$7#c6dqLAO|D1b0;(F$MK}-6=7O(70@~Ht{qveC#P-79O8L_|oWi3viw5XSc6?JSdHm z{$TDB6-enYe5QUIdZyPjnsVYya*`uIZ~Mu-|vlMl@v8^a&7eL>;61k`_$Ux;=+#!0SNQeL>BUEP^-4j#rI=xG?+Vh>({p61 zy~c^fc~}>jG5c-niz>?Ma|fz3a!hD)U+P~D7=_pvMcR&~|H56LoSnLZ-(-WjRRuxO z(b39#Dg{Fn?`3*^w(6N<4TURr%?~QaVaE)$V-FBV!3dtpj zONTFSUQ7ag-`07*L4p^g14K02xT#!wG{twwCn9VPCL@cpkBjU2IXY-L(fnQ8@y|V* znmLxCIy`2dlF5xPR~tp%NfLLKO*9X^%W+?sfIrQu{RP;sYtSuPTVwfKMND%18<76l z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ObjectiveC/Input101/Input101/Base.lproj/Main.storyboard b/ObjectiveC/Input101/Input101/Base.lproj/Main.storyboard new file mode 100644 index 0000000..e64fe2f --- /dev/null +++ b/ObjectiveC/Input101/Input101/Base.lproj/Main.storyboard @@ -0,0 +1,500 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ObjectiveC/Input101/Input101/Images/input_autocomplete.png b/ObjectiveC/Input101/Input101/Images/input_autocomplete.png new file mode 100644 index 0000000000000000000000000000000000000000..1a3342fe7ecacca4447c9dd9246b6241c68cf40f GIT binary patch literal 6355 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 HVQ>BubAq4& literal 0 HcmV?d00001 diff --git a/ObjectiveC/Input101/Input101/Images/input_dropdown.png b/ObjectiveC/Input101/Input101/Images/input_dropdown.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b491e07a518363851f11d805ed3b7ecd832cbe GIT binary patch literal 3349 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

Cx%&pydR#LYCN3BUo-8(T zdHG9Y$+bl*rFs8d$V)n-z1Jh3@joRv{PJutVnx8EW+u16k+)JzDpH~;Y5Nk2kjmNh zp8%rxH+9f$Hl*{u&cFO6p@Ng-iw2BrbXs$^`{=fOg3!7kblLa4V3#wO7JdlddH@?P z+bIcPpmN*P&Oi|8Zq?PEUNNchNd<{d4FF9VLYK^_1SRH7I!~}TOuBeE%plxHw@eHL zFaSB}qIM`a(<^5!@-WcAl=vkAgv^04Xhp^HBH%zn-b6>AigQc8xEiT39B|K% zt`|d~$EcErv6Z~AZ~V!IRweuAg9kGTdZI{>$p!&F()GM?_>RctaUY5o?l;?eJWnrc z>n;qM`RsCf#$7XPkba2Hu(RM9@D~LgB^AR{bzugf;La0vI+laAkhRt`X^GQ(WOZXs z^w8^*3C}MrSR&T=bCZpEr|S2C?DF$}`X%uPErbC_XzDc& T(^C21cMWjB+Q#ah1v&bkQ*ET4 literal 0 HcmV?d00001 diff --git a/ObjectiveC/Input101/Input101/Images/input_mask.png b/ObjectiveC/Input101/Input101/Images/input_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..a88a992922e7d9eb2cc9be88e83dbc6bc81d0975 GIT binary patch literal 6954 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 literal 0 HcmV?d00001 diff --git a/ObjectiveC/Input101/Input101/Info.plist b/ObjectiveC/Input101/Input101/Info.plist new file mode 100644 index 0000000..9a91652 --- /dev/null +++ b/ObjectiveC/Input101/Input101/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + GrapeCity.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ObjectiveC/Input101/Input101/License.h b/ObjectiveC/Input101/Input101/License.h new file mode 100644 index 0000000..60e5f92 --- /dev/null +++ b/ObjectiveC/Input101/Input101/License.h @@ -0,0 +1,10 @@ +// +// License.h +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +#import + +extern NSString *const key; diff --git a/ObjectiveC/Input101/Input101/License.m b/ObjectiveC/Input101/Input101/License.m new file mode 100644 index 0000000..c133248 --- /dev/null +++ b/ObjectiveC/Input101/Input101/License.m @@ -0,0 +1,10 @@ +// +// License.m +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +#import "License.h" + +NSString *const key = @"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"; diff --git a/ObjectiveC/Input101/Input101/Samples/AutoCompleteController.h b/ObjectiveC/Input101/Input101/Samples/AutoCompleteController.h new file mode 100644 index 0000000..e334c95 --- /dev/null +++ b/ObjectiveC/Input101/Input101/Samples/AutoCompleteController.h @@ -0,0 +1,12 @@ +// +// AutoCompleteController.h +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +#import + +@interface AutoCompleteController : UIViewController + +@end diff --git a/ObjectiveC/Input101/Input101/Samples/AutoCompleteController.m b/ObjectiveC/Input101/Input101/Samples/AutoCompleteController.m new file mode 100644 index 0000000..288ff67 --- /dev/null +++ b/ObjectiveC/Input101/Input101/Samples/AutoCompleteController.m @@ -0,0 +1,142 @@ +// +// AutoCompleteController.m +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +#import "AutoCompleteController.h" +@import XuniInputDynamicKit; +#import "AutoCompleteData.h" + +@interface AutoCompleteController () +@property (weak, nonatomic) IBOutlet XuniAutoComplete *customDropdown; +@property (weak, nonatomic) IBOutlet XuniAutoComplete *highlightDropdown; +@property (weak, nonatomic) IBOutlet XuniAutoComplete *delayDropdown; +@property (weak, nonatomic) IBOutlet XuniAutoComplete *filterDropdown; + +@end + +@implementation AutoCompleteController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.title = @"AutoComplete"; + // Do any additional setup after loading the view. + + _highlightDropdown.dropDownHeight = 200; + _highlightDropdown.displayMemberPath = @"name"; + _highlightDropdown.isAnimated = YES; + _highlightDropdown.itemsSource = [AutoCompleteData demoData]; + _highlightDropdown.showButton = NO; + + _delayDropdown.dropDownHeight = 200; + _delayDropdown.displayMemberPath = @"name"; + _delayDropdown.isAnimated = YES; + _delayDropdown.itemsSource = [AutoCompleteData demoData]; + _delayDropdown.delay = 1000; + _delayDropdown.showButton = NO; + +// _customDropdown.autoComplete = self; + _customDropdown.tableView.delegate = self; + _customDropdown.tableView.dataSource = self; + _customDropdown.dropDownHeight = 200; + _customDropdown.displayMemberPath = @"name"; + _customDropdown.isAnimated = YES; + _customDropdown.highlightedColor = [UIColor redColor]; + _customDropdown.itemsSource = [AutoCompleteData demoData1]; + + _filterDropdown.dropDownHeight = 200; + _filterDropdown.displayMemberPath = @"name"; + _filterDropdown.isAnimated = YES; + _filterDropdown.delegate = self; + _filterDropdown.itemsSource = [AutoCompleteData demoData]; + _filterDropdown.filteringArgs.cancel = YES; + +} + +-(void)filtering:(XuniAutoComplete *)sender eventArgs:(XuniAutoCompleteFilteringEventArgs *)eventArgs +{ + sender.collectionView.filter = ^ BOOL (NSObject *item){ + AutoCompleteData *data = (AutoCompleteData*)item; + NSString *string = data.name; + if ([[[string substringToIndex:1] lowercaseString] isEqualToString:@"b"]) { + return true; + } + return false; + }; + sender.itemsSource = [NSMutableArray arrayWithArray:sender.collectionView.items]; +// sender.filteringArgs.cancel = NO; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return _customDropdown.temporaryItemSource.count; +} + +-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath +{ + return 50; +} + +- (UITableViewCell *)tableView:(UITableView *)tableview cellForRowAtIndexPath:(NSIndexPath *)indexPath { + UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:@"simpleIdentifier"]; + + if (cell == nil){ + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"simpleIdentifier"]; + } + + UIView *selectedBackgroundView = [[UIView alloc] init]; + selectedBackgroundView.backgroundColor = [UIColor colorWithRed:0 / 255.0 green:122 / 255.0 blue:255 / 255.0 alpha:1.0]; + cell.selectedBackgroundView = selectedBackgroundView; + [cell.contentView.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)]; + + CGRect rect = cell.contentView.frame; + AutoCompleteData *data = (AutoCompleteData *)[_customDropdown.temporaryItemSource objectAtIndex:indexPath.row]; + NSString *imageName = data.imageString; + + UIImageView *image = [[UIImageView alloc]initWithImage:[UIImage imageNamed:imageName]]; + image.frame = CGRectMake(8, 0, 48, 48); + [cell.contentView addSubview:image]; + + UILabel *label1 = [[UILabel alloc]initWithFrame:CGRectMake(65, 10, rect.size.width - 40, rect.size.height / 2)]; + label1.text = data.name; + [cell.contentView addSubview:label1]; + + [_customDropdown normalizeCellText:label1 WithSubstring:label1.text]; + if(_customDropdown.filterString) + { + [_customDropdown highlightedSubstring:_customDropdown.filterString inFilterCellText:label1]; + } + + return cell; +} + +- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { + // Remove seperator inset. + if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { + [cell setSeparatorInset:UIEdgeInsetsZero]; + } + + // Prevent the cell from inheriting the Table View's margin settings. + if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) { + [cell setPreservesSuperviewLayoutMargins:NO]; + } + + // Explictly set cell's layout margins. + if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { + [cell setLayoutMargins:UIEdgeInsetsZero]; + } +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + _customDropdown.selectedIndex = indexPath.row; + _customDropdown.isDropDownOpen = NO; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + + +@end diff --git a/ObjectiveC/Input101/Input101/Samples/AutoCompleteData.h b/ObjectiveC/Input101/Input101/Samples/AutoCompleteData.h new file mode 100644 index 0000000..0cfac12 --- /dev/null +++ b/ObjectiveC/Input101/Input101/Samples/AutoCompleteData.h @@ -0,0 +1,22 @@ +// +// AutoCompleteData.h +// XuniInput +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +#import + +@interface AutoCompleteData : NSObject + +@property NSString *name; +@property NSString *imageString; + +- (id)initWithName:(NSString *)name; + +- (id)initWithName:(NSString *)name imageString:(NSString *)imageString; + ++ (NSMutableArray *)demoData; ++ (NSMutableArray *)demoData1; + +@end diff --git a/ObjectiveC/Input101/Input101/Samples/AutoCompleteData.m b/ObjectiveC/Input101/Input101/Samples/AutoCompleteData.m new file mode 100644 index 0000000..07ac5f6 --- /dev/null +++ b/ObjectiveC/Input101/Input101/Samples/AutoCompleteData.m @@ -0,0 +1,51 @@ +// +// AutoCompleteData.m +// XuniInput +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +#import "AutoCompleteData.h" + +@implementation AutoCompleteData + +- (id)initWithName:(NSString *)name{ + self = [super init]; + if(self){ + _name = name; + } + return self; +} + +- (id)initWithName:(NSString *)name imageString:(NSString *)imageString{ + self = [super init]; + if(self){ + _name = name; + _imageString = imageString; + } + return self; +} + ++ (NSMutableArray *)demoData { + NSMutableArray *dataArray = [[NSMutableArray alloc]init]; + NSArray *array = @[@"Australia",@"Bangladesh",@"Brazil",@"Canada", @"China", @"France",@"Germany",@"India", @"Japan", @"Nepal", @"Pakistan", @"Srilanka"]; + for (int i = 0; i < array.count; i++) { + AutoCompleteData *data = [[AutoCompleteData alloc]initWithName:array[i]]; + [dataArray addObject:data]; + } + return dataArray; + +} + ++ (NSMutableArray *)demoData1 { + NSMutableArray *dataArray = [[NSMutableArray alloc]init]; + NSArray *textArray = @[@"Australia",@"Bangladesh",@"Brazil",@"Canada", @"China", @"France",@"Germany",@"India", @"Japan", @"Nepal", @"Pakistan", @"Srilanka"]; + NSArray *imageArray = @[@"Australia",@"Bangladesh",@"Brazil",@"Canada", @"China", @"France",@"Germany",@"India", @"Japan", @"Nepal", @"Pakistan", @"Srilanka"]; + for (int i = 0; i < textArray.count; i++) { + AutoCompleteData *data = [[AutoCompleteData alloc]initWithName:textArray[i] imageString:imageArray[i]]; + [dataArray addObject:data]; + } + return dataArray; +} + +@end diff --git a/ObjectiveC/Input101/Input101/Samples/ComboBoxController.h b/ObjectiveC/Input101/Input101/Samples/ComboBoxController.h new file mode 100644 index 0000000..f77b5af --- /dev/null +++ b/ObjectiveC/Input101/Input101/Samples/ComboBoxController.h @@ -0,0 +1,12 @@ +// +// ComboBoxController.h +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +#import + +@interface ComboBoxController : UIViewController + +@end diff --git a/ObjectiveC/Input101/Input101/Samples/ComboBoxController.m b/ObjectiveC/Input101/Input101/Samples/ComboBoxController.m new file mode 100644 index 0000000..7ab8a3f --- /dev/null +++ b/ObjectiveC/Input101/Input101/Samples/ComboBoxController.m @@ -0,0 +1,56 @@ +// +// ComboBoxController.m +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +#import "ComboBoxController.h" +@import XuniInputDynamicKit; +#import "AutoCompleteData.h" + +@interface ComboBoxController () + +@property (weak, nonatomic) IBOutlet XuniComboBox *comboBoxEdit; +@property (weak, nonatomic) IBOutlet XuniComboBox *comboBoxNonEdit; + +@end + +@implementation ComboBoxController + +- (void)viewDidLoad { + [super viewDidLoad]; + + // Do any additional setup after loading the view. + self.comboBoxEdit.delegate = self; + self.comboBoxEdit.displayMemberPath = @"name"; + self.comboBoxEdit.itemsSource = [AutoCompleteData demoData];; + self.comboBoxEdit.dropDownHeight = 200; + self.comboBoxEdit.placeholder = @"Please Enter..."; + + self.comboBoxNonEdit.delegate = self; + self.comboBoxNonEdit.displayMemberPath = @"name"; + self.comboBoxNonEdit.itemsSource = [AutoCompleteData demoData];; + self.comboBoxNonEdit.isEditable = NO; + self.comboBoxNonEdit.dropDownBehavior = XuniDropDownBehaviorHeaderTap; + self.comboBoxNonEdit.dropDownHeight = 200; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +/* +#pragma mark - Navigation + +// In a storyboard-based application, you will often want to do a little preparation before navigation +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. +} +*/ + +@end + + diff --git a/ObjectiveC/Input101/Input101/Samples/DropDownController.h b/ObjectiveC/Input101/Input101/Samples/DropDownController.h new file mode 100644 index 0000000..49a1bd1 --- /dev/null +++ b/ObjectiveC/Input101/Input101/Samples/DropDownController.h @@ -0,0 +1,12 @@ +// +// DropDownController.h +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +#import + +@interface DropDownController : UIViewController + +@end diff --git a/ObjectiveC/Input101/Input101/Samples/DropDownController.m b/ObjectiveC/Input101/Input101/Samples/DropDownController.m new file mode 100644 index 0000000..a457bdb --- /dev/null +++ b/ObjectiveC/Input101/Input101/Samples/DropDownController.m @@ -0,0 +1,59 @@ +// +// DropDownController.m +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +#import "DropDownController.h" +@import XuniInputDynamicKit; +@import XuniCalendarDynamicKit; + +@interface DropDownController () +@property (weak, nonatomic) IBOutlet XuniDropDown *dropdown; + +@end + +@implementation DropDownController +{ + XuniMaskedTextField *_field; + XuniDropDownView *_dropdownView; + XuniCalendar *_calendar; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + self.title = @"DropDown"; + + // Do any additional setup after loading the view. + _dropdown.buttonColor = [UIColor lightGrayColor]; + _dropdown.dropDownHeight = 300; + _dropdown.dropDownWidth = _dropdown.frame.size.width + 30; + _dropdown.dropDownDirection = XuniDropDownDirectionForceBelow; + _dropdown.isAnimated = YES; + + _field = [[XuniMaskedTextField alloc] init]; + _field.mask = @"00/00/0000"; + _field.borderStyle = UITextBorderStyleNone; + _dropdown.header = _field; + + _calendar = [[XuniCalendar alloc] init]; + _calendar.delegate = self; + _dropdown.dropDownView = _calendar; + +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +-(void)selectionChanged:(XuniCalendar *)sender selectedDates:(XuniCalendarRange*)selectedDates +{ + NSDateFormatter *_dateFormatter = [[NSDateFormatter alloc]init]; + _dateFormatter.dateFormat = @"MM/dd/yyyy"; + _field.text = [_dateFormatter stringFromDate:((XuniCalendar *)sender).selectedDate]; + _dropdown.isDropDownOpen = NO; +} + +@end diff --git a/ObjectiveC/Input101/Input101/Samples/MaskedInputController.h b/ObjectiveC/Input101/Input101/Samples/MaskedInputController.h new file mode 100644 index 0000000..b66d0b4 --- /dev/null +++ b/ObjectiveC/Input101/Input101/Samples/MaskedInputController.h @@ -0,0 +1,14 @@ +// +// MaskedInputController.h +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +#import + +@interface MaskedInputController : UIViewController + + +@end + diff --git a/ObjectiveC/Input101/Input101/Samples/MaskedInputController.m b/ObjectiveC/Input101/Input101/Samples/MaskedInputController.m new file mode 100644 index 0000000..02b4ed2 --- /dev/null +++ b/ObjectiveC/Input101/Input101/Samples/MaskedInputController.m @@ -0,0 +1,37 @@ +// +// MaskedInputController.m +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +#import "MaskedInputController.h" +@import XuniInputDynamicKit; + +@interface MaskedInputController () + +@property (weak, nonatomic) IBOutlet XuniMaskedTextField *maskedID; +@property (weak, nonatomic) IBOutlet XuniMaskedTextField *maskedDOB; +@property (weak, nonatomic) IBOutlet XuniMaskedTextField *maskedPhone; +@property (weak, nonatomic) IBOutlet XuniMaskedTextField *maskedState; + +@end + +@implementation MaskedInputController + +- (void)viewDidLoad { + [super viewDidLoad]; + + // Do any additional setup after loading the view, typically from a nib. + self.maskedID.mask = @"000-00-0000"; + self.maskedDOB.mask = @"90/90/0000"; + self.maskedPhone.mask = @"(999) 000-0000"; + self.maskedState.mask = @"LL"; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +@end diff --git a/ObjectiveC/Input101/Input101/main.m b/ObjectiveC/Input101/Input101/main.m new file mode 100644 index 0000000..93c5c40 --- /dev/null +++ b/ObjectiveC/Input101/Input101/main.m @@ -0,0 +1,15 @@ +// +// main.m +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +#import +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/Swift/Calendar101/Calendar101.xcodeproj/project.pbxproj b/Swift/Calendar101/Calendar101.xcodeproj/project.pbxproj index 48e59af..74eef03 100644 --- a/Swift/Calendar101/Calendar101.xcodeproj/project.pbxproj +++ b/Swift/Calendar101/Calendar101.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 843786591CD2ECC000903308 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8437865B1CD2ECC000903308 /* Localizable.strings */; }; 8456E5BC1C7FE813007DBBC9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8456E5BB1C7FE813007DBBC9 /* AppDelegate.swift */; }; 8456E5BE1C7FE813007DBBC9 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8456E5BD1C7FE813007DBBC9 /* ViewController.swift */; }; 8456E5C11C7FE813007DBBC9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8456E5BF1C7FE813007DBBC9 /* Main.storyboard */; }; @@ -25,6 +26,11 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 843786551CD2EC7200903308 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/LaunchScreen.strings; sourceTree = ""; }; + 843786561CD2EC7200903308 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Main.strings; sourceTree = ""; }; + 8437865A1CD2ECC000903308 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; + 8437865C1CD2ECC200903308 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + 8437865D1CD2ECC300903308 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; 8456E5B81C7FE813007DBBC9 /* Calendar101.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Calendar101.app; sourceTree = BUILT_PRODUCTS_DIR; }; 8456E5BB1C7FE813007DBBC9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 8456E5BD1C7FE813007DBBC9 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -80,6 +86,7 @@ children = ( 8456E5BB1C7FE813007DBBC9 /* AppDelegate.swift */, 8456E5C21C7FE813007DBBC9 /* Assets.xcassets */, + 8437865B1CD2ECC000903308 /* Localizable.strings */, 8456E5D31C7FF9FA007DBBC9 /* CustomAppearanceController.swift */, 8456E5D51C8001FF007DBBC9 /* CustomDayContentController.swift */, 8456E5D91C8018E4007DBBC9 /* CustomHeaderController.swift */, @@ -138,6 +145,7 @@ knownRegions = ( en, Base, + ja, ); mainGroup = 8456E5AF1C7FE813007DBBC9; productRefGroup = 8456E5B91C7FE813007DBBC9 /* Products */; @@ -155,6 +163,7 @@ buildActionMask = 2147483647; files = ( 8456E5C61C7FE813007DBBC9 /* LaunchScreen.storyboard in Resources */, + 843786591CD2ECC000903308 /* Localizable.strings in Resources */, 8456E5C31C7FE813007DBBC9 /* Assets.xcassets in Resources */, 8456E5C11C7FE813007DBBC9 /* Main.storyboard in Resources */, ); @@ -183,10 +192,21 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ + 8437865B1CD2ECC000903308 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 8437865A1CD2ECC000903308 /* Base */, + 8437865C1CD2ECC200903308 /* en */, + 8437865D1CD2ECC300903308 /* ja */, + ); + name = Localizable.strings; + sourceTree = ""; + }; 8456E5BF1C7FE813007DBBC9 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( 8456E5C01C7FE813007DBBC9 /* Base */, + 843786561CD2EC7200903308 /* ja */, ); name = Main.storyboard; sourceTree = ""; @@ -195,6 +215,7 @@ isa = PBXVariantGroup; children = ( 8456E5C51C7FE813007DBBC9 /* Base */, + 843786551CD2EC7200903308 /* ja */, ); name = LaunchScreen.storyboard; sourceTree = ""; diff --git a/Swift/Calendar101/Calendar101/Base.lproj/LaunchScreen.storyboard b/Swift/Calendar101/Calendar101/Base.lproj/LaunchScreen.storyboard index 64f1ef9..9587a8e 100644 --- a/Swift/Calendar101/Calendar101/Base.lproj/LaunchScreen.storyboard +++ b/Swift/Calendar101/Calendar101/Base.lproj/LaunchScreen.storyboard @@ -1,5 +1,5 @@ - + diff --git a/Swift/Calendar101/Calendar101/Base.lproj/Localizable.strings b/Swift/Calendar101/Calendar101/Base.lproj/Localizable.strings new file mode 100644 index 0000000..6c05d6d --- /dev/null +++ b/Swift/Calendar101/Calendar101/Base.lproj/Localizable.strings @@ -0,0 +1,6 @@ +/* + Localizable.strings + Calendar101 + + Copyright (c) 2015 GrapeCity. All rights reserved. +*/ diff --git a/Swift/Calendar101/Calendar101/CustomAppearanceController.swift b/Swift/Calendar101/Calendar101/CustomAppearanceController.swift index 676c7c7..bd21c82 100644 --- a/Swift/Calendar101/Calendar101/CustomAppearanceController.swift +++ b/Swift/Calendar101/Calendar101/CustomAppearanceController.swift @@ -14,7 +14,7 @@ class CustomAppearanceController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - self.title = "Custom Appearance" + self.title = NSLocalizedString("Custom Appearance", comment: "") // Do any additional setup after loading the view. _calendar.borderColor = UIColor.blackColor() diff --git a/Swift/Calendar101/Calendar101/CustomDayContentController.swift b/Swift/Calendar101/Calendar101/CustomDayContentController.swift index ad831c2..8ce794b 100644 --- a/Swift/Calendar101/Calendar101/CustomDayContentController.swift +++ b/Swift/Calendar101/Calendar101/CustomDayContentController.swift @@ -25,7 +25,7 @@ class CustomDayContentController: UIViewController, XuniCalendarDelegate { override func viewDidLoad() { super.viewDidLoad() - self.title = "Custom Day Content" + self.title = NSLocalizedString("Custom Day Content", comment: "") // Do any additional setup after loading the view. _calendar.delegate = self @@ -49,17 +49,17 @@ class CustomDayContentController: UIViewController, XuniCalendarDelegate { _calendar.frame = CGRectMake(0, 75, width, width - 75) } - func dayOfWeekSlotLoading(sender: XuniCalendar, args: XuniCalendarDayOfWeekSlotLoadingEventArgs) { - args.dayOfWeekSlot.font = args.isWeekend ? UIFont.italicSystemFontOfSize(11.0) : UIFont.boldSystemFontOfSize(11.0) + func dayOfWeekSlotLoading(sender: XuniCalendar, dayOfWeek: XuniDayOfWeek, isWeekend: Bool, dayOfWeekSlot: UILabel) { + dayOfWeekSlot.font = isWeekend ? UIFont.italicSystemFontOfSize(11.0) : UIFont.boldSystemFontOfSize(11.0) } - func daySlotLoading(sender: XuniCalendar, args: XuniCalendarDaySlotLoadingEventArgs) { - if (args.isAdjacentDay) { - return; + func daySlotLoading(sender: XuniCalendar, date: NSDate, isAdjacentDay: Bool, daySlot: XuniCalendarDaySlotBase) -> XuniCalendarDaySlotBase { + if (isAdjacentDay) { + return daySlot; } - let day = NSCalendar.currentCalendar().components(NSCalendarUnit.Day, fromDate: args.date).day - let rect = args.daySlot.frame + let day = NSCalendar.currentCalendar().components(NSCalendarUnit.Day, fromDate: date).day + let rect = daySlot.frame let size = rect.size var rect1: CGRect var rect2: CGRect @@ -83,7 +83,7 @@ class CustomDayContentController: UIViewController, XuniCalendarDelegate { imageDaySlot.imageSource = UIImage(named: dotIcon[day % 3]) } - args.daySlot = imageDaySlot + return imageDaySlot } /* diff --git a/Swift/Calendar101/Calendar101/CustomHeaderController.swift b/Swift/Calendar101/Calendar101/CustomHeaderController.swift index 400c71c..3a654ce 100644 --- a/Swift/Calendar101/Calendar101/CustomHeaderController.swift +++ b/Swift/Calendar101/Calendar101/CustomHeaderController.swift @@ -19,28 +19,35 @@ class CustomHeaderController: UIViewController, UIPickerViewDelegate, UIPickerVi var _viewTypePicker = UIPickerView() var _dateLabel = UILabel() var _todayBtn = UIButton(type: UIButtonType.System) + var _isEnglish = true override func viewDidLoad() { super.viewDidLoad() self.title = "Custom Header" // Do any additional setup after loading the view. + _dateFormatter.locale = NSLocale(localeIdentifier: "en_US") + let language = NSLocale.preferredLanguages()[0] + _isEnglish = !language.containsString("ja") && !language.containsString("zh") + _viewTypePicker.delegate = self _viewTypePicker.showsSelectionIndicator = true _viewTypePicker.hidden = false - _dateLabel.text = "" - _todayBtn.setTitle("Today", forState: UIControlState.Normal) _todayBtn.addTarget(self, action: "todayBtnClick:", forControlEvents: UIControlEvents.TouchUpInside) _calendar.delegate = self _calendar.showHeader = false + updateDateLabel() + self.view.addSubview(_viewTypePicker) self.view.addSubview(_dateLabel) self.view.addSubview(_todayBtn) self.view.addSubview(_calendar) + + updateDateLabel() } override func didReceiveMemoryWarning() { @@ -78,14 +85,21 @@ class CustomHeaderController: UIViewController, UIPickerViewDelegate, UIPickerVi func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { if (row == 0) { - _calendar.viewMode = XuniCalendarViewMode.Month + _calendar.changeViewModeAsync(XuniCalendarViewMode.Month, date: nil) } else if (row == 1) { - _calendar.viewMode = XuniCalendarViewMode.Year + _calendar.changeViewModeAsync(XuniCalendarViewMode.Year, date: nil) } } func viewModeChanged(sender: XuniCalendar) { + if (_calendar.viewMode == XuniCalendarViewMode.Month) { + _viewTypePicker.selectRow(0, inComponent: 0, animated: false) + } + else if (_calendar.viewMode == XuniCalendarViewMode.Year) { + _viewTypePicker.selectRow(1, inComponent: 0, animated: false) + } + updateDateLabel() } @@ -94,7 +108,7 @@ class CustomHeaderController: UIViewController, UIPickerViewDelegate, UIPickerVi } func updateDateLabel() { - _dateFormatter.dateFormat = (_calendar.viewMode == XuniCalendarViewMode.Month) ? "MMMM yyyy" : "yyyy" + _dateFormatter.dateFormat = (_calendar.viewMode == XuniCalendarViewMode.Month) ? (_isEnglish ? "MMMM yyyy" : "yyyy年M月") : "yyyy" _dateLabel.text = _dateFormatter.stringFromDate(_calendar.displayDate) } diff --git a/Swift/Calendar101/Calendar101/CustomSelectionController.swift b/Swift/Calendar101/Calendar101/CustomSelectionController.swift index 7cc350f..aa857f8 100644 --- a/Swift/Calendar101/Calendar101/CustomSelectionController.swift +++ b/Swift/Calendar101/Calendar101/CustomSelectionController.swift @@ -16,11 +16,11 @@ class CustomSelectionController: UIViewController, XuniCalendarDelegate { override func viewDidLoad() { super.viewDidLoad() - self.title = "Custom Selection" + self.title = NSLocalizedString("Custom Selection", comment: "") // Do any additional setup after loading the view. _stepsLabel.numberOfLines = 3 - _stepsLabel.text = "Step1: Select a date.\nStep2: Select another date in a different week.\nObserve: The weekend days are not selected." + _stepsLabel.text = NSLocalizedString("Step1: Select a date.\nStep2: Select another date in a different week.\nObserve: The weekend days are not selected.", comment: "") _calendar.delegate = self _calendar.maxSelectionCount = -1 @@ -43,15 +43,15 @@ class CustomSelectionController: UIViewController, XuniCalendarDelegate { _calendar.frame = CGRectMake(0, 55 + 100, width, width - 55 - 100) } - func selectionChanging(sender: XuniCalendar, args: XuniCalendarSelectionChangedEventArgs) { - for (var date = args.selectedDates.startDate; - date.compare(args.selectedDates.endDate) == NSComparisonResult.OrderedAscending - || date.compare(args.selectedDates.endDate) == NSComparisonResult.OrderedSame; + func selectionChanging(sender: XuniCalendar, selectedDates: XuniCalendarRange) { + for (var date = selectedDates.startDate; + date.compare(selectedDates.endDate) == NSComparisonResult.OrderedAscending + || date.compare(selectedDates.endDate) == NSComparisonResult.OrderedSame; date = getNextDateOf(date)) { let weekday = NSCalendar.currentCalendar().components(NSCalendarUnit.Weekday, fromDate: date).weekday if (weekday == 1 || weekday == 7) { - args.selectedDates.addExcludedDates(date) + selectedDates.addExcludedDates(date) } } } diff --git a/Swift/Calendar101/Calendar101/GettingStartedController.swift b/Swift/Calendar101/Calendar101/GettingStartedController.swift index 49a41d4..dd285de 100644 --- a/Swift/Calendar101/Calendar101/GettingStartedController.swift +++ b/Swift/Calendar101/Calendar101/GettingStartedController.swift @@ -14,7 +14,7 @@ class GettingStartedController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - self.title = "Getting Started" + self.title = NSLocalizedString("Getting Started", comment: "") // Do any additional setup after loading the view. self.view.addSubview(_calendar) diff --git a/Swift/Calendar101/Calendar101/PopupEditorController.swift b/Swift/Calendar101/Calendar101/PopupEditorController.swift index d4d81ff..c66f7f7 100644 --- a/Swift/Calendar101/Calendar101/PopupEditorController.swift +++ b/Swift/Calendar101/Calendar101/PopupEditorController.swift @@ -53,9 +53,9 @@ class PopupEditorController: UIViewController, XuniCalendarDelegate { _calendar.hidden = !_calendar.hidden } - func selectionChanged(sender: XuniCalendar, args: XuniCalendarSelectionChangedEventArgs) { + func selectionChanged(sender: XuniCalendar, selectedDates: XuniCalendarRange) { _dateFormatter.dateFormat = "M/d/yyyy" - _dateLabel.text = String(format: "The date %@ was selected.", _dateFormatter.stringFromDate(args.selectedDates.startDate)) + _dateLabel.text = String(format: "The date %@ was selected.", _dateFormatter.stringFromDate(selectedDates.startDate)) _calendar.hidden = true } diff --git a/Swift/Calendar101/Calendar101/VerticalOrientationController.swift b/Swift/Calendar101/Calendar101/VerticalOrientationController.swift index 1bd8f18..653fcf0 100644 --- a/Swift/Calendar101/Calendar101/VerticalOrientationController.swift +++ b/Swift/Calendar101/Calendar101/VerticalOrientationController.swift @@ -14,7 +14,7 @@ class VerticalOrientationController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - self.title = "Vertical Orientation" + self.title = NSLocalizedString("Vertical Orientation", comment: "") // Do any additional setup after loading the view. _calendar.orientation = XuniCalendarOrientation.Vertical diff --git a/Swift/Calendar101/Calendar101/ViewController.swift b/Swift/Calendar101/Calendar101/ViewController.swift index 4f6a0c5..4c39d60 100644 --- a/Swift/Calendar101/Calendar101/ViewController.swift +++ b/Swift/Calendar101/Calendar101/ViewController.swift @@ -10,6 +10,24 @@ import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { let samplesTitle = [ + NSLocalizedString("Getting Started", comment: ""), + NSLocalizedString("Vertical Orientation", comment: ""), + NSLocalizedString("Custom Day Content", comment: ""), + NSLocalizedString("Custom Header", comment: ""), + NSLocalizedString("Custom Appearance", comment: ""), + NSLocalizedString("Popup Editor", comment: ""), + NSLocalizedString("Custom Selection", comment: "")] + + let samplesDescription = [ + NSLocalizedString("Shows a basic calendar with selection and interaction.", comment: ""), + NSLocalizedString("Shows a calendar with vertical navigation/scrolling.", comment: ""), + NSLocalizedString("Shows how to customize a day slot to show custom content.", comment: ""), + NSLocalizedString("Shows a custom header inspired by a popular Android or iOS calendar app.", comment: ""), + NSLocalizedString("Shows a calendar with a custom style.", comment: ""), + NSLocalizedString("Shows how to use the control as a pop-up date selector.", comment: ""), + NSLocalizedString("Shows custom selection scenarios.", comment: "")] + + let samplesImage = [ "Getting Started", "Vertical Orientation", "Custom Day Content", @@ -18,15 +36,6 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour "Popup Editor", "Custom Selection"] - let samplesDescription = [ - "Shows a basic calendar with selection and interaction.", - "Shows a calendar with vertical navigation/scrolling.", - "Shows how to customize a day slot to show custom content.", - "Shows a custom header inspired by a popular Android or iOS calendar app.", - "Shows a calendar with a custom style.", - "Shows how to use the control as a pop-up date selector.", - "Shows custom selection scenarios."] - let SimpleIdentifier = "SimpleIdentifier" override func viewDidLoad() { @@ -58,7 +67,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour var cell : UITableViewCell? var imageName : String - imageName = samplesTitle[row].stringByReplacingOccurrencesOfString(" ", withString: "") + imageName = samplesImage[row].stringByReplacingOccurrencesOfString(" ", withString: "") imageName = imageName.lowercaseString + ".png" if(cell == nil){ diff --git a/Swift/Calendar101/Calendar101/en.lproj/Localizable.strings b/Swift/Calendar101/Calendar101/en.lproj/Localizable.strings new file mode 100644 index 0000000..e5586ab --- /dev/null +++ b/Swift/Calendar101/Calendar101/en.lproj/Localizable.strings @@ -0,0 +1,49 @@ +/* + Localizable.strings + Calendar101 + + Copyright (c) 2015 GrapeCity. All rights reserved. +*/ + +// Samples Title +"Getting Started" = "Getting Started"; + +"Vertical Orientation" = "Vertical Orientation"; + +"Custom Day Content" = "Custom Day Content"; + +"Custom Header" = "Custom Header"; + +"Custom Appearance" = "Custom Appearance"; + +"Popup Editor" = "Popup Editor"; + +"Custom Selection" = "Custom Selection"; + +// Samples Description +"Shows a basic calendar with selection and interaction." = "Shows a basic calendar with selection and interaction."; + +"Shows a calendar with vertical navigation/scrolling." = "Shows a calendar with vertical navigation/scrolling."; + +"Shows how to customize a day slot to show custom content." = "Shows how to customize a day slot to show custom content."; + +"Shows a custom header inspired by a popular Android or iOS calendar app." = "Shows a custom header inspired by a popular Android or iOS calendar app."; + +"Shows a calendar with a custom style." = "Shows a calendar with a custom style."; + +"Shows how to use the control as a pop-up date selector." = "Shows how to use the control as a pop-up date selector."; + +"Shows custom selection scenarios." = "Shows custom selection scenarios."; + +// Strings +"Month View" = "Month View"; + +"Year View" = "Year View"; + +"Today" = "Today"; + +"Step1: Select a date.\nStep2: Select another date in a different week.\nObserve: The weekend days are not selected." = "Step1: Select a date.\nStep2: Select another date in a different week.\nObserve: The weekend days are not selected."; + +"Pick a date" = "Pick a date"; + +"The date %@ was selected." = "The date %@ was selected."; diff --git a/Swift/Calendar101/Calendar101/ja.lproj/LaunchScreen.strings b/Swift/Calendar101/Calendar101/ja.lproj/LaunchScreen.strings new file mode 100644 index 0000000..a79ed96 --- /dev/null +++ b/Swift/Calendar101/Calendar101/ja.lproj/LaunchScreen.strings @@ -0,0 +1,6 @@ + +/* Class = "UILabel"; text = " Copyright (c) 2015 GrapeCity. All rights reserved."; ObjectID = "S7t-we-Nel"; */ +"S7t-we-Nel.text" = " Copyright (c) 2016 GrapeCity. All rights reserved."; + +/* Class = "UILabel"; text = "Calendar101"; ObjectID = "raF-aS-QHO"; */ +"raF-aS-QHO.text" = "Calendar101"; diff --git a/Swift/Calendar101/Calendar101/ja.lproj/Localizable.strings b/Swift/Calendar101/Calendar101/ja.lproj/Localizable.strings new file mode 100644 index 0000000..f614c63 --- /dev/null +++ b/Swift/Calendar101/Calendar101/ja.lproj/Localizable.strings @@ -0,0 +1,49 @@ +/* + Localizable.strings + Calendar101 + + Copyright (c) 2016 GrapeCity. All rights reserved. +*/ + +// Samples Title +"Getting Started" = "Calendar の基本機能"; + +"Vertical Orientation" = "垂直方向の操作"; + +"Custom Day Content" = "日付領域の変更"; + +"Custom Header" = "ヘッダーのカスタマイズ"; + +"Custom Appearance" = "外観のカスタマイズ"; + +"Popup Editor" = "選択画面"; + +"Custom Selection" = "日付選択のカスタマイズ"; + +// Samples Description +"Shows a basic calendar with selection and interaction." = "カレンダーの日付選択と対話操作"; + +"Shows a calendar with vertical navigation/scrolling." = "縦方向にめくり、スクロール"; + +"Shows how to customize a day slot to show custom content." = "日付を表示する領域に画像など独自の表現を設定"; + +"Shows a custom header inspired by a popular Android or iOS calendar app." = "AndroidやiOSでおなじみの形にカスタマイズ"; + +"Shows a calendar with a custom style." = "独自スタイルを設定したカレンダー"; + +"Shows how to use the control as a pop-up date selector." = "日付選択用の画面をポップアップ表示"; + +"Shows custom selection scenarios." = "カスタマイズした日付選択の利用例"; + +// Strings +"Month View" = "月表示"; + +"Year View" = "年表示"; + +"Today" = "今日"; + +"Step1: Select a date.\nStep2: Select another date in a different week.\nObserve: The weekend days are not selected." = "ステップ1: 日付を選択\nステップ2: 他の週の日付を選択\n結果: 週末を除いた日付のみが選択状態になります"; + +"Pick a date" = "日付の選択"; + +"The date %@ was selected." = " %@ が選択されました"; diff --git a/Swift/Calendar101/Calendar101/ja.lproj/Main.strings b/Swift/Calendar101/Calendar101/ja.lproj/Main.strings new file mode 100644 index 0000000..9da992f --- /dev/null +++ b/Swift/Calendar101/Calendar101/ja.lproj/Main.strings @@ -0,0 +1,6 @@ + +/* Class = "UINavigationItem"; title = "Calendar101"; ObjectID = "Gdm-FG-Jb3"; */ +"Gdm-FG-Jb3.title" = "Calendar101"; + +/* Class = "UIBarButtonItem"; title = "Calendar101"; ObjectID = "Nw0-Ve-Y6E"; */ +"Nw0-Ve-Y6E.title" = "Calendar101"; diff --git a/Swift/CollectionView101/CollectionView101.xcodeproj/project.pbxproj b/Swift/CollectionView101/CollectionView101.xcodeproj/project.pbxproj index 0bfbd0b..fe3c75a 100644 --- a/Swift/CollectionView101/CollectionView101.xcodeproj/project.pbxproj +++ b/Swift/CollectionView101/CollectionView101.xcodeproj/project.pbxproj @@ -14,7 +14,6 @@ 4C31AF7E1C74D4B90094D76F /* flexgrid_loading.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C31AF791C74D4B90094D76F /* flexgrid_loading.png */; }; 4C31AF7F1C74D4B90094D76F /* sort.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C31AF7A1C74D4B90094D76F /* sort.png */; }; 4C31AF871C74EDA40094D76F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4C31AF861C74EDA40094D76F /* Images.xcassets */; }; - 4C31AF891C74EE9D0094D76F /* XuniCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C31AF881C74EE9D0094D76F /* XuniCoreKit.framework */; }; 4C31AF8D1C74F0E70094D76F /* YouTubeCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C31AF8C1C74F0E70094D76F /* YouTubeCollectionView.swift */; }; 4C49FECA1C8F5DA900C4AAEE /* YouTubeOnDemandCanvasTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C49FEC91C8F5DA900C4AAEE /* YouTubeOnDemandCanvasTableViewController.swift */; }; 4C49FECD1C8F6A7400C4AAEE /* FilteringDemoCanvasTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C49FECC1C8F6A7400C4AAEE /* FilteringDemoCanvasTableViewController.swift */; }; @@ -22,6 +21,7 @@ 4C51F8361C5F4A2600244503 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4C51F8341C5F4A2600244503 /* Main.storyboard */; }; 4C51F83B1C5F4A2600244503 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4C51F8391C5F4A2600244503 /* LaunchScreen.storyboard */; }; 4C51F8441C5F4C8E00244503 /* SampleData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C51F8431C5F4C8E00244503 /* SampleData.swift */; }; + 4C7CDA901D26E07200F61693 /* XuniCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C7CDA8F1D26E07200F61693 /* XuniCoreKit.framework */; }; 4CE12DCD1C8611B30049DF13 /* SimpleOnDemandSampleTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE12DCC1C8611B30049DF13 /* SimpleOnDemandSampleTableViewController.swift */; }; 4CE12DD01C86147F0049DF13 /* FilteringSampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE12DCF1C86147F0049DF13 /* FilteringSampleViewController.swift */; }; 4CE12DD31C8614AA0049DF13 /* GroupingSampleTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE12DD21C8614AA0049DF13 /* GroupingSampleTableViewController.swift */; }; @@ -36,7 +36,6 @@ 4C31AF791C74D4B90094D76F /* flexgrid_loading.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = flexgrid_loading.png; sourceTree = ""; }; 4C31AF7A1C74D4B90094D76F /* sort.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = sort.png; sourceTree = ""; }; 4C31AF861C74EDA40094D76F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ../Images.xcassets; sourceTree = ""; }; - 4C31AF881C74EE9D0094D76F /* XuniCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreKit.framework; path = "../../../Controls/XuniCoreKit.framework"; sourceTree = ""; }; 4C31AF8C1C74F0E70094D76F /* YouTubeCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = YouTubeCollectionView.swift; sourceTree = ""; }; 4C49FEC91C8F5DA900C4AAEE /* YouTubeOnDemandCanvasTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = YouTubeOnDemandCanvasTableViewController.swift; sourceTree = ""; }; 4C49FECC1C8F6A7400C4AAEE /* FilteringDemoCanvasTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilteringDemoCanvasTableViewController.swift; sourceTree = ""; }; @@ -48,6 +47,7 @@ 4C51F83A1C5F4A2600244503 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 4C51F83C1C5F4A2600244503 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 4C51F8431C5F4C8E00244503 /* SampleData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SampleData.swift; sourceTree = ""; }; + 4C7CDA8F1D26E07200F61693 /* XuniCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreKit.framework; path = ../../../Controls/XuniCoreKit.framework; sourceTree = ""; }; 4CE12DCC1C8611B30049DF13 /* SimpleOnDemandSampleTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SimpleOnDemandSampleTableViewController.swift; sourceTree = ""; }; 4CE12DCF1C86147F0049DF13 /* FilteringSampleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilteringSampleViewController.swift; sourceTree = ""; }; 4CE12DD21C8614AA0049DF13 /* GroupingSampleTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroupingSampleTableViewController.swift; sourceTree = ""; }; @@ -59,7 +59,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4C31AF891C74EE9D0094D76F /* XuniCoreKit.framework in Frameworks */, + 4C7CDA901D26E07200F61693 /* XuniCoreKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -90,7 +90,7 @@ 4C51F81F1C5F4A2600244503 = { isa = PBXGroup; children = ( - 4C31AF881C74EE9D0094D76F /* XuniCoreKit.framework */, + 4C7CDA8F1D26E07200F61693 /* XuniCoreKit.framework */, 4C51F82A1C5F4A2600244503 /* CollectionView101 */, 4C51F8291C5F4A2600244503 /* Products */, ); @@ -333,6 +333,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", + ../../../../../Controls, + "$(PROJECT_DIR)", ../../../Controls, ); INFOPLIST_FILE = CollectionView101/Info.plist; @@ -348,6 +350,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", + ../../../../../Controls, + "$(PROJECT_DIR)", ../../../Controls, ); INFOPLIST_FILE = CollectionView101/Info.plist; diff --git a/Swift/CollectionView101/CollectionView101.xcodeproj/project.xcworkspace/xcuserdata/kotyuck.xcuserdatad/UserInterfaceState.xcuserstate b/Swift/CollectionView101/CollectionView101.xcodeproj/project.xcworkspace/xcuserdata/kotyuck.xcuserdatad/UserInterfaceState.xcuserstate index 65470e1e6f734ecd8b7f406c51b2d1777aebf476..0d9bdab830cc38e06af54aa4691ab7ab743f99c8 100644 GIT binary patch literal 69056 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 QuNKby*OOBJYF@tjKi;F&#{d8T delta 26638 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 AbpQYW diff --git a/Swift/CollectionView101/CollectionView101/Base.lproj/Localizable.strings b/Swift/CollectionView101/CollectionView101/Base.lproj/Localizable.strings new file mode 100644 index 0000000..79a37c0 --- /dev/null +++ b/Swift/CollectionView101/CollectionView101/Base.lproj/Localizable.strings @@ -0,0 +1,6 @@ +/* + Localizable.strings + CollectionView101 + + Copyright © 2016 GrapeCity. All rights reserved. +*/ diff --git a/Swift/CollectionView101/CollectionView101/SortingSampleTableViewController.swift b/Swift/CollectionView101/CollectionView101/SortingSampleTableViewController.swift index 2196740..0cdef1d 100644 --- a/Swift/CollectionView101/CollectionView101/SortingSampleTableViewController.swift +++ b/Swift/CollectionView101/CollectionView101/SortingSampleTableViewController.swift @@ -18,19 +18,19 @@ class SortingSampleTableViewController: UITableViewController { } @IBAction func doSort(sender: AnyObject) { - if (self.sortButton.title == "Sort Z-A") { + if (self.sortButton.title == NSLocalizedString("Sort Z-A", comment: "")) { let sd: XuniSortDescription = XuniSortDescription(property: "title", ascending: false) self.collectionView.sortDescriptions.removeAllObjects() self.collectionView.sortDescriptions.addObject(sd) self.tableView.reloadData() - self.sortButton.title = "Sort A-Z" + self.sortButton.title = NSLocalizedString("Sort A-Z", comment: "") } else { let sd: XuniSortDescription = XuniSortDescription(property: "title", ascending: true) self.collectionView.sortDescriptions.removeAllObjects() self.collectionView.sortDescriptions.addObject(sd) self.tableView.reloadData() - self.sortButton.title = "Sort Z-A" + self.sortButton.title = NSLocalizedString("Sort Z-A", comment: "") } } diff --git a/Swift/CollectionView101/CollectionView101/en.lproj/Localizable.strings b/Swift/CollectionView101/CollectionView101/en.lproj/Localizable.strings new file mode 100644 index 0000000..7f7059a --- /dev/null +++ b/Swift/CollectionView101/CollectionView101/en.lproj/Localizable.strings @@ -0,0 +1,10 @@ +/* + Localizable.strings + CollectionView101 + + Copyright © 2016 GrapeCity. All rights reserved. +*/ + +"Sort A-Z" = "Sort A-Z"; + +"Sort Z-A" = "Sort Z-A"; \ No newline at end of file diff --git a/Swift/CollectionView101/CollectionView101/ja.lproj/Localizable.strings b/Swift/CollectionView101/CollectionView101/ja.lproj/Localizable.strings new file mode 100644 index 0000000..00c7da1 --- /dev/null +++ b/Swift/CollectionView101/CollectionView101/ja.lproj/Localizable.strings @@ -0,0 +1,10 @@ +/* + Localizable.strings + CollectionView101 + + Copyright © 2016 GrapeCity. All rights reserved. +*/ + +"Sort A-Z" = "昇順(A-Z)"; + +"Sort Z-A" = "降順(Z-A)"; \ No newline at end of file diff --git a/Swift/CollectionView101/CollectionView101/ja.lproj/Main.strings b/Swift/CollectionView101/CollectionView101/ja.lproj/Main.strings index 17c3950..fbd83be 100644 --- a/Swift/CollectionView101/CollectionView101/ja.lproj/Main.strings +++ b/Swift/CollectionView101/CollectionView101/ja.lproj/Main.strings @@ -3,91 +3,91 @@ "0Wn-El-nmX.text" = ">"; /* Class = "UILabel"; text = "Sorting"; ObjectID = "0ft-v2-ojG"; */ -"0ft-v2-ojG.text" = "Sorting"; +"0ft-v2-ojG.text" = "ソート"; /* Class = "UILabel"; text = "Detail"; ObjectID = "4na-Qg-5gl"; */ -"4na-Qg-5gl.text" = "Detail"; +"4na-Qg-5gl.text" = "詳細"; /* Class = "UILabel"; text = "Displays a grouped list of YouTube videos"; ObjectID = "5gY-WI-I4l"; */ -"5gY-WI-I4l.text" = "Displays a grouped list of YouTube videos"; +"5gY-WI-I4l.text" = "リストをグループ化して表示"; /* Class = "UIViewController"; title = "YouTube OnDemand"; ObjectID = "69x-Gx-Nb6"; */ -"69x-Gx-Nb6.title" = "YouTube OnDemand"; +"69x-Gx-Nb6.title" = "YouTube オンデマンド"; /* Class = "UILabel"; text = "Shows on-demand loading with a ListView"; ObjectID = "6QK-Cc-y15"; */ -"6QK-Cc-y15.text" = "Shows on-demand loading with a ListView"; +"6QK-Cc-y15.text" = "表示時にデータを要求してリストビューに読み込み"; /* Class = "UINavigationController"; title = "CollectionView101"; ObjectID = "798-98-Js3"; */ "798-98-Js3.title" = "CollectionView101"; /* Class = "UITableViewController"; title = "Sorting"; ObjectID = "7ih-MR-4Cm"; */ -"7ih-MR-4Cm.title" = "Sorting"; +"7ih-MR-4Cm.title" = "ソート"; /* Class = "UITableViewController"; title = "CollectionView101"; ObjectID = "A3s-lV-pdi"; */ "A3s-lV-pdi.title" = "CollectionView101"; /* Class = "UILabel"; text = "Title"; ObjectID = "Anb-IA-gi3"; */ -"Anb-IA-gi3.text" = "Title"; +"Anb-IA-gi3.text" = "タイトル"; /* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "DtY-OV-zVb"; */ -"DtY-OV-zVb.title" = "Back"; +"DtY-OV-zVb.title" = "戻る"; /* Class = "UINavigationItem"; title = "Grouping"; ObjectID = "Eop-Sz-bMd"; */ -"Eop-Sz-bMd.title" = "Grouping"; +"Eop-Sz-bMd.title" = "グループ化"; /* Class = "UINavigationItem"; title = "Filtering Demo"; ObjectID = "F1y-Xk-xGA"; */ -"F1y-Xk-xGA.title" = "Filtering Demo"; +"F1y-Xk-xGA.title" = "フィルター処理"; /* Class = "UILabel"; text = "Simple OnDemand"; ObjectID = "F73-Yk-65J"; */ -"F73-Yk-65J.text" = "Simple OnDemand"; +"F73-Yk-65J.text" = "シンプルオンデマンド"; /* Class = "UITextField"; placeholder = "Enter your search request"; ObjectID = "FzP-fF-yx0"; */ -"FzP-fF-yx0.placeholder" = "Enter your search request"; +"FzP-fF-yx0.placeholder" = "検索するキーワードを入力"; /* Class = "UILabel"; text = "Sort a list of items from the action bar"; ObjectID = "GLZ-02-Gdg"; */ -"GLZ-02-Gdg.text" = "Sort a list of items from the action bar"; +"GLZ-02-Gdg.text" = "アクションバーを操作して項目をソート"; /* Class = "UITableViewController"; title = "Filtering Subview"; ObjectID = "HE6-a9-uUW"; */ -"HE6-a9-uUW.title" = "Filtering Subview"; +"HE6-a9-uUW.title" = "フィルター処理 補助画面"; /* Class = "UISegmentedControl"; IfT-lu-aWn.segmentTitles[0] = "Relevance"; ObjectID = "IfT-lu-aWn"; */ -"IfT-lu-aWn.segmentTitles[0]" = "Relevance"; +"IfT-lu-aWn.segmentTitles[0]" = "関連性"; /* Class = "UISegmentedControl"; IfT-lu-aWn.segmentTitles[1] = "Date"; ObjectID = "IfT-lu-aWn"; */ -"IfT-lu-aWn.segmentTitles[1]" = "Date"; +"IfT-lu-aWn.segmentTitles[1]" = "日付"; /* Class = "UISegmentedControl"; IfT-lu-aWn.segmentTitles[2] = "View Count"; ObjectID = "IfT-lu-aWn"; */ -"IfT-lu-aWn.segmentTitles[2]" = "View Count"; +"IfT-lu-aWn.segmentTitles[2]" = "閲覧数"; /* Class = "UISegmentedControl"; IfT-lu-aWn.segmentTitles[3] = "Rating"; ObjectID = "IfT-lu-aWn"; */ -"IfT-lu-aWn.segmentTitles[3]" = "Rating"; +"IfT-lu-aWn.segmentTitles[3]" = "評価"; /* Class = "UISegmentedControl"; IfT-lu-aWn.segmentTitles[4] = "Title"; ObjectID = "IfT-lu-aWn"; */ -"IfT-lu-aWn.segmentTitles[4]" = "Title"; +"IfT-lu-aWn.segmentTitles[4]" = "タイトル"; /* Class = "UILabel"; text = "Detail"; ObjectID = "IpZ-Hb-7b0"; */ -"IpZ-Hb-7b0.text" = "Detail"; +"IpZ-Hb-7b0.text" = "詳細"; /* Class = "UILabel"; text = "Filtering"; ObjectID = "JAY-lX-H0m"; */ -"JAY-lX-H0m.text" = "Filtering"; +"JAY-lX-H0m.text" = "フィルター処理"; /* Class = "UINavigationItem"; title = "Simple OnDemand"; ObjectID = "JXY-hG-Bev"; */ -"JXY-hG-Bev.title" = "Simple OnDemand"; +"JXY-hG-Bev.title" = "シンプルオンデマンド"; /* Class = "UINavigationItem"; title = "Sorting"; ObjectID = "Jcm-u1-tk4"; */ -"Jcm-u1-tk4.title" = "Sorting"; +"Jcm-u1-tk4.title" = "ソート"; /* Class = "UILabel"; text = "Grouping"; ObjectID = "KOu-Xm-dsd"; */ -"KOu-Xm-dsd.text" = "Grouping"; +"KOu-Xm-dsd.text" = "グループ化"; /* Class = "UILabel"; text = ">"; ObjectID = "L4e-gD-TaT"; */ "L4e-gD-TaT.text" = ">"; /* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "PaI-0O-mFv"; */ -"PaI-0O-mFv.title" = "Back"; +"PaI-0O-mFv.title" = "戻る"; /* Class = "UILabel"; text = "Detail"; ObjectID = "S6E-uQ-8gP"; */ -"S6E-uQ-8gP.text" = "Detail"; +"S6E-uQ-8gP.text" = "詳細"; /* Class = "UILabel"; text = ">"; ObjectID = "W5a-cG-S8t"; */ "W5a-cG-S8t.text" = ">"; @@ -96,58 +96,58 @@ "XJb-4a-6I6.text" = ">"; /* Class = "UIViewController"; title = "Filtering Demo"; ObjectID = "ZzD-FA-sPI"; */ -"ZzD-FA-sPI.title" = "Filtering Demo"; +"ZzD-FA-sPI.title" = "フィルター処理"; /* Class = "UILabel"; text = "Shows on-demand loading with YouTube API"; ObjectID = "aEa-i1-YqZ"; */ -"aEa-i1-YqZ.text" = "Shows on-demand loading with YouTube API"; +"aEa-i1-YqZ.text" = "YouTube APIを使用したロードオンデマンド"; /* Class = "UILabel"; text = "Filters a list of items by typing in an Entry"; ObjectID = "ali-Ve-8YO"; */ -"ali-Ve-8YO.text" = "Filters a list of items by typing in an Entry"; +"ali-Ve-8YO.text" = "テキストを入力して項目をフィルタリング"; /* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "amh-J3-5Vm"; */ -"amh-J3-5Vm.title" = "Back"; +"amh-J3-5Vm.title" = "戻る"; /* Class = "UIBarButtonItem"; title = "Sort"; ObjectID = "cDH-85-JES"; */ -"cDH-85-JES.title" = "Sort"; +"cDH-85-JES.title" = "ソート"; /* Class = "UILabel"; text = "Title"; ObjectID = "dnA-mh-F16"; */ -"dnA-mh-F16.text" = "Title"; +"dnA-mh-F16.text" = "タイトル"; /* Class = "UINavigationItem"; title = "CollectionView101"; ObjectID = "fCS-cL-WFr"; */ "fCS-cL-WFr.title" = "CollectionView101"; /* Class = "UILabel"; text = "Detail"; ObjectID = "ia5-D3-eAA"; */ -"ia5-D3-eAA.text" = "Detail"; +"ia5-D3-eAA.text" = "詳細"; /* Class = "UILabel"; text = "Title"; ObjectID = "lkP-cp-Jjv"; */ -"lkP-cp-Jjv.text" = "Title"; +"lkP-cp-Jjv.text" = "タイトル"; /* Class = "UITextField"; placeholder = "Enter your search request"; ObjectID = "m8O-7S-noj"; */ -"m8O-7S-noj.placeholder" = "Enter your search request"; +"m8O-7S-noj.placeholder" = "検索するキーワードを入力"; /* Class = "UILabel"; text = "YouTube OnDemand"; ObjectID = "qaW-JU-eaf"; */ -"qaW-JU-eaf.text" = "YouTube OnDemand"; +"qaW-JU-eaf.text" = "YouTube オンデマンド"; /* Class = "UILabel"; text = "Title"; ObjectID = "rKx-lQ-Ibr"; */ -"rKx-lQ-Ibr.text" = "Title"; +"rKx-lQ-Ibr.text" = "タイトル"; /* Class = "UILabel"; text = "Title"; ObjectID = "sLW-zD-73r"; */ -"sLW-zD-73r.text" = "Title"; +"sLW-zD-73r.text" = "タイトル"; /* Class = "UINavigationItem"; title = "YouTube OnDemand"; ObjectID = "snp-Lp-uik"; */ -"snp-Lp-uik.title" = "YouTube OnDemand"; +"snp-Lp-uik.title" = "YouTube オンデマンド"; /* Class = "UITableViewController"; title = "Sorting"; ObjectID = "tEM-Ha-q5d"; */ -"tEM-Ha-q5d.title" = "Sorting"; +"tEM-Ha-q5d.title" = "ソート"; /* Class = "UITableViewController"; title = "Grouping"; ObjectID = "ujQ-dv-l4y"; */ -"ujQ-dv-l4y.title" = "Grouping"; +"ujQ-dv-l4y.title" = "グループ化"; /* Class = "UILabel"; text = ">"; ObjectID = "vNr-Nf-FJA"; */ "vNr-Nf-FJA.text" = ">"; /* Class = "UITableViewController"; title = "Sorting"; ObjectID = "wLZ-oO-gNR"; */ -"wLZ-oO-gNR.title" = "Sorting"; +"wLZ-oO-gNR.title" = "ソート"; /* Class = "UILabel"; text = "Detail"; ObjectID = "yLd-8q-2dX"; */ -"yLd-8q-2dX.text" = "Detail"; +"yLd-8q-2dX.text" = "詳細"; diff --git a/Swift/FlexChart101/FlexChart101.xcodeproj/project.pbxproj b/Swift/FlexChart101/FlexChart101.xcodeproj/project.pbxproj index f70ba0d..65eceda 100644 --- a/Swift/FlexChart101/FlexChart101.xcodeproj/project.pbxproj +++ b/Swift/FlexChart101/FlexChart101.xcodeproj/project.pbxproj @@ -7,17 +7,16 @@ objects = { /* Begin PBXBuildFile section */ - 8407E6921BA170B3001C1582 /* LineMarkerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8407E6911BA170B3001C1582 /* LineMarkerController.swift */; }; - 8435C94B1C86ACB6001AC90E /* ChartAnnotationsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8435C94A1C86ACB6001AC90E /* ChartAnnotationsController.swift */; }; - 8456E5891C7D41B7007DBBC9 /* XuniChartCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8456E5861C7D41B7007DBBC9 /* XuniChartCoreKit.framework */; }; - 8456E58A1C7D41B7007DBBC9 /* XuniCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8456E5871C7D41B7007DBBC9 /* XuniCoreKit.framework */; }; - 8456E58B1C7D41B7007DBBC9 /* XuniFlexChartKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8456E5881C7D41B7007DBBC9 /* XuniFlexChartKit.framework */; }; - 84D2E7A01C03043800D46662 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 84D2E7A21C03043800D46662 /* Localizable.strings */; }; - 84D4F3161BCCB08D000B5960 /* ConditionalFormattingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D4F3131BCCB08D000B5960 /* ConditionalFormattingController.swift */; }; - 84D4F3171BCCB08D000B5960 /* CustomPlotElementsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D4F3151BCCB08D000B5960 /* CustomPlotElementsController.swift */; }; - 84D4F3201BCF89A1000B5960 /* ScrollingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D4F31F1BCF89A1000B5960 /* ScrollingController.swift */; }; - 84E33AB91B8D6BF4002AE146 /* UpdateAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E33AB81B8D6BF4002AE146 /* UpdateAnimationController.swift */; }; - F2160FD71B18EC0E00F3ADD5 /* LoadAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2160FD61B18EC0E00F3ADD5 /* LoadAnimationController.swift */; }; + 8497208B1C63496B001F538B /* ChartAnnotationsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8497208A1C63496B001F538B /* ChartAnnotationsController.swift */; }; + 84D2BA071BDDD4DA00EDD0F9 /* LineMarkerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D2BA061BDDD4DA00EDD0F9 /* LineMarkerController.swift */; }; + 84D2BA091BDF14A100EDD0F9 /* ConditionalFormattingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D2BA081BDF14A100EDD0F9 /* ConditionalFormattingController.swift */; }; + 84D2BA0B1BDF255900EDD0F9 /* CustomPlotElementsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D2BA0A1BDF255900EDD0F9 /* CustomPlotElementsController.swift */; }; + 84D2BA111BE077B900EDD0F9 /* LoadAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D2BA101BE077B900EDD0F9 /* LoadAnimationController.swift */; }; + 84D2BA131BE07C0000EDD0F9 /* UpdateAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D2BA121BE07C0000EDD0F9 /* UpdateAnimationController.swift */; }; + 84D2BA171BE0BFB200EDD0F9 /* ScrollingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D2BA161BE0BFB200EDD0F9 /* ScrollingController.swift */; }; + ED2F25431D07E5560083217E /* XuniChartCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2F25401D07E5560083217E /* XuniChartCoreKit.framework */; }; + ED2F25441D07E5560083217E /* XuniCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2F25411D07E5560083217E /* XuniCoreKit.framework */; }; + ED2F25451D07E5560083217E /* XuniFlexChartKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2F25421D07E5560083217E /* XuniFlexChartKit.framework */; }; F273C2101B45D38000958473 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F273C20F1B45D38000958473 /* AppDelegate.swift */; }; F273C2121B45D38000958473 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F273C2111B45D38000958473 /* ViewController.swift */; }; F273C2151B45D38000958473 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F273C2131B45D38000958473 /* Main.storyboard */; }; @@ -61,21 +60,16 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 8407E6911BA170B3001C1582 /* LineMarkerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LineMarkerController.swift; sourceTree = ""; }; - 8435C94A1C86ACB6001AC90E /* ChartAnnotationsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartAnnotationsController.swift; sourceTree = ""; }; - 8456E5861C7D41B7007DBBC9 /* XuniChartCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniChartCoreKit.framework; path = "../../../ObjectiveC/DerivedData/FlexChartWorkspace/Build/Products/Debug-framework/XuniChartCoreKit.framework"; sourceTree = ""; }; - 8456E5871C7D41B7007DBBC9 /* XuniCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreKit.framework; path = "../../../ObjectiveC/DerivedData/FlexChartWorkspace/Build/Products/Debug-framework/XuniCoreKit.framework"; sourceTree = ""; }; - 8456E5881C7D41B7007DBBC9 /* XuniFlexChartKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniFlexChartKit.framework; path = "../../../ObjectiveC/DerivedData/FlexChartWorkspace/Build/Products/Debug-framework/XuniFlexChartKit.framework"; sourceTree = ""; }; - 84D2E79C1C0303D500D46662 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/LaunchScreen.strings; sourceTree = ""; }; - 84D2E79D1C0303D500D46662 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Main.strings; sourceTree = ""; }; - 84D2E7A11C03043800D46662 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; - 84D2E7A31C03043B00D46662 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; - 84D2E7A41C03043C00D46662 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; - 84D4F3131BCCB08D000B5960 /* ConditionalFormattingController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConditionalFormattingController.swift; sourceTree = ""; }; - 84D4F3151BCCB08D000B5960 /* CustomPlotElementsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomPlotElementsController.swift; sourceTree = ""; }; - 84D4F31F1BCF89A1000B5960 /* ScrollingController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScrollingController.swift; sourceTree = ""; }; - 84E33AB81B8D6BF4002AE146 /* UpdateAnimationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdateAnimationController.swift; sourceTree = ""; }; - F2160FD61B18EC0E00F3ADD5 /* LoadAnimationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadAnimationController.swift; sourceTree = ""; }; + 8497208A1C63496B001F538B /* ChartAnnotationsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartAnnotationsController.swift; sourceTree = ""; }; + 84D2BA061BDDD4DA00EDD0F9 /* LineMarkerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LineMarkerController.swift; sourceTree = ""; }; + 84D2BA081BDF14A100EDD0F9 /* ConditionalFormattingController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConditionalFormattingController.swift; sourceTree = ""; }; + 84D2BA0A1BDF255900EDD0F9 /* CustomPlotElementsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomPlotElementsController.swift; sourceTree = ""; }; + 84D2BA101BE077B900EDD0F9 /* LoadAnimationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadAnimationController.swift; sourceTree = ""; }; + 84D2BA121BE07C0000EDD0F9 /* UpdateAnimationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdateAnimationController.swift; sourceTree = ""; }; + 84D2BA161BE0BFB200EDD0F9 /* ScrollingController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScrollingController.swift; sourceTree = ""; }; + ED2F25401D07E5560083217E /* XuniChartCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniChartCoreKit.framework; path = ../../../Controls/XuniChartCoreKit.framework; sourceTree = ""; }; + ED2F25411D07E5560083217E /* XuniCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreKit.framework; path = ../../../Controls/XuniCoreKit.framework; sourceTree = ""; }; + ED2F25421D07E5560083217E /* XuniFlexChartKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniFlexChartKit.framework; path = ../../../Controls/XuniFlexChartKit.framework; sourceTree = ""; }; F273C20A1B45D38000958473 /* FlexChart101.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FlexChart101.app; sourceTree = BUILT_PRODUCTS_DIR; }; F273C20E1B45D38000958473 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; F273C20F1B45D38000958473 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -117,9 +111,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8456E5891C7D41B7007DBBC9 /* XuniChartCoreKit.framework in Frameworks */, - 8456E58A1C7D41B7007DBBC9 /* XuniCoreKit.framework in Frameworks */, - 8456E58B1C7D41B7007DBBC9 /* XuniFlexChartKit.framework in Frameworks */, + ED2F25431D07E5560083217E /* XuniChartCoreKit.framework in Frameworks */, + ED2F25441D07E5560083217E /* XuniCoreKit.framework in Frameworks */, + ED2F25451D07E5560083217E /* XuniFlexChartKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -136,9 +130,9 @@ F273C2011B45D38000958473 = { isa = PBXGroup; children = ( - 8456E5861C7D41B7007DBBC9 /* XuniChartCoreKit.framework */, - 8456E5871C7D41B7007DBBC9 /* XuniCoreKit.framework */, - 8456E5881C7D41B7007DBBC9 /* XuniFlexChartKit.framework */, + ED2F25401D07E5560083217E /* XuniChartCoreKit.framework */, + ED2F25411D07E5560083217E /* XuniCoreKit.framework */, + ED2F25421D07E5560083217E /* XuniFlexChartKit.framework */, F273C20C1B45D38000958473 /* FlexChart101 */, F273C2221B45D38000958473 /* FlexChart101Tests */, F273C20B1B45D38000958473 /* Products */, @@ -160,11 +154,11 @@ F273C20F1B45D38000958473 /* AppDelegate.swift */, F273C2311B45D66100958473 /* BasicChartTypesController.swift */, F273C2371B45D69A00958473 /* BubbleChartController.swift */, - 8435C94A1C86ACB6001AC90E /* ChartAnnotationsController.swift */, + 8497208A1C63496B001F538B /* ChartAnnotationsController.swift */, F273C2551B45D7DF00958473 /* ChartData.swift */, - 84D4F3131BCCB08D000B5960 /* ConditionalFormattingController.swift */, + 84D2BA081BDF14A100EDD0F9 /* ConditionalFormattingController.swift */, F273C23F1B45D6E000958473 /* CustomizingAxesController.swift */, - 84D4F3151BCCB08D000B5960 /* CustomPlotElementsController.swift */, + 84D2BA0A1BDF255900EDD0F9 /* CustomPlotElementsController.swift */, F273C2391B45D6AE00958473 /* CustomTooltipsController.swift */, F2BEDB9F1B73E6BE00DD2454 /* DataLabelController.swift */, F273C25B1B45D81700958473 /* DynamicChartData.swift */, @@ -178,19 +172,19 @@ F273C2181B45D38000958473 /* LaunchScreen.xib */, F273C2431B45D71B00958473 /* LegendAndTitlesController.swift */, F273C25F1B45D83400958473 /* License.swift */, - 8407E6911BA170B3001C1582 /* LineMarkerController.swift */, - F2160FD61B18EC0E00F3ADD5 /* LoadAnimationController.swift */, + 84D2BA061BDDD4DA00EDD0F9 /* LineMarkerController.swift */, + 84D2BA101BE077B900EDD0F9 /* LoadAnimationController.swift */, F273C2131B45D38000958473 /* Main.storyboard */, F273C2331B45D67300958473 /* MixedChartTypesController.swift */, F273C2531B45D7C700958473 /* MultipleAxesController.swift */, - 84D4F31F1BCF89A1000B5960 /* ScrollingController.swift */, + 84D2BA161BE0BFB200EDD0F9 /* ScrollingController.swift */, F273C2451B45D72D00958473 /* SelectionModesController.swift */, F273C2511B45D7AF00958473 /* SnapshotController.swift */, F273C23D1B45D6CF00958473 /* StylingSeriesController.swift */, F273C20D1B45D38000958473 /* Supporting Files */, F273C23B1B45D6BD00958473 /* ThemingController.swift */, F273C2471B45D73E00958473 /* TogglesSeriesController.swift */, - 84E33AB81B8D6BF4002AE146 /* UpdateAnimationController.swift */, + 84D2BA121BE07C0000EDD0F9 /* UpdateAnimationController.swift */, F273C2111B45D38000958473 /* ViewController.swift */, F273C25D1B45D82900958473 /* WeatherData.swift */, F273C24D1B45D77C00958473 /* ZoomingAndScrollingController.swift */, @@ -202,7 +196,6 @@ isa = PBXGroup; children = ( F273C20E1B45D38000958473 /* Info.plist */, - 84D2E7A21C03043800D46662 /* Localizable.strings */, ); name = "Supporting Files"; sourceTree = ""; @@ -288,7 +281,6 @@ knownRegions = ( en, Base, - ja, ); mainGroup = F273C2011B45D38000958473; productRefGroup = F273C20B1B45D38000958473 /* Products */; @@ -307,7 +299,6 @@ buildActionMask = 2147483647; files = ( F273C2151B45D38000958473 /* Main.storyboard in Resources */, - 84D2E7A01C03043800D46662 /* Localizable.strings in Resources */, F273C21A1B45D38000958473 /* LaunchScreen.xib in Resources */, F273C2171B45D38000958473 /* Images.xcassets in Resources */, ); @@ -327,22 +318,18 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 84D4F3161BCCB08D000B5960 /* ConditionalFormattingController.swift in Sources */, - 84D4F3171BCCB08D000B5960 /* CustomPlotElementsController.swift in Sources */, - 84D4F3201BCF89A1000B5960 /* ScrollingController.swift in Sources */, - 8407E6921BA170B3001C1582 /* LineMarkerController.swift in Sources */, F273C2361B45D68900958473 /* FinancialChartController.swift in Sources */, + 84D2BA131BE07C0000EDD0F9 /* UpdateAnimationController.swift in Sources */, F273C2441B45D71B00958473 /* LegendAndTitlesController.swift in Sources */, F2BEDBA01B73E6BE00DD2454 /* DataLabelController.swift in Sources */, F273C2301B45D65000958473 /* GettingStartedController.swift in Sources */, - 84E33AB91B8D6BF4002AE146 /* UpdateAnimationController.swift in Sources */, - F2160FD71B18EC0E00F3ADD5 /* LoadAnimationController.swift in Sources */, + 84D2BA171BE0BFB200EDD0F9 /* ScrollingController.swift in Sources */, F273C2601B45D83400958473 /* License.swift in Sources */, - 8435C94B1C86ACB6001AC90E /* ChartAnnotationsController.swift in Sources */, F273C2561B45D7DF00958473 /* ChartData.swift in Sources */, F273C2121B45D38000958473 /* ViewController.swift in Sources */, F273C25E1B45D82900958473 /* WeatherData.swift in Sources */, F273C2401B45D6E000958473 /* CustomizingAxesController.swift in Sources */, + 8497208B1C63496B001F538B /* ChartAnnotationsController.swift in Sources */, F273C24C1B45D76400958473 /* DynamicChartsController.swift in Sources */, F273C23C1B45D6BD00958473 /* ThemingController.swift in Sources */, F273C2541B45D7C700958473 /* MultipleAxesController.swift in Sources */, @@ -355,11 +342,15 @@ F273C2501B45D79200958473 /* HitTestController.swift in Sources */, F273C2521B45D7AF00958473 /* SnapshotController.swift in Sources */, F273C25C1B45D81700958473 /* DynamicChartData.swift in Sources */, + 84D2BA0B1BDF255900EDD0F9 /* CustomPlotElementsController.swift in Sources */, F273C2101B45D38000958473 /* AppDelegate.swift in Sources */, F273C24E1B45D77C00958473 /* ZoomingAndScrollingController.swift in Sources */, F273C25A1B45D80200958473 /* HitTestData.swift in Sources */, F273C23A1B45D6AE00958473 /* CustomTooltipsController.swift in Sources */, + 84D2BA091BDF14A100EDD0F9 /* ConditionalFormattingController.swift in Sources */, F273C2321B45D66100958473 /* BasicChartTypesController.swift in Sources */, + 84D2BA071BDDD4DA00EDD0F9 /* LineMarkerController.swift in Sources */, + 84D2BA111BE077B900EDD0F9 /* LoadAnimationController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -382,21 +373,10 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ - 84D2E7A21C03043800D46662 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 84D2E7A11C03043800D46662 /* Base */, - 84D2E7A31C03043B00D46662 /* en */, - 84D2E7A41C03043C00D46662 /* ja */, - ); - name = Localizable.strings; - sourceTree = ""; - }; F273C2131B45D38000958473 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( F273C2141B45D38000958473 /* Base */, - 84D2E79D1C0303D500D46662 /* ja */, ); name = Main.storyboard; sourceTree = ""; @@ -405,7 +385,6 @@ isa = PBXVariantGroup; children = ( F273C2191B45D38000958473 /* Base */, - 84D2E79C1C0303D500D46662 /* ja */, ); name = LaunchScreen.xib; sourceTree = ""; @@ -434,6 +413,7 @@ COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = "/Users/kotyuck/Desktop/Volumes/main-frameworks"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -480,6 +460,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = "/Users/kotyuck/Desktop/Volumes/main-frameworks"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -501,12 +482,8 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - ../../../Controls, - ); + FRAMEWORK_SEARCH_PATHS = ../../../Controls; INFOPLIST_FILE = FlexChart101/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; }; @@ -517,12 +494,8 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - ../../../Controls, - ); + FRAMEWORK_SEARCH_PATHS = ../../../Controls; INFOPLIST_FILE = FlexChart101/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; }; diff --git a/Swift/FlexChart101/FlexChart101/Base.lproj/Main.storyboard b/Swift/FlexChart101/FlexChart101/Base.lproj/Main.storyboard index dc81b79..78d3f26 100644 --- a/Swift/FlexChart101/FlexChart101/Base.lproj/Main.storyboard +++ b/Swift/FlexChart101/FlexChart101/Base.lproj/Main.storyboard @@ -1,5 +1,5 @@ - + diff --git a/Swift/FlexChart101/FlexChart101/ChartData.swift b/Swift/FlexChart101/FlexChart101/ChartData.swift index 46c3beb..4a175a8 100644 --- a/Swift/FlexChart101/FlexChart101/ChartData.swift +++ b/Swift/FlexChart101/FlexChart101/ChartData.swift @@ -85,4 +85,16 @@ class ChartPoint : NSObject { return points } + + class func generateRandomData(count: Int) -> NSMutableArray { + let points = NSMutableArray() + + + for var i = 0; i < count; i++ { + var random :Double = (Double)(arc4random()%10000) + 100.0 + points.addObject(ChartPoint.init(x: (Double)(i*10), y: random)) + } + + return points + } } diff --git a/Swift/FlexChart101/FlexChart101/ConditionalFormattingController.swift b/Swift/FlexChart101/FlexChart101/ConditionalFormattingController.swift index a8f3455..497f43b 100644 --- a/Swift/FlexChart101/FlexChart101/ConditionalFormattingController.swift +++ b/Swift/FlexChart101/FlexChart101/ConditionalFormattingController.swift @@ -28,19 +28,19 @@ class ConditionalFormattingController: UIViewController { _chart.axisY.format = "F1" _chart.axisX.format = "F1" - func plotElementLoadingHandler(sender: NSObject!, args: XuniEventArgs!) { - var plotArgs = args as! XuniChartPlotElementEventArgs + func plotElementLoadingHandler(args: XuniEventContainer!) { + let plotArgs = args.eventArgs as! XuniChartPlotElementEventArgs if plotArgs.dataPoint != nil && plotArgs.defaultRender != nil { - var y = plotArgs.dataPoint.value; + let y = plotArgs.dataPoint.value; // change color values based on y-axis values - var r = (y >= 0 ? 1 : ((1 + y))) - var b = (y < 0 ? 1 : ((1 - y))) - var g = (1 - fabs(y)) - var a = 0.8 + let r = (y >= 0 ? 1 : ((1 + y))) + let b = (y < 0 ? 1 : ((1 - y))) + let g = (1 - fabs(y)) + let a = 0.8 (plotArgs.renderEngine as! XuniRenderEngine).setFill(UIColor(red: CGFloat(r), green: CGFloat(g), blue: CGFloat(b), alpha: CGFloat(a))) - (plotArgs.defaultRender as! IXuniFunction).execute(nil) + plotArgs.defaultRender.execute() } } _chart.plotElementLoading.addHandler(plotElementLoadingHandler, forObject: self) @@ -59,7 +59,7 @@ class ConditionalFormattingController: UIViewController { } func getData() -> NSMutableArray { - var array = NSMutableArray() + let array = NSMutableArray() for var i = 0; i < 30; i++ { array.addObject(ChartPoint(x: (0.16 * Double(i)), y: cos(0.12 * Double(i)))) diff --git a/Swift/FlexChart101/FlexChart101/CustomPlotElementsController.swift b/Swift/FlexChart101/FlexChart101/CustomPlotElementsController.swift index aa1db66..19dc7c4 100644 --- a/Swift/FlexChart101/FlexChart101/CustomPlotElementsController.swift +++ b/Swift/FlexChart101/FlexChart101/CustomPlotElementsController.swift @@ -31,20 +31,21 @@ class CustomPlotElementsController: UIViewController { _chart.axisX.majorTickWidth = 0 _chart.axisX.minorTickWidth = 1 - func plotElementLoadingHandler(sender: NSObject!, args: XuniEventArgs!) { - var plotArgs = args as! XuniChartPlotElementEventArgs + func plotElementLoadingHandler(args: XuniEventContainer!) { + let plotArgs = args.eventArgs as! XuniChartPlotElementEventArgs if plotArgs.renderEngine != nil && plotArgs.hitTestInfo != nil && plotArgs.defaultRender != nil { (plotArgs.renderEngine as! XuniRenderEngine).setFill(UIColor.grayColor()) - (plotArgs.defaultRender as! IXuniFunction).execute(nil) + plotArgs.defaultRender.execute() var rect = (plotArgs.defaultRender as! DefaultBarElementRender).getBarRect() - var customPoint: CustomPoint = _chart.itemsSource.objectAtIndex(Int(plotArgs.dataPoint.pointIndex)) as! CustomPoint + let customPoint: CustomPoint = _chart.itemsSource.objectAtIndex(Int(plotArgs.dataPoint.pointIndex)) as! CustomPoint rect.origin.y += (rect.size.height - rect.size.width) / 2; rect.size.height = rect.size.width; customPoint.logo.drawInRect(rect) } } _chart.plotElementLoading.addHandler(plotElementLoadingHandler, forObject: self) + self.view.addSubview(_chart) } diff --git a/Swift/FlexChart101/FlexChart101/CustomizingAxesController.swift b/Swift/FlexChart101/FlexChart101/CustomizingAxesController.swift index 0dc654a..59468e7 100644 --- a/Swift/FlexChart101/FlexChart101/CustomizingAxesController.swift +++ b/Swift/FlexChart101/FlexChart101/CustomizingAxesController.swift @@ -26,17 +26,17 @@ class CustomizingAxesController: UIViewController { _chart.itemsSource = ChartData.demoData() _chart.bindingX = "name" _chart.axisX.title = "Country" - _chart.axisX.lineWidth = 2; - _chart.axisX.minorTickWidth = 1; - _chart.axisX.majorTickWidth = 0; + _chart.axisX.lineWidth = 2 + _chart.axisX.minorTickWidth = 1 + _chart.axisX.majorTickWidth = 0 _chart.axisY.lineWidth = 2 - _chart.axisY.minorGridVisible = true; - _chart.axisY.minorGridWidth = 0.5; - _chart.axisY.minorGridDashes = NSArray(array: [4, 4]) as [AnyObject] - _chart.axisY.minorTickWidth = 1; - _chart.axisY.majorTickWidth = 2; - _chart.axisY.majorGridWidth = 1; + _chart.axisY.minorGridVisible = true + _chart.axisY.minorGridWidth = 0.5 + _chart.axisY.minorGridDashes = NSArray(array: [4, 4]) as! [NSNumber] + _chart.axisY.minorTickWidth = 1 + _chart.axisY.majorTickWidth = 2 + _chart.axisY.majorGridWidth = 1 _chart.axisY.majorGridColor = UIColor(white: 0.8, alpha: 1) _chart.axisY.majorGridFill = UIColor(white: 0.6, alpha: 0.2) @@ -44,19 +44,19 @@ class CustomizingAxesController: UIViewController { _chart.axisY.majorUnit = 1000 _chart.axisY.max = 10000 - func axisXLabelLoadingHandler(sender: NSObject!, args: XuniEventArgs!) { - var labelArgs = args as! XuniLabelLoadingEventArgs + func axisXLabelLoadingHandler(args: XuniEventContainer!) { + let labelArgs = args.eventArgs as! XuniLabelLoadingEventArgs labelArgs.label = nil - var image = UIImage(named:"\(labelArgs.value)")! - var rect = CGRectMake (CGFloat(labelArgs.region.left), CGFloat(labelArgs.region.top), CGFloat(labelArgs.region.width), CGFloat(labelArgs.region.height)) + let image = UIImage(named:"\(labelArgs.value)")! + let rect = CGRectMake (CGFloat(labelArgs.region.left), CGFloat(labelArgs.region.top), CGFloat(labelArgs.region.width), CGFloat(labelArgs.region.height)) image.drawInRect(rect) } _chart.axisX.labelLoading.addHandler(axisXLabelLoadingHandler, forObject: self) - func axisYLabelLoadingHandler(sender: NSObject!, args: XuniEventArgs!) { - var labelArgs = args as! XuniLabelLoadingEventArgs - var renderEngine = labelArgs.renderEngine as! XuniRenderEngine + func axisYLabelLoadingHandler(args: XuniEventContainer!) { + let labelArgs = args.eventArgs as! XuniLabelLoadingEventArgs + let renderEngine = labelArgs.renderEngine as! XuniRenderEngine if (labelArgs.value <= 3000) { renderEngine.setTextFill(UIColor.redColor()) diff --git a/Swift/FlexChart101/FlexChart101/HitTestController.swift b/Swift/FlexChart101/FlexChart101/HitTestController.swift index 7b0d967..a78baa3 100644 --- a/Swift/FlexChart101/FlexChart101/HitTestController.swift +++ b/Swift/FlexChart101/FlexChart101/HitTestController.swift @@ -64,8 +64,8 @@ class HitTestController: UIViewController, FlexChartDelegate { _chartElementLabel.frame = CGRectMake(0, self.view.bounds.size.height * 6 / 8, self.view.bounds.size.width, self.view.bounds.size.height / 16) } - func tapped(sender: FlexChartBase!, point: XuniPoint!) -> Bool { - var hitTest = _chart.hitTest(point) + func tapped(sender: XuniView!, point: XuniPoint!) -> Bool { + let hitTest = _chart.hitTest(point) var seriesName = ""; if (hitTest.dataPoint.seriesIndex >= 0 && hitTest.dataPoint.seriesIndex < Int32(_chart.series.count)) { seriesName = hitTest.dataPoint.seriesName; diff --git a/Swift/FlexChart101/FlexChart101/Images.xcassets/chartscaling.imageset/Contents.json b/Swift/FlexChart101/FlexChart101/Images.xcassets/chartscaling.imageset/Contents.json new file mode 100644 index 0000000..05e7047 --- /dev/null +++ b/Swift/FlexChart101/FlexChart101/Images.xcassets/chartscaling.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "chart_line.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Swift/FlexChart101/FlexChart101/Images.xcassets/chartscaling.imageset/chart_line.png b/Swift/FlexChart101/FlexChart101/Images.xcassets/chartscaling.imageset/chart_line.png new file mode 100644 index 0000000000000000000000000000000000000000..8a848e74e8b1e79d0114bddae06374899c265972 GIT binary patch literal 6342 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 + location = "self:"> diff --git a/Swift/FlexGrid101/FlexGrid101/AppDelegate.swift b/Swift/FlexGrid101/FlexGrid101/AppDelegate.swift index bfb375d..3bdaecb 100644 --- a/Swift/FlexGrid101/FlexGrid101/AppDelegate.swift +++ b/Swift/FlexGrid101/FlexGrid101/AppDelegate.swift @@ -1,22 +1,19 @@ // -// AppDelegate.swift +// AppDelegate.h // FlexGrid101 // // Copyright (c) 2015 GrapeCity. All rights reserved. // - import UIKit -import XuniCoreKit +import XuniCoreDynamicKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { - var window: UIWindow? - - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool { // Override point for customization after application launch. - XuniLicenseManager.setKey(License().key) + XuniLicenseManager.setKey(key) return true } @@ -41,7 +38,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func applicationWillTerminate(application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } - - } - +// +// AppDelegate.m +// FlexGrid101 +// +// Copyright (c) 2015 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/Base.lproj/LaunchScreen.xib b/Swift/FlexGrid101/FlexGrid101/Base.lproj/LaunchScreen.xib index d3eac8d..930cf10 100644 --- a/Swift/FlexGrid101/FlexGrid101/Base.lproj/LaunchScreen.xib +++ b/Swift/FlexGrid101/FlexGrid101/Base.lproj/LaunchScreen.xib @@ -1,8 +1,8 @@ - + - + diff --git a/Swift/FlexGrid101/FlexGrid101/Base.lproj/Localizable.strings b/Swift/FlexGrid101/FlexGrid101/Base.lproj/Localizable.strings index 12c8d18..f44cbc2 100644 --- a/Swift/FlexGrid101/FlexGrid101/Base.lproj/Localizable.strings +++ b/Swift/FlexGrid101/FlexGrid101/Base.lproj/Localizable.strings @@ -2,8 +2,7 @@ Localizable.strings FlexGrid101 - Created by Mykola Kotyuck on 27.11.15. - Copyright © 2015 GrapeCity. All rights reserved. + Copyright (c) 2015 GrapeCity. All rights reserved. */ "On Demand Loading" = "On Demand Loading"; @@ -45,4 +44,11 @@ "Total" = "Total"; "Count" = "Count"; "Edit Columns" = "Edit Columns"; -"Done" = "Done"; \ No newline at end of file +"Done" = "Done"; +"Monday" = "Monday"; +"Tuesday" = "Tuesday"; +"Wednesday" = "Wednesday"; +"Thursday" = "Thursday"; +"Friday" = "Friday"; +"Saturday" = "Saturday"; +"Sunday" = "Sunday"; \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/Base.lproj/Main.storyboard b/Swift/FlexGrid101/FlexGrid101/Base.lproj/Main.storyboard index 649d8c3..a6a5263 100644 --- a/Swift/FlexGrid101/FlexGrid101/Base.lproj/Main.storyboard +++ b/Swift/FlexGrid101/FlexGrid101/Base.lproj/Main.storyboard @@ -1,8 +1,10 @@ - + - + + + @@ -16,33 +18,44 @@ + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + @@ -56,15 +69,15 @@ - + - + - + - - + + @@ -98,10 +111,9 @@ - - + @@ -109,19 +121,19 @@ - - - + + + - + - + @@ -129,13 +141,28 @@ + + + + + + + + + + + + + + + - + @@ -148,13 +175,27 @@ - + + + + + + + + + + + + + + + - + @@ -167,15 +208,30 @@ + + + + + + + + + + + + + + + - + - + @@ -186,36 +242,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + - + - - + + - + - - + + - - + + + + + + + + + + + + + + - + - + - + @@ -228,13 +352,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -247,18 +399,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + - + - + @@ -266,13 +457,27 @@ - + + + + + + + + + + + + + + + - + @@ -285,13 +490,33 @@ + + + + + + + + + + + + + + + + + + + + - + @@ -304,13 +529,28 @@ + + + + + + + + + + + + + + + - + @@ -323,14 +563,34 @@ + + + + + + + + + + + + + + + + + + + + - + @@ -344,6 +604,10 @@ + + + + @@ -658,9 +934,9 @@ - + - + @@ -672,13 +948,17 @@ - + + + + + - + @@ -701,20 +981,26 @@ + + + + - + + - + + - + @@ -729,7 +1015,7 @@ - + @@ -742,7 +1028,7 @@ - + @@ -755,13 +1041,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -794,7 +1124,7 @@ - + @@ -847,7 +1177,7 @@ - + @@ -900,7 +1230,7 @@ - + @@ -953,7 +1283,7 @@ - + @@ -1006,7 +1336,7 @@ - + @@ -1059,7 +1389,7 @@ - + @@ -1112,7 +1442,7 @@ - + @@ -1165,7 +1495,7 @@ - + @@ -1218,7 +1548,7 @@ - + @@ -1271,7 +1601,7 @@ - + @@ -1324,7 +1654,7 @@ - + @@ -1377,7 +1707,7 @@ - + @@ -1430,7 +1760,7 @@ - + @@ -1483,7 +1813,7 @@ - + @@ -1536,7 +1866,7 @@ - + @@ -1585,11 +1915,64 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -1665,27 +2048,89 @@ - - + + + + + + + + + + + + + + + + + + - + + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1696,6 +2141,7 @@ + @@ -1703,7 +2149,4 @@ - - - diff --git a/Swift/FlexGrid101/FlexGrid101/ColumnDefinitionsController.swift b/Swift/FlexGrid101/FlexGrid101/ColumnDefinitionsController.swift new file mode 100644 index 0000000..065fec5 --- /dev/null +++ b/Swift/FlexGrid101/FlexGrid101/ColumnDefinitionsController.swift @@ -0,0 +1,64 @@ +// +// ColumnDefinitionsController.h +// FlexGrid101 +// +// Copyright (c) 2015 GrapeCity. All rights reserved. +// +import UIKit +import XuniFlexGridDynamicKit + +class ColumnDefinitionsController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + self.flex.columnHeaderFont = UIFont.boldSystemFontOfSize(self.flex.columnHeaderFont.pointSize) + self.flex.autoGenerateColumns = false + let active: GridColumn = GridColumn() + active.binding = "active" + active.widthType = GridColumnWidth.Pixel + active.width = 70 + self.flex.columns.addObject(active) + let identifier: GridColumn = GridColumn() + identifier.binding = "customerID" + identifier.isReadOnly = true + identifier.widthType = GridColumnWidth.Pixel + identifier.width = 100 + self.flex.columns.addObject(identifier) + let firstName: GridColumn = GridColumn() + firstName.binding = "firstName" + let lastName: GridColumn = GridColumn() + lastName.binding = "lastName" + self.flex.columns.addObject(lastName) + let orderTotal: GridColumn = GridColumn() + orderTotal.binding = "orderTotal" + orderTotal.format = "C2" + self.flex.columns.addObject(orderTotal) + let countryID: GridColumn = GridColumn() + countryID.binding = "countryID" + countryID.header = "Country" + countryID.horizontalAlignment = .Left + let items = CustomerData.defaultCountries() + countryID.dataMap = GridDataMap(array: items, selectedValuePath: "identifier", displayMemberPath: "title") + self.flex.columns.addObject(countryID) + let lastOrderDate: GridColumn = GridColumn() + lastOrderDate.binding = "lastOrderDate" + self.flex.columns.addObject(lastOrderDate) + let lastOrderTime: GridColumn = GridColumn() + lastOrderTime.binding = "lastOrderDate" + lastOrderTime.header = "Last Order Time" + let datefmt: NSDateFormatter = NSDateFormatter() + datefmt.dateFormat = "hh:mm a" + lastOrderTime.formatter = datefmt + self.flex.columns.addObject(lastOrderTime) + self.flex.itemsSource = NSMutableArray(array: CustomerData.getCustomerData(100)) + self.flex.isReadOnly = false + } + + @IBOutlet weak var flex: FlexGrid! +} +// +// ColumnDefinitionsController.m +// FlexGrid101 +// +// Copyright (c) 2015 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/ColumnLayoutController.swift b/Swift/FlexGrid101/FlexGrid101/ColumnLayoutController.swift index 53862e9..7cb8956 100644 --- a/Swift/FlexGrid101/FlexGrid101/ColumnLayoutController.swift +++ b/Swift/FlexGrid101/FlexGrid101/ColumnLayoutController.swift @@ -1,72 +1,80 @@ -import Foundation +// +// ColumnLayoutController.h +// FlexGrid101 +// +// Copyright © 2015 GrapeCity. All rights reserved. +// import UIKit -import XuniFlexGridKit +import XuniCoreDynamicKit +import XuniFlexGridDynamicKit class ColumnLayoutController: UIViewController { - var flex: FlexGrid! = nil - var editButton: UIBarButtonItem! = nil + @IBOutlet weak var flex: FlexGrid! + var editButton: UIBarButtonItem! + var restoreButton: UIBarButtonItem! + var columnsInitial: GridColumnCollection! + override func viewDidLoad() { - columnLayoutController = self super.viewDidLoad() - editButton = UIBarButtonItem(title: NSLocalizedString("Edit Columns", comment: ""), style: .Plain, target: self, - action: "editColumns:") - self.navigationItem.rightBarButtonItem = editButton + editButton = UIBarButtonItem(title: NSLocalizedString("Edit Columns", comment:""), style: .Plain, target: self, action: #selector(editColumns(_:))) + restoreButton = UIBarButtonItem(title: NSLocalizedString("Restore", comment:""), style: .Plain, target: self, action: #selector(restoreColumns(_:))) + self.navigationItem.rightBarButtonItems = [editButton] self.columnList.hidden = true - self.flex = FlexGrid() - self.flex.columnHeaderFont = UIFont.boldSystemFontOfSize(flex.columnHeaderFont.pointSize) + self.flex.columnHeaderFont = UIFont.boldSystemFontOfSize(self.flex.columnHeaderFont.pointSize) self.flex.isReadOnly = true - self.flex.itemsSource = CustomerData.getCustomerData(100) - self.flex.tag = 1 - flex.autoSizeColumns(0, to: Int32(flex.columns.count) - 1) - view.addSubview(flex) - view.sendSubviewToBack(flex) + self.flex.itemsSource = NSMutableArray(array: CustomerData.getCustomerData(100)) + columnsInitial = GridColumnCollection() + for i: UInt in 0 ..< self.flex.columns.count { + columnsInitial.addObject(self.flex.columns![Int32(i)]) + } + self.flex.autoSizeColumns(0, to: Int32(self.flex.columns.count - 1)) } func beginEditing() { - columnReorderTable.tableView.reloadData() + (self.childViewControllers.first as! ColumnReordererTableViewController).tableView.reloadData() self.columnList.alpha = 0 self.columnList.hidden = false UIView.animateWithDuration(0.7, animations: {() -> Void in self.columnList.alpha = 1 }, completion: {(finished: Bool) -> Void in }) - editButton.title = NSLocalizedString("Done", comment: "") + editButton.title = NSLocalizedString("Done",comment: "") + self.navigationItem.rightBarButtonItems = [editButton, restoreButton] } - @IBOutlet weak var columnList: UIVisualEffectView! - func endEditing() { UIView.animateWithDuration(0.7, animations: {() -> Void in self.columnList.alpha = 0 }, completion: {(finished: Bool) -> Void in self.columnList.hidden = true }) - editButton.title = NSLocalizedString("Edit Columns", comment: "") + editButton.title = NSLocalizedString("Edit Columns",comment: "") + self.navigationItem.rightBarButtonItems = [editButton] + } + + @IBAction func restoreColumns(sender: AnyObject) { + self.flex.columns.removeAllObjects() + for i: UInt in 0 ..< columnsInitial.count { + self.flex.columns.addObject(columnsInitial![Int32(i)]) + } + (self.childViewControllers.first as! ColumnReordererTableViewController).tableView.reloadData() } @IBAction func editColumns(sender: AnyObject) { - if columnList.hidden { - beginEditing() + if self.columnList.hidden { + self.beginEditing() } else { - endEditing() + self.endEditing() } } - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - } - - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - - if (self.navigationController == nil) {return;} - - let ss: CGFloat = UIApplication.sharedApplication().statusBarFrame.size.height + navigationController!.navigationBar.intrinsicContentSize().height - self.flex.frame = CGRectMake(0, ss, view.bounds.size.width, view.bounds.size.height - ss) - flex.setNeedsDisplay() - } + @IBOutlet weak var columnList: UIVisualEffectView! } - -var columnLayoutController: ColumnLayoutController! = nil \ No newline at end of file +// +// ColumnLayoutController.m +// FlexGrid101 +// +// Copyright © 2015 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/ColumnReordererTableViewController.swift b/Swift/FlexGrid101/FlexGrid101/ColumnReordererTableViewController.swift index 00ae9ab..535721a 100644 --- a/Swift/FlexGrid101/FlexGrid101/ColumnReordererTableViewController.swift +++ b/Swift/FlexGrid101/FlexGrid101/ColumnReordererTableViewController.swift @@ -1,11 +1,16 @@ -import Foundation +// +// ColumnReordererTableViewController.h +// FlexGrid101 +// +// Copyright © 2015 GrapeCity. All rights reserved. +// + import UIKit -import XuniFlexGridKit +import XuniFlexGridDynamicKit class ColumnReordererTableViewController: UITableViewController { override func viewDidLoad() { - columnReorderTable = self super.viewDidLoad() self.editing = true } @@ -19,37 +24,41 @@ class ColumnReordererTableViewController: UITableViewController { } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - - if (columnLayoutController == nil) {return 0} - - let fg: FlexGrid! = columnLayoutController.flex + if self.parentViewController == nil + { + return 0 + } + let fg: FlexGrid! = (self.parentViewController as! ColumnLayoutController).flex + if fg == nil + { + return 0 + } return Int(fg.columns.count) } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("CELL", forIndexPath: indexPath) - let fg: FlexGrid = columnLayoutController.flex - let col: FlexColumn = fg.columns.objectAtIndex(UInt(indexPath.row)) as! FlexColumn + let fg: FlexGrid = (self.parentViewController as! ColumnLayoutController).flex + let col: GridColumn = fg.columns![Int32(indexPath.row)] as! GridColumn cell.textLabel!.text = col.header return cell } override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { if editingStyle == .Delete { - let fg: FlexGrid = columnLayoutController.flex + let fg: FlexGrid = (self.parentViewController as! ColumnLayoutController).flex fg.columns.removeObjectAtIndex(UInt(indexPath.row)) tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) } - else { - if editingStyle == .Insert { + else if editingStyle == .Insert { - } } + } override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { - let fg: FlexGrid = columnLayoutController.flex - let fc: FlexColumn = fg.columns.objectAtIndex(UInt(fromIndexPath.row)) as! FlexColumn + let fg: FlexGrid = (self.parentViewController as! ColumnLayoutController).flex + let fc: GridColumn = fg.columns![Int32(fromIndexPath.row)] as! GridColumn fg.columns.removeObjectAtIndex(UInt(fromIndexPath.row)) fg.columns.insertObject(fc, atIndex: UInt(toIndexPath.row)) } @@ -58,6 +67,9 @@ class ColumnReordererTableViewController: UITableViewController { return true } } - - -var columnReorderTable: ColumnReordererTableViewController! = nil +// +// ColumnReordererTableViewController.m +// FlexGrid101 +// +// Copyright © 2015 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/ConditionalFormattingController.swift b/Swift/FlexGrid101/FlexGrid101/ConditionalFormattingController.swift index 18093e6..3489c6e 100644 --- a/Swift/FlexGrid101/FlexGrid101/ConditionalFormattingController.swift +++ b/Swift/FlexGrid101/FlexGrid101/ConditionalFormattingController.swift @@ -1,104 +1,100 @@ // -// ConditionalFormattingController.swift +// ConditionalFormattingController.h // FlexGrid101 // // Copyright © 2015 GrapeCity. All rights reserved. // - import UIKit -import XuniFlexGridKit +import XuniCoreDynamicKit +import XuniFlexGridDynamicKit + +class ConditionalFormattingController: UIViewController { -class ConditionalFormattingController: UIViewController, FlexGridDelegate { - var _flex = FlexGrid() - override func viewDidLoad() { super.viewDidLoad() - - _flex.autoGenerateColumns = false - let c1: FlexColumn = FlexColumn() + self.flex.autoGenerateColumns = false + let c1: GridColumn = GridColumn() c1.binding = "firstName" - c1.header = NSLocalizedString("First Name", comment: "") + c1.header = NSLocalizedString("First Name", comment:"") c1.width = 100 - let c2: FlexColumn = FlexColumn() + let c2: GridColumn = GridColumn() c2.binding = "lastName" - c2.header = NSLocalizedString("Last Name", comment: "") - let c3: FlexColumn = FlexColumn() + c2.header = NSLocalizedString("Last Name", comment:"") + let c3: GridColumn = GridColumn() c3.binding = "orderTotal" - c3.header = NSLocalizedString("Total", comment: "") + c3.header = NSLocalizedString("Total", comment:"") c3.format = "C" - let c4: FlexColumn = FlexColumn() + let c4: GridColumn = GridColumn() c4.binding = "orderCount" - c4.header = NSLocalizedString("Count", comment: "") + c4.header = NSLocalizedString("Count", comment:"") c4.format = "N1" - _flex.columns.addObject(c1) - _flex.columns.addObject(c2) - _flex.columns.addObject(c3) - _flex.columns.addObject(c4) - - - _flex.isReadOnly = true - _flex.itemsSource = CustomerData.getCustomerData(100) - - _flex.delegate = self - - self.view.addSubview(_flex) - } - - func formatItem(sender: FlexGrid!, panel: FlexGridPanel!, forRange range: FlexCellRange!, inContext context: CGContext!) -> Bool - { - if panel.cellType == FlexCellType.Cell { - let g: FlexGrid = _flex - let col: FlexColumn = g.columns.objectAtIndex(UInt(range.col)) as! FlexColumn - if col.binding == "orderCount" { - let n: Int? = panel.getCellDataForRow(range.row, inColumn: range.col, formatted: false) as? Int - if n != nil { - if n! >= 50 { - let r: CGRect = panel.getCellRectForRow(range.row, inColumn: range.col) - CGContextSetFillColorWithColor( - context, UIColor(red: 0.15, green: 0.31, blue: 0.07, alpha: 1.0).CGColor) - CGContextFillRect(context, r) - } - else { - if n! < 50 { - let r: CGRect = panel.getCellRectForRow(range.row, inColumn: range.col) - CGContextSetFillColorWithColor(context, UIColor.redColor().CGColor) - CGContextFillRect(context, r) + self.flex.columns.addObject(c1) + self.flex.columns.addObject(c2) + self.flex.columns.addObject(c3) + self.flex.columns.addObject(c4) + let countryID: GridColumn = GridColumn() + countryID.binding = "countryID" + countryID.header = "Country" + countryID.horizontalAlignment = .Left + let items = (array: CustomerData.defaultCountries()) + countryID.dataMap = GridDataMap(array: items, selectedValuePath: "identifier", displayMemberPath: "title") + self.flex.columns.addObject(countryID) + let lastOrderDate: GridColumn = GridColumn() + lastOrderDate.binding = "lastOrderDate" + self.flex.columns.addObject(lastOrderDate) + let lastOrderTime: GridColumn = GridColumn() + lastOrderTime.binding = "lastOrderDate" + lastOrderTime.header = "Last Order Time" + let datefmt: NSDateFormatter = NSDateFormatter() + datefmt.dateFormat = "hh:mm a" + lastOrderTime.formatter = datefmt + self.flex.columns.addObject(lastOrderTime) + self.flex.columnHeaderFont = UIFont.boldSystemFontOfSize(self.flex.columnHeaderFont.pointSize) + self.flex.isReadOnly = true + self.flex.itemsSource = NSMutableArray(array:CustomerData.getCustomerData(100)) + self.flex.flexGridFormatItem.addHandler({(eventContainer: XuniEventContainer!) -> Void in + let eventContainerEventArgs = eventContainer.eventArgs as! GridFormatItemEventArgs + if eventContainerEventArgs.panel.cellType == GridCellType.Cell { + let g: FlexGrid! = self.flex + let col: GridColumn = g.columns![eventContainerEventArgs.col] as! GridColumn + if (col.binding == "orderCount") { + let n: NSNumber! = eventContainerEventArgs.panel.getCellDataForRow(eventContainerEventArgs.row, inColumn: eventContainerEventArgs.col, formatted: false) as! NSNumber! + if n != nil { + if n.integerValue >= 50 { + let r: CGRect = eventContainerEventArgs.panel.getCellRectForRow(eventContainerEventArgs.row, inColumn: eventContainerEventArgs.col) + CGContextSetFillColorWithColor(eventContainerEventArgs.context, UIColor(red: 0.15, green: 0.31, blue: 0.07, alpha: 1.0).CGColor) + CGContextFillRect(eventContainerEventArgs.context, r) } + else if n.integerValue < 50 { + let r: CGRect = eventContainerEventArgs.panel.getCellRectForRow(eventContainerEventArgs.row, inColumn: eventContainerEventArgs.col) + CGContextSetFillColorWithColor(eventContainerEventArgs.context, UIColor.redColor().CGColor) + CGContextFillRect(eventContainerEventArgs.context, r) + } + + eventContainerEventArgs.panel.textAttributes[NSForegroundColorAttributeName] = UIColor.whiteColor() } - panel.textAttributes.setValue(UIColor.whiteColor(), forKey: NSForegroundColorAttributeName) } - } - if col.binding == "orderTotal" { - let n: Int? = panel.getCellDataForRow(range.row, inColumn: range.col, formatted: false) as? Int - if n != nil { - if n! >= 5000 { - panel.textAttributes.setValue(UIColor(red: 0.15, green: 0.31, blue: 0.07, alpha: 1.0), forKey: NSForegroundColorAttributeName) - } - else { - if n! < 5000 { - panel.textAttributes.setValue(UIColor.redColor(), forKey: NSForegroundColorAttributeName) + if (col.binding == "orderTotal") { + let n: NSNumber! = eventContainerEventArgs.panel.getCellDataForRow(eventContainerEventArgs.row, inColumn: eventContainerEventArgs.col, formatted: false) as! NSNumber! + if n != nil { + if n.integerValue >= 5000 { + eventContainerEventArgs.panel.textAttributes[NSForegroundColorAttributeName] = UIColor(red: 0.15, green: 0.31, blue: 0.07, alpha: 1.0) + } + else if n.integerValue < 5000 { + eventContainerEventArgs.panel.textAttributes[NSForegroundColorAttributeName] = UIColor.redColor() } } } } - } - return false - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. + eventContainerEventArgs.cancel = false + }, forObject: self) } - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - - if (self.navigationController == nil) {return;} - - let ss = UIApplication.sharedApplication().statusBarFrame.size.height + self.navigationController!.navigationBar.intrinsicContentSize().height; - - _flex.frame = CGRectMake(0, ss, self.view.bounds.size.width, self.view.bounds.size.height - ss) - _flex.setNeedsDisplay() - } - + @IBOutlet weak var flex: FlexGrid! } +// +// ConditionalFormattingController.m +// FlexGrid101 +// +// Copyright © 2015 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/CustomCellsController.swift b/Swift/FlexGrid101/FlexGrid101/CustomCellsController.swift index e803ac8..29aad4b 100644 --- a/Swift/FlexGrid101/FlexGrid101/CustomCellsController.swift +++ b/Swift/FlexGrid101/FlexGrid101/CustomCellsController.swift @@ -1,127 +1,96 @@ // -// CustomCellsController.swift +// CustomCellsController.h // FlexGrid101 // // Copyright (c) 2015 GrapeCity. All rights reserved. // - import UIKit -import XuniFlexGridKit -import XuniGaugeKit -class CustomCellsController: UIViewController, FlexGridDelegate { +import XuniCoreDynamicKit +import XuniFlexGridDynamicKit +import XuniGaugeDynamicKit + +class CustomCellsController: UIViewController { - var _flex = FlexGrid() - override func viewDidLoad() { super.viewDidLoad() - - // Do any additional setup after loading the view. - _flex.isReadOnly = true - _flex.delegate = self - _flex.autoGenerateColumns = false - let c1: FlexColumn = FlexColumn() + self.flex.columnHeaderFont = UIFont.boldSystemFontOfSize(self.flex.columnHeaderFont.pointSize) + self.flex.autoGenerateColumns = false + self.flex.isReadOnly = true + self.flex.selectionMode = GridSelectionMode.Row + let c1: GridColumn = GridColumn() c1.header = NSLocalizedString("First Name", comment: "") c1.binding = "firstName" - let c2: FlexColumn = FlexColumn() + let c2: GridColumn = GridColumn() c2.header = NSLocalizedString("Last Name", comment: "") c2.binding = "lastName" - let c3: FlexColumn = FlexColumn() + let c3: GridColumn = GridColumn() c3.header = NSLocalizedString("Total Orders", comment: "") c3.binding = "orderTotal" - - _flex.columns.addObject(c1) - _flex.columns.addObject(c2) - _flex.columns.addObject(c3) - - _flex.selectionMode = FlexSelectionMode.None - - _flex.itemsSource = CustomerData.getCustomerData(100) - _flex.isReadOnly = true - self.starSizing(_flex) - self.view.addSubview(_flex) - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - func formatItem(sender: FlexGrid!, panel: FlexGridPanel!, forRange range: FlexCellRange!, inContext context: CGContext!) -> Bool { - let col = _flex.columns.objectAtIndex(UInt(range.col)) as! FlexColumn - if(col.header == NSLocalizedString("Total Orders", comment: "")){ - let v = panel.getCellDataForRow(range.row, inColumn: range.col, formatted: false) - if(v != nil){ - //check for column header... if not equal to header performance proceed - if(v.description != NSLocalizedString("Total Orders", comment: "")){ - let radialGauge = XuniRadialGauge() - let lower = XuniGaugeRange(gauge: radialGauge) - lower.min = 0 - lower.max = 40 - lower.color = UIColor(red: CGFloat(0.133), green: CGFloat(0.694), blue: CGFloat(0.298), alpha: CGFloat(1)) - let middle = XuniGaugeRange(gauge: radialGauge) - middle.min = 40 - middle.max = 80 - middle.color = UIColor(red: CGFloat(1), green: CGFloat(0.502), blue: CGFloat(0.502), alpha: CGFloat(1)) - var upper = XuniGaugeRange(gauge: radialGauge) - upper.min = 80 - upper.max = 100 - upper.color = UIColor(red: CGFloat(0), green: CGFloat(0.635), blue: CGFloat(0.91), alpha: CGFloat(1)) - - radialGauge.ranges.addObject(lower) - radialGauge.ranges.addObject(middle) - radialGauge.ranges.addObject(upper) - - radialGauge.showText = XuniShowText.None - radialGauge.thickness = 0.6 - radialGauge.min = 0 - radialGauge.max = 100 - radialGauge.loadAnimation = nil - radialGauge.value = Double(v.description)! * (100.0/90000.0); - radialGauge.showRanges = false - - var r : CGRect = panel.getCellRectForRow(range.row, inColumn: range.col) - - r.size.width-=4; - r.size.height-=4; - - r.origin.x+=2; - r.origin.y+=2; - - var t = XuniRect(left: 0.0, top: 0.0, width: Double(r.size.width), height: Double(r.size.height)) - radialGauge.rectGauge = t - radialGauge.frame = CGRectMake(0, 0, r.size.width, r.size.height) - - var image = UIImage() - image = UIImage(data: radialGauge.getImage())! - image.drawInRect(r) - return true + self.flex.columns.addObject(c1) + self.flex.columns.addObject(c2) + self.flex.columns.addObject(c3) + self.flex.itemsSource = NSMutableArray(array:CustomerData.getCustomerData(100)) + self.starSizing(self.flex) + self.flex.flexGridFormatItem.addHandler({(eventContainer: XuniEventContainer!) -> Void in + let eventContainerEventArgs = eventContainer.eventArgs as! GridFormatItemEventArgs + eventContainerEventArgs.cancel = false + let g: FlexGrid = self.flex + let col: GridColumn = g.columns![eventContainerEventArgs.col] as! GridColumn + if (col.binding == "orderTotal") { + let v: NSObject! = eventContainerEventArgs.panel.getCellDataForRow(eventContainerEventArgs.row, inColumn: eventContainerEventArgs.col, formatted: false) + if v != nil { + if !v.description.isEqual(NSLocalizedString("Total Orders", comment:"")) { + let radialGauge: XuniRadialGauge = XuniRadialGauge() + let lower: XuniGaugeRange = XuniGaugeRange(gauge: radialGauge) + lower.min = 0 + lower.max = 40 + lower.color = UIColor(red: 0.133, green: 0.694, blue: 0.298, alpha: 1) + let middle: XuniGaugeRange = XuniGaugeRange(gauge: radialGauge) + middle.min = 40 + middle.max = 80 + middle.color = UIColor(red: 1, green: 0.502, blue: 0.502, alpha: 1) + let upper: XuniGaugeRange = XuniGaugeRange(gauge: radialGauge) + upper.min = 80 + upper.max = 100 + upper.color = UIColor(red: 0, green: 0.635, blue: 0.91, alpha: 1) + radialGauge.ranges.addObject(lower) + radialGauge.ranges.addObject(middle) + radialGauge.ranges.addObject(upper) + radialGauge.backgroundColor = UIColor.clearColor() + radialGauge.showText = XuniShowText.None + radialGauge.thickness = 0.6 + radialGauge.min = 0 + radialGauge.max = 100 + radialGauge.loadAnimation = nil + radialGauge.value = CDouble(v.description)! * (100.0 / 90000.0) + radialGauge.showRanges = false + let r: CGRect = eventContainerEventArgs.panel.getCellRectForRow(eventContainerEventArgs.row, inColumn: eventContainerEventArgs.col) + let t: XuniRect = XuniRect(left: 0, top: 0, width: Double(r.size.width), height: Double(r.size.height)) + radialGauge.rectGauge = t + radialGauge.frame = CGRectMake(0, 0, r.size.width, r.size.height) + var image: UIImage = UIImage() + image = UIImage(data: radialGauge.getImage())! + image.drawInRect(r) + eventContainerEventArgs.cancel = true } + } } - } - return false - } - - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - _flex.frame = CGRectMake(0, 65, self.view.bounds.size.width, self.view.bounds.size.height - 65) - _flex.setNeedsDisplay() + }, forObject: self) } - func starSizing(g: FlexGrid){ - for var i : UInt = 0; i < g.columns.count; i++ { - var c = FlexColumn() - c = g.columns.objectAtIndex(i) as! FlexColumn - c.widthType = FlexColumnWidth.Star + + func starSizing(g: FlexGrid) { + for i:UInt in 0 ..< g.columns.count { + let c: GridColumn = g.columns![Int32(i)] as! GridColumn + c.widthType = GridColumnWidth.Star c.width = (i == 0) ? 5 : (i == 3) ? 3 : 4 } } - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - // Get the new view controller using segue.destinationViewController. - // Pass the selected object to the new view controller. - } - */ + @IBOutlet weak var flex: FlexGrid! } +// +// CustomCellsController.m +// FlexGrid101 +// +// Copyright (c) 2015 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/CustomMergingViewController.swift b/Swift/FlexGrid101/FlexGrid101/CustomMergingViewController.swift index 2428641..c225b1d 100644 --- a/Swift/FlexGrid101/FlexGrid101/CustomMergingViewController.swift +++ b/Swift/FlexGrid101/FlexGrid101/CustomMergingViewController.swift @@ -1,53 +1,53 @@ // -// CustomMergingViewController.swift +// CustomMergingViewController.h // FlexGrid101 // // Copyright © 2016 GrapeCity. All rights reserved. // - import UIKit -import XuniFlexGridKit +import XuniFlexGridDynamicKit class CustomMergingViewController: UIViewController { - @IBOutlet weak var grid: FlexGrid! - @IBOutlet weak var showTitle: UILabel! - @IBOutlet weak var showTimetable: UILabel! override func viewDidLoad() { super.viewDidLoad() - self.grid.selectionMode = FlexSelectionMode.Cell + self.grid.selectionMode = GridSelectionMode.Cell self.grid.isReadOnly = true - + self.grid.columnHeaderFont = UIFont.boldSystemFontOfSize(self.grid.columnHeaderFont.pointSize) let weekdays: [String] = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] for dayName: String in weekdays { - let c1: FlexColumn = FlexColumn() + let c1: GridColumn = GridColumn() c1.header = dayName - c1.widthType = FlexColumnWidth.Star + c1.widthType = GridColumnWidth.Star c1.width = 1 c1.dataType = XuniDataType.String c1.minWidth = 120 + c1.horizontalAlignment = .Center + c1.headerHorizontalAlignment = .Center c1.allowMerging = true self.grid.columns.addObject(c1) } - let timespans: [String] = ["12", "13", "14", "15", "16", "17", "18"] for timeSpan: String in timespans { - let r1: FlexRow = FlexRow() + let r1: GridRow = GridRow() self.grid.rows.addObject(r1) self.grid.rowHeaders.setCellData("\(timeSpan):00", forRow: Int32(self.grid.rows.indexOfObject(r1)), inColumn: 0) } - self.grid.flexGridSelectionChanged.addHandler({(sender: NSObject!, args: XuniEventArgs!) -> Void in - let e: FlexCellRangeEventArgs = (args as! FlexCellRangeEventArgs) - let r: Int32 = e.row - let c: Int32 = e.col + + self.grid.flexGridSelectionChanged.addHandler({(eventContainer: XuniEventContainer!) -> Void in + let eventContainerEventArgs = eventContainer.eventArgs as! GridCellRangeEventArgs + + let r = eventContainerEventArgs.row + let c = eventContainerEventArgs.col + let thisShow: String = self.grid.getCellDataForRow(r, inColumn: c, formatted: true).description self.showTitle.text = thisShow var timetable: String = "" - for var cc = 0; cc < 7; cc++ { - let day: String = ((self.grid.columns.objectAtIndex(UInt(cc)) as! FlexColumn)).header + for cc in 0 ..< 7 { + let day: String = (self.grid.columns.objectAtIndex(UInt(cc)) as! GridColumn).header var spanStart: String? = nil var spanEnd: String? = nil - for var cr = 0; cr < 7; cr++ { + for cr in 0 ..< 7 { let candidate: String = self.grid.getCellDataForRow(Int32(cr), inColumn: Int32(cc), formatted: true).description if (candidate == thisShow) { if spanStart == nil { @@ -68,8 +68,17 @@ class CustomMergingViewController: UIViewController { } } self.showTimetable.text = timetable - }, forObject: self) + }, forObject: self) + self.grid.columnHeaders.rows.insertObject(GridRow(), atIndex: 0) + (self.grid.columnHeaders.rows.objectAtIndex(0) as! GridRow).allowMerging = true + self.grid.columnHeaders[0][0] = "Weekday" + self.grid.columnHeaders[0][1] = "Weekday" + self.grid.columnHeaders[0][2] = "Weekday" + self.grid.columnHeaders[0][3] = "Weekday" + self.grid.columnHeaders[0][4] = "Weekday" + self.grid.columnHeaders[0][5] = "Weekend" + self.grid.columnHeaders[0][6] = "Weekend" self.grid.setCellData("Walker", forRow: 0, inColumn: 0) self.grid.setCellData("Morning Show", forRow: 0, inColumn: 1) self.grid.setCellData("Morning Show", forRow: 0, inColumn: 2) @@ -105,9 +114,9 @@ class CustomMergingViewController: UIViewController { self.grid.setCellData("News", forRow: 4, inColumn: 2) self.grid.setCellData("News", forRow: 4, inColumn: 3) self.grid.setCellData("News", forRow: 4, inColumn: 4) - self.grid.setCellData("Weel of Fortune", forRow: 5, inColumn: 0) - self.grid.setCellData("Weel of Fortune", forRow: 5, inColumn: 1) - self.grid.setCellData("Weel of Fortune", forRow: 5, inColumn: 2) + self.grid.setCellData("Wheel of Fortune", forRow: 5, inColumn: 0) + self.grid.setCellData("Wheel of Fortune", forRow: 5, inColumn: 1) + self.grid.setCellData("Wheel of Fortune", forRow: 5, inColumn: 2) self.grid.setCellData("Jeopardy", forRow: 5, inColumn: 3) self.grid.setCellData("Jeopardy", forRow: 5, inColumn: 4) self.grid.setCellData("Movie", forRow: 5, inColumn: 5) @@ -119,15 +128,103 @@ class CustomMergingViewController: UIViewController { self.grid.setCellData("Sports", forRow: 6, inColumn: 2) self.grid.setCellData("Big Brother", forRow: 6, inColumn: 3) self.grid.setCellData("Big Brother", forRow: 6, inColumn: 4) - - self.grid.allowMerging = FlexGridAllowMerging.Cells + self.grid.allowMerging = GridAllowMerging.All self.grid.autoSizeColumn(0, header: true) } - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - } - + @IBOutlet weak var grid: FlexGrid! + @IBOutlet weak var showTitle: UILabel! + @IBOutlet weak var showTimetable: UILabel! +} +// +// CustomMergingViewController.m +// FlexGrid101 +// +// Copyright © 2016 GrapeCity. All rights reserved. +// +class CustomMergingFlexGrid: FlexGrid { -} + override func prepareForInterfaceBuilder() { + self.columnHeaderFont = UIFont.boldSystemFontOfSize(self.columnHeaderFont.pointSize) + let weekdays: [String] = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] + for dayName: String in weekdays { + let c1: GridColumn = GridColumn() + c1.header = dayName + c1.widthType = GridColumnWidth.Star + c1.width = 1 + c1.dataType = XuniDataType.String + c1.minWidth = 120 + c1.horizontalAlignment = .Center + c1.headerHorizontalAlignment = .Center + c1.allowMerging = true + self.columns.addObject(c1) + } + let timespans: [String] = ["12", "13", "14", "15", "16", "17", "18"] + for timeSpan: String in timespans { + let r1: GridRow = GridRow() + self.rows.addObject(r1) + self.rowHeaders.setCellData("\(timeSpan):00", forRow: Int32(self.rows.indexOfObject(r1)), inColumn: 0) + } + self.columnHeaders.rows.insertObject(GridRow(), atIndex: 0) + (self.columnHeaders.rows.objectAtIndex(0) as! GridRow).allowMerging = true + self.columnHeaders[0][0] = "Weekday" + self.columnHeaders[0][1] = "Weekday" + self.columnHeaders[0][2] = "Weekday" + self.columnHeaders[0][3] = "Weekday" + self.columnHeaders[0][4] = "Weekday" + self.columnHeaders[0][5] = "Weekend" + self.columnHeaders[0][6] = "Weekend" + self.setCellData("Walker", forRow: 0, inColumn: 0) + self.setCellData("Morning Show", forRow: 0, inColumn: 1) + self.setCellData("Morning Show", forRow: 0, inColumn: 2) + self.setCellData("Sports", forRow: 0, inColumn: 3) + self.setCellData("Weather", forRow: 0, inColumn: 4) + self.setCellData("N/A", forRow: 0, inColumn: 5) + self.setCellData("N/A", forRow: 0, inColumn: 6) + self.setCellData("N/A", forRow: 1, inColumn: 5) + self.setCellData("N/A", forRow: 1, inColumn: 6) + self.setCellData("N/A", forRow: 2, inColumn: 5) + self.setCellData("N/A", forRow: 2, inColumn: 6) + self.setCellData("N/A", forRow: 3, inColumn: 5) + self.setCellData("N/A", forRow: 3, inColumn: 6) + self.setCellData("N/A", forRow: 4, inColumn: 5) + self.setCellData("N/A", forRow: 4, inColumn: 6) + self.setCellData("Today Show", forRow: 1, inColumn: 0) + self.setCellData("Today Show", forRow: 1, inColumn: 1) + self.setCellData("Today Show", forRow: 2, inColumn: 0) + self.setCellData("Today Show", forRow: 2, inColumn: 1) + self.setCellData("Sesame Street", forRow: 1, inColumn: 2) + self.setCellData("Football", forRow: 1, inColumn: 3) + self.setCellData("Football", forRow: 2, inColumn: 3) + self.setCellData("Market Watch", forRow: 1, inColumn: 4) + self.setCellData("Kids Zone", forRow: 2, inColumn: 2) + self.setCellData("Soap Opera", forRow: 2, inColumn: 4) + self.setCellData("News", forRow: 3, inColumn: 0) + self.setCellData("News", forRow: 3, inColumn: 1) + self.setCellData("News", forRow: 3, inColumn: 2) + self.setCellData("News", forRow: 3, inColumn: 3) + self.setCellData("News", forRow: 3, inColumn: 4) + self.setCellData("News", forRow: 4, inColumn: 0) + self.setCellData("News", forRow: 4, inColumn: 1) + self.setCellData("News", forRow: 4, inColumn: 2) + self.setCellData("News", forRow: 4, inColumn: 3) + self.setCellData("News", forRow: 4, inColumn: 4) + self.setCellData("Weel of Fortune", forRow: 5, inColumn: 0) + self.setCellData("Weel of Fortune", forRow: 5, inColumn: 1) + self.setCellData("Weel of Fortune", forRow: 5, inColumn: 2) + self.setCellData("Jeopardy", forRow: 5, inColumn: 3) + self.setCellData("Jeopardy", forRow: 5, inColumn: 4) + self.setCellData("Movie", forRow: 5, inColumn: 5) + self.setCellData("Movie", forRow: 6, inColumn: 5) + self.setCellData("Golf", forRow: 5, inColumn: 6) + self.setCellData("Golf", forRow: 6, inColumn: 6) + self.setCellData("Night Show", forRow: 6, inColumn: 0) + self.setCellData("Night Show", forRow: 6, inColumn: 1) + self.setCellData("Sports", forRow: 6, inColumn: 2) + self.setCellData("Big Brother", forRow: 6, inColumn: 3) + self.setCellData("Big Brother", forRow: 6, inColumn: 4) + self.allowMerging = GridAllowMerging.All + self.autoSizeColumn(0, header: true) + } +} \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/CustomerData.swift b/Swift/FlexGrid101/FlexGrid101/CustomerData.swift index 22e4eea..e31ca74 100644 --- a/Swift/FlexGrid101/FlexGrid101/CustomerData.swift +++ b/Swift/FlexGrid101/FlexGrid101/CustomerData.swift @@ -1,27 +1,50 @@ // -// CustomerData.swift +// CustomerData.h // FlexGrid101 // // Copyright (c) 2015 GrapeCity. All rights reserved. // - -import UIKit - +import Foundation +class CountryPair: NSObject { + var title: String + var identifier: Int + + override init() + { + title = "" + identifier = 0 + super.init() + } +} class CustomerData: NSObject { var customerID: Int - var firstName, lastName: String - var address, postalCode, country: String + var firstName: String + var lastName: String + var name: String { + get { + return "\(self.firstName) \(self.lastName)" + } + } + + var address: String var city: String var countryID: Int + var country: String + var postalCode: String var email: String var lastOrderDate: NSDate var orderCount: Int var orderTotal: Double + var orderAverage: Double { + get { + return self.orderTotal / (Double(self.orderCount)) + } + } + var active: Bool - private override init() + override init() { - self.customerID = 0 self.countryID = 0 self.firstName = "" @@ -33,47 +56,34 @@ class CustomerData: NSObject { self.postalCode = "" self.lastOrderDate = NSDate() self.orderCount = 0 - self.orderTotal = 0.0 + self.orderTotal = 0 self.email = "" super.init() } - - init(customerID: Int, countryID: Int, firstName first: String, lastName last: String, address: String, city: String, country: String, postalCode: String, email: String, lastOrderDate: NSDate, orderCount: Int, orderTotal: Double, active: Bool){ - self.customerID = customerID - self.countryID = countryID - self.firstName = first - self.lastName = last - self.active = active - self.address = address - self.city = city - self.country = country - self.postalCode = postalCode - self.lastOrderDate = lastOrderDate - self.orderCount = orderCount - self.orderTotal = orderTotal - self.email = email - } - - class func generateRandomBool() -> Bool{ - let random = (Int(arc4random_uniform(UInt32(RAND_MAX)))) - if (random % 5 == 0) { - return true - } - else{ - return false - } - } - - class func generateRandom(max: Int) -> Int{ - return (Int(arc4random_uniform(UInt32(max)))) + + init(customerID: Int, countryID: Int, firstName first: String, lastName last: String, address: String, city: String, country: String, postalCode: String, lastOrderDate: NSDate, orderCount: Int, orderTotal: Double, active: Bool) { + + self.customerID = customerID + self.countryID = countryID + self.firstName = first + self.lastName = last + self.active = active + self.address = address + self.city = city + self.country = country + self.postalCode = postalCode + self.lastOrderDate = lastOrderDate + self.orderCount = orderCount + self.orderTotal = orderTotal + self.email = "" + super.init() } - - class func getCustomerData(total: Int) -> NSMutableArray{ + class func getCustomerData(total: Int) -> [CustomerData] { let firstNames: String = "Andy|Ben|Charlie|Dan|Ed|Fred|Gil|Herb|Jack|Karl|Larry|Mark|Noah|Oprah|Paul|Quince|Rich|Steve|Ted|Ulrich|Vic|Xavier|Zeb" - var firstNamesArray: [AnyObject] = firstNames.componentsSeparatedByString("|") + let firstNamesArray: [AnyObject] = firstNames.componentsSeparatedByString("|") let lastNames: String = "Ambers|Bishop|Cole|Danson|Evers|Frommer|Griswold|Heath|Jammers|Krause|Lehman|Myers|Neiman|Orsted|Paulson|Quaid|Richards|Stevens|Trask|Ulam" - var lastNamesArray: [AnyObject] = lastNames.componentsSeparatedByString("|") + let lastNamesArray: [AnyObject] = lastNames.componentsSeparatedByString("|") let countries: String = "China|India|United States|Indonesia|Brazil|Pakistan|Bangladesh|Nigeria|Russia|Japan|Mexico|Philippines|Vietnam|Germany|Ethiopia|Egypt|Iran|Turkey|Congo|France|Thailand|United Kingdom|Italy|Myanmar" var countriesArray: [AnyObject] = countries.componentsSeparatedByString("|") let cities: String = "Honolulu|Los Angeles|San Francisco|Las Vegas|Cancun|Chicago|New York|San Paolo|Miami|Dublin|London|Paris|Addis-Abeba|St. Petersburg|Frankfurt|Istanbul|Isfahan|Cairo|Milano|New Delhi|Bangalor|Mumbai|Dhaka|Tokyo|Osaka|Bangkok|Yangon|Manila" @@ -86,28 +96,53 @@ class CustomerData: NSObject { var previousDate: NSDate let dateComps: NSDateComponents = NSDateComponents() let calendar: NSCalendar = NSCalendar.currentCalendar() - let array: NSMutableArray = NSMutableArray() - for var i = 0; i < total; i++ { - dateComps.day = (Int(CustomerData.generateRandom(1000)) * -1) - previousDate = calendar.dateByAddingComponents(dateComps, toDate: now, options: NSCalendarOptions(rawValue: 0))! + var array: [CustomerData] = [CustomerData]() + for i in 0 ..< total { + dateComps.second = (CustomerData.generateRandom(100000000) * -1) + previousDate = calendar.dateByAddingComponents(dateComps, toDate: now, options:NSCalendarOptions())! let customer: CustomerData = CustomerData() customer.customerID = i customer.countryID = CustomerData.generateRandom(countriesArray.count) - customer.country = String(countriesArray[Int(customer.countryID)]) + customer.country = countriesArray[customer.countryID] as! String customer.firstName = firstNamesArray[CustomerData.generateRandom(firstNamesArray.count)] as! String customer.lastName = lastNamesArray[CustomerData.generateRandom(lastNamesArray.count)] as! String customer.city = citiesArray[CustomerData.generateRandom(citiesArray.count)] as! String - customer.address = streetsArray[CustomerData.generateRandom(streetsArray.count)] as! String + customer.address = "\(Int(CustomerData.generateRandom(500))) \(streetsArray[CustomerData.generateRandom(streetsArray.count)])" customer.postalCode = "\(self.generateRandom(9))\(self.generateRandom(9))\(self.generateRandom(9))\(self.generateRandom(9))\(self.generateRandom(9))" customer.lastOrderDate = previousDate customer.email = emailsArray[CustomerData.generateRandom(emailsArray.count)] as! String - customer.orderCount = self.generateRandom(100) + customer.orderCount = self.generateRandom(100) + 1 customer.orderTotal = Double(self.generateRandom(100)) / 100.0 + Double(self.generateRandom(90000)) customer.active = CustomerData.generateRandomBool() - array.addObject(customer) + array.append(customer) } return array - } -} + class func defaultCountries() -> [CountryPair] { + let countries: String = "China|India|United States|Indonesia|Brazil|Pakistan|Bangladesh|Nigeria|Russia|Japan|Mexico|Philippines|Vietnam|Germany|Ethiopia|Egypt|Iran|Turkey|Congo|France|Thailand|United Kingdom|Italy|Myanmar" + let countriesArray: [String] = countries.componentsSeparatedByString("|") + var result: [CountryPair] = [CountryPair]() + for country: String in countriesArray { + let pair: CountryPair = CountryPair() + pair.title = country + pair.identifier = countriesArray.indexOf(country)! + result.append(pair) + } + return result + } + + class func generateRandomBool() -> Bool{ + let random = (Int(arc4random_uniform(UInt32(RAND_MAX)))) + if (random % 5 == 0) { + return true + } + else{ + return false + } + } + + class func generateRandom(max: Int) -> Int{ + return (Int(arc4random_uniform(UInt32(max)))) + } +} \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/CustomerObjectEditor.swift b/Swift/FlexGrid101/FlexGrid101/CustomerObjectEditor.swift index 8ea4b17..284f786 100644 --- a/Swift/FlexGrid101/FlexGrid101/CustomerObjectEditor.swift +++ b/Swift/FlexGrid101/FlexGrid101/CustomerObjectEditor.swift @@ -1,67 +1,63 @@ -import Foundation +// +// CustomerObjectEditor.h +// FlexGrid101 +// +// Copyright © 2015 GrapeCity. All rights reserved. +// import UIKit -import XuniFlexGridKit - class CustomerObjectEditor: UITableViewController { - - - @IBOutlet weak var firstNameEdit: UITextField! - @IBOutlet weak var secondNameEdit: UITextField! - @IBOutlet weak var countryEdit: UITextField! - @IBOutlet weak var cityEdit: UITextField! - @IBOutlet weak var emailEdit: UITextField! - @IBOutlet weak var addressEdit: UITextField! - func initObject() { - self.firstNameEdit.text = edited.firstName - self.secondNameEdit.text = edited.lastName - self.countryEdit.text = edited.country - self.cityEdit.text = edited.city - self.addressEdit.text = edited.address - self.emailEdit.text = edited.email - self.firstNameEdit.placeholder = firstNameEdit.text - self.secondNameEdit.placeholder = secondNameEdit.text - self.countryEdit.placeholder = countryEdit.text - self.cityEdit.placeholder = cityEdit.text - self.addressEdit.placeholder = addressEdit.text - self.emailEdit.placeholder = emailEdit.text + let efc: EditingFormController = (self.parentViewController as! EditingFormController) + self.firstNameEdit.text = efc.edited.firstName + self.secondNameEdit.text = efc.edited.lastName + self.countryEdit.text = efc.edited.country + self.cityEdit.text = efc.edited.city + self.addressEdit.text = efc.edited.address + self.emailEdit.text = efc.edited.email + self.firstNameEdit.placeholder = self.firstNameEdit.text! + self.secondNameEdit.placeholder = self.secondNameEdit.text! + self.countryEdit.placeholder = self.countryEdit.text! + self.cityEdit.placeholder = self.cityEdit.text! + self.addressEdit.placeholder = self.addressEdit.text! + self.emailEdit.placeholder = self.emailEdit.text! } override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { cell.backgroundColor = UIColor.clearColor() } - override func viewDidLoad() { - super.viewDidLoad() - objEdit = self - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - } - override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { - if indexPath.row == tableView.numberOfRowsInSection(indexPath.section) - 2 { + let efc: EditingFormController = (self.parentViewController as! EditingFormController) + if indexPath.row == self.tableView(tableView, numberOfRowsInSection: indexPath.section) - 2 { efc.cancel() } - else { - if indexPath.row == tableView.numberOfRowsInSection(indexPath.section) - 3 - { - edited.firstName = objEdit.firstNameEdit.text! - edited.lastName = objEdit.secondNameEdit.text! - edited.country = objEdit.countryEdit.text! - edited.city = objEdit.cityEdit.text! - edited.address = objEdit.addressEdit.text! - edited.email = objEdit.emailEdit.text! - efc.confirm() - } + else if indexPath.row == self.tableView(tableView, numberOfRowsInSection: indexPath.section) - 3 { + efc.edited.firstName = self.firstNameEdit.text! + efc.edited.lastName = self.secondNameEdit.text! + efc.edited.country = self.countryEdit.text! + efc.edited.city = self.cityEdit.text! + efc.edited.address = self.addressEdit.text! + efc.edited.email = self.emailEdit.text! + efc.confirm() } - tableView.deselectRowAtIndexPath(indexPath, animated: false) + + self.tableView.deselectRowAtIndexPath(indexPath, animated: false) } @IBAction func endEdit(sender: AnyObject) { - resignFirstResponder() + self.resignFirstResponder() } -} -var objEdit: CustomerObjectEditor! = nil \ No newline at end of file + @IBOutlet weak var firstNameEdit: UITextField! + @IBOutlet weak var secondNameEdit: UITextField! + @IBOutlet weak var countryEdit: UITextField! + @IBOutlet weak var cityEdit: UITextField! + @IBOutlet weak var addressEdit: UITextField! + @IBOutlet weak var emailEdit: UITextField! +} +// +// CustomerObjectEditor.m +// FlexGrid101 +// +// Copyright © 2015 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/EditConfirmationController.swift b/Swift/FlexGrid101/FlexGrid101/EditConfirmationController.swift index 5cc127d..070dd77 100644 --- a/Swift/FlexGrid101/FlexGrid101/EditConfirmationController.swift +++ b/Swift/FlexGrid101/FlexGrid101/EditConfirmationController.swift @@ -1,74 +1,83 @@ // -// EditConfirmationController.swift +// EditConfirmationController.h // FlexGrid101 // // Copyright (c) 2015 GrapeCity. All rights reserved. // - import UIKit -import XuniFlexGridKit +import XuniFlexGridDynamicKit -class EditConfirmationController: UIViewController, FlexGridDelegate { +class EditConfirmationController: UIViewController { - var _flex = FlexGrid() - var _temp = NSObject() - override func viewDidLoad() { super.viewDidLoad() - // Do any additional setup after loading the view. - _flex.isReadOnly = false - _flex.delegate = self - _flex.itemsSource = CustomerData.getCustomerData(100) - _flex.columns.removeObjectAtIndex(1) - self.view.addSubview(_flex) - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - _flex.frame = CGRectMake(0, 65, self.view.bounds.size.width, self.view.bounds.size.height - 65) - _flex.setNeedsDisplay() - } - - func beginningEdit(sender: FlexGrid!, panel: FlexGridPanel!, forRange range: FlexCellRange!) -> Bool { - _temp = _flex.cells.getCellDataForRow(range.row, inColumn: range.col, formatted: false) - return false - } - - func cellEditEnding(sender: FlexGrid!, panel: FlexGridPanel!, forRange range: FlexCellRange!, cancel: Bool) -> Bool { + self.flex.isReadOnly = false + self.flex.columnHeaderFont = UIFont.boldSystemFontOfSize(self.flex.columnHeaderFont.pointSize) + self.flex.autoGenerateColumns = false + let identifier: GridColumn = GridColumn() + identifier.binding = "customerID" + identifier.isReadOnly = true + identifier.widthType = GridColumnWidth.Pixel + identifier.width = 100 + self.flex.columns.addObject(identifier) + let firstName: GridColumn = GridColumn() + firstName.binding = "firstName" + self.flex.columns.addObject(firstName) + let lastName: GridColumn = GridColumn() + lastName.binding = "lastName" + self.flex.columns.addObject(lastName) + let address: GridColumn = GridColumn() + address.binding = "address" + self.flex.columns.addObject(address) + let city: GridColumn = GridColumn() + city.binding = "city" + self.flex.columns.addObject(city) + let postalCode: GridColumn = GridColumn() + postalCode.binding = "postalCode" + self.flex.columns.addObject(postalCode) + let active: GridColumn = GridColumn() + active.binding = "active" + active.widthType = GridColumnWidth.Pixel + active.width = 70 + self.flex.columns.addObject(active) + - dispatch_async(dispatch_get_main_queue()) { () -> Void in + self.flex.itemsSource = NSMutableArray(array: CustomerData.getCustomerData(100)) + + self.flex.flexGridCellEditEnding.addHandler({(eventContainer: XuniEventContainer!) -> Void in + let eventContainerEventArgs : GridCellRangeEventArgs = eventContainer.eventArgs as! GridCellRangeEventArgs - if(self._flex.cells.getCellDataForRow(range.row, inColumn: range.col, formatted: false).isEqual(self._temp)) - { - return; + var activeEditorValue: NSObject! = self.flex.activeEditorValue + if activeEditorValue == nil { + activeEditorValue = "" } - - let title = NSLocalizedString("Edit Confirmation", comment: "") - let message = NSLocalizedString("Do you want to commit the edit?", comment: "") - let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert) - alert.addAction(UIAlertAction(title: NSLocalizedString("Ok", comment: ""), style: .Default, handler: nil)) - alert.addAction(UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .Cancel, handler: {(action) -> Void in - self._flex.cells.setCellData(self._temp, forRow: range.row, inColumn: range.col) - self._flex.invalidate() - })) - self.presentViewController(alert, animated: true, completion: nil) - } - - return false; - } - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - // Get the new view controller using segue.destinationViewController. - // Pass the selected object to the new view controller. + if self.flex.cells.getCellDataForRow(eventContainerEventArgs.row, inColumn: eventContainerEventArgs.col, formatted: false).isEqual(activeEditorValue) { + eventContainerEventArgs.cancel = true + return + } + let prev: NSObject = self.flex.cells.getCellDataForRow(eventContainerEventArgs.row, inColumn: eventContainerEventArgs.col, formatted: false) + var title: String = String() + var message: String = String() + title = NSLocalizedString("Edit Confirmation", comment: "") + message = NSLocalizedString("Do you want to commit the edit?", comment: "") + let alertController: UIAlertController = UIAlertController(title: title, message: message, preferredStyle: .Alert) + let okAction: UIAlertAction = UIAlertAction(title: NSLocalizedString("Ok", comment: ""), style: .Default, handler: {(action: UIAlertAction) -> Void in + }) + let cancelAction: UIAlertAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .Cancel, handler: {(action: UIAlertAction) -> Void in + self.flex.cells.setCellData(prev, forRow: eventContainerEventArgs.row, inColumn: eventContainerEventArgs.col) + }) + alertController.addAction(okAction) + alertController.addAction(cancelAction) + self.presentViewController(alertController, animated: true, completion: { _ in }) + eventContainerEventArgs.cancel = false + }, forObject: self) } - */ + @IBOutlet weak var flex: FlexGrid! } +// +// EditConfirmationController.m +// FlexGrid101 +// +// Copyright (c) 2015 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/EditingFormController.swift b/Swift/FlexGrid101/FlexGrid101/EditingFormController.swift index ae9a47a..4e176ba 100644 --- a/Swift/FlexGrid101/FlexGrid101/EditingFormController.swift +++ b/Swift/FlexGrid101/FlexGrid101/EditingFormController.swift @@ -1,15 +1,18 @@ -import Foundation +// +// EditingFormController.h +// FlexGrid101 +// +// Copyright © 2015 GrapeCity. All rights reserved. +// import UIKit -import XuniFlexGridKit +import XuniCoreDynamicKit +import XuniFlexGridDynamicKit -class EditingFormController: UIViewController, FlexGridDelegate { - +class EditingFormController: UIViewController { + var edited: CustomerData! - @IBOutlet weak var editpanel: UIVisualEffectView! - - var flex: FlexGrid! = nil; - func cancel() { + let objEdit: CustomerObjectEditor = (self.childViewControllers[0] as! CustomerObjectEditor) objEdit.resignFirstResponder() UIView.animateWithDuration(0.7, animations: {() -> Void in self.editpanel.alpha = 0 @@ -19,35 +22,40 @@ class EditingFormController: UIViewController, FlexGridDelegate { } func confirm() { - flex.collectionView.raiseCollectionChanged() - cancel() + self.flex.collectionView.raiseCollectionChanged() + self.cancel() } override func viewDidLoad() { super.viewDidLoad() - efc = self - flex = FlexGrid() - flex.columnHeaderFont = UIFont.boldSystemFontOfSize(flex.columnHeaderFont.pointSize) - flex.isReadOnly = true - flex.delegate = self - flex.itemsSource = CustomerData.getCustomerData(100) - flex.tag = 1 - flex.autoSizeColumns(0, to: Int32(flex.columns.count) - 1) - view.addSubview(flex) - view.sendSubviewToBack(flex) + self.flex.columnHeaderFont = UIFont.boldSystemFontOfSize(self.flex.columnHeaderFont.pointSize) + self.flex.isReadOnly = true + self.flex.itemsSource = NSMutableArray(array: CustomerData.getCustomerData(100)) + self.flex.flexGridSelectionChanged.addHandler({(eventContainer: XuniEventContainer!) -> Void in + self.editaction.enabled = true + }, forObject: self) + self.flex.flexGridTapped.addHandler({(eventContainer: XuniEventContainer!) -> Void in + self.cancel() + }, forObject: self) + self.flex.flexGridCellDoubleTapped.addHandler({(eventContainer: XuniEventContainer!) -> Void in + if !self.editpanel.hidden { + self.cancel() + return + } + dispatch_async(dispatch_get_main_queue(), {() -> Void in + self.beginEditing() + }) + }, forObject: self) + self.flex.autoSizeColumns(0, to: Int32(self.flex.columns.count - 1)) } - func tapped(sender: FlexGrid!, point: XuniPoint!) -> Bool { - cancel() - return false + @IBAction func doedit(sender: AnyObject) { + self.beginEditing() } - - func cellDoubleTapped(sender: FlexGrid!, panel: FlexGridPanel!, forRange range: FlexCellRange!) -> Bool { - if !editpanel.hidden { - tapped(nil, point: nil) - return false - } - edited = flex.itemsSource.objectAtIndex(Int(range.row)) as! CustomerData + + func beginEditing() { + self.edited = self.flex.collectionView.items![Int(self.flex.selection.row)] as! CustomerData + let objEdit: CustomerObjectEditor = (self.childViewControllers[0] as! CustomerObjectEditor) objEdit.initObject() self.editpanel.alpha = 0 self.editpanel.hidden = false @@ -56,22 +64,15 @@ class EditingFormController: UIViewController, FlexGridDelegate { }, completion: {(finished: Bool) -> Void in self.editpanel.alpha = 1 }) - return false - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() } - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - if (self.navigationController == nil) {return;} - let ss: CGFloat = UIApplication.sharedApplication().statusBarFrame.size.height + navigationController!.navigationBar.intrinsicContentSize().height - flex.frame = CGRectMake(0, ss, view.bounds.size.width, view.bounds.size.height - ss) - flex.setNeedsDisplay() - } + @IBOutlet weak var editpanel: UIVisualEffectView! + @IBOutlet weak var flex: FlexGrid! + @IBOutlet weak var editaction: UIBarButtonItem! } - -var efc: EditingFormController! = nil - -var edited: CustomerData! = nil +// +// GettingStartedController.m +// FlexGrid101 +// +// Copyright (c) 2015 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/FilterController.swift b/Swift/FlexGrid101/FlexGrid101/FilterController.swift index 8fd45aa..ac6212f 100644 --- a/Swift/FlexGrid101/FlexGrid101/FilterController.swift +++ b/Swift/FlexGrid101/FlexGrid101/FilterController.swift @@ -1,259 +1,126 @@ // -// FilterController.swift +// FilterController.h // FlexGrid101 // // Copyright (c) 2015 GrapeCity. All rights reserved. // - import UIKit -import XuniFlexGridKit -import Foundation +import XuniCoreDynamicKit +import XuniFlexGridDynamicKit class FilterController: UIViewController { - - var _flex = FlexGrid() - var _filterButton = UIButton() - var _removeButton = UIButton() - let sharedData = SharedFilterData.sharedInstance - - override func viewDidLoad() { - super.viewDidLoad() + @IBOutlet weak var flex: FlexGrid! - // Do any additional setup after loading the view. - _filterButton = UIButton(type: UIButtonType.System) - _filterButton.setTitle(NSLocalizedString("Filter", comment: ""), forState: UIControlState.Normal) - _filterButton.addTarget(self, action: "filterButtonClicked", forControlEvents: UIControlEvents.TouchUpInside) - - _removeButton = UIButton(type: UIButtonType.System) - _removeButton.setTitle(NSLocalizedString("Remove", comment: ""), forState: UIControlState.Normal) - _removeButton.addTarget(self, action: "removeButtonClicked", forControlEvents: UIControlEvents.TouchUpInside) - - _flex.isReadOnly = true - _flex.itemsSource = CustomerData.getCustomerData(100) - - self.view.addSubview(_flex) - self.view.addSubview(_removeButton) - self.view.addSubview(_filterButton) - + func doDropFilter() { + self.filterButton.title = NSLocalizedString("Filter", comment:"") + self.removeFilterButton.enabled = false + self.filterPane.hidden = true + self.flex.collectionView.filter = {(item: NSObject!) -> Bool in + return true + } } - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - _filterButton.frame = CGRectMake(0, 60, self.view.bounds.size.width/2, 50) - _removeButton.frame = CGRectMake(self.view.bounds.size.width/2, 60, self.view.bounds.size.width/2, 50) - _flex.frame = CGRectMake(0, 110, self.view.bounds.size.width, self.view.bounds.size.height-110) - _flex.setNeedsDisplay() - } - - override func viewDidAppear(animated: Bool) { - super.viewDidAppear(true) - let filterSet = SharedFilterData.sharedInstance.filterSet - - if (filterSet != nil && filterSet == true) { - - if (self.sharedData.filterOperation == 0) { - self.containsFilter() - } - else if (self.sharedData.filterOperation == 1){ - self.beginsWithFilter() - } - else if (self.sharedData.filterOperation == 2){ - self.endsWithFilter() - } - else if (self.sharedData.filterOperation == 3){ - self.equalsFilter() - } + func doApplyFilter() { + self.filterButton.title = NSLocalizedString("Change", comment:"") + self.filterPane.hidden = true + self.removeFilterButton.enabled = true + self.flex.collectionView.filter = {(item: NSObject!) -> Bool in + let shared = FilterData.sharedFilterData() + var result: Bool = true + for i in 0 ..< shared.count { + + let fd: FilterData = shared[i] as! FilterData + + let col: GridColumn = (self.flex.columns![Int32(i)] as! GridColumn) + let thisprop: String = col.getBoundValue(item).description.lowercaseString + if fd.filterString == nil + { + continue + } + let filterstr: String = fd.filterString.lowercaseString + print(filterstr) + if filterstr.characters.count > 0 { + if fd.filterOperation == 0 { + //contains + if !thisprop.containsString(filterstr) { + result = false + } + } + else if fd.filterOperation == 1 { + //starts + if !thisprop.hasPrefix(filterstr) { + result = false + } + } + else if fd.filterOperation == 2 { + //ends + if !thisprop.hasSuffix(filterstr) { + result = false + } + } + else if fd.filterOperation == 3 { + //equalstext + if !(thisprop == filterstr) { + result = false + } + } + } + } + return result } } - - override func viewDidDisappear(animated: Bool) { - super.viewDidDisappear(true) - self.sharedData.filterSet = false - self.sharedData.filterString = "" - self.sharedData.filterOperation = 0 - } - - func filterButtonClicked(){ - self.performSegueWithIdentifier("FilterFormSegue", sender: self) - } - func containsFilter(){ - let dateFormat = NSDateFormatter() - dateFormat.setLocalizedDateFormatFromTemplate("M/d/yy") - _flex.collectionView.filter = {(item : NSObject?) -> Bool in - let d = item as! CustomerData - - if (String(format: "%.f", d.customerID).rangeOfString(self.sharedData.filterString) != nil) { - return true - } - else if (String(format: "%.f", d.countryID).rangeOfString(self.sharedData.filterString) != nil) { - return true - } - else if (String(format: "%.f", d.orderTotal).rangeOfString(self.sharedData.filterString.lowercaseString) != nil) { - return true - } - else if (d.firstName.lowercaseString.rangeOfString(self.sharedData.filterString.lowercaseString) != nil) { - return true - } - else if (d.lastName.lowercaseString.rangeOfString(self.sharedData.filterString.lowercaseString) != nil) - { - return true - } - else if (d.city.lowercaseString.rangeOfString(self.sharedData.filterString.lowercaseString) != nil){ - return true - } - else if (d.address.lowercaseString.rangeOfString(self.sharedData.filterString.lowercaseString) != nil){ - return true - } - else if (d.country.lowercaseString.rangeOfString(self.sharedData.filterString.lowercaseString) != nil){ - return true - } - else if (dateFormat.stringFromDate(d.lastOrderDate).rangeOfString(self.sharedData.filterString.lowercaseString) != nil) { - return true - } - else { - return false - } - } as IXuniPredicate - } - - func equalsFilter(){ - let dateFormat = NSDateFormatter() - dateFormat.setLocalizedDateFormatFromTemplate("M/d/yy") - _flex.collectionView.filter = {(item : NSObject?) -> Bool in - let d = item as! CustomerData - - if (String(format: "%.f", d.customerID) == self.sharedData.filterString) { - return true - } - else if (String(format: "%.f", d.countryID) == self.sharedData.filterString) { - return true - } - else if (String(format: "%.f", d.orderTotal) == self.sharedData.filterString) { - return true - } - else if (d.firstName == self.sharedData.filterString) { - return true - } - else if (d.lastName == self.sharedData.filterString) - { - return true - } - else if (d.city == self.sharedData.filterString){ - return true - } - else if (d.address == self.sharedData.filterString){ - return true - } - else if (d.country == self.sharedData.filterString){ - return true - } - else if (dateFormat.stringFromDate(d.lastOrderDate) == self.sharedData.filterString) { - return true - } - else { - return false - } - } as IXuniPredicate - } - func endsWithFilter(){ - let dateFormat = NSDateFormatter() - dateFormat.setLocalizedDateFormatFromTemplate("M/d/yy") - _flex.collectionView.filter = {(item : NSObject?) -> Bool in - let d = item as! CustomerData - - if (String(format: "%.f", d.customerID).hasSuffix(self.sharedData.filterString)) { - return true - } - else if (String(format: "%.f", d.countryID).hasSuffix(self.sharedData.filterString)) { - return true - } - else if (String(format: "%.f", d.orderTotal).hasSuffix(self.sharedData.filterString)) { - return true - } - else if (d.firstName.lowercaseString.hasSuffix(self.sharedData.filterString.lowercaseString)) { - return true - } - else if (d.lastName.lowercaseString.hasSuffix(self.sharedData.filterString.lowercaseString)){ - return true - } - else if (d.city.lowercaseString.hasSuffix(self.sharedData.filterString.lowercaseString)){ - return true - } - else if (d.address.hasSuffix(self.sharedData.filterString.lowercaseString)){ - return true - } - else if (d.country.lowercaseString.hasSuffix(self.sharedData.filterString.lowercaseString)){ - return true - } - else if (dateFormat.stringFromDate(d.lastOrderDate).hasSuffix(self.sharedData.filterString.lowercaseString)) { - return true - } - else { - return false - } - } as IXuniPredicate - } - func beginsWithFilter(){ - let dateFormat = NSDateFormatter() - dateFormat.setLocalizedDateFormatFromTemplate("M/d/yy") - _flex.collectionView.filter = {(item : NSObject?) -> Bool in - let d = item as! CustomerData - - if (String(format: "%.f", d.customerID).hasPrefix(self.sharedData.filterString)) { - return true - } - else if (String(format: "%.f", d.countryID).hasPrefix(self.sharedData.filterString)) { - return true - } - else if (String(format: "%.f", d.orderTotal).hasPrefix(self.sharedData.filterString)) { - return true - } - else if (d.firstName.lowercaseString.hasPrefix(self.sharedData.filterString.lowercaseString)) { - return true - } - else if (d.lastName.lowercaseString.hasPrefix(self.sharedData.filterString.lowercaseString)) { - return true - } - else if (d.city.lowercaseString.hasPrefix(self.sharedData.filterString.lowercaseString)) { - return true - } - else if (d.address.lowercaseString.hasPrefix(self.sharedData.filterString.lowercaseString)) { - return true - } - else if (d.country.lowercaseString.hasPrefix(self.sharedData.filterString.lowercaseString)) { - return true - } - else if (dateFormat.stringFromDate(d.lastOrderDate).hasPrefix(self.sharedData.filterString)) { - return true - } - else { - return false + + func doStartEditingFilter() { + if (self.filterButton.title == NSLocalizedString("Filter", comment:"")) { + let shared = FilterData.sharedFilterData() + shared.removeAllObjects() + for i:UInt in 0 ..< self.flex.columns.count { + let c: GridColumn = self.flex.columns![Int32(i)] as! GridColumn + let fd: FilterData = FilterData() + fd.filterColumn = c.header + fd.filterOperation = 0 + fd.filterString = nil + shared.addObject(fd) } - return false - } as IXuniPredicate + } + let filterController: FilterGridViewController = (self.childViewControllers.first as! FilterGridViewController) + filterController.flex.itemsSource = FilterData.sharedFilterData() + let operID: GridColumn = (filterController.flex.columns[1] as! GridColumn) + let items = FilterOperation.defaultOperations() + operID.dataMap = GridDataMap(array: items, selectedValuePath: "identifier", displayMemberPath: "title") + self.filterButton.title = NSLocalizedString("Done", comment: "") + self.filterPane.hidden = false + self.removeFilterButton.enabled = true } - func removeButtonClicked(){ - self.sharedData.filterSet = false - self.sharedData.filterString = "" - self.sharedData.filterOperation = 0 - _flex.collectionView.filter = {(item : NSObject?) -> Bool in - return true + + @IBAction func doFilter(sender: AnyObject) { + if (self.filterButton.title == NSLocalizedString("Done", comment: "")) { + self.doApplyFilter() } + else { + self.doStartEditingFilter() + } + } + + @IBAction func removeFilter(sender: AnyObject) { + self.doDropFilter() } - /* - // MARK: - Navigation - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - // Get the new view controller using segue.destinationViewController. - // Pass the selected object to the new view controller. + override func viewDidLoad() { + super.viewDidLoad() + self.flex.columnHeaderFont = UIFont.boldSystemFontOfSize(self.flex.columnHeaderFont.pointSize) + self.flex.isReadOnly = true + self.flex.itemsSource = NSMutableArray(array:CustomerData.getCustomerData(100)) } - */ + @IBOutlet weak var filterButton: UIBarButtonItem! + @IBOutlet weak var removeFilterButton: UIBarButtonItem! + @IBOutlet weak var filterPane: UIVisualEffectView! } +// +// FilterController.m +// FlexGrid101 +// +// Copyright (c) 2015 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/FilterData.swift b/Swift/FlexGrid101/FlexGrid101/FilterData.swift new file mode 100644 index 0000000..16e636e --- /dev/null +++ b/Swift/FlexGrid101/FlexGrid101/FilterData.swift @@ -0,0 +1,67 @@ +// +// SharedFilterData.h +// FlexGrid101 +// +// Copyright (c) 2015 GrapeCity. All rights reserved. +// +import Foundation + + +class FilterOperation: NSObject { + var title: String + var identifier: Int + + override init() + { + title="" + identifier = 0 + super.init() + } + + class func defaultOperations() -> [FilterOperation] { + let operations: String = "Contains|StartsWith|EndsWith|EqualsText" + let operationsArray: [String] = operations.componentsSeparatedByString("|") + var result: [FilterOperation] = [FilterOperation]() + for operation: String in operationsArray { + let oper: FilterOperation = FilterOperation() + oper.title = operation + oper.identifier = operationsArray.indexOf(operation)! + result.append(oper) + } + return result + } +} + +class FilterData: NSObject { + var filterColumn: String + var filterOperation: Int + var filterString: String! + + override init() + { + filterColumn = "" + filterOperation = 0 + filterString = "" + super.init() + } + + static var sharedInstance: NSMutableArray! = nil + + class func sharedFilterData() -> NSMutableArray! { + + let lockQueue = dispatch_queue_create("com.test.LockQueue", nil) + + dispatch_sync(lockQueue) { + if (sharedInstance == nil) { + sharedInstance = NSMutableArray() + } + } + return sharedInstance! + } +} +// +// SharedFilterData.m +// FlexGrid101 +// +// Copyright (c) 2015 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/FilterGridViewController.swift b/Swift/FlexGrid101/FlexGrid101/FilterGridViewController.swift new file mode 100644 index 0000000..1900697 --- /dev/null +++ b/Swift/FlexGrid101/FlexGrid101/FilterGridViewController.swift @@ -0,0 +1,23 @@ +// +// FilterGridViewController.h +// FlexGrid101 +// +// Copyright © 2016 GrapeCity. All rights reserved. +// +import UIKit +import XuniFlexGridDynamicKit + +class FilterGridViewController: UIViewController { + @IBOutlet weak var flex: FlexGrid! + + override func viewDidLoad() { + super.viewDidLoad() + self.flex.columnHeaderFont = UIFont.boldSystemFontOfSize(self.flex.columnHeaderFont.pointSize) + } +} +// +// FilterGridViewController.m +// FlexGrid101 +// +// Copyright © 2016 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/FrozenCellsController.swift b/Swift/FlexGrid101/FlexGrid101/FrozenCellsController.swift index b4feb07..e2b147b 100644 --- a/Swift/FlexGrid101/FlexGrid101/FrozenCellsController.swift +++ b/Swift/FlexGrid101/FlexGrid101/FrozenCellsController.swift @@ -1,64 +1,37 @@ // -// FrozenCellsController.swift +// FrozenCellsController.h // FlexGrid101 // -// Created by Mykola Kotyuck on 21.10.15. // Copyright © 2015 GrapeCity. All rights reserved. // - import UIKit -import XuniFlexGridKit +import XuniCoreDynamicKit +import XuniFlexGridDynamicKit class FrozenCellsController: UIViewController { - var _flex = FlexGrid() - + override func viewDidLoad() { super.viewDidLoad() - - // Do any additional setup after loading the view. - _flex.isReadOnly = true - _flex.columnHeaderFont = UIFont.boldSystemFontOfSize(_flex.columnHeaderFont.pointSize) - _flex.itemsSource = CustomerData.getCustomerData(100) - _flex.autoSizeColumns(0, to: Int32(Int(_flex.columns.count)-1)) - _flex.frozenRows = 1 - _flex.frozenColumns = 1 - - _flex.allowMerging = FlexGridAllowMerging.Cells; - - for(var i = 0; i Bool { - return true - } - func textFieldDidBeginEditing(textField: UITextField) { - textField.selectAll(nil) - } - func textFieldShouldEndEditing(textField: UITextField) -> Bool { - return true - } - func textFieldDidEndEditing(textField: UITextField) { - let dateFormat = NSDateFormatter() - dateFormat.setLocalizedDateFormatFromTemplate("M/d/yy") - _flex.collectionView.filter = {(item : NSObject?) -> Bool in - let d = item as! CustomerData; + self.filterField.keyboardType = .Default + self.flex.columnHeaderFont = UIFont.boldSystemFontOfSize(self.flex.columnHeaderFont.pointSize) + self.flex.isReadOnly = true + self.flex.itemsSource = NSMutableArray(array:CustomerData.getCustomerData(100)) - if (String(format: "%.f", d.customerID) == textField.text) { - return true - } - else if (String(format: "%.f", d.countryID) == textField.text) { - return true - } - else if (String(format: "%.f", d.orderTotal) == textField.text) { - return true - } - else if (d.firstName == textField.text) { - return true - } - else if (d.lastName == textField.text) - { - return true + self.flex.flexGridFormatItem.addHandler({(eventContainer: XuniEventContainer!) -> Void in + let eventContainerEventArgs = eventContainer.eventArgs as! GridFormatItemEventArgs + if eventContainerEventArgs.panel == self.flex.cells { + if !(self.flex.editRange==nil) && self.flex.editRange.intersects(eventContainerEventArgs.cellRange) { + return + } + + if (self.flex.columns![eventContainerEventArgs.col] as! GridColumn).dataType == XuniDataType.Boolean + { + return + } + + do + { + + let regex: NSRegularExpression = try NSRegularExpression(pattern: self.filterField.text!, options: NSRegularExpressionOptions.CaseInsensitive) + let data: String = self.flex.getCellDataForRow(eventContainerEventArgs.row, inColumn: eventContainerEventArgs.col, formatted: true).description + + let attributedString: NSMutableAttributedString = NSMutableAttributedString(string:data) + let allMatches = regex.matchesInString(data, options: NSMatchingOptions(), range: NSMakeRange(0, data.characters.count)) + for aMatch: NSTextCheckingResult in allMatches { + let matchRange: NSRange = aMatch.range + attributedString.setAttributes([NSFontAttributeName: UIFont.boldSystemFontOfSize(self.flex.font.pointSize), NSForegroundColorAttributeName: UIColor.redColor()], range: matchRange) + } + + var t: CGRect = eventContainerEventArgs.panel.getCellRectForRow(eventContainerEventArgs.row, inColumn: eventContainerEventArgs.col) + let col: GridColumn = self.flex.columns![eventContainerEventArgs.col] as! GridColumn + let sz: CGSize = attributedString.size() + let align: NSTextAlignment = col.horizontalAlignment + if align == .Right { + var mod = t.size.width - sz.width - 4 + if mod < 4 { + mod = 4 + } + t.origin.x += mod + } + else if align == .Center { + var mod = (t.size.width - sz.width) / 2 + if mod < 4 { + mod = 4 + } + t.origin.x += mod + } + else { + t.origin.x += 4 + } + + var mod = (t.size.height - sz.height) / 2 + if mod < 4 { + mod = 4 + } + t.origin.y += mod + attributedString.drawInRect(t) + eventContainerEventArgs.cancel = true + } + catch + { + + } + } - else if (d.city == textField.text){ - return true - } - else if (d.address == textField.text){ - return true - } - else if (d.country == textField.text){ - return true - } - else if (dateFormat.stringFromDate(d.lastOrderDate) == textField.text) { - return true - } - else { - return false - } - } as IXuniPredicate; + }, forObject: self) } - - func textFieldShouldReturn(textField: UITextField) -> Bool { - textField.resignFirstResponder() - return true + + @IBAction func onTextChange(sender: UITextField) { + let textField: UITextField = sender + let flex: FlexGrid = self.flex + let dateFormat: NSDateFormatter = NSDateFormatter() + dateFormat.dateFormat = "M/d/yy" + if textField.text?.characters.count > 0 { + flex.collectionView.filter = {(item: NSObject!) -> Bool in + let d: CustomerData = (item as! CustomerData) + if "\(d.customerID)".lowercaseString.containsString(textField.text!.lowercaseString) { + return true + } + else if "\(d.countryID)".lowercaseString.containsString(textField.text!.lowercaseString) { + return true + } + else if "\(d.email)".lowercaseString.containsString(textField.text!.lowercaseString) { + return true + } + else if d.firstName.lowercaseString.containsString(textField.text!.lowercaseString) { + return true + } + else if d.lastName.lowercaseString.containsString(textField.text!.lowercaseString) { + return true + } + else if d.country.lowercaseString.containsString(textField.text!.lowercaseString) { + return true + } + else if d.city.lowercaseString.containsString(textField.text!.lowercaseString) { + return true + } + else if d.address.lowercaseString.containsString(textField.text!.lowercaseString) { + return true + } + else if dateFormat.stringFromDate(d.lastOrderDate).lowercaseString.containsString(textField.text!.lowercaseString) { + return true + } + else { + return false + } + + } + } + else { + flex.collectionView.filter = nil + } } - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - // Get the new view controller using segue.destinationViewController. - // Pass the selected object to the new view controller. + + @IBAction func finishedit(sender: UITextField) { + sender.resignFirstResponder() } - */ - + + @IBOutlet weak var filterField: UITextField! + @IBOutlet weak var flex: FlexGrid! } +// +// FullTextFilterController.m +// FlexGrid101 +// +// Copyright (c) 2015 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/GettingStartedController.swift b/Swift/FlexGrid101/FlexGrid101/GettingStartedController.swift index 85b001a..9e28f05 100644 --- a/Swift/FlexGrid101/FlexGrid101/GettingStartedController.swift +++ b/Swift/FlexGrid101/FlexGrid101/GettingStartedController.swift @@ -1,49 +1,94 @@ // -// GettingStartedController.swift +// EditingController.h // FlexGrid101 // // Copyright (c) 2015 GrapeCity. All rights reserved. // - import UIKit -import XuniFlexGridKit +import XuniCoreDynamicKit +import XuniFlexGridDynamicKit + +class GettingStartedController: UIViewController, FlexGridDelegate { -class GettingStartedController: UIViewController { - var _flex = FlexGrid() - override func viewDidLoad() { super.viewDidLoad() + self.flex.columnHeaderFont = UIFont.boldSystemFontOfSize(self.flex.columnHeaderFont.pointSize) + self.flex.isReadOnly = false + self.flex.delegate = self + self.flex.flexGridAutoGeneratingColumn.addHandler({(eventContainer: XuniEventContainer!) -> Void in + let eventContainerEventArgs = eventContainer.eventArgs as! GridAutoGeneratingColumnEventArgs + if (eventContainerEventArgs.propertyInfo.name == "country") || (eventContainerEventArgs.propertyInfo.name == "name") || (eventContainerEventArgs.propertyInfo.name == "orderAverage") { + eventContainerEventArgs.cancel = true + } + else if (eventContainerEventArgs.propertyInfo.name == "customerID") { + eventContainerEventArgs.column.isReadOnly = true + } + else if (eventContainerEventArgs.propertyInfo.name == "countryID") { + eventContainerEventArgs.column.header = "Country" + eventContainerEventArgs.column.horizontalAlignment = .Left + let items = CustomerData.defaultCountries() + eventContainerEventArgs.column.dataMap = GridDataMap(array: items, selectedValuePath: "identifier", displayMemberPath: "title") + } + else if (eventContainerEventArgs.propertyInfo.name == "orderTotal") { + eventContainerEventArgs.column.format = "C2" + } + else if (eventContainerEventArgs.propertyInfo.name == "address") { + eventContainerEventArgs.column.wordWrap = true + } - // Do any additional setup after loading the view. - _flex.isReadOnly = true - _flex.itemsSource = CustomerData.getCustomerData(100) - _flex.autoSizeColumns(0, to: Int32(Int(_flex.columns.count)-1)) - - self.view.addSubview(_flex) + }, forObject: self) + self.flex.itemsSource = NSMutableArray(array:CustomerData.getCustomerData(100)) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - - if (self.navigationController == nil) {return;} - - let ss = UIApplication.sharedApplication().statusBarFrame.size.height + self.navigationController!.navigationBar.intrinsicContentSize().height; - - _flex.frame = CGRectMake(0, ss, self.view.bounds.size.width, self.view.bounds.size.height - ss) - _flex.setNeedsDisplay() + + func prepareCellForEdit(sender: FlexGrid, panel: GridPanel, forRange range: GridCellRange) -> Bool { + let flex: FlexGrid = self.flex + let col: GridColumn = flex.columns![range.col] as! GridColumn + if (col.binding == "lastOrderDate") { + let editor: UITextField = (flex.activeEditor as! UITextField) + let picker: UIDatePicker = UIDatePicker() + let d: NSDate = (flex.cells.getCellDataForRow(range.row, inColumn: range.col, formatted: false) as! NSDate) + picker.opaque = true + picker.datePickerMode = .Date + picker.date = d + picker.addTarget(self, action: #selector(onDatePickerChanged(_:)), forControlEvents: .ValueChanged) + editor.inputView = picker + let toolbar: UIToolbar = UIToolbar(frame: CGRectMake(0, 0, flex.frame.size.width, 44)) + toolbar.barStyle = .Default + let done: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Done, target: self, action: #selector(endEditDatePicker(_:))) + let space: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil) + toolbar.items = [space, done] + editor.inputAccessoryView = toolbar + editor.clearButtonMode = .Never + } + return false + } + + func onDatePickerChanged(sender: UIDatePicker) { + let flex: FlexGrid = self.flex + let editor: UITextField = (flex.activeEditor as! UITextField) + let c: GridColumn = flex.columns![flex.editRange.col] as! GridColumn + editor.text = String(c.getFormattedValue(sender.date)) } - /* - // MARK: - Navigation - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - // Get the new view controller using segue.destinationViewController. - // Pass the selected object to the new view controller. + func endEditDatePicker(textField: UITextField) -> Bool { + let flex: FlexGrid = self.flex + let editor: UITextField = (flex.activeEditor as! UITextField) + let picker: UIDatePicker = (editor.inputView as! UIDatePicker) + flex.cells.setCellData(picker.date, forRow: flex.editRange.row, inColumn: flex.editRange.col) + flex.finishEditing(true) + return true } - */ + @IBOutlet weak var flex: FlexGrid! } +// +// EditingController.m +// FlexGrid101 +// +// Copyright (c) 2015 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/GroupingController.swift b/Swift/FlexGrid101/FlexGrid101/GroupingController.swift index b282518..28212eb 100644 --- a/Swift/FlexGrid101/FlexGrid101/GroupingController.swift +++ b/Swift/FlexGrid101/FlexGrid101/GroupingController.swift @@ -1,67 +1,46 @@ // -// GroupingController.swift +// GroupingController.h // FlexGrid101 // // Copyright (c) 2015 GrapeCity. All rights reserved. // - import UIKit -import XuniFlexGridKit +import XuniCoreDynamicKit +import XuniFlexGridDynamicKit class GroupingController: UIViewController { - var _flex = FlexGrid() - var _sortAscendingButton = UIButton() - var _sortDescendingButton = UIButton() + override func viewDidLoad() { super.viewDidLoad() - - _flex.autoGenerateColumns = false - let c1: FlexColumn = FlexColumn() - c1.binding = "firstName" - c1.header = NSLocalizedString("First Name", comment: "") + self.flex.columnHeaderFont = UIFont.boldSystemFontOfSize(self.flex.columnHeaderFont.pointSize) + self.flex.isReadOnly = true + self.flex.autoGenerateColumns = false + let c1: GridColumn = GridColumn() + c1.binding = "active" + c1.header = NSLocalizedString("Active", comment: "") c1.width = 100 - let c2: FlexColumn = FlexColumn() - c2.binding = "lastName" - c2.header = NSLocalizedString("Last Name", comment: "") - let c3: FlexColumn = FlexColumn() + let c2: GridColumn = GridColumn() + c2.binding = "firstName" + c2.header = NSLocalizedString("Name", comment: "") + let c3: GridColumn = GridColumn() c3.binding = "orderTotal" c3.header = NSLocalizedString("Order Total", comment: "") c3.format = "C" c3.aggregate = XuniAggregate.Sum - _flex.columns.addObject(c1) - _flex.columns.addObject(c2) - _flex.columns.addObject(c3) - - - // Do any additional setup after loading the view. - _sortAscendingButton = UIButton(type: UIButtonType.System) - _sortAscendingButton.setTitle(NSLocalizedString("Ascending", comment: ""), forState: UIControlState.Normal) - _sortAscendingButton.addTarget(self, action: "sortAscendingButtonClicked", forControlEvents: UIControlEvents.TouchUpInside) - - _sortDescendingButton = UIButton(type: UIButtonType.System) - _sortDescendingButton.setTitle(NSLocalizedString("Descending", comment: ""), forState: UIControlState.Normal) - _sortDescendingButton.addTarget(self, action: "sortDescendingButtonClicked", forControlEvents: UIControlEvents.TouchUpInside) - - _flex.itemsSource = CustomerData.getCustomerData(100) - _flex.isReadOnly = true - - let gd = XuniPropertyGroupDescription(property: "country") - let sd = XuniSortDescription(property: "country", ascending: true) - - _flex.collectionView.groupDescriptions.addObject(gd) - _flex.collectionView.sortDescriptions.addObject(sd) - - self.starSizing(_flex) - self.view.addSubview(_flex) - self.view.addSubview(_sortDescendingButton) - self.view.addSubview(_sortAscendingButton) + self.flex.columns.addObject(c1) + self.flex.columns.addObject(c2) + self.flex.columns.addObject(c3) + let gd: XuniPropertyGroupDescription = XuniPropertyGroupDescription(property: "country") + self.flex.itemsSource = NSMutableArray(array:CustomerData.getCustomerData(100)) + self.flex.collectionView.groupDescriptions.addObject(gd) + self.starSizing(self.flex) } - + func starSizing(g: FlexGrid) { - for var i:UInt = 0; i < g.columns.count; i++ { - let c: FlexColumn = g.columns.objectAtIndex(i) as! FlexColumn - c.widthType = FlexColumnWidth.Star - c.width = (i == 0) ? 3 : (i == 3) ? 3 : 4 + for i:UInt in 0 ..< g.columns.count { + let c: GridColumn = g.columns.objectAtIndex(i) as! GridColumn + c.widthType = GridColumnWidth.Star + c.width = (i == 0) ? 2 : (i == 3) ? 3 : 4 } } @@ -69,37 +48,60 @@ class GroupingController: UIViewController { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } - - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - - _sortAscendingButton.frame = CGRectMake(0, 60, self.view.bounds.size.width/2, 50) - _sortDescendingButton.frame = CGRectMake(self.view.bounds.size.width/2, 60, self.view.bounds.size.width/2, 50) - _flex.frame = CGRectMake(0, 110, self.view.bounds.size.width, self.view.bounds.size.height-110) - - _flex.setNeedsDisplay() + + @IBAction func doSort(sender: AnyObject) { + let btn: UIBarButtonItem = (sender as! UIBarButtonItem) + if (btn.title == NSLocalizedString("Z-A", comment:"")) { + self.sortDescendingButtonClicked() + btn.title = NSLocalizedString("A-Z", comment:"") + } + else { + self.sortAscendingButtonClicked() + btn.title = NSLocalizedString("Z-A", comment:"") + } } - - func sortAscendingButtonClicked(){ - _flex.collectionView.sortDescriptions.removeAllObjects() - let sd = XuniSortDescription(property: "country", ascending: true) - _flex.collectionView.sortDescriptions.addObject(sd) + + @IBAction func doCollapse(sender: AnyObject) { + let btn: UIBarButtonItem = (sender as! UIBarButtonItem) + if (btn.title == NSLocalizedString("Collapse", comment:"")) { + self.flex.collapseGroupsToLevel(0) + btn.title = NSLocalizedString("Expand", comment:"") + } + else { + if self.flex.finishEditing(false) { + for i:UInt in 0 ..< self.flex.rows.count { + let row: GridRow = (self.flex.rows.objectAtIndex(i) as! GridRow) + if (row is GridGroupRow) { + let group: GridGroupRow = (row as! GridGroupRow) + group.isCollapsed = false + } + } + } + btn.title = NSLocalizedString("Collapse", comment:"") + } } - - func sortDescendingButtonClicked(){ - _flex.collectionView.sortDescriptions.removeAllObjects() - let sd = XuniSortDescription(property: "country", ascending: false) - _flex.collectionView.sortDescriptions.addObject(sd) + + func sortAscendingButtonClicked() { + self.flex.collectionView.sortDescriptions.removeAllObjects() + let sd: XuniSortDescription = XuniSortDescription(property: "country", ascending: true) + self.flex.collectionView.sortDescriptions.addObject(sd) + self.collapseButton.title = NSLocalizedString("Collapse", comment:"") } - - /* - // MARK: - Navigation - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - // Get the new view controller using segue.destinationViewController. - // Pass the selected object to the new view controller. + func sortDescendingButtonClicked() { + self.flex.collectionView.sortDescriptions.removeAllObjects() + let sd: XuniSortDescription = XuniSortDescription(property: "country", ascending: false) + self.flex.collectionView.sortDescriptions.addObject(sd) + self.collapseButton.title = NSLocalizedString("Collapse", comment:"") } - */ + @IBOutlet weak var flex: FlexGrid! + @IBOutlet weak var sortButton: UIBarButtonItem! + @IBOutlet weak var collapseButton: UIBarButtonItem! } +// +// GroupingController.m +// FlexGrid101 +// +// Copyright (c) 2015 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/Images.xcassets/AppIcon.appiconset/Contents.json b/Swift/FlexGrid101/FlexGrid101/Images.xcassets/AppIcon.appiconset/Contents.json index c4071ec..eb31a95 100644 --- a/Swift/FlexGrid101/FlexGrid101/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Swift/FlexGrid101/FlexGrid101/Images.xcassets/AppIcon.appiconset/Contents.json @@ -34,14 +34,15 @@ "scale" : "3x" }, { - "idiom" : "ipad", "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small.png", "scale" : "1x" }, { "size" : "29x29", "idiom" : "ipad", - "filename" : "Icon-Small@2x-1-1.png", + "filename" : "Icon-Small@2x.png", "scale" : "2x" }, { diff --git a/Swift/FlexGrid101/FlexGrid101/License.swift b/Swift/FlexGrid101/FlexGrid101/License.swift index 232be7c..ecb877a 100644 --- a/Swift/FlexGrid101/FlexGrid101/License.swift +++ b/Swift/FlexGrid101/FlexGrid101/License.swift @@ -1,12 +1,16 @@ // -// License.swift +// License.h // FlexGrid101 // // Copyright (c) 2015 GrapeCity. All rights reserved. // +import Foundation -import UIKit +// +// License.m +// FlexGrid101 +// +// Copyright (c) 2015 GrapeCity. All rights reserved. +// -class License { - let key = "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" -} +let key: String = "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" \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/OnDemandController.swift b/Swift/FlexGrid101/FlexGrid101/OnDemandController.swift index 4f75606..8d67a3f 100644 --- a/Swift/FlexGrid101/FlexGrid101/OnDemandController.swift +++ b/Swift/FlexGrid101/FlexGrid101/OnDemandController.swift @@ -1,47 +1,100 @@ -import Foundation +// +// OnDemandController.h +// FlexGrid101 +// +// Copyright © 2015 GrapeCity. All rights reserved. +// import UIKit -import XuniFlexGridKit +import XuniFlexGridDynamicKit class OnDemandController: UIViewController { - override func viewDidLoad() { - super.viewDidLoad() - let flex: FlexGrid = FlexGrid() - flex.columnHeaderFont = UIFont.boldSystemFontOfSize(flex.columnHeaderFont.pointSize) - flex.isReadOnly = true - flex.collectionView = DemoCursorCollectionView() - flex.tag = 1 - flex.autoSizeColumns(0, to: Int32(flex.columns.count) - 1) - view.addSubview(flex) + @IBAction func startSearching(sender: AnyObject) { + self.textInput.resignFirstResponder() + self.updateSearch() } - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() + @IBAction func searchModeChanged(sender: AnyObject) { + self.updateSearch() } - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - if (self.navigationController == nil) {return;} - let flex: FlexGrid = view.viewWithTag(1) as! FlexGrid - let ss: CGFloat = UIApplication.sharedApplication().statusBarFrame.size.height + navigationController!.navigationBar.intrinsicContentSize().height - flex.frame = CGRectMake(0, ss, view.bounds.size.width, view.bounds.size.height - ss) - flex.setNeedsDisplay() + func updateSearch() { + var selArray: [String] = ["relevance", "date", "viewCount", "rating", "title"] + let cv: YouTubeCollectionView = YouTubeCollectionView(query: self.textInput.text!, orderBy: selArray[self.sortSelect.selectedSegmentIndex]) + self.flex.collectionView = cv + cv.loadMoreItems(50, completion: {() -> Void in + }) } -} -class DemoCursorCollectionView: XuniCursorCollectionView { - - override init() { - super.init() - self.sourceCollection = CustomerData.getCustomerData(100) + override func viewDidLoad() { + super.viewDidLoad() + var dic: [NSObject : AnyObject] = [NSObject : AnyObject]() + self.flex.columnHeaderFont = UIFont.boldSystemFontOfSize(self.flex.columnHeaderFont.pointSize) + self.flex.isReadOnly = true + self.flex.autoGenerateColumns = false + let thumbnail: GridColumn = GridColumn() + thumbnail.binding = "thumbnail" + thumbnail.width = 150 + self.flex.columns.addObject(thumbnail) + let title: GridColumn = GridColumn() + title.binding = "title" + title.wordWrap = true + self.flex.columns.addObject(title) + let channel: GridColumn = GridColumn() + channel.binding = "channelTitle" + channel.wordWrap = true + self.flex.columns.addObject(channel) + + + self.flex.flexGridLoadedRows.addHandler({(eventContainer: XuniEventContainer!) -> Void in + for i:UInt in 0 ..< self.flex.rows.count { + let row: GridRow = self.flex.rows.objectAtIndex(i) as! GridRow + row.height = 75 + } + }, forObject: self) + self.flex.flexGridFormatItem.addHandler({(eventContainer: XuniEventContainer!) -> Void in + let eventContainerEventArgs = eventContainer.eventArgs as! GridFormatItemEventArgs + let col: GridColumn = self.flex.columns.objectAtIndex(UInt(eventContainerEventArgs.col)) as! GridColumn + if (col.binding == "thumbnail") && eventContainerEventArgs.panel == self.flex.cells { + let url: String = String(self.flex.getCellDataForRow(eventContainerEventArgs.row, inColumn: eventContainerEventArgs.col, formatted: false)) + let imgdata: NSData! = (dic[url] as! NSData!) + if imgdata == nil { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), {() -> Void in + let imgdata: NSData = NSData(contentsOfURL: NSURL(string: url)!)! + dispatch_async(dispatch_get_main_queue(), {() -> Void in + dic[url] = imgdata + self.flex.invalidate() + }) + }) + eventContainerEventArgs.cancel = true + return + } + let image: UIImage = UIImage(data:imgdata!)! + let r: CGRect = eventContainerEventArgs.panel.getCellRectForRow(eventContainerEventArgs.row, inColumn: eventContainerEventArgs.col) + let imageSize: CGSize = image.size + let viewSize: CGSize = r.size + let hfactor: Float = Float(imageSize.width) / Float(viewSize.width) + let vfactor: Float = Float(imageSize.height) / Float(viewSize.height) + let factor: Float = fmax(hfactor, vfactor) + let newWidth: Float = Float(imageSize.width) / factor + let newHeight: Float = Float(imageSize.height) / factor + let newRect: CGRect = CGRectMake(r.origin.x + (r.size.width - CGFloat(newWidth)) / 2, r.origin.y + (r.size.height - CGFloat(newHeight)) / 2, CGFloat(newWidth), CGFloat(newHeight)) + image.drawInRect(newRect) + eventContainerEventArgs.cancel = true + } + }, forObject: self) + self.updateSearch() } - - override func itemGetter(desiredNumber: NSNumber!) -> NSMutableArray! { - return CustomerData.getCustomerData(desiredNumber == nil ? 100 : Int(desiredNumber.intValue)) - } + @IBOutlet weak var flex: FlexGrid! + @IBOutlet weak var textInput: UITextField! + @IBOutlet weak var sortSelect: UISegmentedControl! +} +// +// OnDemandController.m +// FlexGrid101 +// +// Copyright © 2015 GrapeCity. All rights reserved. +// - override func hasMoreItems() -> Bool { - return sourceCollection.count < 400 - } -} \ No newline at end of file +import XuniCoreDynamicKit \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/RowDetailsViewController.swift b/Swift/FlexGrid101/FlexGrid101/RowDetailsViewController.swift index 1b67199..bf88489 100644 --- a/Swift/FlexGrid101/FlexGrid101/RowDetailsViewController.swift +++ b/Swift/FlexGrid101/FlexGrid101/RowDetailsViewController.swift @@ -1,45 +1,97 @@ // -// RowDetailsViewController.swift +// RowDetailsViewController.h // FlexGrid101 // // Copyright © 2016 GrapeCity. All rights reserved. // - import UIKit -import XuniFlexGridKit +import XuniFlexGridDynamicKit class RowDetailsViewController: UIViewController { - @IBOutlet weak var grid: FlexGrid! - + @IBAction func detailModeChange(sender: AnyObject) { + switch self.detailMode.selectedSegmentIndex { + case 0: + self.grid.detailProvider.detailVisibilityMode = GridDetailVisibilityMode.ExpandSingle + case 1: + self.grid.detailProvider.detailVisibilityMode = GridDetailVisibilityMode.ExpandMultiple + case 2: + self.grid.detailProvider.detailVisibilityMode = GridDetailVisibilityMode.Selection + default: + self.grid.detailProvider.detailVisibilityMode = .None + } + + } + override func viewDidLoad() { super.viewDidLoad() self.grid.isReadOnly = true - self.grid.itemsSource = CustomerData.getCustomerData(100) - let rowHeaderLoadingEventHandler: IXuniEventHandler = {(sender: NSObject!, args: XuniEventArgs!) -> Void in - let e: FlexGridRowHeaderLoadingEventArgs = (args as! FlexGridRowHeaderLoadingEventArgs) + self.grid.selectionMode = GridSelectionMode.Row + self.grid.columnHeaderFont = UIFont.boldSystemFontOfSize(self.grid.columnHeaderFont.pointSize) + self.grid.autoGenerateColumns = false + + let identifier: GridColumn = GridColumn() + identifier.binding = "customerID" + identifier.header = "ID" + identifier.isReadOnly = true + identifier.widthType = GridColumnWidth.Pixel + identifier.width = 45 + self.grid.columns.addObject(identifier) + let firstName: GridColumn = GridColumn() + firstName.binding = "firstName" + firstName.widthType = GridColumnWidth.Star + firstName.width = 1 + self.grid.columns.addObject(firstName) + let lastName: GridColumn = GridColumn() + lastName.binding = "lastName" + lastName.widthType = GridColumnWidth.Star + lastName.width = 1 + self.grid.columns.addObject(lastName) + + self.grid.detailProvider.gridRowHeaderLoading.addHandler({(eventContainer: XuniEventContainer!) -> Void in + let eventContainerEventArgs = eventContainer.eventArgs as! GridRowHeaderLoadingEventArgs let btn: UIButton = UIButton(type: .Custom) btn.setImage(UIImage(named: "show"), forState: (.Normal)) btn.setImage(UIImage(named: "hide"), forState: (.Selected)) btn.imageView!.contentMode = .ScaleAspectFit - e.button = btn - } - self.grid.detailProvider.gridRowHeaderLoading.addHandler(rowHeaderLoadingEventHandler, forObject: self) - let detailCellCreatingHandler: IXuniEventHandler = {(sender: NSObject!, args: XuniEventArgs!) -> Void in - let e: FlexGridDetailCellCreatingEventArgs = (args as! FlexGridDetailCellCreatingEventArgs) - let flex: FlexGrid = FlexGrid() - flex.itemsSource = NSMutableArray(array: XuniReflector.getProperties(e.row.dataItem)) - e.view = flex - } - self.grid.detailProvider.detailCellCreating.addHandler(detailCellCreatingHandler, forObject: self) - self.grid.detailProvider.detailVisibilityMode = FlexGridDetailVisibilityMode.ExpandMultiple - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. + eventContainerEventArgs.button = btn + }, forObject: self) + + self.grid.detailProvider.detailCellCreating.addHandler({(eventContainer: XuniEventContainer!) -> Void in + let eventContainerEventArgs = eventContainer.eventArgs as! GridDetailCellCreatingEventArgs + let mapView: MKMapView = MKMapView() + eventContainerEventArgs.view = mapView + mapView.userInteractionEnabled = false + let geocoder: CLGeocoder = CLGeocoder() + geocoder.geocodeAddressString((eventContainerEventArgs.row.dataItem as! CustomerData).city, completionHandler: {(placemarks: [CLPlacemark]?, error: NSError?) -> Void in + if error != nil { + print("\(error)") + } + else { + let placemark: CLPlacemark = placemarks!.last! + let spanX: Double = 0.0725 + let spanY: Double = 0.0725 + var region: MKCoordinateRegion = MKCoordinateRegion() + region.center.latitude = placemark.location!.coordinate.latitude + region.center.longitude = placemark.location!.coordinate.longitude + region.span = MKCoordinateSpanMake(spanX, spanY) + mapView.setRegion(region, animated: false) + } + }) + }, forObject: self) + self.detailModeChange(self) + self.grid.itemsSource = NSMutableArray(array:CustomerData.getCustomerData(100)) } - - + @IBOutlet weak var grid: FlexGrid! + @IBOutlet weak var detailMode: UISegmentedControl! } +// +// RowDetailsViewController.m +// FlexGrid101 +// +// Copyright © 2016 GrapeCity. All rights reserved. +// + +import MapKit +import CoreLocation \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/SampleData.swift b/Swift/FlexGrid101/FlexGrid101/SampleData.swift new file mode 100644 index 0000000..b62a71a --- /dev/null +++ b/Swift/FlexGrid101/FlexGrid101/SampleData.swift @@ -0,0 +1,22 @@ +// +// SampleData.h +// CollectionView101 +// +// Copyright © 2016 GrapeCity. All rights reserved. +// +import Foundation +class SampleData: NSObject { + var title: String = "" + var subtitle: String = "" + var thumbnail: String = "" + var link: String = "" + var channelTitle: String = "" + + init(title: String, subtitle: String) { + self.title = title + self.subtitle = subtitle + + super.init() + + } +} \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/SelectionModesController.swift b/Swift/FlexGrid101/FlexGrid101/SelectionModesController.swift index 61f6839..fa2fc55 100644 --- a/Swift/FlexGrid101/FlexGrid101/SelectionModesController.swift +++ b/Swift/FlexGrid101/FlexGrid101/SelectionModesController.swift @@ -1,79 +1,55 @@ // -// SelectionModesController.swift +// SelectionModesController.h // FlexGrid101 // // Copyright (c) 2015 GrapeCity. All rights reserved. // - import UIKit -import XuniFlexGridKit - -class SelectionModesController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { - - var _selectionModePicker = UIPickerView() - var _flex = FlexGrid() - var _pickerData = NSMutableArray() - - override func viewDidLoad() { - super.viewDidLoad() +import XuniCoreDynamicKit +import XuniFlexGridDynamicKit - // Do any additional setup after loading the view. - _pickerData = [NSLocalizedString("None", comment: ""), NSLocalizedString("Cell", comment: ""), NSLocalizedString("Cell Range", comment: ""), NSLocalizedString("Row", comment: ""), NSLocalizedString("Row Range", comment: "")] - - _flex.isReadOnly = true - _flex.itemsSource = CustomerData.getCustomerData(100) - - _selectionModePicker.delegate = self - _selectionModePicker.showsSelectionIndicator = true - _selectionModePicker.hidden = false - - self.view.addSubview(_flex) - self.view.addSubview(_selectionModePicker) - } +class SelectionModesController: UIViewController { - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - _flex.frame = CGRectMake(0, 206, self.view.bounds.size.width, (self.view.bounds.size.height-206)) - _selectionModePicker.frame = CGRectMake(self.view.bounds.size.width/4, 44, self.view.bounds.size.width/2, 162) - _flex.setNeedsDisplay() - } - func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { - return 1 - } - func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { - return _pickerData.count - } - func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { - switch (row) { - case 0: - _flex.selectionMode = FlexSelectionMode.None - case 1: - _flex.selectionMode = FlexSelectionMode.Cell - case 2: - _flex.selectionMode = FlexSelectionMode.CellRange - case 3: - _flex.selectionMode = FlexSelectionMode.Row - case 4: - _flex.selectionMode = FlexSelectionMode.RowRange - default: - break; + @IBAction func modeSwitched(sender: AnyObject) { + let row: Int = self.modeSwitch.selectedSegmentIndex + if row == 0 { + self.flex.selectionMode = GridSelectionMode.None + } + else if row == 1 { + self.flex.selectionMode = GridSelectionMode.Cell } + else if row == 2 { + self.flex.selectionMode = GridSelectionMode.CellRange + } + else if row == 3 { + self.flex.selectionMode = GridSelectionMode.Row + } + else if row == 4 { + self.flex.selectionMode = GridSelectionMode.RowRange + } + } - - func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { - return _pickerData.objectAtIndex(row) as? String - } /* - // MARK: - Navigation - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - // Get the new view controller using segue.destinationViewController. - // Pass the selected object to the new view controller. + override func viewDidLoad() { + super.viewDidLoad() + self.flex.isReadOnly = true + self.flex.columnHeaderFont = UIFont.boldSystemFontOfSize(self.flex.columnHeaderFont.pointSize) + self.flex.selectionMode = GridSelectionMode.None + self.flex.itemsSource = NSMutableArray(array:CustomerData.getCustomerData(100)) + self.flex.flexGridSelectionChanged.addHandler({(eventContainer: XuniEventContainer!) -> Void in + let selected = self.flex.selection.columnSpan * self.flex.selection.rowSpan + self.selectedCount.title = "\(selected) selected" + }, forObject: self) } - */ + @IBOutlet weak var flex: FlexGrid! + @IBOutlet weak var modeSwitch: UISegmentedControl! + @IBOutlet weak var selected: UIBarButtonItem! + @IBOutlet weak var selectedCount: UIBarButtonItem! } +// +// SelectionModesController.m +// FlexGrid101 +// +// Copyright (c) 2015 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/StarSizingController.swift b/Swift/FlexGrid101/FlexGrid101/StarSizingController.swift index b5b45a5..533cb37 100644 --- a/Swift/FlexGrid101/FlexGrid101/StarSizingController.swift +++ b/Swift/FlexGrid101/FlexGrid101/StarSizingController.swift @@ -1,77 +1,47 @@ // -// StarSizingController.swift +// StarSizingController.h // FlexGrid101 // // Copyright © 2015 GrapeCity. All rights reserved. // - import UIKit -import XuniFlexGridKit +import XuniFlexGridDynamicKit class StarSizingController: UIViewController { - var flex = FlexGrid() override func viewDidLoad() { super.viewDidLoad() - - flex.columnHeaderFont = UIFont.boldSystemFontOfSize(flex.columnHeaderFont.pointSize) - flex.autoGenerateColumns = false - let c1: FlexColumn = FlexColumn() - c1.binding = "customerID" - c1.header = NSLocalizedString("ID", comment: "") - c1.widthType = FlexColumnWidth.Star - c1.width = 1 - let c2: FlexColumn = FlexColumn() - c2.binding = "firstName" - c2.header = NSLocalizedString("First Name", comment: "") - c2.widthType = FlexColumnWidth.Star + self.flex.columnHeaderFont = UIFont.boldSystemFontOfSize(self.flex.columnHeaderFont.pointSize) + self.flex.autoGenerateColumns = false + let c1: GridColumn = GridColumn() + c1.binding = "firstName" + c1.header = NSLocalizedString("First Name", comment:"") + c1.widthType = GridColumnWidth.Star + c1.width = 3 + let c2: GridColumn = GridColumn() + c2.binding = "lastName" + c2.header = NSLocalizedString("Last Name", comment:"") + c2.widthType = GridColumnWidth.Star c2.width = 3 - let c3: FlexColumn = FlexColumn() - c3.binding = "lastName" - c3.header = NSLocalizedString("Last Name", comment: "") - c3.widthType = FlexColumnWidth.Star - c3.width = 3 - let c4: FlexColumn = FlexColumn() + let c3: GridColumn = GridColumn() + c3.binding = "lastOrderDate" + c3.header = NSLocalizedString("Last Date", comment:"") + c3.widthType = GridColumnWidth.Star + c3.width = 2 + let c4: GridColumn = GridColumn() c4.binding = "orderTotal" - c4.header = NSLocalizedString("Total", comment: "") + c4.header = NSLocalizedString("Total", comment:"") c4.format = "C" - c4.widthType = FlexColumnWidth.Star + c4.headerHorizontalAlignment = .Left + c4.widthType = GridColumnWidth.Star c4.width = 2 - flex.columns.addObject(c1) - flex.columns.addObject(c2) - flex.columns.addObject(c3) - flex.columns.addObject(c4) - flex.itemsSource = CustomerData.getCustomerData(100) - flex.isReadOnly = true - flex.tag = 1 - self.view.addSubview(flex) - - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - - if (self.navigationController == nil) {return;} - - let ss = UIApplication.sharedApplication().statusBarFrame.size.height + self.navigationController!.navigationBar.intrinsicContentSize().height; - - flex.frame = CGRectMake(0, ss, self.view.bounds.size.width, self.view.bounds.size.height - ss) - flex.setNeedsDisplay() - } - - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - // Get the new view controller using segue.destinationViewController. - // Pass the selected object to the new view controller. + self.flex.columns.addObject(c1) + self.flex.columns.addObject(c2) + self.flex.columns.addObject(c3) + self.flex.columns.addObject(c4) + self.flex.itemsSource = NSMutableArray(array: CustomerData.getCustomerData(100)) + self.flex.isReadOnly = true } - */ -} + @IBOutlet weak var flex: FlexGrid! +} \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/UnboundSampleViewController.swift b/Swift/FlexGrid101/FlexGrid101/UnboundSampleViewController.swift new file mode 100644 index 0000000..c8160e2 --- /dev/null +++ b/Swift/FlexGrid101/FlexGrid101/UnboundSampleViewController.swift @@ -0,0 +1,69 @@ +// +// UnboundSampleViewController.h +// FlexGrid101 +// +// Created by Mykola Kotyuck on 16.06.16. +// Copyright © 2016 GrapeCity. All rights reserved. +// +import UIKit +import XuniFlexGridDynamicKit + +class UnboundSampleViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // allow merging + self.grid.allowMerging = GridAllowMerging.All + // add rows/columns to the unbound grid + for _ in 0 ..< 12 { + grid.columns.addObject(GridColumn()) + } + for _ in 0 ..< 500 { + grid.rows.addObject(GridRow()) + } + // populate the unbound grid with some stuff + for r:UInt in 0 ..< grid.rows.count { + for c:UInt in 0 ..< grid.columns.count { + self.grid.setCellData("cell [\(r), \(c)]", forRow: Int32(r), inColumn: Int32(c)) + } + } + // set unbound column headers + let ch: GridPanel = grid.columnHeaders + ch.rows.addObject(GridRow()) + // one header row for years, one for quarters + for c:UInt in 0 ..< ch.columns.count { + ch[0][Int32(c)] = 2016 + c / 4 + // year + ch[1][Int32(c)] = "Q \(c % 4 + 1)" + // quarter + } + // allow merging the first fixed row + (ch.rows[Int32(0)] as! GridRow).allowMerging = true + // set unbound row headers + let rh: GridPanel = grid.rowHeaders + rh.columns.addObject(GridColumn()) + for c:UInt in 0 ..< rh.columns.count { + (rh.columns[Int32(c)] as! GridColumn).width = 60 + for r:UInt in 0 ..< rh.rows.count { + rh[Int32(r)][Int32(c)] = "hdr \(c == 0 ? r / 2 : r), \(c)" + } + } + // allow merging the first fixed column + (rh.columns[Int32(0)] as! GridColumn).allowMerging = true + grid.autoSizeColumns(0, to: 1, header: true) + grid.autoSizeColumns() + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + } + + @IBOutlet weak var grid: FlexGrid! +} +// +// UnboundSampleViewController.m +// FlexGrid101 +// +// Created by Mykola Kotyuck on 16.06.16. +// Copyright © 2016 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/YouTubeCollectionView.swift b/Swift/FlexGrid101/FlexGrid101/YouTubeCollectionView.swift new file mode 100644 index 0000000..27610f0 --- /dev/null +++ b/Swift/FlexGrid101/FlexGrid101/YouTubeCollectionView.swift @@ -0,0 +1,73 @@ +// +// YouTubeCollectionView.h +// CollectionView101 +// +// Copyright © 2016 GrapeCity. All rights reserved. +// +import UIKit +import XuniCoreDynamicKit +class YouTubeCollectionView: XuniCursorCollectionView { + var query: String + + var orderBy: String + + + init(query: String, orderBy: String) { + self.query = query + self.orderBy = orderBy + self.pageToken = "" + super.init() + } + + override func hasMoreItems() -> Bool { + return true + } + + override func itemGetter(desiredNumber: NSNumber!) -> NSMutableArray! + { + let dataToAppend = NSMutableArray() + + let urlAddress: String = "https://www.googleapis.com/youtube/v3/search?part=snippet&type=video&q=\(query.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())!)&order=\(orderBy)&maxResults=\(desiredNumber)\(NSString(string: pageToken).length==0 ? "&pageToken=\(pageToken)" : "")&key=\("AIzaSyDFz8V9U0ccKXQ5oSrcRSoHqpaursqOudo")" + + let dataResult: NSData! = NSData(contentsOfURL: NSURL(string: urlAddress)!) + + if(dataResult == nil) + { + return dataToAppend + } + + let object: AnyObject! = try! NSJSONSerialization.JSONObjectWithData(dataResult, options: NSJSONReadingOptions()) + + if (object is NSDictionary) { + let results: NSDictionary = object as! NSDictionary + self.pageToken = (results["nextPageToken"] as! String) + + let items: NSMutableArray = (results["items"] as! NSMutableArray) + + for index in 0 ..< items.count { + let dict = items[index] as! NSDictionary + let title: NSString = dict.valueForKeyPath("snippet.title") as! NSString + let description: NSString = dict.valueForKeyPath("snippet.description") as! NSString + let sample: SampleData = SampleData(title: title.description, subtitle: description.description) + sample.channelTitle = dict.valueForKeyPath("snippet.channelTitle") as! String + sample.thumbnail = dict.valueForKeyPath("snippet.thumbnails.default.url") as! String + + let vidid = dict.valueForKeyPath("id.videoId") as! String + sample.link = "http://www.youtube.com/watch?v=\(vidid)" + dataToAppend.addObject(sample) + + } + } + + return dataToAppend + + } + + var pageToken: String +} +// +// YouTubeCollectionView.m +// CollectionView101 +// +// Copyright © 2016 GrapeCity. All rights reserved. +// \ No newline at end of file diff --git a/Swift/FlexGrid101/FlexGrid101/flexgrid_headers.png b/Swift/FlexGrid101/FlexGrid101/flexgrid_headers.png new file mode 100644 index 0000000000000000000000000000000000000000..5ff47b307686656ac6c54e53fa64d59c664b995b GIT binary patch literal 2787 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 PT`IuX?oYez8Itf1mpXoR literal 0 HcmV?d00001 diff --git a/Swift/FlexGrid101/FlexGrid101/ja.lproj/LaunchScreen.strings b/Swift/FlexGrid101/FlexGrid101/ja.lproj/LaunchScreen.strings index 4c3f625..6ce77da 100644 --- a/Swift/FlexGrid101/FlexGrid101/ja.lproj/LaunchScreen.strings +++ b/Swift/FlexGrid101/FlexGrid101/ja.lproj/LaunchScreen.strings @@ -1,6 +1,6 @@ -/* Class = "UILabel"; text = " Copyright (c) 2015 GrapeCity. All rights reserved."; ObjectID = "8ie-xW-0ye"; */ -"8ie-xW-0ye.text" = " Copyright (c) 2015 GrapeCity. All rights reserved."; +/* Class = "UILabel"; text = "FlexGrid101"; ObjectID = "9OV-Zx-N0E"; */ +"9OV-Zx-N0E.text" = "FlexGrid101"; -/* Class = "UILabel"; text = "FlexGrid101"; ObjectID = "kId-c2-rCX"; */ -"kId-c2-rCX.text" = "FlexGrid101"; +/* Class = "UILabel"; text = " Copyright (c) 2016 GrapeCity. All rights reserved."; ObjectID = "yI0-Lc-fAb"; */ +"yI0-Lc-fAb.text" = " Copyright (c) 2016 GrapeCity. All rights reserved."; diff --git a/Swift/FlexGrid101/FlexGrid101/ja.lproj/Localizable.strings b/Swift/FlexGrid101/FlexGrid101/ja.lproj/Localizable.strings index 7137ac2..569de8e 100644 --- a/Swift/FlexGrid101/FlexGrid101/ja.lproj/Localizable.strings +++ b/Swift/FlexGrid101/FlexGrid101/ja.lproj/Localizable.strings @@ -2,7 +2,7 @@ Localizable.strings FlexGrid101 - Copyright © 2015 GrapeCity. All rights reserved. + Copyright (c) 2015 GrapeCity. All rights reserved. */ "On Demand Loading" = "ロードオンデマンド"; @@ -44,4 +44,11 @@ "Total" = "合計"; "Count" = "件数"; "Edit Columns" = "表示列の構成を編集"; -"Done" = "完了"; \ No newline at end of file +"Done" = "完了"; +"Monday" = "月曜日"; +"Tuesday" = "火曜日"; +"Wednesday" = "水曜日"; +"Thursday" = "木曜日"; +"Friday" = "金曜日"; +"Saturday" = "土曜日"; +"Sunday" = "日曜日"; diff --git a/Swift/FlexGrid101/FlexGrid101/ja.lproj/Main.strings b/Swift/FlexGrid101/FlexGrid101/ja.lproj/Main.strings index 42ca519..186ab3c 100644 --- a/Swift/FlexGrid101/FlexGrid101/ja.lproj/Main.strings +++ b/Swift/FlexGrid101/FlexGrid101/ja.lproj/Main.strings @@ -1,39 +1,255 @@ +/* Class = "UILabel"; text = "Display, edit and aggregate your data all at once with FlexGrid"; ObjectID = "04q-Qk-1Uw"; */ +"04q-Qk-1Uw.text" = "Display, edit and aggregate your data all at once with FlexGrid"; + +/* Class = "UILabel"; text = "Expand and collapse row details"; ObjectID = "06n-gc-HrI"; */ +"06n-gc-HrI.text" = "Expand and collapse row details"; + /* Class = "UILabel"; text = "Address"; ObjectID = "1eT-oW-hrf"; */ -"1eT-oW-hrf.text" = "住所(Address)"; +"1eT-oW-hrf.text" = "Address"; /* Class = "UILabel"; text = "Cancel"; ObjectID = "27j-QJ-v3z"; */ -"27j-QJ-v3z.text" = "キャンセル"; +"27j-QJ-v3z.text" = "Cancel"; + +/* Class = "UILabel"; text = "Filter"; ObjectID = "2LZ-vR-psM"; */ +"2LZ-vR-psM.text" = "Filter"; + +/* Class = "UILabel"; text = "Custom Cells"; ObjectID = "2Th-7C-8LJ"; */ +"2Th-7C-8LJ.text" = "Custom Cells"; + +/* Class = "UILabel"; text = "Cell Freezing&Merging"; ObjectID = "2gG-ng-mWe"; */ +"2gG-ng-mWe.text" = "Cell Freezing&Merging"; + +/* Class = "UINavigationItem"; title = "Star Sizing"; ObjectID = "3qT-IC-ym1"; */ +"3qT-IC-ym1.title" = "Star Sizing"; /* Class = "UILabel"; text = "City"; ObjectID = "3zE-V2-2FJ"; */ -"3zE-V2-2FJ.text" = "都市(City)"; +"3zE-V2-2FJ.text" = "City"; + +/* Class = "UILabel"; text = "Shows the various cell selection modes"; ObjectID = "4tS-YM-9aG"; */ +"4tS-YM-9aG.text" = "Shows the various cell selection modes"; + +/* Class = "UILabel"; text = ">"; ObjectID = "AA4-TE-lHv"; */ +"AA4-TE-lHv.text" = ">"; + +/* Class = "UILabel"; text = ">"; ObjectID = "BGo-Hy-EXj"; */ +"BGo-Hy-EXj.text" = ">"; + +/* Class = "UINavigationItem"; title = "On Demand"; ObjectID = "BlD-bH-UCJ"; */ +"BlD-bH-UCJ.title" = "On Demand"; + +/* Class = "UINavigationItem"; title = "Getting Started"; ObjectID = "Bmk-c4-cSH"; */ +"Bmk-c4-cSH.title" = "Getting Started"; + +/* Class = "UILabel"; text = "Groups and aggregates a collection of videos"; ObjectID = "DJX-fJ-Pwm"; */ +"DJX-fJ-Pwm.text" = "Groups and aggregates a collection of videos"; + +/* Class = "UISegmentedControl"; DNg-23-xSo.segmentTitles[0] = "None"; ObjectID = "DNg-23-xSo"; */ +"DNg-23-xSo.segmentTitles[0]" = "None"; + +/* Class = "UISegmentedControl"; DNg-23-xSo.segmentTitles[1] = "Cell"; ObjectID = "DNg-23-xSo"; */ +"DNg-23-xSo.segmentTitles[1]" = "Cell"; + +/* Class = "UISegmentedControl"; DNg-23-xSo.segmentTitles[2] = "CellRange"; ObjectID = "DNg-23-xSo"; */ +"DNg-23-xSo.segmentTitles[2]" = "CellRange"; + +/* Class = "UISegmentedControl"; DNg-23-xSo.segmentTitles[3] = "Row"; ObjectID = "DNg-23-xSo"; */ +"DNg-23-xSo.segmentTitles[3]" = "Row"; + +/* Class = "UISegmentedControl"; DNg-23-xSo.segmentTitles[4] = "RowRange"; ObjectID = "DNg-23-xSo"; */ +"DNg-23-xSo.segmentTitles[4]" = "RowRange"; + +/* Class = "UILabel"; text = ">"; ObjectID = "GPg-el-nwa"; */ +"GPg-el-nwa.text" = ">"; -/* Class = "UINavigationItem"; title = "FlexGrid101"; ObjectID = "Gnw-bn-nSm"; */ -"Gnw-bn-nSm.title" = "FlexGrid101"; +/* Class = "UILabel"; text = ">"; ObjectID = "Hgo-7Q-HXe"; */ +"Hgo-7Q-HXe.text" = ">"; -/* Class = "UIBarButtonItem"; title = "FlexGrid101"; ObjectID = "Kll-7W-u7d"; */ -"Kll-7W-u7d.title" = "FlexGrid101"; +/* Class = "UINavigationItem"; title = "Freezing&Merging"; ObjectID = "I2u-HG-HDn"; */ +"I2u-HG-HDn.title" = "Freezing&Merging"; + +/* Class = "UILabel"; text = "Shows a grid with custom cell merging"; ObjectID = "IHh-tS-Qvb"; */ +"IHh-tS-Qvb.text" = "Shows a grid with custom cell merging"; + +/* Class = "UILabel"; text = "Edit cells by input form rather than inline"; ObjectID = "Jnc-m9-pHa"; */ +"Jnc-m9-pHa.text" = "Edit cells by input form rather than inline"; + +/* Class = "UILabel"; text = "Customizes a cell by displaying a numeric value in a gauge"; ObjectID = "Jqb-XX-nWX"; */ +"Jqb-XX-nWX.text" = "Customizes a cell by displaying a numeric value in a gauge"; + +/* Class = "UILabel"; text = ">"; ObjectID = "LUH-fq-7yE"; */ +"LUH-fq-7yE.text" = ">"; /* Class = "UILabel"; text = "E-Mail"; ObjectID = "MSp-cY-cG9"; */ -"MSp-cY-cG9.text" = "メール(E-Mail)"; +"MSp-cY-cG9.text" = "E-Mail"; + +/* Class = "UILabel"; text = "Edit Confirmation"; ObjectID = "Mh8-MY-tUv"; */ +"Mh8-MY-tUv.text" = "Edit Confirmation"; + +/* Class = "UILabel"; text = "Shows how to prompt the user with a confirmation dialog before committing changes to a cell"; ObjectID = "N9S-vR-gzU"; */ +"N9S-vR-gzU.text" = "Shows how to prompt the user with a confirmation dialog before committing changes to a cell"; + +/* Class = "UILabel"; text = "Column Layout"; ObjectID = "NDk-U5-GbB"; */ +"NDk-U5-GbB.text" = "Column Layout"; + +/* Class = "UILabel"; text = ">"; ObjectID = "NbF-kJ-Na8"; */ +"NbF-kJ-Na8.text" = ">"; + +/* Class = "UINavigationItem"; title = "Custom Merging"; ObjectID = "PAA-vu-4Dw"; */ +"PAA-vu-4Dw.title" = "Custom Merging"; + +/* Class = "UILabel"; text = "Selection Modes"; ObjectID = "Pgu-0Z-VMV"; */ +"Pgu-0Z-VMV.text" = "Selection Modes"; + +/* Class = "UILabel"; text = "Filters and highlights the data across all columns"; ObjectID = "Qk7-tT-4qi"; */ +"Qk7-tT-4qi.text" = "Filters and highlights the data across all columns"; + +/* Class = "UILabel"; text = "Rotate the device to see star-sizing in action"; ObjectID = "QkN-hJ-IoU"; */ +"QkN-hJ-IoU.text" = "Rotate the device to see star-sizing in action"; + +/* Class = "UIBarButtonItem"; title = "Edit"; ObjectID = "QoG-Dk-6QL"; */ +"QoG-Dk-6QL.title" = "Edit"; + +/* Class = "UITableViewController"; title = "FlexGrid101"; ObjectID = "Qz0-jK-VdE"; */ +"Qz0-jK-VdE.title" = "FlexGrid101"; /* Class = "UILabel"; text = "Country"; ObjectID = "R1X-wj-bQr"; */ -"R1X-wj-bQr.text" = "国(Country)"; +"R1X-wj-bQr.text" = "Country"; /* Class = "UILabel"; text = "First Name"; ObjectID = "R5M-4S-gmw"; */ -"R5M-4S-gmw.text" = "名(First Name)"; +"R5M-4S-gmw.text" = "First Name"; + +/* Class = "UILabel"; text = "Here you will see the timetable"; ObjectID = "VU5-qF-FzC"; */ +"VU5-qF-FzC.text" = "Here you will see the timetable"; + +/* Class = "UILabel"; text = ">"; ObjectID = "WQg-a8-FOy"; */ +"WQg-a8-FOy.text" = ">"; + +/* Class = "UILabel"; text = "On Demand"; ObjectID = "WUb-mq-rHk"; */ +"WUb-mq-rHk.text" = "On Demand"; /* Class = "UILabel"; text = "Confirm editing"; ObjectID = "ZXh-Mv-kdZ"; */ -"ZXh-Mv-kdZ.text" = "編集の完了"; +"ZXh-Mv-kdZ.text" = "Confirm editing"; + +/* Class = "UINavigationItem"; title = "Edit Confirmation"; ObjectID = "Zhz-qw-39u"; */ +"Zhz-qw-39u.title" = "Edit Confirmation"; /* Class = "UILabel"; text = "Last Name"; ObjectID = "at8-vu-Ft0"; */ -"at8-vu-Ft0.text" = "姓(Last Name)"; +"at8-vu-Ft0.text" = "Last Name"; + +/* Class = "UILabel"; text = "Select TV show"; ObjectID = "b5w-4m-Jz3"; */ +"b5w-4m-Jz3.text" = "Select TV show"; + +/* Class = "UILabel"; text = ">"; ObjectID = "bil-EV-iKd"; */ +"bil-EV-iKd.text" = ">"; + +/* Class = "UILabel"; text = "Star Sizing"; ObjectID = "cCB-Mg-zy9"; */ +"cCB-Mg-zy9.text" = "Star Sizing"; + +/* Class = "UILabel"; text = ">"; ObjectID = "cKR-sR-jnu"; */ +"cKR-sR-jnu.text" = ">"; + +/* Class = "UILabel"; text = "Row Details"; ObjectID = "dsU-dQ-3PQ"; */ +"dsU-dQ-3PQ.text" = "Row Details"; /* Class = "UILabel"; text = ">"; ObjectID = "ein-f6-TS0"; */ "ein-f6-TS0.text" = ">"; +/* Class = "UILabel"; text = ">"; ObjectID = "fAw-eT-abh"; */ +"fAw-eT-abh.text" = ">"; + +/* Class = "UINavigationItem"; title = "Row Details"; ObjectID = "fPn-ol-nxW"; */ +"fPn-ol-nxW.title" = "Row Details"; + +/* Class = "UINavigationItem"; title = "FlexGrid101"; ObjectID = "fQI-FH-RiG"; */ +"fQI-FH-RiG.title" = "FlexGrid101"; + +/* Class = "UINavigationItem"; title = "Conditional Formatting"; ObjectID = "gGM-lt-hc6"; */ +"gGM-lt-hc6.title" = "Conditional Formatting"; + +/* Class = "UILabel"; text = "Uses a CellFactory to apply conditional formatting"; ObjectID = "gcv-bk-jWC"; */ +"gcv-bk-jWC.text" = "Uses a CellFactory to apply conditional formatting"; + +/* Class = "UINavigationItem"; title = "Column Definitions"; ObjectID = "htf-Gy-By7"; */ +"htf-Gy-By7.title" = "Column Definitions"; + +/* Class = "UIBarButtonItem"; title = "0 selected"; ObjectID = "iIA-Df-AaM"; */ +"iIA-Df-AaM.title" = "0 selected"; + +/* Class = "UILabel"; text = "Conditional Formatting"; ObjectID = "if5-fG-b6E"; */ +"if5-fG-b6E.text" = "Conditional Formatting"; + +/* Class = "UINavigationItem"; title = "Editing Form"; ObjectID = "ig5-aS-Vgh"; */ +"ig5-aS-Vgh.title" = "Editing Form"; + +/* Class = "UILabel"; text = "Shows frozen columns, rows and cell merging"; ObjectID = "iwq-wR-ahB"; */ +"iwq-wR-ahB.text" = "Shows frozen columns, rows and cell merging"; + +/* Class = "UILabel"; text = ">"; ObjectID = "jaL-e6-fOw"; */ +"jaL-e6-fOw.text" = ">"; + +/* Class = "UILabel"; text = ">"; ObjectID = "k2d-IG-BPG"; */ +"k2d-IG-BPG.text" = ">"; + +/* Class = "UILabel"; text = "Filters the data by columns through a generated form"; ObjectID = "kcb-VB-G0j"; */ +"kcb-VB-G0j.text" = "Filters the data by columns through a generated form"; + +/* Class = "UILabel"; text = "Getting Started"; ObjectID = "lev-La-dSM"; */ +"lev-La-dSM.text" = "Getting Started"; + +/* Class = "UILabel"; text = "Grouping"; ObjectID = "mTY-Nq-vjh"; */ +"mTY-Nq-vjh.text" = "Grouping"; + +/* Class = "UILabel"; text = ">"; ObjectID = "nLJ-ZY-wYK"; */ +"nLJ-ZY-wYK.text" = ">"; + +/* Class = "UILabel"; text = "Editing Form"; ObjectID = "oUW-Ec-gDn"; */ +"oUW-Ec-gDn.text" = "Editing Form"; + +/* Class = "UILabel"; text = ">"; ObjectID = "pBF-A7-DwK"; */ +"pBF-A7-DwK.text" = ">"; + +/* Class = "UINavigationItem"; title = "Custom Cells"; ObjectID = "qfI-an-dEx"; */ +"qfI-an-dEx.title" = "Custom Cells"; + /* Class = "UILabel"; text = ">"; ObjectID = "r46-Kv-t99"; */ "r46-Kv-t99.text" = ">"; +/* Class = "UILabel"; text = ">"; ObjectID = "sIH-X3-Yo3"; */ +"sIH-X3-Yo3.text" = ">"; + +/* Class = "UILabel"; text = "Column Definitions"; ObjectID = "sYt-Cd-lig"; */ +"sYt-Cd-lig.text" = "Column Definitions"; + /* Class = "UILabel"; text = "Edit the Object"; ObjectID = "syX-hS-ICg"; */ -"syX-hS-ICg.text" = "内容を編集"; +"syX-hS-ICg.text" = "Edit the Object"; + +/* Class = "UILabel"; text = "Custom Merging"; ObjectID = "tmz-Ut-Msh"; */ +"tmz-Ut-Msh.text" = "Custom Merging"; + +/* Class = "UINavigationItem"; title = "Selection Modes"; ObjectID = "ump-jf-AN4"; */ +"ump-jf-AN4.title" = "Selection Modes"; + +/* Class = "UINavigationController"; title = "FlexGrid101"; ObjectID = "vQy-oz-8OE"; */ +"vQy-oz-8OE.title" = "FlexGrid101"; + +/* Class = "UINavigationItem"; title = "Grouping"; ObjectID = "vfQ-bd-Mgq"; */ +"vfQ-bd-Mgq.title" = "Grouping"; + +/* Class = "UILabel"; text = "Shows a custom column manager to modify column layout"; ObjectID = "wKr-Ae-bKg"; */ +"wKr-Ae-bKg.text" = "Shows a custom column manager to modify column layout"; + +/* Class = "UILabel"; text = ">"; ObjectID = "wZw-ZU-IA6"; */ +"wZw-ZU-IA6.text" = ">"; + +/* Class = "UILabel"; text = "Load items on demand as the user scrolls down the grid"; ObjectID = "xhb-NF-nFn"; */ +"xhb-NF-nFn.text" = "Load items on demand as the user scrolls down the grid"; + +/* Class = "UINavigationItem"; title = "Full Text Filter"; ObjectID = "yEw-h4-u6W"; */ +"yEw-h4-u6W.title" = "Full Text Filter"; + +/* Class = "UILabel"; text = "Shows how to specify and format columns"; ObjectID = "ycB-vo-am7"; */ +"ycB-vo-am7.text" = "Shows how to specify and format columns"; + +/* Class = "UILabel"; text = "Full Text Filter"; ObjectID = "zKl-cD-EzG"; */ +"zKl-cD-EzG.text" = "Full Text Filter"; diff --git a/Swift/FlexGrid101/FlexGrid101Tests/FlexGrid101Tests.swift b/Swift/FlexGrid101/FlexGrid101Tests/FlexGrid101Tests.swift index 6cddf1f..16eb076 100644 --- a/Swift/FlexGrid101/FlexGrid101Tests/FlexGrid101Tests.swift +++ b/Swift/FlexGrid101/FlexGrid101Tests/FlexGrid101Tests.swift @@ -1,35 +1,32 @@ // -// FlexGrid101Tests.swift +// FlexGrid101Tests.m // FlexGrid101Tests // // Copyright (c) 2015 GrapeCity. All rights reserved. // - import UIKit import XCTest - class FlexGrid101Tests: XCTestCase { - + override func setUp() { super.setUp() // Put setup code here. This method is called before the invocation of each test method in the class. } - + override func tearDown() { // Put teardown code here. This method is called after the invocation of each test method in the class. super.tearDown() } - + func testExample() { // This is an example of a functional test case. XCTAssert(true, "Pass") } - + func testPerformanceExample() { // This is an example of a performance test case. - self.measureBlock() { + self.measureBlock({() -> Void in // Put the code you want to measure the time of here. - } + }) } - -} +} \ No newline at end of file diff --git a/Swift/Gauges101/Gauges101.xcodeproj/project.pbxproj b/Swift/Gauges101/Gauges101.xcodeproj/project.pbxproj index 095096b..7573a12 100644 --- a/Swift/Gauges101/Gauges101.xcodeproj/project.pbxproj +++ b/Swift/Gauges101/Gauges101.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 4C4796081D30263700BD39C9 /* XuniGaugeDesignTimeStoryboardSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4796071D30263700BD39C9 /* XuniGaugeDesignTimeStoryboardSupport.swift */; }; 4C5FF2B11C49565E008794F4 /* gauge_basic.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C5FF2A31C49565D008794F4 /* gauge_basic.png */; }; 4C5FF2B21C49565E008794F4 /* gauge_bullet.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C5FF2A41C49565E008794F4 /* gauge_bullet.png */; }; 4C5FF2B31C49565E008794F4 /* gauge_linear.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C5FF2A51C49565E008794F4 /* gauge_linear.png */; }; @@ -24,12 +25,16 @@ 4C5FF2C01C4957C0008794F4 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4C5FF2C21C4957C0008794F4 /* Main.storyboard */; }; 4C5FF2C51C4957C8008794F4 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C5FF2C71C4957C8008794F4 /* LaunchScreen.xib */; }; 4C862F731C07717600EA942C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4C862F751C07717600EA942C /* Localizable.strings */; }; + 4CC37CAE1D2A66D000DF85BC /* XuniGaugeDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CC37CAC1D2A66D000DF85BC /* XuniGaugeDynamicKit.framework */; }; + 4CC37CAF1D2A66D000DF85BC /* XuniCoreDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CC37CAD1D2A66D000DF85BC /* XuniCoreDynamicKit.framework */; }; + 4CC37CB01D2A66D500DF85BC /* XuniGaugeDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CC37CAC1D2A66D000DF85BC /* XuniGaugeDynamicKit.framework */; }; + 4CC37CB11D2A66D500DF85BC /* XuniGaugeDynamicKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4CC37CAC1D2A66D000DF85BC /* XuniGaugeDynamicKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4CC37CB21D2A66D500DF85BC /* XuniCoreDynamicKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CC37CAD1D2A66D000DF85BC /* XuniCoreDynamicKit.framework */; }; + 4CC37CB31D2A66D500DF85BC /* XuniCoreDynamicKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4CC37CAD1D2A66D000DF85BC /* XuniCoreDynamicKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; F23573621B4441F400F300D7 /* License.swift in Sources */ = {isa = PBXBuildFile; fileRef = F23573611B4441F400F300D7 /* License.swift */; }; F28241B71B39A6DA00B72CBE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F28241B61B39A6DA00B72CBE /* AppDelegate.swift */; }; F28241BE1B39A6DA00B72CBE /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F28241BD1B39A6DA00B72CBE /* Images.xcassets */; }; F28241CD1B39A6DA00B72CBE /* Gauges101Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F28241CC1B39A6DA00B72CBE /* Gauges101Tests.swift */; }; - F28241D91B39C5DB00B72CBE /* XuniCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F28241D81B39C5DB00B72CBE /* XuniCoreKit.framework */; }; - F28241DB1B39C60000B72CBE /* XuniGaugeKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F28241DA1B39C60000B72CBE /* XuniGaugeKit.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,7 +47,23 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + 4CC37CB41D2A66D500DF85BC /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 4CC37CB31D2A66D500DF85BC /* XuniCoreDynamicKit.framework in Embed Frameworks */, + 4CC37CB11D2A66D500DF85BC /* XuniGaugeDynamicKit.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ + 4C4796071D30263700BD39C9 /* XuniGaugeDesignTimeStoryboardSupport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = XuniGaugeDesignTimeStoryboardSupport.swift; path = ../../../Controls/XuniGaugeDesignTimeStoryboardSupport.swift; sourceTree = ""; }; 4C5FF2A31C49565D008794F4 /* gauge_basic.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gauge_basic.png; sourceTree = ""; }; 4C5FF2A41C49565E008794F4 /* gauge_bullet.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gauge_bullet.png; sourceTree = ""; }; 4C5FF2A51C49565E008794F4 /* gauge_linear.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gauge_linear.png; sourceTree = ""; }; @@ -63,6 +84,8 @@ 4C5FF2C91C4957D3008794F4 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/LaunchScreen.strings; sourceTree = ""; }; 4C862F741C07717600EA942C /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; 4C862F761C07717B00EA942C /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; + 4CC37CAC1D2A66D000DF85BC /* XuniGaugeDynamicKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniGaugeDynamicKit.framework; path = ../../../Controls/XuniGaugeDynamicKit.framework; sourceTree = ""; }; + 4CC37CAD1D2A66D000DF85BC /* XuniCoreDynamicKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreDynamicKit.framework; path = ../../../Controls/XuniCoreDynamicKit.framework; sourceTree = ""; }; F23573611B4441F400F300D7 /* License.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = License.swift; sourceTree = ""; }; F28241B11B39A6DA00B72CBE /* Gauges101.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Gauges101.app; sourceTree = BUILT_PRODUCTS_DIR; }; F28241B51B39A6DA00B72CBE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -71,8 +94,6 @@ F28241C61B39A6DA00B72CBE /* Gauges101Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Gauges101Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; F28241CB1B39A6DA00B72CBE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; F28241CC1B39A6DA00B72CBE /* Gauges101Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Gauges101Tests.swift; sourceTree = ""; }; - F28241D81B39C5DB00B72CBE /* XuniCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreKit.framework; path = "../../../Controls/XuniCoreKit.framework"; sourceTree = ""; }; - F28241DA1B39C60000B72CBE /* XuniGaugeKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniGaugeKit.framework; path = "../../../Controls/XuniGaugeKit.framework"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -80,8 +101,10 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F28241D91B39C5DB00B72CBE /* XuniCoreKit.framework in Frameworks */, - F28241DB1B39C60000B72CBE /* XuniGaugeKit.framework in Frameworks */, + 4CC37CAF1D2A66D000DF85BC /* XuniCoreDynamicKit.framework in Frameworks */, + 4CC37CAE1D2A66D000DF85BC /* XuniGaugeDynamicKit.framework in Frameworks */, + 4CC37CB21D2A66D500DF85BC /* XuniCoreDynamicKit.framework in Frameworks */, + 4CC37CB01D2A66D500DF85BC /* XuniGaugeDynamicKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -111,8 +134,9 @@ F28241A81B39A6DA00B72CBE = { isa = PBXGroup; children = ( - F28241DA1B39C60000B72CBE /* XuniGaugeKit.framework */, - F28241D81B39C5DB00B72CBE /* XuniCoreKit.framework */, + 4C4796071D30263700BD39C9 /* XuniGaugeDesignTimeStoryboardSupport.swift */, + 4CC37CAC1D2A66D000DF85BC /* XuniGaugeDynamicKit.framework */, + 4CC37CAD1D2A66D000DF85BC /* XuniCoreDynamicKit.framework */, F28241B31B39A6DA00B72CBE /* Gauges101 */, F28241C91B39A6DA00B72CBE /* Gauges101Tests */, F28241B21B39A6DA00B72CBE /* Products */, @@ -186,6 +210,7 @@ F28241AD1B39A6DA00B72CBE /* Sources */, F28241AE1B39A6DA00B72CBE /* Frameworks */, F28241AF1B39A6DA00B72CBE /* Resources */, + 4CC37CB41D2A66D500DF85BC /* Embed Frameworks */, ); buildRules = ( ); @@ -290,6 +315,7 @@ 4C5FF2BE1C49565E008794F4 /* XGUsingRangesViewController.swift in Sources */, 4C5FF2B91C49565E008794F4 /* XGBulletGraphViewController.swift in Sources */, 4C5FF2B71C49565E008794F4 /* XGAnimationViewController.swift in Sources */, + 4C4796081D30263700BD39C9 /* XuniGaugeDesignTimeStoryboardSupport.swift in Sources */, 4C5FF2BD1C49565E008794F4 /* XGGettingStartedViewController.swift in Sources */, 4C5FF2B81C49565E008794F4 /* XGAutomaticScalingViewController.swift in Sources */, F28241B71B39A6DA00B72CBE /* AppDelegate.swift in Sources */, diff --git a/Swift/Gauges101/Gauges101/AppDelegate.swift b/Swift/Gauges101/Gauges101/AppDelegate.swift index eef2f91..3d089be 100644 --- a/Swift/Gauges101/Gauges101/AppDelegate.swift +++ b/Swift/Gauges101/Gauges101/AppDelegate.swift @@ -6,7 +6,7 @@ // import UIKit -import XuniCoreKit +import XuniCoreDynamicKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { diff --git a/Swift/Gauges101/Gauges101/Base.lproj/Main.storyboard b/Swift/Gauges101/Gauges101/Base.lproj/Main.storyboard index 5bbc297..37da480 100644 --- a/Swift/Gauges101/Gauges101/Base.lproj/Main.storyboard +++ b/Swift/Gauges101/Gauges101/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + @@ -39,7 +39,7 @@ - + @@ -92,7 +92,7 @@ - + @@ -145,7 +145,7 @@ - + @@ -198,7 +198,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -304,7 +304,7 @@ - + @@ -357,7 +357,7 @@ - + @@ -410,7 +410,7 @@ - + @@ -536,9 +536,8 @@ - + - @@ -614,9 +613,8 @@ - + - @@ -640,9 +638,8 @@ - + - @@ -678,9 +675,8 @@ - + - diff --git a/Swift/Gauges101/Gauges101/XGAnimationViewController.swift b/Swift/Gauges101/Gauges101/XGAnimationViewController.swift index ecd8573..c5f52c2 100644 --- a/Swift/Gauges101/Gauges101/XGAnimationViewController.swift +++ b/Swift/Gauges101/Gauges101/XGAnimationViewController.swift @@ -5,7 +5,7 @@ // Copyright © 2016 GrapeCity. All rights reserved. // import UIKit -import XuniGaugeKit +import XuniGaugeDynamicKit class XGAnimationViewController: UIViewController { @@ -95,4 +95,4 @@ class XGAnimationViewController: UIViewController { // Copyright © 2016 GrapeCity. All rights reserved. // -import XuniGaugeKit \ No newline at end of file +import XuniGaugeDynamicKit \ No newline at end of file diff --git a/Swift/Gauges101/Gauges101/XGAutomaticScalingViewController.swift b/Swift/Gauges101/Gauges101/XGAutomaticScalingViewController.swift index 4d2526d..7363ca8 100644 --- a/Swift/Gauges101/Gauges101/XGAutomaticScalingViewController.swift +++ b/Swift/Gauges101/Gauges101/XGAutomaticScalingViewController.swift @@ -60,4 +60,4 @@ class XGAutomaticScalingViewController: UIViewController { // Copyright © 2016 GrapeCity. All rights reserved. // -import XuniGaugeKit \ No newline at end of file +import XuniGaugeDynamicKit \ No newline at end of file diff --git a/Swift/Gauges101/Gauges101/XGBulletGraphViewController.swift b/Swift/Gauges101/Gauges101/XGBulletGraphViewController.swift index 543b3da..8bc171b 100644 --- a/Swift/Gauges101/Gauges101/XGBulletGraphViewController.swift +++ b/Swift/Gauges101/Gauges101/XGBulletGraphViewController.swift @@ -53,4 +53,4 @@ class XGBulletGraphViewController: UIViewController { // Copyright © 2016 GrapeCity. All rights reserved. // -import XuniGaugeKit \ No newline at end of file +import XuniGaugeDynamicKit \ No newline at end of file diff --git a/Swift/Gauges101/Gauges101/XGDirectionViewController.swift b/Swift/Gauges101/Gauges101/XGDirectionViewController.swift index eb7d0fa..0303544 100644 --- a/Swift/Gauges101/Gauges101/XGDirectionViewController.swift +++ b/Swift/Gauges101/Gauges101/XGDirectionViewController.swift @@ -135,4 +135,4 @@ class XGDirectionViewController: UIViewController { // // Copyright © 2016 GrapeCity. All rights reserved. // -import XuniGaugeKit \ No newline at end of file +import XuniGaugeDynamicKit \ No newline at end of file diff --git a/Swift/Gauges101/Gauges101/XGDisplayingValuesViewController.swift b/Swift/Gauges101/Gauges101/XGDisplayingValuesViewController.swift index a49bb78..ced812e 100644 --- a/Swift/Gauges101/Gauges101/XGDisplayingValuesViewController.swift +++ b/Swift/Gauges101/Gauges101/XGDisplayingValuesViewController.swift @@ -5,7 +5,7 @@ // Copyright © 2016 GrapeCity. All rights reserved. // import UIKit -import XuniGaugeKit +import XuniGaugeDynamicKit class XGDisplayingValuesViewController: UIViewController { @@ -51,10 +51,12 @@ class XGDisplayingValuesViewController: UIViewController { self.radialGauge.isReadOnly = false self.radialGauge.startAngle = 90 self.radialGauge.sweepAngle = 90 - radialGauge.gaugeValueChanged.addHandler({(sender: NSObject!, args: XuniEventArgs!) -> Void in + + radialGauge.gaugeValueChanged.addHandler({ (a) in self.valueStepper.value = self.radialGauge.value self.stepperValueChanged(self) - }, forObject: self) + }, forObject: self) + self.linearGauge.min = valueStepper.minimumValue self.linearGauge.max = valueStepper.maximumValue self.linearGauge.value = valueStepper.value @@ -62,7 +64,7 @@ class XGDisplayingValuesViewController: UIViewController { self.linearGauge.updateAnimation.duration = 0.5 self.linearGauge.isReadOnly = false self.linearGauge.backgroundColor = UIColor.clearColor() - linearGauge.gaugeValueChanged.addHandler({(sender: NSObject!, args: XuniEventArgs!) -> Void in + linearGauge.gaugeValueChanged.addHandler({(a) in self.valueStepper.value = self.linearGauge.value self.stepperValueChanged(self) }, forObject: self) diff --git a/Swift/Gauges101/Gauges101/XGExportImageViewController.swift b/Swift/Gauges101/Gauges101/XGExportImageViewController.swift index e4b886c..24155a7 100644 --- a/Swift/Gauges101/Gauges101/XGExportImageViewController.swift +++ b/Swift/Gauges101/Gauges101/XGExportImageViewController.swift @@ -5,6 +5,8 @@ // Copyright © 2016 GrapeCity. All rights reserved. // import UIKit +import XuniCoreDynamicKit + class XGExportImageViewController: UIViewController { override func viewDidLoad() { @@ -24,7 +26,8 @@ class XGExportImageViewController: UIViewController { func animateNextStep(sender: AnyObject) { let random: Double = Double(Int(arc4random()) % 101) - radialGauge.updateAnimation.easing = XuniEasing.EaseOutElastic() + + //radialGauge.updateAnimation.easing = XuniCoreDynamicKit.XuniEasing.EaseOutElastic() radialGauge.value = random } @@ -52,6 +55,8 @@ class XGExportImageViewController: UIViewController { } let alert: UIAlertView = UIAlertView(title: title, message: message, delegate: nil, cancelButtonTitle: NSLocalizedString("OK",comment:"")) alert.show() + self.radialGauge.hidden = false + self.snapshotDisplay.hidden = true } @IBAction func takeSnapshot(sender: AnyObject) { @@ -78,5 +83,5 @@ class XGExportImageViewController: UIViewController { // Copyright © 2016 GrapeCity. All rights reserved. // -import XuniGaugeKit +import XuniGaugeDynamicKit //#define LOC(A) NSLocalizedString(A, nil) \ No newline at end of file diff --git a/Swift/Gauges101/Gauges101/XGGettingStartedViewController.swift b/Swift/Gauges101/Gauges101/XGGettingStartedViewController.swift index 2b688e3..708651d 100644 --- a/Swift/Gauges101/Gauges101/XGGettingStartedViewController.swift +++ b/Swift/Gauges101/Gauges101/XGGettingStartedViewController.swift @@ -5,7 +5,8 @@ // Copyright © 2016 GrapeCity. All rights reserved. // import UIKit -import XuniGaugeKit +import XuniGaugeDynamicKit + class XGGettingStartedViewController: UIViewController { @@ -28,7 +29,7 @@ class XGGettingStartedViewController: UIViewController { self.radialGauge.updateAnimation.duration = 0.5 self.radialGauge.isReadOnly = false self.radialGauge.showText = XuniShowText.None - radialGauge.gaugeValueChanged.addHandler({(sender: NSObject!, args: XuniEventArgs!) -> Void in + radialGauge.gaugeValueChanged.addHandler({(a) in self.valueStepper.value = self.radialGauge.value self.stepperValueChanged(self) }, forObject: self) @@ -41,7 +42,7 @@ class XGGettingStartedViewController: UIViewController { self.linearGauge.isReadOnly = false - linearGauge.gaugeValueChanged.addHandler({(sender: NSObject!, args: XuniEventArgs!) -> Void in + linearGauge.gaugeValueChanged.addHandler({(a) -> Void in self.valueStepper.value = self.linearGauge.value self.stepperValueChanged(self) }, forObject: self) @@ -55,7 +56,7 @@ class XGGettingStartedViewController: UIViewController { self.bulletGraph.bad = 45 self.bulletGraph.good = 80 self.bulletGraph.target = 90 - bulletGraph.gaugeValueChanged.addHandler({(sender: NSObject!, args: XuniEventArgs!) -> Void in + bulletGraph.gaugeValueChanged.addHandler({(a) -> Void in self.valueStepper.value = self.bulletGraph.value self.stepperValueChanged(self) }, forObject: self) diff --git a/Swift/Gauges101/Gauges101/XGUsingRangesViewController.swift b/Swift/Gauges101/Gauges101/XGUsingRangesViewController.swift index f3ee3d3..92e3670 100644 --- a/Swift/Gauges101/Gauges101/XGUsingRangesViewController.swift +++ b/Swift/Gauges101/Gauges101/XGUsingRangesViewController.swift @@ -5,6 +5,9 @@ // Copyright © 2016 GrapeCity. All rights reserved. // import UIKit +import XuniCoreDynamicKit +import XuniGaugeDynamicKit + class XGUsingRangesViewController: UIViewController { @IBAction func stepperValueChanged(sender: AnyObject) { @@ -38,7 +41,7 @@ class XGUsingRangesViewController: UIViewController { self.radialGauge.updateAnimation.duration = 0.5 self.radialGauge.isReadOnly = false - radialGauge.gaugeValueChanged.addHandler({(sender: NSObject!, args: XuniEventArgs!) -> Void in + radialGauge.gaugeValueChanged.addHandler({(a) in self.valueStepper.value = self.radialGauge.value self.stepperValueChanged(self) }, forObject: self) @@ -51,7 +54,7 @@ class XGUsingRangesViewController: UIViewController { self.linearGauge.isReadOnly = false self.linearGauge.backgroundColor = UIColor.clearColor() - linearGauge.gaugeValueChanged.addHandler({(sender: NSObject!, args: XuniEventArgs!) -> Void in + linearGauge.gaugeValueChanged.addHandler({(a) in self.valueStepper.value = self.linearGauge.value self.stepperValueChanged(self) }, forObject: self) @@ -122,4 +125,3 @@ class XGUsingRangesViewController: UIViewController { // Copyright © 2016 GrapeCity. All rights reserved. // -import XuniGaugeKit \ No newline at end of file diff --git a/Swift/Gauges101/Gauges101/ja.lproj/LaunchScreen.strings b/Swift/Gauges101/Gauges101/ja.lproj/LaunchScreen.strings index ea141d8..3687668 100644 --- a/Swift/Gauges101/Gauges101/ja.lproj/LaunchScreen.strings +++ b/Swift/Gauges101/Gauges101/ja.lproj/LaunchScreen.strings @@ -1,6 +1,6 @@ /* Class = "UILabel"; text = " Copyright (c) 2015 GrapeCity. All rights reserved."; ObjectID = "8ie-xW-0ye"; */ -"8ie-xW-0ye.text" = " Copyright (c) 2015 GrapeCity. All rights reserved."; +"8ie-xW-0ye.text" = " Copyright (c) 2016 GrapeCity. All rights reserved."; /* Class = "UILabel"; text = "Gauges101"; ObjectID = "kId-c2-rCX"; */ "kId-c2-rCX.text" = "Gauges101"; diff --git a/Swift/Gauges101/Gauges101/ja.lproj/Main.strings b/Swift/Gauges101/Gauges101/ja.lproj/Main.strings index 1ccab45..9dd8bcd 100644 --- a/Swift/Gauges101/Gauges101/ja.lproj/Main.strings +++ b/Swift/Gauges101/Gauges101/ja.lproj/Main.strings @@ -1,18 +1,18 @@ - + /* Class = "UIViewController"; title = "Displaying Values"; ObjectID = "08v-Js-otx"; */ -"08v-Js-otx.title" = "Displaying Values"; +"08v-Js-otx.title" = "値の表示"; /* Class = "UILabel"; text = "Getting Started"; ObjectID = "1ee-Cf-CWG"; */ -"1ee-Cf-CWG.text" = "Getting Started"; +"1ee-Cf-CWG.text" = "Gaugeの基本機能"; /* Class = "UILabel"; text = "Target:"; ObjectID = "3ED-w9-Ppg"; */ -"3ED-w9-Ppg.text" = "Target:"; +"3ED-w9-Ppg.text" = "目標値:"; /* Class = "UILabel"; text = "Using Ranges"; ObjectID = "7J6-GK-aNv"; */ -"7J6-GK-aNv.text" = "Using Ranges"; +"7J6-GK-aNv.text" = "範囲の使用"; /* Class = "UIViewController"; title = "Direction"; ObjectID = "8HJ-fh-1SY"; */ -"8HJ-fh-1SY.title" = "Direction"; +"8HJ-fh-1SY.title" = "ポインタの方向"; /* Class = "UINavigationItem"; title = "Gauges101"; ObjectID = "8Wf-a8-DaP"; */ "8Wf-a8-DaP.title" = "Gauges101"; @@ -21,25 +21,25 @@ "90n-xp-2bQ.text" = ">"; /* Class = "UIViewController"; title = "Using Ranges"; ObjectID = "97A-vA-PeO"; */ -"97A-vA-PeO.title" = "Using Ranges"; +"97A-vA-PeO.title" = "範囲の使用"; /* Class = "UILabel"; text = "Automatic Scaling"; ObjectID = "9Cb-yd-23P"; */ -"9Cb-yd-23P.text" = "Automatic Scaling"; +"9Cb-yd-23P.text" = "自動スケーリング"; /* Class = "UILabel"; text = ">"; ObjectID = "9NI-Dt-7eP"; */ "9NI-Dt-7eP.text" = ">"; /* Class = "UILabel"; text = "BulletGraph"; ObjectID = "9el-8a-fhh"; */ -"9el-8a-fhh.text" = "BulletGraph"; +"9el-8a-fhh.text" = "ブレットグラフ"; /* Class = "UITableViewController"; title = "Gauges101"; ObjectID = "AU1-cr-RgQ"; */ "AU1-cr-RgQ.title" = "Gauges101"; /* Class = "UILabel"; text = "Shows custom animation techniques"; ObjectID = "Alq-na-nFv"; */ -"Alq-na-nFv.text" = "Shows custom animation techniques"; +"Alq-na-nFv.text" = "カスタマイズしたアニメーション効果"; /* Class = "UIBarButtonItem"; title = "Save"; ObjectID = "FBK-za-8GA"; */ -"FBK-za-8GA.title" = "Save"; +"FBK-za-8GA.title" = "保存"; /* Class = "UILabel"; text = "25"; ObjectID = "FxO-w8-ck0"; */ "FxO-w8-ck0.text" = "25"; @@ -51,10 +51,10 @@ "HBI-Dp-7R8.text" = "25"; /* Class = "UIViewController"; title = "Getting Started"; ObjectID = "K37-G5-oNb"; */ -"K37-G5-oNb.title" = "Getting Started"; +"K37-G5-oNb.title" = "Gaugeの基本機能"; /* Class = "UILabel"; text = "Value:"; ObjectID = "L1J-cb-T1O"; */ -"L1J-cb-T1O.text" = "Value:"; +"L1J-cb-T1O.text" = "値:"; /* Class = "UILabel"; text = "25"; ObjectID = "MY9-fZ-afe"; */ "MY9-fZ-afe.text" = "25"; @@ -63,70 +63,70 @@ "OGj-UI-bB3.text" = "25"; /* Class = "UILabel"; text = "Bad:"; ObjectID = "Pub-T4-qcT"; */ -"Pub-T4-qcT.text" = "Bad:"; +"Pub-T4-qcT.text" = "不良値:"; /* Class = "UILabel"; text = "Direction"; ObjectID = "SAF-Yp-pdT"; */ -"SAF-Yp-pdT.text" = "Direction"; +"SAF-Yp-pdT.text" = "ポインタの方向"; /* Class = "UINavigationItem"; title = "Export Image"; ObjectID = "SNe-ez-n5s"; */ -"SNe-ez-n5s.title" = "Export Image"; +"SNe-ez-n5s.title" = "画像のエクスポート"; /* Class = "UIBarButtonItem"; title = "Take"; ObjectID = "SfY-tf-4K4"; */ -"SfY-tf-4K4.title" = "Take"; +"SfY-tf-4K4.title" = "画像を取得"; /* Class = "UILabel"; text = "25"; ObjectID = "V8W-Od-sjy"; */ "V8W-Od-sjy.text" = "25"; /* Class = "UILabel"; text = "Shows a radial gauge with different sweep angles"; ObjectID = "Van-sG-8er"; */ -"Van-sG-8er.text" = "Shows a radial gauge with different sweep angles"; +"Van-sG-8er.text" = "角度が異なる円形ゲージを表示"; /* Class = "UIViewController"; title = "Export Image"; ObjectID = "WDz-EX-ieM"; */ -"WDz-EX-ieM.title" = "Export Image"; +"WDz-EX-ieM.title" = "画像へのエクスポート"; /* Class = "UILabel"; text = "Displaying Values"; ObjectID = "Wge-Jg-8BX"; */ -"Wge-Jg-8BX.text" = "Displaying Values"; +"Wge-Jg-8BX.text" = "値ラベルの表示"; /* Class = "UILabel"; text = "Export Image"; ObjectID = "XMx-92-4cz"; */ -"XMx-92-4cz.text" = "Export Image"; +"XMx-92-4cz.text" = "画像へのエクスポート"; /* Class = "UILabel"; text = "Bullet Graph"; ObjectID = "XNt-pY-JQX"; */ -"XNt-pY-JQX.text" = "Bullet Graph"; +"XNt-pY-JQX.text" = "ブレットグラフ"; /* Class = "UILabel"; text = "Shows how to export an image of a gauge"; ObjectID = "XWe-Ze-WII"; */ -"XWe-Ze-WII.text" = "Shows how to export an image of a gauge"; +"XWe-Ze-WII.text" = "ゲージを画像として表示する方法"; /* Class = "UILabel"; text = "Animation"; ObjectID = "Xl9-rg-7Sy"; */ -"Xl9-rg-7Sy.text" = "Animation"; +"Xl9-rg-7Sy.text" = "アニメーション"; /* Class = "UISegmentedControl"; YMs-gj-yEm.segmentTitles[0] = "Right"; ObjectID = "YMs-gj-yEm"; */ -"YMs-gj-yEm.segmentTitles[0]" = "Right"; +"YMs-gj-yEm.segmentTitles[0]" = "右(Right)"; /* Class = "UISegmentedControl"; YMs-gj-yEm.segmentTitles[1] = "Left"; ObjectID = "YMs-gj-yEm"; */ -"YMs-gj-yEm.segmentTitles[1]" = "Left"; +"YMs-gj-yEm.segmentTitles[1]" = "左(Left)"; /* Class = "UISegmentedControl"; YMs-gj-yEm.segmentTitles[2] = "Down"; ObjectID = "YMs-gj-yEm"; */ -"YMs-gj-yEm.segmentTitles[2]" = "Down"; +"YMs-gj-yEm.segmentTitles[2]" = "下(Down)"; /* Class = "UISegmentedControl"; YMs-gj-yEm.segmentTitles[3] = "Up"; ObjectID = "YMs-gj-yEm"; */ -"YMs-gj-yEm.segmentTitles[3]" = "Up"; +"YMs-gj-yEm.segmentTitles[3]" = "上(Up)"; /* Class = "UILabel"; text = "Radial Gauge:"; ObjectID = "aG3-kp-5yy"; */ -"aG3-kp-5yy.text" = "Radial Gauge:"; +"aG3-kp-5yy.text" = "円形ゲージ"; /* Class = "UILabel"; text = ">"; ObjectID = "bGa-Ca-sVM"; */ "bGa-Ca-sVM.text" = ">"; /* Class = "UILabel"; text = "Linear Gauge"; ObjectID = "bSF-Vv-iOI"; */ -"bSF-Vv-iOI.text" = "Linear Gauge"; +"bSF-Vv-iOI.text" = "線形ゲージ"; /* Class = "UILabel"; text = "Direction:"; ObjectID = "dkS-jp-MbA"; */ -"dkS-jp-MbA.text" = "Direction:"; +"dkS-jp-MbA.text" = "方向:"; /* Class = "UILabel"; text = "Shows customized ranges behind the pointer"; ObjectID = "eFO-oh-g7u"; */ -"eFO-oh-g7u.text" = "Shows customized ranges behind the pointer"; +"eFO-oh-g7u.text" = "範囲の設定領域をポインタの背後に表示"; /* Class = "UILabel"; text = "Good:"; ObjectID = "fKb-LG-Ipi"; */ -"fKb-LG-Ipi.text" = "Good:"; +"fKb-LG-Ipi.text" = "良 値:"; /* Class = "UILabel"; text = "25"; ObjectID = "fXK-Pj-z2I"; */ "fXK-Pj-z2I.text" = "25"; @@ -135,7 +135,7 @@ "gM7-nb-edl.text" = "25"; /* Class = "UILabel"; text = "Shows a bulletgraph with good, bad and target ranges"; ObjectID = "i1t-bi-tIj"; */ -"i1t-bi-tIj.text" = "Shows a bulletgraph with good, bad and target ranges"; +"i1t-bi-tIj.text" = "「良値/不良値/目標値」の範囲を設定して表示"; /* Class = "UILabel"; text = ">"; ObjectID = "ip3-22-hTU"; */ "ip3-22-hTU.text" = ">"; @@ -144,40 +144,40 @@ "jKi-Lt-4No.title" = "Gauges101"; /* Class = "UILabel"; text = "Show ranges:"; ObjectID = "kWE-Ws-VUg"; */ -"kWE-Ws-VUg.text" = "Show ranges:"; +"kWE-Ws-VUg.text" = "範囲の表示:"; /* Class = "UIViewController"; title = "Automatic Scaling"; ObjectID = "lsw-OR-pPQ"; */ -"lsw-OR-pPQ.title" = "Automatic Scaling"; +"lsw-OR-pPQ.title" = "自動スケーリング"; /* Class = "UILabel"; text = "Sweep Angle:"; ObjectID = "ox7-O5-nN1"; */ -"ox7-O5-nN1.text" = "Sweep Angle:"; +"ox7-O5-nN1.text" = "移動角度:"; /* Class = "UILabel"; text = "Shows linear gauges at different directions"; ObjectID = "qT9-gI-3dF"; */ -"qT9-gI-3dF.text" = "Shows linear gauges at different directions"; +"qT9-gI-3dF.text" = "方向が異なる線形ゲージを表示"; /* Class = "UISegmentedControl"; qsf-cb-II0.segmentTitles[0] = "All"; ObjectID = "qsf-cb-II0"; */ -"qsf-cb-II0.segmentTitles[0]" = "All"; +"qsf-cb-II0.segmentTitles[0]" = "すべて表示"; /* Class = "UISegmentedControl"; qsf-cb-II0.segmentTitles[1] = "MinMax"; ObjectID = "qsf-cb-II0"; */ -"qsf-cb-II0.segmentTitles[1]" = "MinMax"; +"qsf-cb-II0.segmentTitles[1]" = "最小値と最大値"; /* Class = "UISegmentedControl"; qsf-cb-II0.segmentTitles[2] = "Value"; ObjectID = "qsf-cb-II0"; */ -"qsf-cb-II0.segmentTitles[2]" = "Value"; +"qsf-cb-II0.segmentTitles[2]" = "現在の値"; /* Class = "UISegmentedControl"; qsf-cb-II0.segmentTitles[3] = "None"; ObjectID = "qsf-cb-II0"; */ -"qsf-cb-II0.segmentTitles[3]" = "None"; +"qsf-cb-II0.segmentTitles[3]" = "表示なし"; /* Class = "UIViewController"; title = "BulletGraph"; ObjectID = "qxu-TE-WXN"; */ -"qxu-TE-WXN.title" = "BulletGraph"; +"qxu-TE-WXN.title" = "ブレットグラフ"; /* Class = "UILabel"; text = ">"; ObjectID = "rSe-fm-Gxe"; */ "rSe-fm-Gxe.text" = ">"; /* Class = "UILabel"; text = "Value:"; ObjectID = "rZc-UW-ghl"; */ -"rZc-UW-ghl.text" = "Value:"; +"rZc-UW-ghl.text" = "現在の値:"; /* Class = "UILabel"; text = "Start Angle:"; ObjectID = "t1k-Of-tJc"; */ -"t1k-Of-tJc.text" = "Start Angle:"; +"t1k-Of-tJc.text" = "開始角度:"; /* Class = "UILabel"; text = ">"; ObjectID = "uWs-YC-BOy"; */ "uWs-YC-BOy.text" = ">"; @@ -186,16 +186,16 @@ "v4P-ZC-9ef.text" = ">"; /* Class = "UIViewController"; title = "Animation"; ObjectID = "yDK-XO-7Ae"; */ -"yDK-XO-7Ae.title" = "Animation"; +"yDK-XO-7Ae.title" = "アニメーション"; /* Class = "UILabel"; text = "Shows simple gauge controls with interaction"; ObjectID = "yEl-vp-kjt"; */ -"yEl-vp-kjt.text" = "Shows simple gauge controls with interaction"; +"yEl-vp-kjt.text" = "インタラクション機能を持つゲージ"; /* Class = "UILabel"; text = "Shows value labels on the gauges"; ObjectID = "yWQ-mg-ImF"; */ -"yWQ-mg-ImF.text" = "Shows value labels on the gauges"; +"yWQ-mg-ImF.text" = "値ラベルをゲージに表示"; /* Class = "UILabel"; text = "Value:"; ObjectID = "z2t-xN-ZFN"; */ -"z2t-xN-ZFN.text" = "Value:"; +"z2t-xN-ZFN.text" = "現在の値:"; /* Class = "UILabel"; text = ">"; ObjectID = "zUw-ej-Vj6"; */ "zUw-ej-Vj6.text" = ">"; diff --git a/Swift/Input101/Input101.xcodeproj/project.pbxproj b/Swift/Input101/Input101.xcodeproj/project.pbxproj new file mode 100644 index 0000000..052b2ad --- /dev/null +++ b/Swift/Input101/Input101.xcodeproj/project.pbxproj @@ -0,0 +1,360 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 844FD0E11CEDA7090011DEA1 /* ComboBoxController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 844FD0E01CEDA7090011DEA1 /* ComboBoxController.swift */; }; + 84837AD31CE3230B0008468B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84837AD21CE3230B0008468B /* AppDelegate.swift */; }; + 84837AD81CE3230B0008468B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84837AD61CE3230B0008468B /* Main.storyboard */; }; + 84837ADA1CE3230B0008468B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 84837AD91CE3230B0008468B /* Assets.xcassets */; }; + 84837ADD1CE3230B0008468B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84837ADB1CE3230B0008468B /* LaunchScreen.storyboard */; }; + 84837AE61CE32AAC0008468B /* XuniCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84837AE41CE32AAC0008468B /* XuniCoreKit.framework */; }; + 84837AE71CE32AAC0008468B /* XuniInputKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84837AE51CE32AAC0008468B /* XuniInputKit.framework */; }; + 84837AEF1CE32D7E0008468B /* MaskedInputController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84837AEE1CE32D7E0008468B /* MaskedInputController.swift */; }; + 84837B051CE576820008468B /* License.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84837B041CE576820008468B /* License.swift */; }; + 84BD21891D13E55600CCE1BF /* input_autocomplete.png in Resources */ = {isa = PBXBuildFile; fileRef = 84BD21851D13E55600CCE1BF /* input_autocomplete.png */; }; + 84BD218A1D13E55600CCE1BF /* input_combobox.png in Resources */ = {isa = PBXBuildFile; fileRef = 84BD21861D13E55600CCE1BF /* input_combobox.png */; }; + 84BD218B1D13E55600CCE1BF /* input_dropdown.png in Resources */ = {isa = PBXBuildFile; fileRef = 84BD21871D13E55600CCE1BF /* input_dropdown.png */; }; + 84BD218C1D13E55600CCE1BF /* input_mask.png in Resources */ = {isa = PBXBuildFile; fileRef = 84BD21881D13E55600CCE1BF /* input_mask.png */; }; + ED7284F01CE99616006768D6 /* XuniCalendarKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED7284EF1CE99616006768D6 /* XuniCalendarKit.framework */; }; + ED7284F21CE99625006768D6 /* DropDownController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED7284F11CE99625006768D6 /* DropDownController.swift */; }; + ED7983031D05665E00EC9013 /* AutoCompleteController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED7983011D05665E00EC9013 /* AutoCompleteController.swift */; }; + ED7983041D05665E00EC9013 /* AutoCompleteData.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED7983021D05665E00EC9013 /* AutoCompleteData.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 844FD0E01CEDA7090011DEA1 /* ComboBoxController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ComboBoxController.swift; path = Samples/ComboBoxController.swift; sourceTree = ""; }; + 84837ACF1CE3230B0008468B /* Input101.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Input101.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 84837AD21CE3230B0008468B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 84837AD71CE3230B0008468B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 84837AD91CE3230B0008468B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 84837ADC1CE3230B0008468B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 84837ADE1CE3230B0008468B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 84837AE41CE32AAC0008468B /* XuniCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCoreKit.framework; path = ../../../Controls/XuniCoreKit.framework; sourceTree = ""; }; + 84837AE51CE32AAC0008468B /* XuniInputKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniInputKit.framework; path = ../../../Controls/XuniInputKit.framework; sourceTree = ""; }; + 84837AEE1CE32D7E0008468B /* MaskedInputController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MaskedInputController.swift; path = Samples/MaskedInputController.swift; sourceTree = ""; }; + 84837B041CE576820008468B /* License.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = License.swift; sourceTree = ""; }; + 84BD21851D13E55600CCE1BF /* input_autocomplete.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = input_autocomplete.png; path = Images/input_autocomplete.png; sourceTree = ""; }; + 84BD21861D13E55600CCE1BF /* input_combobox.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = input_combobox.png; path = Images/input_combobox.png; sourceTree = ""; }; + 84BD21871D13E55600CCE1BF /* input_dropdown.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = input_dropdown.png; path = Images/input_dropdown.png; sourceTree = ""; }; + 84BD21881D13E55600CCE1BF /* input_mask.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = input_mask.png; path = Images/input_mask.png; sourceTree = ""; }; + ED7284EF1CE99616006768D6 /* XuniCalendarKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XuniCalendarKit.framework; path = ../../../Controls/XuniCalendarKit.framework; sourceTree = ""; }; + ED7284F11CE99625006768D6 /* DropDownController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DropDownController.swift; path = Samples/DropDownController.swift; sourceTree = ""; }; + ED7983011D05665E00EC9013 /* AutoCompleteController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AutoCompleteController.swift; path = Samples/AutoCompleteController.swift; sourceTree = ""; }; + ED7983021D05665E00EC9013 /* AutoCompleteData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AutoCompleteData.swift; path = Samples/AutoCompleteData.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 84837ACC1CE3230B0008468B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ED7284F01CE99616006768D6 /* XuniCalendarKit.framework in Frameworks */, + 84837AE61CE32AAC0008468B /* XuniCoreKit.framework in Frameworks */, + 84837AE71CE32AAC0008468B /* XuniInputKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 84837AC61CE3230B0008468B = { + isa = PBXGroup; + children = ( + ED7284EF1CE99616006768D6 /* XuniCalendarKit.framework */, + 84837AE41CE32AAC0008468B /* XuniCoreKit.framework */, + 84837AE51CE32AAC0008468B /* XuniInputKit.framework */, + 84837AD11CE3230B0008468B /* Input101 */, + 84837AD01CE3230B0008468B /* Products */, + ); + sourceTree = ""; + }; + 84837AD01CE3230B0008468B /* Products */ = { + isa = PBXGroup; + children = ( + 84837ACF1CE3230B0008468B /* Input101.app */, + ); + name = Products; + sourceTree = ""; + }; + 84837AD11CE3230B0008468B /* Input101 */ = { + isa = PBXGroup; + children = ( + 84837AD21CE3230B0008468B /* AppDelegate.swift */, + 84837AD91CE3230B0008468B /* Assets.xcassets */, + 84837AE81CE32B410008468B /* Images */, + 84837ADE1CE3230B0008468B /* Info.plist */, + 84837ADB1CE3230B0008468B /* LaunchScreen.storyboard */, + 84837B041CE576820008468B /* License.swift */, + 84837AD61CE3230B0008468B /* Main.storyboard */, + 84837AE91CE32B4B0008468B /* Samples */, + ); + path = Input101; + sourceTree = ""; + }; + 84837AE81CE32B410008468B /* Images */ = { + isa = PBXGroup; + children = ( + 84BD21851D13E55600CCE1BF /* input_autocomplete.png */, + 84BD21861D13E55600CCE1BF /* input_combobox.png */, + 84BD21871D13E55600CCE1BF /* input_dropdown.png */, + 84BD21881D13E55600CCE1BF /* input_mask.png */, + ); + name = Images; + sourceTree = ""; + }; + 84837AE91CE32B4B0008468B /* Samples */ = { + isa = PBXGroup; + children = ( + ED7983011D05665E00EC9013 /* AutoCompleteController.swift */, + ED7983021D05665E00EC9013 /* AutoCompleteData.swift */, + 844FD0E01CEDA7090011DEA1 /* ComboBoxController.swift */, + ED7284F11CE99625006768D6 /* DropDownController.swift */, + 84837AEE1CE32D7E0008468B /* MaskedInputController.swift */, + ); + name = Samples; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 84837ACE1CE3230B0008468B /* Input101 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 84837AE11CE3230B0008468B /* Build configuration list for PBXNativeTarget "Input101" */; + buildPhases = ( + 84837ACB1CE3230B0008468B /* Sources */, + 84837ACC1CE3230B0008468B /* Frameworks */, + 84837ACD1CE3230B0008468B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Input101; + productName = Input101; + productReference = 84837ACF1CE3230B0008468B /* Input101.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 84837AC71CE3230B0008468B /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0720; + LastUpgradeCheck = 0720; + ORGANIZATIONNAME = ComponentOne; + TargetAttributes = { + 84837ACE1CE3230B0008468B = { + CreatedOnToolsVersion = 7.2; + }; + }; + }; + buildConfigurationList = 84837ACA1CE3230B0008468B /* Build configuration list for PBXProject "Input101" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 84837AC61CE3230B0008468B; + productRefGroup = 84837AD01CE3230B0008468B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 84837ACE1CE3230B0008468B /* Input101 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 84837ACD1CE3230B0008468B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84BD21891D13E55600CCE1BF /* input_autocomplete.png in Resources */, + 84837ADD1CE3230B0008468B /* LaunchScreen.storyboard in Resources */, + 84BD218B1D13E55600CCE1BF /* input_dropdown.png in Resources */, + 84837ADA1CE3230B0008468B /* Assets.xcassets in Resources */, + 84BD218C1D13E55600CCE1BF /* input_mask.png in Resources */, + 84BD218A1D13E55600CCE1BF /* input_combobox.png in Resources */, + 84837AD81CE3230B0008468B /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 84837ACB1CE3230B0008468B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ED7284F21CE99625006768D6 /* DropDownController.swift in Sources */, + ED7983031D05665E00EC9013 /* AutoCompleteController.swift in Sources */, + 84837AD31CE3230B0008468B /* AppDelegate.swift in Sources */, + 844FD0E11CEDA7090011DEA1 /* ComboBoxController.swift in Sources */, + 84837AEF1CE32D7E0008468B /* MaskedInputController.swift in Sources */, + 84837B051CE576820008468B /* License.swift in Sources */, + ED7983041D05665E00EC9013 /* AutoCompleteData.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 84837AD61CE3230B0008468B /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 84837AD71CE3230B0008468B /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 84837ADB1CE3230B0008468B /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 84837ADC1CE3230B0008468B /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 84837ADF1CE3230B0008468B /* 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 = 8.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 84837AE01CE3230B0008468B /* 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 = 8.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 84837AE21CE3230B0008468B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + FRAMEWORK_SEARCH_PATHS = ../../../Controls; + INFOPLIST_FILE = Input101/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = GrapeCity.Input101; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 84837AE31CE3230B0008468B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + FRAMEWORK_SEARCH_PATHS = ../../../Controls; + INFOPLIST_FILE = Input101/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = GrapeCity.Input101; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 84837ACA1CE3230B0008468B /* Build configuration list for PBXProject "Input101" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84837ADF1CE3230B0008468B /* Debug */, + 84837AE01CE3230B0008468B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 84837AE11CE3230B0008468B /* Build configuration list for PBXNativeTarget "Input101" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84837AE21CE3230B0008468B /* Debug */, + 84837AE31CE3230B0008468B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 84837AC71CE3230B0008468B /* Project object */; +} diff --git a/Swift/Input101/Input101.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Swift/Input101/Input101.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1fd20e1 --- /dev/null +++ b/Swift/Input101/Input101.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Swift/Input101/Input101/AppDelegate.swift b/Swift/Input101/Input101/AppDelegate.swift new file mode 100644 index 0000000..e8fd905 --- /dev/null +++ b/Swift/Input101/Input101/AppDelegate.swift @@ -0,0 +1,47 @@ +// +// AppDelegate.swift +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +import UIKit +import XuniCoreKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + // Override point for customization after application launch. + XuniLicenseManager.setKey(License().key) + return true + } + + func applicationWillResignActive(application: UIApplication) { + // 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. + } + + func applicationDidEnterBackground(application: UIApplication) { + // 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. + } + + func applicationWillEnterForeground(application: UIApplication) { + // 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. + } + + func applicationDidBecomeActive(application: UIApplication) { + // 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. + } + + func applicationWillTerminate(application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Contents.json b/Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..c4071ec --- /dev/null +++ b/Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,81 @@ +{ + "images" : [ + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-Small@2x-1.png", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-Small-40@2x-1.png", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@2x.png", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small@2x-1-1.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-Small-40.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-Small-40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76@2x.png", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png b/Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6092bc74330d477f4b2ab16215d0600a4749b164 GIT binary patch literal 2715 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 yW=PhPVE&T;oBuqDBzWduQ$5V|l+Q80^I>PM5R zv_kVLW?|BVB$9}Yl>TyuH$6G`dSYuAlQ<|Y{AZ9sWMiL2cx(2 zbh1O{p#ucymuEy zm2SPvgsXKZZ`1k1DM*C{?i@L*i~uK%p1ohg?L;+Yn@;SbadqcWwE);)L<$+YH-8vj zE)!XjeC_;U-F~uHBe!_?VgW_P5R?Ump1sHKg|sUdEND8>PX8-g4hcmCv&-I-=_s7XjXlRke)=t8o2~xzT{E;0coM=@CgBGk2=>+=-z3M`$Yj!V9`uKk zLJHmI;>lzQn5l_KNRxc_*P0+?(IBl2 zEvczXXhO9nPDWw9+Xqj{BaL!nDl?EcB!JsYMO&w;l!s<36-51x>4=FFvDS9%LLl4& zHw_*|)}j!yGy)`umlEVqAk*~Nu+K5eLv*q{0RS`Ehd=K<&P_vzYIblTs${vQ8C~|U zQ~3jSnL7$~lEf5~%^sKbnvUI4ZJ?nMJUM+g5lZG{&aC`TzGCB~6*GxiL^%aEzpncE zcV2(cn+pP9fouFuKLd%MjG{mBt$z305)X-Qjx~-A=RRJvYPsnwZtVHeW%UAaGOSCo zb~De=5`kpQE_M(nLD+EFia}b_5H1L?tI4HHkf0|hmE78bs%ww+_K_$*=XSxUqKJ5@h+s7S=N9{>4Q~K9X21$rqHY%2KfX2Br2jHbv|KJgWFc zh#Z_5p5E9@*LH<7tOPat)xND6<9>|BLf}t&?m2igBV9}9A7a=E8-S4_G zL%=CPA`t!nX_RAnu8m_9PD`bi{#S$ZSL9yM6S*><{&=`_Xp063ytN&>)owvqrK@0W zrNuElH1ikln(RWPqHiY5*!I@Jlf^=vo6hB^f;r>h?vfD(nM%8!6}8sH%jAqAs0^IF zWDq-{wp2=xfw%nk7*+1Dq!ve{3>8$OZpv_%be|>6<5-FxX43qsWtRO4N(oUlrS8iQ z)CQkwqvD~ZqsXP7EJ$+)vS-32ER(3~^QBF39_n>;hJ+gAoasNbB^Po^3^Fi9my0pY zJl;Cm>Z4?QE@td=OLR*H(){HpuJnpu(VR1E1d|Ry)x13}mZ%%=Pi02eQ%K~wgtJ9i z<-ETJMz|jhjPPg*xAEL3W>mBeYjQmvozOl(a@PQj<<}m$UVMKmM;~eb{?+$`7p~7v z#^X|J*4kXbI=xvHc#{y>_(TV*Yy(v5O}fZ2Q^%vBIr(Q+IuxuI(jhrb8#dC9SpXS`cs2o{ zOBv28UKX{)QvwO!B6kbwcP}&w&PY-)`ON>pCS?eTiv(i8UqAbngTEOJTw+q-T?W~Z z^XsaUW6$h_kd+6vONBzp95b9v%OWM=>Jy2R&*0_%fzX5WAU#MA(u4FMJxCAIgY+Oh hNDtD3OmqDszyKg|L&2trb*!Rrj2c^ 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 X<+5p>HO`ynO7uwQu{KJ}F6w^(|Kmh? literal 0 HcmV?d00001 diff --git a/Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png b/Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png new file mode 100644 index 0000000000000000000000000000000000000000..abee98b110fe76e165ff87afcb187a20cf9d5b2b GIT binary patch literal 1071 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 literal 0 HcmV?d00001 diff --git a/Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png b/Swift/Input101/Input101/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..96950d00243a24c25fbaffb47fa53a4be1cc30f1 GIT binary patch literal 1491 zcmV;^1uXiBP)*RqJY`8>`S{VZkD#U5GBE11{Q)6%-T~$*!dZQ}BmM zY0`)UoFN$02@P#RT55y%%zcxOF~hO&yQZDHcZm82jE2cVVKG&UVpBH+1<{;nn>3_w;N^bvyfyZ+;@fAb-$u`AOU;%Q6^G#6^(Lj^a(upmiQAAVdt zvAr>aVggJ)Z<{{(g*@Sf(Gy#`Glp1L7bi;J_8*r6pj4kRk;IK)R^HUns{ZYnIiG52 z4-G!L)A!e3ckhA8wTL=*%QxpPT*YglIiQ%bTPl2#LOslE%k3qAe*5Y&Z(lq=!pt9D zd!Ge;Si$%6d!M3m7Gzobf7i$%A_1lFELN0VT3fp`0?t(Eb9QU2xO3!?ftFXuH5CB( z&-lK#+0yj^4E@vaS^1Bzxq;4(>>D?$!B*Dq%;&-==2B1I6aXMa9=?&T5L_1>#g<`3 z3_c0O>f5MT7^@)(yHwgf&=(fP%t3#){qA$enCbb(ijy$pPZJL(4r6F$wy#n?b7n(C zYK&l3m);}j#>fF{;-E&rbQsF1m>_ZpYiwakVe2rd8Y9w)L-Gg1GNcc&1S94Ypc<}; zmBlR(0UG8l!OWnxT#+wjmTm5Rns_J1BPbnOc%-cvp8j$06vOAv9A$|6LJrYMXZN`w zW@`A$M_(Hk)c{wKfhkoVv0Ur^=i!~@@bZASkN{=W()8?OJK8%AA3#-?_q`J#Bi2h1nH}os}nd9Vh}x6 zT?oiSJPqyR`%9u50Q9O z<%DHK7O}#>+@n5l6(Z3Uk20`i6JrR0<>82$rrN0<^qzsJkFI!B->6iunqf6*9gD7M zZ1K9m)j2t=;!*XeX-1!P%SzXhxYzX?M_;NUZD*l+<;??Y^(~=8sYq}+>IjeD&Qa_#b zU-syz6L@g1j$Ofx$zS(*r3V@kug*5rC2wFg!=Kf~uCOXc{JS@hfl-WGN7U535)H>$ zs?KnImsV&9gHA;jsfszKxeO3}YN$_%V_JD4x93JB9TekRQ#A%bMj1)W{a&LR+)t<_ tx917m1a1O1ft$ch;3ja_Mf+QT0RY3kiZJ>8(N6#X002ovPDHLkV1mMM+E@Sp literal 0 HcmV?d00001 diff --git a/Swift/Input101/Input101/Assets.xcassets/Australia.imageset/Contents.json b/Swift/Input101/Input101/Assets.xcassets/Australia.imageset/Contents.json new file mode 100644 index 0000000..8042295 --- /dev/null +++ b/Swift/Input101/Input101/Assets.xcassets/Australia.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "australia.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Swift/Input101/Input101/Assets.xcassets/Australia.imageset/australia.png b/Swift/Input101/Input101/Assets.xcassets/Australia.imageset/australia.png new file mode 100644 index 0000000000000000000000000000000000000000..8937404587a4abb530151acddaae3da4583b7068 GIT binary patch literal 2623 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 Bs9pd7 literal 0 HcmV?d00001 diff --git a/Swift/Input101/Input101/Assets.xcassets/Brazil.imageset/Brazil.png b/Swift/Input101/Input101/Assets.xcassets/Brazil.imageset/Brazil.png new file mode 100644 index 0000000000000000000000000000000000000000..47a007f2dfe23c5a3296447c0b5a136b3f81fe3b GIT binary patch literal 2549 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 literal 0 HcmV?d00001 diff --git a/Swift/Input101/Input101/Assets.xcassets/France.imageset/Contents.json b/Swift/Input101/Input101/Assets.xcassets/France.imageset/Contents.json new file mode 100644 index 0000000..d011da7 --- /dev/null +++ b/Swift/Input101/Input101/Assets.xcassets/France.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "France.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Swift/Input101/Input101/Assets.xcassets/France.imageset/France.png b/Swift/Input101/Input101/Assets.xcassets/France.imageset/France.png new file mode 100644 index 0000000000000000000000000000000000000000..12318d45d0d0c596176975d6a50a8eadb3569839 GIT binary patch literal 941 zcmV;e15*5nP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZEW@eWZGh@glW8h^6U4(tQ@P>eo3ed&&mf67lzPP_vS&(GgocAf0QhdvB>pb@NKi|J`z)Mx- z?Ci&0R`bO#KX)2;`|%T>{+&H{z`iPkpj=m&zRfYOb@k68;MGXQ7&DRZ~&`>p&)m2Cqu31Qt8eD7>Dp0MR zxSqr)ia=TF)+J;`b@xSRSKnlL;jlYmqzJ7_96%M6qNpg+$+lIBqT86L7T4&iF924S z9at;Clsym!wF7(q9{^H1)4sJORCF3+L3ul3zXdR#7c3U#))~-+fBK-&2n&I~N){1- z;eEjSuzd;n4h)PuguvdxURFDC)guGmKP=OSB-`}691BV@Ewm1!S_ANYAQH+mEas1v zf!VBNKJOt4E&Tmef2?lufd~X!1~8u$cwf~Cq{+l93C3buHWPq4`+y=4l02Yl+)Ng| zZ05}SZey}6Wgt+Np%(z!B@+YU+%f}~m$$tDNOz+vCf*5k)gJ(Ne6;KXsy*Ewdi1`O z-EXE{mh47D2=sP?tK)Sob>a{LSteAKwv0Wt)me%_vH|-$FfT4gt0e|%fi;WqttoB8 zn>nn@8Du4qg-Ay)GU_a$6hNfI)E?ANb2<{)_--1y1P?VVL$ecu!T4=mYU+eOFtgx%usT9OY>c+86O{EA_p8 zfvSl@lZ%T&Rmt;cY=Yf*EZn3g@3rlJdK5xh>AB14v~o_#b4i@ozVj;9pA$C{YIP{W zV2TL33SekOqs<8e42pq9z5|v}bm9ZZrV-6}{A}yCWaERi#=B?x=+whx@}<)RS65eS z8E}1bv(|A!fY-n&@M>Uw{15P1s2?wlV?Ctefr;#%)b9Z70PFztTD}ed#HR|?5V(hK P00000NkvXXu0mjf1!1B3 literal 0 HcmV?d00001 diff --git a/Swift/Input101/Input101/Assets.xcassets/Germany.imageset/Contents.json b/Swift/Input101/Input101/Assets.xcassets/Germany.imageset/Contents.json new file mode 100644 index 0000000..c06bb39 --- /dev/null +++ b/Swift/Input101/Input101/Assets.xcassets/Germany.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Germany.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Swift/Input101/Input101/Assets.xcassets/Germany.imageset/Germany.png b/Swift/Input101/Input101/Assets.xcassets/Germany.imageset/Germany.png new file mode 100644 index 0000000000000000000000000000000000000000..77e9338bab888a9b1816f49547f1507e01a5876d GIT binary patch literal 808 zcmV+@1K0eCP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;u1Q2eRCwC#nZ0h?Fc8Oor!S{~gQRhbq8&N}=+GfUpCB)gckLS#$Wml4`V?(a z2M%J1=J7gEwxu|Z?Q{r;`UXiy9Yy|mA3UDK%t)Cs5~n?YJ%IlmKp`SIFaYvYCVh5x zRE$Pn^3&7PMu68B7Z*1vuKw)m+lK-;3L$WQexB6iFE1~-`hEYZ00tohRF&~~3_y2t z6A=)=VtXdS>ekl^v}9(8WQ(@QOHXv!L;7-=z@vL>lruAqkB|i`IOlNAB?G|w4gfPt4uF|affN9$O4Bq?1L*j{lWpsp*UD`xKc}W{ zP*pya3>E;U(Tt zYd9dE8rGzd+er=@4){2aLU_gQYiyc^34wri!>CuneT_BEG91{NOhGn8sK-Lf!{_x` z$ofdvxr>4M&Q5GWvB_;RiJZ9_BwGT&E0#zau~1Z5b^rt=+@y6R$lr|mK42lO`jBZa z8&$B76oAl+LaIoXW9@lhmuR*UDIR;bDeCN~d?^ZS1wc$ochuvWXP%hUwsM=O3t-Oh ztU9S}2;jTqr`wOw)4==hN?FJ=S3|aFmw&W)Sz%{h;WHE`C&R)*h?7sKQoT46A0CdX z5T?)brk9&Op$+@lf0QfVWkRYi5?|?JlZDN!E1^f`=@1?``o)R^{ mMD~B`_W&~Qe^>4R0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=0!c(cRCwC#nN4gPRS?I2FT4I~?bwMECnTsesZytqAaVdiDK}Dq#09D91tE|S zoRH{|0|zc}=D>yCkXm{{LZu=IA&}AnDM%3_CEzw~lBNkNZIaq1lW0*Uo?E|K7~JRU(3)r3If$6F?Kd{~ds-lrn%2VE9Gp;o-QMOpX}+{ryD~ zXw4maWz~;g|L~C$Jth!G3xU4JeWkoL_dREq*CQqn5;US6q>wK+S2{OUaW9*mYl(O? zu6iF8Zbi`KAYi(68nok?zQ9U43q%~qDzRj{J|e> zK{*6+0cZzo%PoEo+uC4@S%w6T1x~2}3aG!RS6ib)%`tVvDFH$dRM`R=u?xrsfbDL9 zB4~$!0HF#BmE7V7F-o8vrY#DlyM{Gl7ky;`5lt`}Y^kt7agznA?a7Vq=l3F8@Et8C zXou2TNh=^NA{kFVkfWKsl4at@MTQ1C8QR-PC}?^PSt&K>c{G}tTj8zu#>re-W@v9G zH}XZ^`QSUoPS5@$cJtH%=jT^Ae(D#Fy!05Ng{9x~+}E*_NF>OK&!%aMhdFd`aC=(7 zb~NuFpX7}fA7$}sjxWBw#FrEEjGdWd`rN`ojYl34KuK-jn!O% z2lsS%55SAVtw#pC82@2`aLC}{bc)_ojASB0MIy9?Cyz^Ohh<#>Sq$MF!5N}QveD`+qRuC3~zG! zvD26M`14;m^z1%*QZe%RBA<@W(2DtDVsUeIyeRZ^I$mCJ+b=ngHpeFQW}8*;e&bKs68s)k>omfRCzVrM1E=sgZV6 zj13qjhPV}GdwbN>B8VurztmB#(X}oO)XNsz+&Lw#gaisJG2-Ef?tl>1?P53 zd2?l@v_musgF7ZrbvRM&^r2o|qiLh6^X|Jjrz*G6)wMM{tlbV$lPj_XuE;&|Pqr{# zp|!4XWLl#Xz7eHdojvu$|N1H@>%0L#;U5zyR22X|;*e5z0GLr|x&06gMtnylGaNz# zA`{u}^eqs;EC=ZkXy O0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ zUfQFg*y`1T2T{-}6e{AuUPX$Ccrn^inzAbXA(Ud%(i*9fm}JfFY-ZlChn;OUYeX|M z>@qk%_%UxDZ{GWTXMXSd`_1nu5h2QwAmS1OhyncH0T@cDBwzx`s2Dvu+H3Upmy*R| z(KdihA~F}nw|{s`&tL-RjjH=x{9`$r@Z2YovH+==g<=3fX*Bd1wZ^&mD=RZMSh+R> z3Q{|EkSabv^1iL8WO!_y1{Ep*=hiIM$#1BC{}ayaEVwQJ)ue&3eGqeWn9QMr7=v3w zS#MVgQvth0WIE_%%jZ64;iHd1Yp+MOjgW>W4SJt{j@;qL0|QV>4Fv`uS~K_h8`LkA zTc`fFr$|3mqW{%bAmM)-ntAh~z%I1#_Iucq=Qqp;_T+gM@A-gD$Bz15yI!g5KmhEi zGJk#Y>3?|R>&xQVvzYtFF&}xj3oPWi{Q2fPNVOJ#ja?SrJ?{Dg{2gL1hY$;e+Qq3Z0jSkNh=nfoD_1+e2dWn? zq30Gu2uFf*?Rw{Pq14VIqE`?t0acSM^aTUpr?{0FFL}XL2UM5z$neI$n`g7pyipsZ zvCM%9k5ObT^Rx%!_ILBQaf4+kI!)h+7ZGthS7jD^k^n zN~J(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ@a7jc#RCwC#ntO0mR~^ScXZP+Sn@s}?B>}_-gccB^VC7*^s|>Z&nL1T#%M_eS zfVN;OC8eWzL3MdIQ3bZAKT9CF>hmKgZ2u3I|mOu&xF|n8j1W2-X@7~?}IR3F| zAefNsCOk6ZZ|2PGIwS4{h!jA*u zX1v$-A`qy#=+16r(0k8s-Z2MIx?2hba61T^&K{@E1y(&*_}0M<8(+Q$aCR2}w_(~C zrp?#Fm7J*+BTt-9-@P(_=PT<9el_%FNUL^>*tBd+%jS!b|L_C7j6qr*6?G}!sZa+T zT(f@L{86Judv0m~!>}+63!(;Tkp{l69%YhNj=x?_DX;GN^Sd9&KD0W&Xwr?Uj}AmY zVpjlz&1WX&#w2`LSV%VmIW=i@* zgG>vRF(>>Fde=AjOaAF!a9$2MoVRxK^y`sU9WG)_Gd2vf#cRW`2%9!TB6ZByN_Zf0 z0_~#gf3PC({QRZc_CB*>?U-x1~umn zjKl51D@|&JkKZW+_=9r*E+2YEFYV=2XYI1=?0FSH!rfzQ_Zmk8EQI0&%S37#I0WuH zM{~=vpWq&I2RNNrVI9qco`%XaXC=AXK|a-Z!CO|5oOS%-Ck`!KlK*&Dr&R}vIJS{t zn0UsG0mH=ED?rly-@y0CLpb~OC3)IpQszE^Yj6e_Cd&A`2!*0#1gpqV50a%HL9f+% zzgyWm|IzH14y?#qH@>TO^L7Dj+s3wSq;288`!1wqp=5p%t}Z z*?{Ys74d}WTT206srfzFHYtl2;2N0;mK7`BOBDt}VEp|E!R4!4I*J;Xnky`9;E^TRg)E1n{57vQT?i%J2u*Sr~9Ri6+4oX2s0W$gdVkG@lk zx_W)vDq=)qet{%u5)>|Wx(2e%Igm(_hoQHsyFb}8IPd92^NzKqRtW)o`H?N906VL9 zHRXzlv@Beo9gch4Se)s7uxic{-CvCP{>g;Wpi#IebPZ*nBaPI6D|CC`;M&Hs$5(Iq zb;0?|K@tKOH|51rfY+;5d$m};ShZ2yOk%>#&?MNfLq!q*hs*#91g`P z8Qd?rJ3Sz`Ec@A$+ohD|mDjbqsZ`ggF*&U{+vXe{c$7a=@2O{}XAmK+?8LbvFYE!L z3Cg5wa$B_zPTu*Y@oJM&#Sc*5sK)>r8e5-WS>SMh5In^`G;fG4j*KBGpLz0wVA(I0 z0+B@2@uNln2p{;%+l_6hQ@a3`Eic{ZN3IPsrkYL%BJ~!e8Uo8gMh%`d4`3(Rykrf& z&p#rkPAy$JGeL;UVMJR!lp~?wDhk4-VAnU0y5eb++Xf-^2*TqgBwVZt7xO*)B;f|{ zRR4&a0-!UGof5FS48T5Dhi}S*^eOohJqq&h-hVH?Dc>cnycpk<2eHrAp$ZqP!ha*n zK0zp$)D;k2cQWVy(JYkAVL1Aw;meu~fG=w@j(%wB$&wi}=y((Pf>W7&YeIGTLd`%$Y0slEyt=75ZQ3$l)?|8Ycn;xlBXzy`^IZKfGmLW7Mt_$= z#08+P-GH{S=&EzHjYa6ceG`%FL%3RY$+`MrW?09%6e2DFqvSoj6DM4Cj(6e&^ta!^ zK7TQ`!ChfjK;(B8A}#>oPexs{0j+3z>#JY19d*ryCeLlVZiWc@vpNeAw+d-neuH_W z9J{KvIi0kPMc7rfm`BP9=B(tMji%9k%bscFK&C=OXi>cF5 zR5h_kBnBV^!k2{bdXbSRG8jU5y)o5E;8)KWL>X!@C2ojLANdK7J9bjnNsHCQ(YPVv z25@3`*>GGoT0k^*T%9^x#5clZw4p^|cU=)*Cll_}EdPj{e1A$$Z=w;%0KN`n+<^Nx zfDeIpfnz{0ky8mjkPi57P!J5@Leq%E4bUCz|9|$l(e~c~0O!K;(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ>E=fc|RCwC#nQLqnMHI(>v-eT@uG9hsTC8x}A`eSbk%+_u1qo^dv_wK|An_4` zglgj>@X4eoUySc)G$A38KqP3Q0wz3-AJpn?+KRSmv7n_Ow52av?%lh)-ilnaHFt!D$k}B!K@r00B6F6!SijNC*5*AWKSl&8pPn zyVj2z1mC{-)l?^tos7`(MGuUN$$#JQ13^_JVes;OvpHK1w%TZ5*! zr;wjFlM9#sLNm0n0SKr_L;iOfkP!y5Y{C7M6)k4}i31Gzhobl*`4f>pprYH=fG^-n zivP*w>)5zr1J$3r&ZX{4arx3x(lDffPfgsvOLf@?;8*>YdDkyr%f=NO*n4arE$uC% z@}{{{d8OhdYWDA;aK@cvWn@y@^eeH>D{hBtEE=!|VBV}^Hm`mLRZ}_cJ(*DMx^ECq z!CXGr{tlY1@#<$gxe-Sj4u=y>x2=K1Di$bgUQ>xc(A?faM^{H&ClM$tz570@p4vvL zE0wgVX?*kJQ7&G+7`K0iP%!Lj;D+i?;C7PY{36QcmICl+N1G`VZ_kHQ^=I(5dilEM zFg*jk+%sn(S?Sqa>A4zriFCte9Pp{Ws8ACbs>(cN!M2u;bNE$Xbo7o)EmPBJY&%QU zN7WR~^l;Z5h5UWBJ*E#xB)YEI-9{7pK2;lGs_dK7tYAHB;yNoCp8b3!)Xt|wf@8dDayz}Z+_u?`Um^a^kk#&=sD5t z*}3+Pl!lZEOT)Q_Ab-KMe3q2lYe_D=7^Al9W-6h?N@Yh)6AYQK)HZv=WL~b=fm3l< zlC@S0bTbYl4?r5`>KFts8FH5f$GxY*WF9Ghm>1V=#gGOvgfCLgYEcwNa2HA%fFUJP z4xfyqVb-NtH?R704gAzp8z#4V%NuN2U5OFG7wjYSk|Xuptf@@DEpOzVITkP$4TMZs z#sFbR0$PCAKHU}NlOI>T&s)#ekdvN0Vh%FGJj~}M#pP74+5|$08V5-*7ZO0Rs;bQ{ zm&@ArwJIZK+8iseRaaE8=ee4wJ}!6v!{;XsaNK(mZ)+WcHwI0IFQB}njLMapD4OYE zS=B>y^+rcyx6_SNangUJvqS*Je!suj?RHxN;8>YH>ZTWYP<(IO+iZK{g|PE)DD__N zqi?VmAr$iSW+8;2z4IcE?p(_s7n))oHmA5!P*Avjth+=3FwDHdnhnJ+GDbndjt{GO zdUs{qye20jo7vN6Q!p(bAq0Dm?qkuj<@|oWDcDEo7{iD}&o#>nQV-lAD!_A{2)FL$qB!&ym{iICT0;8rm8y#W*80nM>A*?NC==7Y9#& zL1SAZi|3XyZ*~bOE;sF+9h^OX7H>;ES9-2kwt}#1G$|7r1Nl@Rb*=T(wbqaAgRT%r z^RtRFmQ}r#baT!V62PzqnCJj(`aot{=C}gmG=CJ()6-)~V4%N$Jk4Jhz;s|CkT=2n zxD)tInEwYdll@OH4#*D-h{-?olK>_GOai#2^zQ)K=%y{kgF0vc0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ@-bqA3RCwC#nOkfeR~g5D=j_bxI?l$i<1`LV($FSAo6tlekcZGxP=uB#~QCZ>+{X`KmY%CnRAS)vYdxynUC85ZUgv#2Vj64P-uQG zr{RG{0Ibr9PgR!X>W@4-6aWLDP`p3Gfo6!xV87KPdI4Y{NaZ7d=bL}aFY5aDh&n*E z!SsEghN$wdpZe}us$gvUo+=pAHmF$@cl@6Tr_l0?>BV zb^O(~u8BvyN1bQj0ZUR*W={$h)1*lk&QsI&*<=`3vyk-W?f&hCa1dr*P*C5JK^p)u ziSHH1uIGKlBZ*_v!yzb~{;e=~LT;*B`gd6Fel!OLPCTCgant8{0O~+8L18rO(wa1~diW!o~e0?xEQj)FH9w zKTpKnirr-JV~Ty7WXKYQ>D*H>=duge^r4#ppYLHl?(x(%fKEqN-eXvGpJn{CM>?GH znI)KKr?>(7w^$@r>SId%d^)EmdkY!xpmid5g8;OV0*G8IOg*svp^(ZkLDW;c(=hj@ zVguOn)d26Huqt)!;!z=2GHia(P=3X+cBjE75MP0}e&cYH+5+4i@AYgDdmy6W`g+j2 z1ORdPMjL=B8U{8A;|D!qN!kAOkjbM$|9S}43PBEB0znZ5Yl@qN*BvES=jLL z93!7o%7+9KDDedNa%XOh76Bj;k&CaxKqmKT167AaNlQNAYJ&|!;<<#`x0K139iw{< zIt#Nkhy{WWTm*QfKCbM1%yRrm$M_!v+h@3ZKrw@cb$cv>J1pmZ?~teifMfxv2dUHO z2_Whb0}arm#ee`IfDyEoVDiePHxf=AR^Izyj?oVprl+8K4RQhax)POz+NB)Zz6e)e zQ{tLZEE!AzlB#m*2Od+;NJ#3L7|=8Z>OBBxPYFdJ4yng2AsV%yLVYF%5BGc_&$UZR zW6q(8K~?F?L#_zbs&eHoj`BgJxYkg3mqBBQ%SuvJ?)XH&=w}UMzeq5h3etS04&Z<~ z4cF+=0Yyv1K#Y$Z7)@($Y(WGU#l%;YW8Y{nbYG6r7N`tZk_5actNRR5S%{|`R$=yn za_s^bljbPX5Bb56cv5kZ$0}g7nLYEME>nr6O2e=1!9cP^7D|w~9RqRAfKgm6h8ZO~ z0^=uP^lJfk^jYc(Q9~(O!{9Du#YTmCYHoP5C07vCLt)r(t(x%i=VOATT_@59Ra?oq z&44;0m)u|-XrP)PQTn}EV;J5SkTjIxhdmd6mSFo0dw!XxFygo}357iL6=1Fg!y~X_ zYe%7Q9j%r^aWxF>N~rwRFKm=ekck0*mCChV3{3ZUrKq4TA+E&DDr#uV1WZ&cI-pc5 zF?a0?ShXd9X=QXM(~TNhtG{UXSyW0JJeMo3yMy-y$gSxFAb=v;tM2O(_XU-7UUCJ- z|D^Qq&13IU)_nxl>;f9nwXy(SAh+ZTZJM&@t_UKMsmf_v-D*8l)7H1w4?Qnw8&k!o zqBBBcN(fONcrqln5l9r(^qPN8JyIwrl+sVpMeN7I^xu8Ue(OS-J~tUqbr@{Z$YPy; z4`x(Bn+zBbg~A$3;hIo>$rF4(WW+0i(h$f4xg3ar!jNI&b>Yk(9kn-<5AM%n^UA6f zCVlq_;nJ&0^^_x&tOjyuXBJZRU}1inQ5TT8l!WG2CgsytghC`-KIAwm%Ff3^P91Qp z+-TXj!$2M;URB=wmE+2D9wX`UOdt1b-e;MbP*$ymUj0oVNg0Q%?8kdfC5CCK`hv+ zGQK}1Pz6zp2=qbWPFQm}VxKJYc)Du3ag62?=Q?KcY=troWtl_x&hj^nOFwXE^<9$INk0zLf`*;)g9; zzYRc$7gb^%F!ZUu4r-jof2w|8=&EOo|UfipjjIsZ6# z2QmktcBh5-q;T$AF=u?b&^ZfZ378N}l!9E4SX8nAu9t1DAH<8+Qw2A!J@+*Lq@u(X zu9vhI1z=MN$vfUZ*nOzLzKJ3`pU&U(O}L#;=h-(=WcQ&$hlHdvh~N1!)97AHzGN6X zc=Pui#}0b(CBx`m+rfZ#N{IH>-;E4ytLx~u6Y6J`@}K=p-?N{5)^qsLn7+;P+moiH z+Mtc*#sQeT5aiN%V^6sM*@1&qxZ1^RTS93X_044Y<*^&x^dkU1eeTw6QU`#?z|>TA zIUW&s1FQqy53F5g&X+?UVZ30B!@g4d9lJ{|*3PTIm$)L*EVn O000014Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>A_ld`MjvE3l4Bq~ z1&ac`YR6@x4-YmwE}ui{k-$JU^K@|xu@GE4)tax#L7?sK)d>L!XIV9Ld!~j&LGA}!PZ&+uVdEl`=`RF_u%JULB5Y-3cykA3TBFWafz^+@sAhgr)m zKDMxPv{h{3zN*GNSw-={+I6pOn~W?r1RhY}FzI1d&_B@EutxI8FL8m3ITI&^PJ1f* zicw8+!7BxUzSkOEdId@oSgThvh5S~Z;GnUMxAxG(2Jc|m-*5N~c$}TRJYAP1?XLB6 z{wy8kq7pT0Szc&p_zb>;UlT50nB|a_&LF>|?1qKp5&oC8(R&it)McH}R1W25c=hMx zM7@7ORt|prfim?ezB$|Z+SM1B zJ==d^aRZN9?2{i^%rEUu8`+*OW?z1x^c&;tw(a$d`Ry;abUaxq{sWX4Jzf1=);T3K F0RXND6NUf) literal 0 HcmV?d00001 diff --git a/Swift/Input101/Input101/Assets.xcassets/tip.imageset/tip@2x.png b/Swift/Input101/Input101/Assets.xcassets/tip.imageset/tip@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..18facde766af967b0228d2151cdeb7c1649d50ff GIT binary patch literal 1739 zcmY*ae^k;}6#ojM32B~HI;%}WkC7pul_?@>LMDk2WI?k8Ny(N%f?{S$uB>c~N=#g# zSt_~XubMWeHtb9d4y0Fdei0Fu)H@Y)1P zo&!J<769~Y0Kh2#z)^6mem5QfELd@Sm?9=649DfiqdAB8(J|iV;28UG4DEki<(*`K=GIl*G7PbHE&><-e)G17_^6J)2a9+ zd~L|bS@#ZB%|x$_T>G78Q?locQ$6HdvV1SJBebu^mwe-!Z5pY-deC}X)A|j9uPj09 z{Ay_tnc%is>9ImFBa$23`gQG#oz8}Dhw{&ge^`i(wH;n^ttc;_&&$hW)b8(0@V=_9 z*n z=t|yzt3we1TAXnUO1>?XN@+gp{v0-=7kuR|Obdt-M#**_Ef>dvorUcsXi3 zgB11ZdmH_FeUQ9&&myuRYh~Uhh*PUZo!RP{17FKwQ?8CO9WHJ$#znLtA6YAZfT)NK zISs~N^%WBn@n_ES0SY#^$|7CnY_K%LY-ehNm0 z5wcnq^AAn{KhJKxcvs>r0F|qms5XGkR9L!QNYs`-#**4sKR{_04@!-Xt$k$1RfyY{ zmh2w>Oo#QXYX|~-CV=dfTUJnOyE1mzd)s?Uqb!O9oZixY?LOVq%fSn;R7gFE3f8+w zQX}M_bI#H)NA|jtlpEWoCX=$Ik4PWM9w8y$d}IxH5d- zR(Ja(uQU0uj^iWln$?or0C)7zF2xJh*P2@J?EHLPIFe5DJ3nc!{UXEFdH?lEmh1AN z$jC_4)WpQeb3_D5GGu{##D$cfHrfavIeN-bc3DVM*QEp>R2r)d9#QQhHWDjrpzMcM%Wb z7ZQEc*s|@wVAST>`nvAvtIwhaA?^XLIVV@42>ReotE7e0f;+4FDvKi*-v|OuVyAQa zj5EuSXUbH%(3egcZP7JZh_3$WAFfnYoocQ!E1jUWU2Wg5b;h!0xJ_(Y;fc-2h0WbH zelO6vG)?g&Qtxh;Y%^M)-5m$jcvrlK4+3Hz~tP<#u-F-&4~92><{9 literal 0 HcmV?d00001 diff --git a/Swift/Input101/Input101/Assets.xcassets/tip.imageset/tip@3x.png b/Swift/Input101/Input101/Assets.xcassets/tip.imageset/tip@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9a343d29834642edca03607484e535df37b60d36 GIT binary patch literal 2679 zcmY*bc|6ox8~^?6Ntei;8e_X-nHgl8W`@eX4P(-famO|&W5f(HVJ=E3TCS}yb&>5g zNXT+yQ1&jR=vs%eM@lHVc}MrY_kG{<`J8i}=X;*#`+c7C$N8KqF3vXl#FfMW0N7_| zYl-LY=-nwM!e3Ee{|M)ALV?Gejsd`f>wCZY2=jf2pDo@A0Ae%&fRzLQTYQK$4*(1# z04$RES=j&}AC}wb$|nLnf(b-A(a90zN29`h{As=c@MvlnKZCCkjpCcs0J;w(ni>)s zfr`dJzek|>_AZQoLcWL4&tjlNCl|;GT6h4&2z~^Pgkr@Z5C}TlpMt_$TK}ES_b|{P zIz0@9Ktx4F!J`b}wD3TLzL}XB0%?FSFwo;i=tZ0lrTawdg+{3TMe-jW%YX>K@Zd0d zFfA0a%j@GyW6&{B=&sN|I4jzs*!%}+(|q9|N=Z~$L< zmmjN-{vP>%*xx#6#IE@N6!TZ7-%)<6SaCGspKHU4JGN0GOsyMzxm(~r8ER?)u+^|SVtOxr?)VF~-3xyB00qhFd~ zoWu(dVU?RD^pi|VpiR?S&dS2df=96kR<$v5*|Vmq>PF6;J4(#$4XSEN{sRt&qtn#X zbP8YkGTWs9Cq{E~nJ$W1Cl@abR~DA{PfchOx%pTLN!6L) zku3)nM8&!dW+v|TqCR7Qi`P{j5);V&%#?6(Rgd~*5KId zZsNvP7@LMU?~?cf3|XX_;~wLjXJwg+g`NVR&M$8LuKF1o+ss2(4rXc?G%oUzM@dG^w2)% ze%ZEc8LG8bhW8|$_qY}|kTg-LMdf5t!3#UzV)xnq5L|SFF#F+6rxrjt&91u&pgVb~ zOkq+&hVN=#&ABg;q*E?j~QL-yW+?6E_Tt%E^J{wD@$hV9%#M-wI7Qj>7U$NO zw|QpyO}Z7g&&7PNs7^0K);+&f_PNbT+9K&|Q9*kBb;;%@67BQzL2$|7bcJmpNb|3B zQNK)|ADW-kwmz2oqxN4lfE{mCG+>28RtGkSS%H!1zC#O7N0i4nUe+0ia~L5AsT*bw-tnm- z=g@wP`Q|ZIF+G3A6MAy*6ptKC7#Rqom{ztr7YFqmEX#p-H;!u z`S!`B;H05fYmiT0V`Fddu%+>GCP19a%+775J1~mmq^vzuU&O5PelE>=4=M>rF0PI3 z+`|8q7b3pp+_SC5ApzZjNf|WLOI~eyRDm!Rp8nUgm@6+-ZXM0{cY6=-?kb;4C99A{ zerx9nl823_W}vUzXMZK?PN;7aDQZ4a26o%B(YcM}_PFe`TK9@ef2dLuwg4O%1s#H+ z-{$7#c6dqLAO|D1b0;(F$MK}-6=7O(70@~Ht{qveC#P-79O8L_|oWi3viw5XSc6?JSdHm z{$TDB6-enYe5QUIdZyPjnsVYya*`uIZ~Mu-|vlMl@v8^a&7eL>;61k`_$Ux;=+#!0SNQeL>BUEP^-4j#rI=xG?+Vh>({p61 zy~c^fc~}>jG5c-niz>?Ma|fz3a!hD)U+P~D7=_pvMcR&~|H56LoSnLZ-(-WjRRuxO z(b39#Dg{Fn?`3*^w(6N<4TURr%?~QaVaE)$V-FBV!3dtpj zONTFSUQ7ag-`07*L4p^g14K02xT#!wG{twwCn9VPCL@cpkBjU2IXY-L(fnQ8@y|V* znmLxCIy`2dlF5xPR~tp%NfLLKO*9X^%W+?sfIrQu{RP;sYtSuPTVwfKMND%18<76l z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Swift/Input101/Input101/Base.lproj/Main.storyboard b/Swift/Input101/Input101/Base.lproj/Main.storyboard new file mode 100644 index 0000000..5784c7f --- /dev/null +++ b/Swift/Input101/Input101/Base.lproj/Main.storyboard @@ -0,0 +1,494 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Swift/Input101/Input101/Images/input_autocomplete.png b/Swift/Input101/Input101/Images/input_autocomplete.png new file mode 100644 index 0000000000000000000000000000000000000000..1a3342fe7ecacca4447c9dd9246b6241c68cf40f GIT binary patch literal 6355 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 HVQ>BubAq4& literal 0 HcmV?d00001 diff --git a/Swift/Input101/Input101/Images/input_dropdown.png b/Swift/Input101/Input101/Images/input_dropdown.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b491e07a518363851f11d805ed3b7ecd832cbe GIT binary patch literal 3349 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

Cx%&pydR#LYCN3BUo-8(T zdHG9Y$+bl*rFs8d$V)n-z1Jh3@joRv{PJutVnx8EW+u16k+)JzDpH~;Y5Nk2kjmNh zp8%rxH+9f$Hl*{u&cFO6p@Ng-iw2BrbXs$^`{=fOg3!7kblLa4V3#wO7JdlddH@?P z+bIcPpmN*P&Oi|8Zq?PEUNNchNd<{d4FF9VLYK^_1SRH7I!~}TOuBeE%plxHw@eHL zFaSB}qIM`a(<^5!@-WcAl=vkAgv^04Xhp^HBH%zn-b6>AigQc8xEiT39B|K% zt`|d~$EcErv6Z~AZ~V!IRweuAg9kGTdZI{>$p!&F()GM?_>RctaUY5o?l;?eJWnrc z>n;qM`RsCf#$7XPkba2Hu(RM9@D~LgB^AR{bzugf;La0vI+laAkhRt`X^GQ(WOZXs z^w8^*3C}MrSR&T=bCZpEr|S2C?DF$}`X%uPErbC_XzDc& T(^C21cMWjB+Q#ah1v&bkQ*ET4 literal 0 HcmV?d00001 diff --git a/Swift/Input101/Input101/Images/input_mask.png b/Swift/Input101/Input101/Images/input_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..a88a992922e7d9eb2cc9be88e83dbc6bc81d0975 GIT binary patch literal 6954 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 literal 0 HcmV?d00001 diff --git a/Swift/Input101/Input101/Info.plist b/Swift/Input101/Input101/Info.plist new file mode 100644 index 0000000..9a91652 --- /dev/null +++ b/Swift/Input101/Input101/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + GrapeCity.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Swift/Input101/Input101/License.swift b/Swift/Input101/Input101/License.swift new file mode 100644 index 0000000..3aeebe8 --- /dev/null +++ b/Swift/Input101/Input101/License.swift @@ -0,0 +1,13 @@ +// +// License.swift +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +import Foundation + +public class License{ + let key = "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" + +} \ No newline at end of file diff --git a/Swift/Input101/Input101/Samples/AutoCompleteController.swift b/Swift/Input101/Input101/Samples/AutoCompleteController.swift new file mode 100644 index 0000000..2808f26 --- /dev/null +++ b/Swift/Input101/Input101/Samples/AutoCompleteController.swift @@ -0,0 +1,128 @@ +// +// AutoCompleteController.swift +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +import UIKit +import Foundation +import XuniInputKit + +class AutoCompleteController: UIViewController, XuniDropDownDelegate, XuniAutoCompleteDelegate,UITableViewDelegate,UITableViewDataSource{ + + @IBOutlet weak var highlightDropdown: XuniAutoComplete! + @IBOutlet weak var delayDropdown: XuniAutoComplete! + @IBOutlet weak var customDropdown: XuniAutoComplete! + @IBOutlet weak var filterDropdown: XuniAutoComplete! + + override func viewDidLoad() { + super.viewDidLoad() + + //Do any additional setup after loading the view. + highlightDropdown.dropDownHeight = 200; + highlightDropdown.displayMemberPath = "name" + highlightDropdown.isAnimated = true + highlightDropdown.itemsSource = AutoCompleteData.demoData() + highlightDropdown.showButton = false + + delayDropdown.dropDownHeight = 200; + delayDropdown.displayMemberPath = "name"; + delayDropdown.isAnimated = true + delayDropdown.itemsSource = AutoCompleteData.demoData() + delayDropdown.delay = 1000; + delayDropdown.showButton = false + + customDropdown.tableView.delegate = self; + customDropdown.tableView.dataSource = self; + customDropdown.dropDownHeight = 200; + customDropdown.displayMemberPath = "name"; + customDropdown.isAnimated = true + customDropdown.highlightedColor = UIColor.redColor() + customDropdown.itemsSource = AutoCompleteData.demoData() + + filterDropdown.dropDownHeight = 200 + filterDropdown.displayMemberPath = "name" + filterDropdown.isAnimated = true + filterDropdown.delegate = self + filterDropdown.itemsSource = AutoCompleteData.demoData() + filterDropdown.filteringArgs.cancel = true + } + + func filtering(sender: XuniAutoComplete!, eventArgs: XuniAutoCompleteFilteringEventArgs!) { + sender.collectionView.filter = {(item : NSObject?) -> Bool in + let data = item as! AutoCompleteData + let string = data.name as NSString; + if (string.substringToIndex(1).lowercaseString == "b") { + return true; + } + return false; + } as IXuniPredicate + sender.itemsSource = NSMutableArray(array: sender.collectionView.items) +// sender.filteringArgs.cancel = false + + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return customDropdown.temporaryItemSource.count + } + + func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + return 50; + } + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + + var cell = tableView.dequeueReusableCellWithIdentifier("simpleIdentifier") + + if (cell == nil){ + cell = UITableViewCell.init(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "simpleIdentifier") + } + + let selectedBackgroundView = UIView.init() + selectedBackgroundView.backgroundColor = UIColor.init(colorLiteralRed: 0 / 255.0, green: 122 / 255.0, blue: 255 / 255.0, alpha: 1.0) + cell!.selectedBackgroundView = selectedBackgroundView + + let array = ((cell?.contentView.subviews)! as NSArray) + for view in array + { + let v = view as! UIView + v.removeFromSuperview() + } + + let rect = cell!.contentView.frame; + let tempArray = customDropdown.temporaryItemSource as NSArray + let data = tempArray.objectAtIndex(indexPath.row) as! AutoCompleteData + + let image = UIImageView.init(image: UIImage.init(named: data.imageString)) + image.frame = CGRect(x: 8, y: 0, width: 48, height: 48) + cell?.contentView.addSubview(image) + + let label1 = UILabel.init(frame: CGRectMake(65, 10, rect.size.width - 40, rect.size.height / 2)) + label1.text = data.name + cell?.contentView.addSubview(label1) + + customDropdown.normalizeCellText(label1, withSubstring: label1.text) + if((customDropdown.filterString) != nil) + { + customDropdown.highlightedSubstring(customDropdown.filterString, inFilterCellText: label1) + } + + return cell! + } + + func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { + customDropdown.selectedIndex = UInt.init(bitPattern: indexPath.row) + customDropdown.isDropDownOpen = false + } + + func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { + cell.separatorInset = UIEdgeInsetsZero + + // Prevent the cell from inheriting the Table View's margin settings. + cell.preservesSuperviewLayoutMargins = false + + // Explictly set cell's layout margins. + cell.layoutMargins = UIEdgeInsetsZero + } +} \ No newline at end of file diff --git a/Swift/Input101/Input101/Samples/AutoCompleteData.swift b/Swift/Input101/Input101/Samples/AutoCompleteData.swift new file mode 100644 index 0000000..9cdccae --- /dev/null +++ b/Swift/Input101/Input101/Samples/AutoCompleteData.swift @@ -0,0 +1,32 @@ +// +// AutoCompleteData.swift +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +import Foundation + +class AutoCompleteData: NSObject { + var name: String + var imageString: String + + init(name: String, imageString: String) { + self.name = name + self.imageString = imageString + } + + class func demoData() -> NSMutableArray { + + let dataArray = NSMutableArray() + let array = ["Australia","Bangladesh","Brazil","Canada", "China", "France","Germany","India", "Japan", "Nepal", "Pakistan", "Srilanka"] + let imageArray = ["Australia","Bangladesh","Brazil","Canada", "China", "France","Germany","India", "Japan", "Nepal", "Pakistan", "Srilanka"] + + for var i = 0; i < array.count; i++ { + let data = AutoCompleteData(name: array[i],imageString: imageArray[i]) + dataArray.addObject(data) + } + + return dataArray; + } +} \ No newline at end of file diff --git a/Swift/Input101/Input101/Samples/ComboBoxController.swift b/Swift/Input101/Input101/Samples/ComboBoxController.swift new file mode 100644 index 0000000..ed7c0f3 --- /dev/null +++ b/Swift/Input101/Input101/Samples/ComboBoxController.swift @@ -0,0 +1,50 @@ +// +// ComboBoxController.swift +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +import UIKit +import XuniInputKit + +class ComboBoxController: UIViewController, XuniDropDownDelegate, XuniComboBoxDelegate { + + @IBOutlet weak var comboBoxEdit: XuniComboBox! + @IBOutlet weak var comboBoxNonEdit: XuniComboBox! + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + self.comboBoxEdit.delegate = self + self.comboBoxEdit.displayMemberPath = "name" + self.comboBoxEdit.itemsSource = AutoCompleteData.demoData() + self.comboBoxEdit.dropDownHeight = 200 + self.comboBoxEdit.placeholder = "Please Enter..." + + self.comboBoxNonEdit.delegate = self + self.comboBoxNonEdit.displayMemberPath = "name" + self.comboBoxNonEdit.itemsSource = AutoCompleteData.demoData() + self.comboBoxNonEdit.isEditable = false + self.comboBoxNonEdit.dropDownBehavior = XuniDropDownBehavior.HeaderTap + self.comboBoxNonEdit.dropDownHeight = 200 + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} \ No newline at end of file diff --git a/Swift/Input101/Input101/Samples/DropDownController.swift b/Swift/Input101/Input101/Samples/DropDownController.swift new file mode 100644 index 0000000..8f647a8 --- /dev/null +++ b/Swift/Input101/Input101/Samples/DropDownController.swift @@ -0,0 +1,56 @@ +// +// DropDownController.swift +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +import Foundation +import XuniInputKit +import XuniCalendarKit + +class DropDownController: UIViewController,XuniDropDownDelegate,XuniCalendarDelegate { + @IBOutlet weak var dropdown: XuniDropDown! + + var _field: XuniMaskedTextField? + var _dropdownView: XuniDropDownView? + var _calendar: XuniCalendar? + + + override func viewDidLoad() { + super.viewDidLoad() + self.title = "DropDown" + + dropdown.delegate = self + dropdown.buttonColor = UIColor.lightGrayColor() + dropdown.dropDownHeight = 300 + dropdown.dropDownWidth = (Double)(dropdown.frame.size.width + 30.0) + dropdown.dropDownDirection = XuniDropDownDirection.BelowOrAbove + dropdown.isAnimated = true + + _field = XuniMaskedTextField.init() + _field!.mask = "00/00/0000" + _field!.borderStyle = UITextBorderStyle.None + dropdown.header = _field + + _calendar = XuniCalendar.init() + _calendar?.disabledTextColor = UIColor.yellowColor() + _calendar?.delegate = self + dropdown.dropDownView = _calendar + } + + + func selectionChanged(sender:XuniCalendar,selectedDates:XuniCalendarRange) + { + let _dateFormatter = NSDateFormatter() + _dateFormatter.dateFormat = "MM/dd/yyyy" + _field!.text = _dateFormatter.stringFromDate((sender).selectedDate) + dropdown.isDropDownOpen = false + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + +} \ No newline at end of file diff --git a/Swift/Input101/Input101/Samples/MaskedInputController.swift b/Swift/Input101/Input101/Samples/MaskedInputController.swift new file mode 100644 index 0000000..9079a56 --- /dev/null +++ b/Swift/Input101/Input101/Samples/MaskedInputController.swift @@ -0,0 +1,33 @@ +// +// MaskedInputController.swift +// Input101 +// +// Copyright (c) GrapeCity, Inc. All rights reserved. +// + +import Foundation +import XuniInputKit + +class MaskedInputController: UIViewController { + + @IBOutlet weak var maskedID: XuniMaskedTextField! + @IBOutlet weak var maskedDOB: XuniMaskedTextField! + @IBOutlet weak var maskedPhone: XuniMaskedTextField! + @IBOutlet weak var maskedState: XuniMaskedTextField! + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view, typically from a nib. + self.maskedID.mask = "000-00-0000" + self.maskedDOB.mask = "90/90/0000" + self.maskedPhone.mask = "(999) 000-0000" + self.maskedState.mask = "LL" + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + +}